From: Igor Laevsky Date: Wed, 1 Mar 2017 14:38:29 +0000 (+0000) Subject: [DeadStoreElimination] Check function modref behavior before considering memory clobbered X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f789f6f9d7f0da077715fc9f409d65690f920a1f;p=llvm [DeadStoreElimination] Check function modref behavior before considering memory clobbered Differential Revision: https://reviews.llvm.org/D29996 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296625 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index c3c0295bee5..53590175be8 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/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/test/Transforms/DeadStoreElimination/operand-bundles.ll b/test/Transforms/DeadStoreElimination/operand-bundles.ll index d71b9673ed1..784b2e8e55f 100644 --- a/test/Transforms/DeadStoreElimination/operand-bundles.ll +++ b/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 +}