summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2011-01-02 13:38:21 +0000
committerDuncan Sands <baldrick@free.fr>2011-01-02 13:38:21 +0000
commit64f1c0dcda41011f76ed66b5eb986d2d7a161a4e (patch)
tree653731707fc80fbb972d0692df287225d9d09a11
parent7e23b72221ec6fac8cf97600c94067f568d67415 (diff)
downloadbcm5719-llvm-64f1c0dcda41011f76ed66b5eb986d2d7a161a4e.tar.gz
bcm5719-llvm-64f1c0dcda41011f76ed66b5eb986d2d7a161a4e.zip
Fix PR8702 by not having LoopSimplify claim to preserve LCSSA form. As described
in the PR, the pass could break LCSSA form when inserting preheaders. It probably would be easy enough to fix this, but since currently we always go into LCSSA form after running this pass, doing so is not urgent. llvm-svn: 122695
-rw-r--r--llvm/lib/Transforms/Utils/LoopSimplify.cpp27
-rw-r--r--llvm/test/Transforms/LoopSimplify/2010-12-26-PHIInfiniteLoop.ll43
2 files changed, 55 insertions, 15 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopSimplify.cpp b/llvm/lib/Transforms/Utils/LoopSimplify.cpp
index f77a58300f4..2e5b1136586 100644
--- a/llvm/lib/Transforms/Utils/LoopSimplify.cpp
+++ b/llvm/lib/Transforms/Utils/LoopSimplify.cpp
@@ -91,7 +91,6 @@ namespace {
AU.addPreserved<ScalarEvolution>();
AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added.
AU.addPreserved<DominanceFrontier>();
- AU.addPreservedID(LCSSAID);
}
/// verifyAnalysis() - Verify LoopSimplifyForm's guarantees.
@@ -269,12 +268,11 @@ ReprocessLoop:
PHINode *PN;
for (BasicBlock::iterator I = L->getHeader()->begin();
(PN = dyn_cast<PHINode>(I++)); )
- if (Value *V = SimplifyInstruction(PN, 0, DT))
- if (LI->replacementPreservesLCSSAForm(PN, V)) {
- if (AA) AA->deleteValue(PN);
- PN->replaceAllUsesWith(V);
- PN->eraseFromParent();
- }
+ if (Value *V = SimplifyInstruction(PN, 0, DT)) {
+ if (AA) AA->deleteValue(PN);
+ PN->replaceAllUsesWith(V);
+ PN->eraseFromParent();
+ }
// If this loop has multiple exits and the exits all go to the same
// block, attempt to merge the exits. This helps several passes, such
@@ -450,14 +448,13 @@ static PHINode *FindPHIToPartitionLoops(Loop *L, DominatorTree *DT,
for (BasicBlock::iterator I = L->getHeader()->begin(); isa<PHINode>(I); ) {
PHINode *PN = cast<PHINode>(I);
++I;
- if (Value *V = SimplifyInstruction(PN, 0, DT))
- if (LI->replacementPreservesLCSSAForm(PN, V)) {
- // This is a degenerate PHI already, don't modify it!
- PN->replaceAllUsesWith(V);
- if (AA) AA->deleteValue(PN);
- PN->eraseFromParent();
- continue;
- }
+ if (Value *V = SimplifyInstruction(PN, 0, DT)) {
+ // This is a degenerate PHI already, don't modify it!
+ PN->replaceAllUsesWith(V);
+ if (AA) AA->deleteValue(PN);
+ PN->eraseFromParent();
+ continue;
+ }
// Scan this PHI node looking for a use of the PHI node by itself.
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
diff --git a/llvm/test/Transforms/LoopSimplify/2010-12-26-PHIInfiniteLoop.ll b/llvm/test/Transforms/LoopSimplify/2010-12-26-PHIInfiniteLoop.ll
new file mode 100644
index 00000000000..4973d43b451
--- /dev/null
+++ b/llvm/test/Transforms/LoopSimplify/2010-12-26-PHIInfiniteLoop.ll
@@ -0,0 +1,43 @@
+; RUN: opt < %s -loopsimplify -S
+; PR8702
+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"
+target triple = "x86_64-unknown-freebsd9.0"
+
+declare void @foo(i32 %x)
+
+define fastcc void @inm_merge() nounwind {
+entry:
+ br label %for.cond
+
+for.cond: ; preds = %while.cond36.i, %entry
+ br i1 undef, label %do.body, label %for.body
+
+for.body: ; preds = %for.cond
+ br i1 undef, label %while.cond36.i, label %if.end44
+
+if.end44: ; preds = %for.body
+ %call49 = call fastcc i32 @inm_get_source()
+ br i1 undef, label %if.end54, label %for.cond64
+
+if.end54: ; preds = %if.end44
+ br label %while.cond36.i
+
+while.cond36.i: ; preds = %if.end54, %for.body
+ br label %for.cond
+
+for.cond64: ; preds = %if.end88, %for.cond64, %if.end44
+ %error.161 = phi i32 [ %error.161, %for.cond64 ], [ %error.161, %if.end88 ], [ %call49, %if.end44 ]
+ call void @foo(i32 %error.161)
+ br i1 undef, label %for.cond64, label %if.end88
+
+if.end88: ; preds = %for.cond64
+ br i1 undef, label %for.cond64, label %if.end98
+
+if.end98: ; preds = %if.end88
+ unreachable
+
+do.body: ; preds = %for.cond
+ unreachable
+}
+
+declare fastcc i32 @inm_get_source() nounwind
OpenPOWER on IntegriCloud