summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2017-11-20 18:33:38 +0000
committerTeresa Johnson <tejohnson@google.com>2017-11-20 18:33:38 +0000
commit3309002a868382abc57804507a92be4d5c400c6d (patch)
tree2844729d23f5872375e2a70278581b28305662f9 /llvm/lib
parent37d3288cf53deb53f2ef0c3f04d513b650f8036d (diff)
downloadbcm5719-llvm-3309002a868382abc57804507a92be4d5c400c6d.tar.gz
bcm5719-llvm-3309002a868382abc57804507a92be4d5c400c6d.zip
[SROA] Correctly invalidate analyses when dead instructions deleted
Summary: SROA can fail in rewriting alloca but still rewrite a phi resulting in dead instruction elimination. The Changed flag was not being set correctly, resulting in downstream passes using stale analyses. The included test case will assert during the second BDCE pass as a result. Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D39921 llvm-svn: 318677
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Scalar/SROA.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp
index 6de6c8cce2c..2d668f940fb 100644
--- a/llvm/lib/Transforms/Scalar/SROA.cpp
+++ b/llvm/lib/Transforms/Scalar/SROA.cpp
@@ -4243,8 +4243,9 @@ bool SROA::runOnAlloca(AllocaInst &AI) {
///
/// We also record the alloca instructions deleted here so that they aren't
/// subsequently handed to mem2reg to promote.
-void SROA::deleteDeadInstructions(
+bool SROA::deleteDeadInstructions(
SmallPtrSetImpl<AllocaInst *> &DeletedAllocas) {
+ bool Changed = false;
while (!DeadInsts.empty()) {
Instruction *I = DeadInsts.pop_back_val();
DEBUG(dbgs() << "Deleting dead instruction: " << *I << "\n");
@@ -4270,7 +4271,9 @@ void SROA::deleteDeadInstructions(
++NumDeleted;
I->eraseFromParent();
+ Changed = true;
}
+ return Changed;
}
/// \brief Promote the allocas, using the best available technique.
@@ -4312,7 +4315,7 @@ PreservedAnalyses SROA::runImpl(Function &F, DominatorTree &RunDT,
do {
while (!Worklist.empty()) {
Changed |= runOnAlloca(*Worklist.pop_back_val());
- deleteDeadInstructions(DeletedAllocas);
+ Changed |= deleteDeadInstructions(DeletedAllocas);
// Remove the deleted allocas from various lists so that we don't try to
// continue processing them.
OpenPOWER on IntegriCloud