[PATCH] Sink: Don't sink allocas

Matt Arsenault Matthew.Arsenault at amd.com
Mon Dec 16 10:21:25 PST 2013


On 12/16/2013 07:17 AM, Tom Stellard wrote:
> From: Tom Stellard <thomas.stellard at amd.com>
>
> CodeGen treats allocas outside the entry block as dynamically sized
> stack objects.
> ---
>   lib/Transforms/Scalar/Sink.cpp |  6 ++++++
>   test/Transforms/Sink/basic.ll  | 23 +++++++++++++++++++++++
>   2 files changed, 29 insertions(+)
>
> diff --git a/lib/Transforms/Scalar/Sink.cpp b/lib/Transforms/Scalar/Sink.cpp
> index d4595bb..c7f9e97 100644
> --- a/lib/Transforms/Scalar/Sink.cpp
> +++ b/lib/Transforms/Scalar/Sink.cpp
> @@ -218,6 +218,12 @@ bool Sinking::IsAcceptableTarget(Instruction *Inst,
>   /// instruction out of its current block into a successor.
>   bool Sinking::SinkInstruction(Instruction *Inst,
>                                 SmallPtrSet<Instruction *, 8> &Stores) {
> +
> +  // Don't sink alloca instructions.  CodeGen assumes allocas outside the
> +  // entry block are dynamically sized stack objects.
> +  if (dyn_cast<AllocaInst>(Inst))
> +    return false;
> +
You don't use the value of dyn_cast, so just use isa

>     // Check if it's safe to move the instruction.
>     if (!isSafeToMove(Inst, AA, Stores))
>       return false;
> diff --git a/test/Transforms/Sink/basic.ll b/test/Transforms/Sink/basic.ll
> index 85ab376..740e5a8 100644
> --- a/test/Transforms/Sink/basic.ll
> +++ b/test/Transforms/Sink/basic.ll
> @@ -62,3 +62,26 @@ X:                                     ; preds = %5, %3
>     ret i32 %R
>   }
>   
> +; We shouldn't sink allocas, since CodeGen interprets allocas outside the
> +; entry block as dynamically sized stack objects.
> +
> +; CHECK-LABEL: @alloca_sink
> +; CHECK: entry:
> +; CHECK-NEXT: alloca
> +define i32 @alloca_sink(i32 %a, i32 %b) {
> +entry:
> +  %0 = alloca i32
> +  %1 = icmp ne i32 %a, 0
> +  br i1 %1, label %if, label %endif
> +
> +if:
> +  %2 = getelementptr i32* %0, i32 1
> +  store i32 0, i32* %0
> +  store i32 1, i32* %2
> +  %3 = getelementptr i32* %0, i32 %b
> +  %4 = load i32* %3
> +  ret i32 %4
> +
> +endif:
> +  ret i32 0
> +}





More information about the llvm-commits mailing list