forked from OSchip/llvm-project
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
This commit is contained in:
parent
7e23b72221
commit
64f1c0dcda
|
@ -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,8 +268,7 @@ 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 (Value *V = SimplifyInstruction(PN, 0, DT)) {
|
||||
if (AA) AA->deleteValue(PN);
|
||||
PN->replaceAllUsesWith(V);
|
||||
PN->eraseFromParent();
|
||||
|
@ -450,8 +448,7 @@ 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)) {
|
||||
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);
|
||||
|
|
|
@ -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