[LLVMdev] GEP vs IntToPtr/PtrToInt

John Criswell criswell at illinois.edu
Mon Apr 4 07:10:36 PDT 2011


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




More information about the llvm-dev mailing list