[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