From 7137eb36e1ca4f5a9730676d860354bb5eab394b Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Tue, 15 Jul 2014 00:56:40 +0000 Subject: [PATCH] Teach GetUnderlyingObject / BasicAA about addrspacecast git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213025 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/BasicAliasAnalysis.cpp | 3 ++- lib/Analysis/ValueTracking.cpp | 3 ++- .../DeadStoreElimination/PartialStore.ll | 22 ++++++++++++++++--- .../Transforms/DeadStoreElimination/simple.ll | 17 ++++++++++++++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index fe90b84533d..241355e9c3c 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -309,7 +309,8 @@ DecomposeGEPExpression(const Value *V, int64_t &BaseOffs, return V; } - if (Op->getOpcode() == Instruction::BitCast) { + if (Op->getOpcode() == Instruction::BitCast || + Op->getOpcode() == Instruction::AddrSpaceCast) { V = Op->getOperand(0); continue; } diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 9e2deaa18e3..bfdc349bf04 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -1901,7 +1901,8 @@ llvm::GetUnderlyingObject(Value *V, const DataLayout *TD, unsigned MaxLookup) { for (unsigned Count = 0; MaxLookup == 0 || Count < MaxLookup; ++Count) { if (GEPOperator *GEP = dyn_cast(V)) { V = GEP->getPointerOperand(); - } else if (Operator::getOpcode(V) == Instruction::BitCast) { + } else if (Operator::getOpcode(V) == Instruction::BitCast || + Operator::getOpcode(V) == Instruction::AddrSpaceCast) { V = cast(V)->getOperand(0); } else if (GlobalAlias *GA = dyn_cast(V)) { if (GA->mayBeOverridden()) diff --git a/test/Transforms/DeadStoreElimination/PartialStore.ll b/test/Transforms/DeadStoreElimination/PartialStore.ll index 4799ef3383b..80c2bfae846 100644 --- a/test/Transforms/DeadStoreElimination/PartialStore.ll +++ b/test/Transforms/DeadStoreElimination/PartialStore.ll @@ -45,9 +45,9 @@ define void @test4(i8* %P) { store i8 19, i8* %P ;; dead %A = getelementptr i8* %P, i32 3 - + store i8 42, i8* %A ;; dead - + %Q = bitcast i8* %P to double* store double 0.0, double* %Q ret void @@ -61,7 +61,7 @@ define void @test5(i32 %i) nounwind ssp { %C = getelementptr i8* %B, i32 %i store i8 10, i8* %C ;; Dead store to variable index. store i32 20, i32* %A - + call void @test5a(i32* %A) ret void ; CHECK-LABEL: @test5( @@ -69,3 +69,19 @@ define void @test5(i32 %i) nounwind ssp { ; CHECK-NEXT: store i32 20 ; CHECK-NEXT: call void @test5a } + +declare void @test5a_as1(i32*) +define void @test5_addrspacecast(i32 %i) nounwind ssp { + %A = alloca i32 + %B = addrspacecast i32* %A to i8 addrspace(1)* + %C = getelementptr i8 addrspace(1)* %B, i32 %i + store i8 10, i8 addrspace(1)* %C ;; Dead store to variable index. + store i32 20, i32* %A + + call void @test5a(i32* %A) + ret void +; CHECK-LABEL: @test5_addrspacecast( +; CHECK-NEXT: alloca +; CHECK-NEXT: store i32 20 +; CHECK-NEXT: call void @test5a +} diff --git a/test/Transforms/DeadStoreElimination/simple.ll b/test/Transforms/DeadStoreElimination/simple.ll index cdfe2268eff..1e813852b04 100644 --- a/test/Transforms/DeadStoreElimination/simple.ll +++ b/test/Transforms/DeadStoreElimination/simple.ll @@ -172,6 +172,23 @@ define i32* @test13() { ; CHECK-NEXT: call void } +define i32 addrspace(1)* @test13_addrspacecast() { + %p = tail call i8* @malloc(i32 4) + %p.bc = bitcast i8* %p to i32* + %P = addrspacecast i32* %p.bc to i32 addrspace(1)* + %DEAD = load i32 addrspace(1)* %P + %DEAD2 = add i32 %DEAD, 1 + store i32 %DEAD2, i32 addrspace(1)* %P + call void @test13f( ) + store i32 0, i32 addrspace(1)* %P + ret i32 addrspace(1)* %P +; CHECK: @test13_addrspacecast() +; CHECK-NEXT: malloc +; CHECK-NEXT: bitcast +; CHECK-NEXT: addrspacecast +; CHECK-NEXT: call void +} + declare noalias i8* @malloc(i32) declare noalias i8* @calloc(i32, i32)