[LLVMdev] alloca not in first bb behaving differently

David Chisnall David.Chisnall at cl.cam.ac.uk
Sun Apr 5 02:44:10 PDT 2015


It's not great IR, but it doesn't look like it should actually crash, just (without SROA) produce comparatively bad code.  The alloca is only referenced in the basic block that it exists.  If this isn't expected to work, then we should probably improve the documentation of alloca in the language reference.

David

> On 5 Apr 2015, at 04:55, Eric Christopher <echristo at gmail.com> wrote:
> 
> Allocas not in the entry block are treated as dynamic allocas and not stack slots.
> 
> 
> On Sat, Apr 4, 2015, 8:37 PM Dave Pitsbawn <dpitsbawn at gmail.com> wrote:
> Here is some IR that is working and executing as expected -- All allocas are in the first basic block, and only updates happen in other basic blocks.
> 
> define i32 @f() {
> entry:
>   %x = alloca i32
>   store i32 333, i32* %x
>   %i = alloca i32
>   store i32 11, i32* %i
>   br i1 true, label %if.then, label %if.else
> 
> if.then:                                          ; preds = %entry
>   store i32 3, i32* %i
>   %0 = load i32* %i
>   ret i32 %0
> 
> if.else:                                          ; preds = %entry
>   ret i32 2
> 
> if.end:                                           ; preds = %after_ret1, %after_
> ret
>   ret i32 1
> 
> after_ret:                                        ; No predecessors!
>   br label %if.end
> 
> after_ret1:                                       ; No predecessors!
>   br label %if.end
> 
> after_ret2:                                       ; No predecessors!
>   ret i32 0
> }
> 
> The following IR is slightly different in that the alloca is defined not in the first basic block:
> 
> define i32 @M() {
> entry:
>   %x = alloca i32
>   store i32 333, i32* %x
>   br i1 true, label %if.then, label %if.else
> 
> if.then:                                          ; preds = %entry
>   %i = alloca i32
>   store i32 3, i32* %i
>   %0 = load i32* %i
>   ret i32 %0
> 
> if.else:                                          ; preds = %entry
>   ret i32 2
> 
> if.end:                                           ; preds = %after_ret1, %after_
> ret
>   ret i32 1
> 
> after_ret:                                        ; No predecessors!
>   br label %if.end
> 
> after_ret1:                                       ; No predecessors!
>   br label %if.end
> 
> after_ret2:                                       ; No predecessors!
>   ret i32 0
> }
> 
> This segfaults for me. The IR passes the function verifier. Can someone spot an error? I don't see any.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> _______________________________________________
> 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