summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Laevsky <igmyrj@gmail.com>2017-03-01 14:38:29 +0000
committerIgor Laevsky <igmyrj@gmail.com>2017-03-01 14:38:29 +0000
commitb40152d5d195f965dd4f397c3770afe13117d9e5 (patch)
tree439b952d45427f60071c3aa8c3ef9869127f7000
parentfc261240b213278e77bceee2b02ed579f4ab6a8e (diff)
downloadbcm5719-llvm-b40152d5d195f965dd4f397c3770afe13117d9e5.tar.gz
bcm5719-llvm-b40152d5d195f965dd4f397c3770afe13117d9e5.zip
[DeadStoreElimination] Check function modref behavior before considering memory clobbered
Differential Revision: https://reviews.llvm.org/D29996 llvm-svn: 296625
-rw-r--r--llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp2
-rw-r--r--llvm/test/Transforms/DeadStoreElimination/operand-bundles.ll12
2 files changed, 13 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
index c3c0295bee5..53590175be8 100644
--- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -551,7 +551,7 @@ static bool memoryIsNotModifiedBetween(Instruction *FirstI,
Instruction *I = &*BI;
if (I->mayWriteToMemory() && I != SecondI) {
auto Res = AA->getModRefInfo(I, MemLoc);
- if (Res != MRI_NoModRef)
+ if (Res & MRI_Mod)
return false;
}
}
diff --git a/llvm/test/Transforms/DeadStoreElimination/operand-bundles.ll b/llvm/test/Transforms/DeadStoreElimination/operand-bundles.ll
index d71b9673ed1..784b2e8e55f 100644
--- a/llvm/test/Transforms/DeadStoreElimination/operand-bundles.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/operand-bundles.ll
@@ -41,3 +41,15 @@ define void @test3() {
store i64 0, i64* %s
ret void
}
+
+declare noalias i8* @calloc(i64, i64)
+
+define void @test4() {
+; CHECK-LABEL: @test4
+ %local_obj = call i8* @calloc(i64 1, i64 4)
+ call void @foo() ["deopt" (i8* %local_obj)]
+ store i8 0, i8* %local_obj, align 4
+ ; CHECK-NOT: store i8 0, i8* %local_obj, align 4
+ call void @bar(i8* nocapture %local_obj)
+ ret void
+}
OpenPOWER on IntegriCloud