[llvm-dev] Is it valid to dereference a pointer that have undef bits in its offset?
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Mon Sep 21 11:41:01 PDT 2020
I think we need to allow this. Otherwise, we have to prove that
addresses are non-undef before we can hoist or sink a memory
instruction. Today, aliasing can use things like known bits, and if we
imposed a no-undef in address requirement, we'd either need to replace
such reasoning in AA, or have passes which wish to hoist/sink check the
property afterwards.
Or to say it differently, I think it's reasonable for %p2 and %p3 to be
provably no alias and dereferenceable, and for %v and %v2 to be safe to
speculate.
%p = alloca [16 x i8]
%p2 = gep %p, (undef & 7)
%v = load %p2
%p3 = gep %p, 8
%v2 = load %p3
Keep in mind that the undef doesn't have to be literal and can be
arbitrarily obscured (e.g. behind a function call). The alternative
interpretation is extremely limiting.
Philip
On 9/21/20 10:41 AM, Johannes Doerfert via llvm-dev wrote:
> My feeling tells me we should allows this.
> No proper justification handy but your example doesn't strike me as UB.
>
> ~ Johannes
>
>
> On 9/21/20 12:32 PM, Eli Friedman via llvm-dev wrote:
>> I think it’s reasonable to expect that IR generated by frontends
>> doesn’t do this.
>>
>> Not sure about transforms; I can imagine that we might speculate a
>> load without proving all the bits are well-defined.
>>
>> -Eli
>>
>> From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of
>> Juneyoung Lee via llvm-dev
>> Sent: Sunday, September 20, 2020 3:54 PM
>> To: llvm-dev <llvm-dev at lists.llvm.org>
>> Subject: [EXT] Re: [llvm-dev] Is it valid to dereference a pointer
>> that have undef bits in its offset?
>>
>>> %p2 = gep %p, (undef & 8)
>> A silly typo: undef & 8 -> undef & 7
>>
>> On Mon, Sep 21, 2020 at 7:47 AM Juneyoung Lee
>> <juneyoung.lee at sf.snu.ac.kr<mailto:juneyoung.lee at sf.snu.ac.kr>> wrote:
>> Hello all,
>>
>> Is it valid to dereference a pointer that has undef bits in its offset?
>>
>> For example,
>>
>> %p = alloca [8 x i8]
>> %p2 = gep %p, (undef & 8)
>> store 0, %p2
>>
>> undef & 8 is always less than 8, so technically it will store zero to
>> one of the array's elements.
>>
>> The reason is that I want to improve no-undef analysis by suggesting
>> that a pointer that is passed to load/store is well-defined, by
>> making it raise UB when a pointer with undef bits is given.
>>
>> A suggested patch is here: https://reviews.llvm.org/D87994
>>
>> I wonder whether there is a case using this to do something that I'm
>> not aware.
>>
>> Thanks,
>> Juneyoung
>>
>>
>> --
>>
>> Juneyoung Lee
>> Software Foundation Lab, Seoul National University
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list