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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122695 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands 2011-01-02 13:38:21 +00:00
parent 86a582ddfb
commit 67fb341f8b
2 changed files with 55 additions and 15 deletions

View File

@ -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)

View File

@ -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