[LLVMdev] GEP vs IntToPtr/PtrToInt

Eli Friedman eli.friedman at gmail.com
Mon Apr 4 18:34:00 PDT 2011


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




More information about the llvm-dev mailing list