[LLVMdev] why are volatile memory accesses ordered?

Daniel Berlin dberlin at dberlin.org
Thu Apr 2 18:16:54 PDT 2015


On Thu, Apr 2, 2015 at 6:04 PM, Sanjoy Das
<sanjoy at playingwithpointers.com> wrote:
> Marking volatile accesses as !unordered seems excessively
> conservative.  For instance, LLVM is not able to optimize
>
> declare void @escape(i32*)
> declare i32 @read_only(i32) readonly
>
> define i32 @f(i1* %c) {
>  entry:
>   %a = alloca i32
>   %b = alloca i32
>   call void @escape(i32* %a)
>   call void @escape(i32* %b)
>
>   %a0 = load i32, i32* %b, align 4
>   %lv = load volatile i32, i32* %b
>   %a1 = load i32, i32* %a, align 4
>
>   %result = add i32 %a0, %a1
>   ret i32 %result
> }
>
> to "%result = %a0 << 1" via -O3.
Maybe it's just late, but  what am i missing that makes you think this
optimizes to %a0 << 1?

In particular,  how do you know what %a1 is, since %a0 and %a1 are
loads of different pointers?

GVN otherwise optimizes volatile loads (as does everything using memdep).

The volatile load will not be a barrier to eliminating two loads.
You can see a testcase like yours in transforms/GVN/volatile.ll

If you replace %a with %b in %a1, it should do with %result = add i32
%a0, %a0, which i presume will transform the way you want it.



>

> NB: changing the volatile load to a volatile store triggers the
> optimization (via -instcombine) -- llvm::FindAvailableLoadedValue just
> skips over noalias ordered stores.
>
> -- Sanjoy
> _______________________________________________
> 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