]> granicus.if.org Git - llvm/commitdiff
[DeadStoreElimination] Check function modref behavior before considering memory clobbered
authorIgor Laevsky <igmyrj@gmail.com>
Wed, 1 Mar 2017 14:38:29 +0000 (14:38 +0000)
committerIgor Laevsky <igmyrj@gmail.com>
Wed, 1 Mar 2017 14:38:29 +0000 (14:38 +0000)
Differential Revision: https://reviews.llvm.org/D29996

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296625 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/DeadStoreElimination.cpp
test/Transforms/DeadStoreElimination/operand-bundles.ll

index c3c0295bee569e3c3c65e4265e1fb99a80752d21..53590175be8ecb91af3191d661299fb7100382f1 100644 (file)
@@ -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;
       }
     }
index d71b9673ed1d7e65f97f793d4b337f40dbb96d5f..784b2e8e55f79b9a64cfd805d2a8329bac755a1b 100644 (file)
@@ -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
+}