From d9a0db4f6e179a71102f5898e291c1e904cce3cb Mon Sep 17 00:00:00 2001 From: Igor Laevsky Date: Wed, 1 Mar 2017 14:38:29 +0000 Subject: [PATCH] [DeadStoreElimination] Check function modref behavior before considering memory clobbered Differential Revision: https://reviews.llvm.org/D29996 llvm-svn: 296625 --- lib/Transforms/Scalar/DeadStoreElimination.cpp | 2 +- .../DeadStoreElimination/operand-bundles.ll | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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 +}