From d747f3f3fe02a2bb20ba04757481713ca1c21d1d Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Fri, 13 Mar 2015 19:42:09 +0000 Subject: [PATCH] instcombine: alloca: Canonicalize scalar allocation array size As a follow-up to r232200, add an `-instcombine` to canonicalize scalar allocations to `i32 1`. Since r232200, `iX 1` (for X != 32) are only created by RAUWs, so this shouldn't fire too often. Nevertheless, it's a cheap check and a nice cleanup. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232202 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstCombine/InstCombineLoadStoreAlloca.cpp | 12 ++++++++++-- test/Transforms/InstCombine/alloca.ll | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index deed58c425e..73dd40e4d19 100644 --- a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -166,8 +166,16 @@ isOnlyCopiedFromConstantGlobal(AllocaInst *AI, static Instruction *simplifyAllocaArraySize(InstCombiner &IC, AllocaInst &AI) { // Check for array size of 1 (scalar allocation). - if (!AI.isArrayAllocation()) - return nullptr; + if (!AI.isArrayAllocation()) { + // i32 1 is the canonical array size for scalar allocations. + if (AI.getArraySize()->getType()->isIntegerTy(32)) + return nullptr; + + // Canonicalize it. + Value *V = IC.Builder->getInt32(1); + AI.setOperand(0, V); + return &AI; + } // Convert: alloca Ty, C - where C is a constant != 1 into: alloca [C x Ty], 1 if (const ConstantInt *C = dyn_cast(AI.getArraySize())) { diff --git a/test/Transforms/InstCombine/alloca.ll b/test/Transforms/InstCombine/alloca.ll index db26218f3b8..81e2083204b 100644 --- a/test/Transforms/InstCombine/alloca.ll +++ b/test/Transforms/InstCombine/alloca.ll @@ -155,8 +155,8 @@ define void @test10() { entry: ; ALL-LABEL: @test10( ; ALL: %v32 = alloca i1, align 8 -; ALL: %v64 = alloca i1, i64 1, align 8 -; ALL: %v33 = alloca i1, i33 1, align 8 +; ALL: %v64 = alloca i1, align 8 +; ALL: %v33 = alloca i1, align 8 %v32 = alloca i1, align 8 %v64 = alloca i1, i64 1, align 8 %v33 = alloca i1, i33 1, align 8 -- 2.34.1