mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-03 01:12:59 +00:00
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:
parent
86a582ddfb
commit
67fb341f8b
@ -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)
|
||||
|
43
test/Transforms/LoopSimplify/2010-12-26-PHIInfiniteLoop.ll
Normal file
43
test/Transforms/LoopSimplify/2010-12-26-PHIInfiniteLoop.ll
Normal 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
|
Loading…
Reference in New Issue
Block a user