From 2764f3ded3dc2a4e1a8d1b07ae3ec2fa1ca4b14b Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 6 Aug 2014 19:30:38 +0000 Subject: [PATCH] Revert "r214897 - Remove dead zero store to calloc initialized memory" It broke msan. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214989 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/DeadStoreElimination.cpp | 50 ++++++------------- .../DeadStoreElimination/calloc-store.ll | 17 ------- 2 files changed, 15 insertions(+), 52 deletions(-) delete mode 100644 test/Transforms/DeadStoreElimination/calloc-store.ll diff --git a/lib/Transforms/Scalar/DeadStoreElimination.cpp b/lib/Transforms/Scalar/DeadStoreElimination.cpp index b8cd38bd6fc..3af8ee7546f 100644 --- a/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/lib/Transforms/Scalar/DeadStoreElimination.cpp @@ -514,49 +514,29 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) { if (!InstDep.isDef() && !InstDep.isClobber()) continue; - // Check for cases where the store is redundant. + // If we're storing the same value back to a pointer that we just + // loaded from, then the store can be removed. if (StoreInst *SI = dyn_cast(Inst)) { - bool DeleteStore = false; - // If we're storing the same value back to a pointer that we just - // loaded from, then the store can be removed. if (LoadInst *DepLoad = dyn_cast(InstDep.getInst())) { if (SI->getPointerOperand() == DepLoad->getPointerOperand() && SI->getOperand(0) == DepLoad && isRemovable(SI)) { DEBUG(dbgs() << "DSE: Remove Store Of Load from same pointer:\n " << "LOAD: " << *DepLoad << "\n STORE: " << *SI << '\n'); - DeleteStore = true; - } - } - // If we find a store to memory which was defined by calloc - // we can remove the store if the value being stored is a - // constant zero (since calloc initialized the memory to - // that same value) or the store is undefined (if out of - // bounds). - if (isCallocLikeFn(InstDep.getInst(), TLI) && isRemovable(SI)) { - Value *V = SI->getValueOperand(); - if (isa(V) && cast(V)->isNullValue()) { - DEBUG(dbgs() << "DSE: Remove Store Of Zero to Calloc:\n " - << "CALLOC: " << *InstDep.getInst() << "\n" - << "STORE: " << *SI << '\n'); - DeleteStore = true; - } - } + // DeleteDeadInstruction can delete the current instruction. Save BBI + // in case we need it. + WeakVH NextInst(BBI); - if (DeleteStore) { - // DeleteDeadInstruction can delete the current instruction. Save BBI - // in case we need it. - WeakVH NextInst(BBI); - - DeleteDeadInstruction(SI, *MD, TLI); - - if (!NextInst) // Next instruction deleted. - BBI = BB.begin(); - else if (BBI != BB.begin()) // Revisit this instruction if possible. - --BBI; - ++NumFastStores; - MadeChange = true; - continue; + DeleteDeadInstruction(SI, *MD, TLI); + + if (!NextInst) // Next instruction deleted. + BBI = BB.begin(); + else if (BBI != BB.begin()) // Revisit this instruction if possible. + --BBI; + ++NumFastStores; + MadeChange = true; + continue; + } } } diff --git a/test/Transforms/DeadStoreElimination/calloc-store.ll b/test/Transforms/DeadStoreElimination/calloc-store.ll deleted file mode 100644 index 32b62a0bf17..00000000000 --- a/test/Transforms/DeadStoreElimination/calloc-store.ll +++ /dev/null @@ -1,17 +0,0 @@ -; RUN: opt < %s -basicaa -dse -S | FileCheck %s - -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" - -; Function Attrs: nounwind -declare noalias i8* @calloc(i64, i64) - -; Function Attrs: nounwind uwtable -define noalias i32* @test_store() { -; CHECK-LABEL: test_store - %1 = tail call noalias i8* @calloc(i64 1, i64 4) - %2 = bitcast i8* %1 to i32* - ; This store is dead and should be removed - store i32 0, i32* %2, align 4 -; CHECK-NOT: store i32 0, i32* %2, align 4 - ret i32* %2 -} -- 2.34.1