[llvm-dev] Status of llvm.invariant.{start|end}

Anna Thomas via llvm-dev llvm-dev at lists.llvm.org
Tue Oct 31 12:50:11 PDT 2017


> On Oct 31, 2017, at 12:17 PM, Yichao Yu <yyc1992 at gmail.com> wrote:
> 
>> We at Azul have been using invariant.start for marking objects as immutable after a certain point.
>> Also, upstream changes to teach relevant optimizations about invariant.start and end were added
>> last year.
>> 
>> With respect to store to load forwarding, this is handled in GVN. I think the test cases in test/Transforms/GVN/invariant.start.ll
>> handle what you’re looking for.
> 
> Hmm, I'm pretty sure I checked that.
> It seems that none of the test cases in there actually requires
> invariant.start for store-to-load forwarding? (they need
> `invariant.start|end` to not be marked as modifying the memory but
> should all work without the intrinsics.) AFAICT the simple case in the
> issue I linked still doesn't work
> 
> ```
> declare void @g(i8*)
> 
> declare {}* @llvm.invariant.start.p0i8(i64, i8* nocapture) #0
> 
> define i8 @f() {
>  %a = alloca i8
>  store i8 0, i8* %a
>  %i = call {}* @llvm.invariant.start.p0i8(i64 1, i8* %a)
>  call void @g(i8* %a)
>  %r = load i8, i8* %a
>  ret i8 %r
> }
> 
> attributes #0 = { argmemonly nounwind }
> ```
Yes, you’re right. We don’t forward across the call even in presence of invariant.start.

By definition, invariant.start represents constant physical memory, so I would think this is a legal transform
to do. Ofcourse, this can lead to miscompiles if g is a special function that can modify %a in some way,
but those are things the front end needs to identify.


Anna

> 
>> 
>> 
>> Hope this helps,
>> Anna
>> 
>>> On Oct 29, 2017, at 9:01 PM, Yichao Yu via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>>> 
>>> Hi,
>>> 
>>> From LangRef, these intrinsics seems really useful for letting LLVM
>>> know about certain higher level immutability guarantee, e.g. for
>>> objects that are not allowed to be mutated after construction.
>>> However, it doesn't seem to work[1] and a quick code search suggests
>>> that there's not a single optimization pass that's currently using it
>>> for store to load forwarding, only very few that use it to eliminate
>>> stores. The issue linked is marked as resolved-later and mentioned
>>> that it "probably have to be redesigned before they work out right".
>>> What has to be redesigned to make it work and is there a better way
>>> that works currently to mark an object as immutable after a certain
>>> point/in certain region?
>>> 
>>> Yichao Yu
>>> 
>>> [1] https://bugs.llvm.org/show_bug.cgi?id=5441
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> 



More information about the llvm-dev mailing list