On 4/4/2011 6:45 PM, Eli Friedman wrote:> On Mon, Apr 4, 2011 at 5:02 PM, Arushi Aggarwal<arushi987 at gmail.com> wrote: >> >>> Hi, >>> Is it correct to convert, >>> %196 = load i32* %195, align 8 ;<i32> [#uses=1] >>> %197 = zext i32 %196 to i64 ;<i64> [#uses=1] >>> %198 = ptrtoint i8* %193 to i64 ;<i64> [#uses=1] >>> %199 = add i64 %198, %197 ;<i64> [#uses=1] >>> %200 = inttoptr i64 %199 to i8* ;<i8*> [#uses=1] >>> into >>> %200 = getelementptr %193, %196 >>> Reducing the unnecessary casts of converting to integers and then back? >>> Thanks, >>> Arushi >>> > See http://llvm.org/docs/LangRef.html#pointeraliasing ; it's not > correct in general. It is correct if %196 isn't dependent on the > address of any memory object, though.Can you clarify why the transform isn't correct? Is it because in the original code, %200 is based on both the originally cast pointer (%193) and the indexed offset from it (%197) while the transformed code is only based on %193? Arushi, is some transform converting a GEP into this ptrtoint/inttoptr sequence and thereby adding "based on" relationships that didn't exist previously in the code? -- John T.> -Eli > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
On Mon, Apr 4, 2011 at 5:02 PM, Arushi Aggarwal <arushi987 at gmail.com> wrote:> > >> Hi, >> Is it correct to convert, >> %196 = load i32* %195, align 8 ; <i32> [#uses=1] >> %197 = zext i32 %196 to i64 ; <i64> [#uses=1] >> %198 = ptrtoint i8* %193 to i64 ; <i64> [#uses=1] >> %199 = add i64 %198, %197 ; <i64> [#uses=1] >> %200 = inttoptr i64 %199 to i8* ; <i8*> [#uses=1] >> into >> %200 = getelementptr %193, %196 >> Reducing the unnecessary casts of converting to integers and then back? >> Thanks, >> Arushi >>See http://llvm.org/docs/LangRef.html#pointeraliasing ; it's not correct in general. It is correct if %196 isn't dependent on the address of any memory object, though. -Eli
On Mon, Apr 4, 2011 at 7:10 AM, John Criswell <criswell at illinois.edu> wrote:> On 4/4/2011 6:45 PM, Eli Friedman wrote: >> >> On Mon, Apr 4, 2011 at 5:02 PM, Arushi Aggarwal<arushi987 at gmail.com> >> wrote: >>> >>>> Hi, >>>> Is it correct to convert, >>>> %196 = load i32* %195, align 8 ;<i32> [#uses=1] >>>> %197 = zext i32 %196 to i64 ;<i64> [#uses=1] >>>> %198 = ptrtoint i8* %193 to i64 ;<i64> [#uses=1] >>>> %199 = add i64 %198, %197 ;<i64> [#uses=1] >>>> %200 = inttoptr i64 %199 to i8* ;<i8*> [#uses=1] >>>> into >>>> %200 = getelementptr %193, %196 >>>> Reducing the unnecessary casts of converting to integers and then back? >>>> Thanks, >>>> Arushi >>>> >> See http://llvm.org/docs/LangRef.html#pointeraliasing ; it's not >> correct in general. It is correct if %196 isn't dependent on the >> address of any memory object, though. > > Can you clarify why the transform isn't correct? Is it because in the > original code, %200 is based on both the originally cast pointer (%193) and > the indexed offset from it (%197) while the transformed code is only based > on %193?Yes, exactly. -Eli
This code is generated for va_arg. %6 = getelementptr inbounds %struct.__va_list_tag* %5, i32 0, i32 3 ; <i8**> [#uses=1] %7 = load i8** %6, align 8 ; <i8*> [#uses=1] %8 = getelementptr inbounds [1 x %struct.__va_list_tag]* %ap, i64 0, i64 0 ; <%struct.__va_list_tag*> [#uses=1] %9 = getelementptr inbounds %struct.__va_list_tag* %8, i32 0, i32 0 ; <i32*> [#uses=1] %10 = load i32* %9, align 8 ; <i32> [#uses=1] %11 = inttoptr i32 %10 to i8* ; <i8*> [#uses=1] %12 = ptrtoint i8* %7 to i64 ; <i64> [#uses=1] %13 = ptrtoint i8* %11 to i64 ; <i64> [#uses=1] %14 = add i64 %12, %13 ; <i64> [#uses=1] %15 = inttoptr i64 %14 to i8* ; <i8*> [#uses=1] store i8* %15, i8** %addr.0, align 8 and I have optimized one inttoptr to a zext. I guess it is safe in this case? On Mon, Apr 4, 2011 at 9:10 AM, John Criswell <criswell at illinois.edu> wrote:> On 4/4/2011 6:45 PM, Eli Friedman wrote: > >> On Mon, Apr 4, 2011 at 5:02 PM, Arushi Aggarwal<arushi987 at gmail.com> >> wrote: >> >>> >>> Hi, >>>> Is it correct to convert, >>>> %196 = load i32* %195, align 8 ;<i32> [#uses=1] >>>> %197 = zext i32 %196 to i64 ;<i64> [#uses=1] >>>> %198 = ptrtoint i8* %193 to i64 ;<i64> [#uses=1] >>>> %199 = add i64 %198, %197 ;<i64> [#uses=1] >>>> %200 = inttoptr i64 %199 to i8* ;<i8*> [#uses=1] >>>> into >>>> %200 = getelementptr %193, %196 >>>> Reducing the unnecessary casts of converting to integers and then back? >>>> Thanks, >>>> Arushi >>>> >>>> See http://llvm.org/docs/LangRef.html#pointeraliasing ; it's not >> correct in general. It is correct if %196 isn't dependent on the >> address of any memory object, though. >> > > Can you clarify why the transform isn't correct? Is it because in the > original code, %200 is based on both the originally cast pointer (%193) and > the indexed offset from it (%197) while the transformed code is only based > on %193? > > Arushi, is some transform converting a GEP into this ptrtoint/inttoptr > sequence and thereby adding "based on" relationships that didn't exist > previously in the code? > > -- John T. > > -Eli >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110404/627a2144/attachment.html>