From: Artur Pilipenko Date: Thu, 25 May 2017 15:14:48 +0000 (+0000) Subject: [InstCombine] Teach isAllocSiteRemovable to look through addrspacecasts X-Git-Tag: android-x86-7.1-r4~15830 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=81a4c4fa699fec2847cec70ce6594956a008d2ba;p=android-x86%2Fexternal-llvm.git [InstCombine] Teach isAllocSiteRemovable to look through addrspacecasts Reviewed By: reames Differential Revision: https://reviews.llvm.org/D28565 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303870 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp index 90b024b753c..2730afc5c5b 100644 --- a/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -1963,6 +1963,7 @@ static bool isAllocSiteRemovable(Instruction *AI, // Give up the moment we see something we can't handle. return false; + case Instruction::AddrSpaceCast: case Instruction::BitCast: case Instruction::GetElementPtr: Users.emplace_back(I); @@ -2064,7 +2065,8 @@ Instruction *InstCombiner::visitAllocSite(Instruction &MI) { replaceInstUsesWith(*C, ConstantInt::get(Type::getInt1Ty(C->getContext()), C->isFalseWhenEqual())); - } else if (isa(I) || isa(I)) { + } else if (isa(I) || isa(I) || + isa(I)) { replaceInstUsesWith(*I, UndefValue::get(I->getType())); } eraseInstFromFunction(*I); diff --git a/test/Transforms/InstCombine/alloca.ll b/test/Transforms/InstCombine/alloca.ll index f81f700e6cf..490830af2d8 100644 --- a/test/Transforms/InstCombine/alloca.ll +++ b/test/Transforms/InstCombine/alloca.ll @@ -51,8 +51,8 @@ define i32* @test4(i32 %n) { ret i32* %A } -; Allocas which are only used by GEPs, bitcasts, and stores (transitively) -; should be deleted. +; Allocas which are only used by GEPs, bitcasts, addrspacecasts, and stores +; (transitively) should be deleted. define void @test5() { ; CHECK-LABEL: @test5( ; CHECK-NOT: alloca @@ -62,6 +62,7 @@ define void @test5() { entry: %a = alloca { i32 } %b = alloca i32* + %c = alloca i32 %a.1 = getelementptr { i32 }, { i32 }* %a, i32 0, i32 0 store i32 123, i32* %a.1 store i32* %a.1, i32** %b @@ -73,6 +74,8 @@ entry: store atomic i32 3, i32* %a.3 release, align 4 %a.4 = getelementptr { i32 }, { i32 }* %a, i32 0, i32 0 store atomic i32 4, i32* %a.4 seq_cst, align 4 + %c.1 = addrspacecast i32* %c to i32 addrspace(1)* + store i32 123, i32 addrspace(1)* %c.1 ret void }