[llvm-commits] RFC: patch for PR1782 (BasicAliasAnalyis)
Chris Lattner
clattner at apple.com
Tue Dec 11 21:32:11 PST 2007
On Dec 9, 2007, at 2:57 PM, Wojciech Matyjewicz wrote:
> Chris Lattner wrote:
>
>> Yep, it looks Gordon was right :). Thanks again Wojtek, I applied
>> the
>> patch. Please close the PR,
>
> Before I close the PR, I would like to discuss one more issue
> discovered
> while working on it.
>
> Suppose, we have a target with 32-bit pointers and the following
> instructions:
>
> %p = getelementptr i32* %x, i32 -1
> %q = getelementptr i32* %x, i32 1073741823 ;(1073741823 == 2^30 - 1)
>
> TargetData::getIndexedOffset() uses 64-bit arithmetic to perform
> offset
> computation and return 64-bit values. Hence, it will return -4 as an
> offset for %p, and 2^32 - 4 for %q. Based on these offsets, it may
> seem
> that %p and %q point to different memory objects. However, they don't,
> taking into account that pointers are 32-bit long.
Ok.
> I guess, such a large positive index in GEP as seen above can be
> introduced by -instcombine pass.
Ok. This is somewhat dubious though, as it is wrapping around the end
of the address space which is undefined in C.
> BasicAA seems to be affected by the issue. For the attached example
> opt
> -aa-eval says that %p and %q don't alias.
>
> I think, the simplest way to fix it is to truncate the computed offset
> to the target pointer size before returning it in
> TargetData::getIndexedOffset(). If you think this is the correct
> approach, I may prepare a patch.
Ah, that does make a lot of sense. Since the fix is simple, please go
for it!
-Chris
More information about the llvm-commits
mailing list