[LLVMdev] why are volatile memory accesses ordered?

Sanjoy Das sanjoy at playingwithpointers.com
Thu Apr 2 18:04:39 PDT 2015


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.

NB: changing the volatile load to a volatile store triggers the
optimization (via -instcombine) -- llvm::FindAvailableLoadedValue just
skips over noalias ordered stores.

-- Sanjoy



More information about the llvm-dev mailing list