(original) (raw)

I don't believe that anyone has explored using assumes for modeling memory.� Doing so seems reasonable, but would require some careful thought.� The place to start looking would be the GVN pass.� Specifically, look at the handling for full redundancy cases.� Looking at what we do for known functions (i.e. malloc, calloc) might be a reasonable place to start reading.

Philip

On 07/03/2015 03:55 AM, Tom Aernoudt wrote:

Hi all,

Is it possible to use \_\_builtin\_assume (or something similar like \_\_builtin\_unreachable) to eliminate stores?

Eg I would expect that I if I write something as follows the optimizer could optimize away the store to the variable a:

void foo(int\* a)

{

� \_\_builtin\_assume(\*a == 0);

� \*a = 0;

}

But the generated code still writes to the variable:

; Function Attrs: nounwind uwtable

define void @\_Z3fooPi(i32\* nocapture %a) #0 {

� %1 = load i32, i32\* %a, align 4, !tbaa !8

� %2 = icmp eq i32 %1, 0

� tail call void @llvm.assume(i1 %2)

� store i32 0, i32\* %a, align 4, !tbaa !8

� ret void

}

00000000000000a0 <\_Z3fooPi>:

� a0:�� c7 07 00 00 00 00������ movl�� $0x0,(%rdi)

� a6:�� c3��������������������� retq�

Why this store not optimized away?

Is there another way to tell the optimizer that the store can be eliminated?

Regards,

Tom



\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_  
LLVM Developers mailing list  
LLVMdev@cs.uiuc.edu http://llvm.cs.uiuc.edu  
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev