[LLVMdev] alloca not in first bb behaving differently

David Chisnall
Sun, 05 Apr 2015 09:44:10 -0000

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