[LLVMdev] Meaning of the nocapture attribute (possible bug?)

Richard Osborne richard at xmos.com
Mon Oct 8 05:34:53 PDT 2012

Regarding the nocapture attribute the language ref says: "the callee 
does not make any copies of the pointer that outlive the callee itself". 
>From I inferred that it is OK for the callee to make a copy of the 
pointer that doesn't outlive the call. However if I write some code that 
does this the optimizers don't do what I'd expect. Consider the 
following the example:

declare void @g(i32** %p, i32* %q) nounwind

define i32 @f(i32* noalias nocapture %p) nounwind {
   %q = alloca i32*
   call void @g(i32** %q, i32* %p) nounwind
   store i32 0, i32* %p
   %0 = load i32** %q
   store i32 1, i32* %0
   %1 = load i32* %p
   ret i32 %1

I would expect it to be valid for g() to store the value of its second 
argument to the object pointed to by its first argument. Because of this 
I would expect a possible memory dependency between the last load (%1 = 
load i32* %p) and the last store (store i32 1, i32* %0). However if I 
run the example through opt -basicaa -gvn then the return instruction is 
optimized to ret i32 0 suggesting basicaa doesn't think there is any 
such dependency.

Is this a bug in the basic alias analysis pass or am I misunderstanding 
the semantics of nocapture?

Richard Osborne | XMOS

More information about the llvm-dev mailing list