mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
LoopVectorizer: Fix an endless loop in the code that looks for reductions.
The bug was in the code that detects PHIs in if-then-else block sequence. PR14701. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171008 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a048c237e6
commit
470ea9b72f
@ -1737,10 +1737,9 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi,
|
||||
Instruction *ExitInstruction = 0;
|
||||
|
||||
// Iter is our iterator. We start with the PHI node and scan for all of the
|
||||
// users of this instruction. All users must be instructions which can be
|
||||
// users of this instruction. All users must be instructions that can be
|
||||
// used as reduction variables (such as ADD). We may have a single
|
||||
// out-of-block user. They cycle must end with the original PHI.
|
||||
// Also, we can't have multiple block-local users.
|
||||
// out-of-block user. The cycle must end with the original PHI.
|
||||
Instruction *Iter = Phi;
|
||||
while (true) {
|
||||
// If the instruction has no users then this is a broken
|
||||
@ -1752,9 +1751,9 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi,
|
||||
if (!isReductionInstr(Iter, Kind))
|
||||
return false;
|
||||
|
||||
// Did we find a user inside this block ?
|
||||
// Did we find a user inside this loop already ?
|
||||
bool FoundInBlockUser = false;
|
||||
// Did we reach the initial PHI node ?
|
||||
// Did we reach the initial PHI node already ?
|
||||
bool FoundStartPHI = false;
|
||||
|
||||
// For each of the *users* of iter.
|
||||
@ -1779,8 +1778,10 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi,
|
||||
// We allow in-loop PHINodes which are not the original reduction PHI
|
||||
// node. If this PHI is the only user of Iter (happens in IF w/ no ELSE
|
||||
// structure) then don't skip this PHI.
|
||||
if (isa<PHINode>(U) && U->getParent() != TheLoop->getHeader() &&
|
||||
TheLoop->contains(U) && Iter->getNumUses() > 1)
|
||||
if (isa<PHINode>(Iter) && isa<PHINode>(U) &&
|
||||
U->getParent() != TheLoop->getHeader() &&
|
||||
TheLoop->contains(U) &&
|
||||
Iter->getNumUses() > 1)
|
||||
continue;
|
||||
|
||||
// We can't have multiple inside users.
|
||||
|
@ -25,3 +25,47 @@ for.body: ; preds = %for.body, %entry
|
||||
for.end: ; preds = %for.body
|
||||
unreachable
|
||||
}
|
||||
|
||||
;PR14701
|
||||
define void @start_model_rare() nounwind uwtable ssp {
|
||||
entry:
|
||||
br i1 undef, label %return, label %if.end
|
||||
|
||||
if.end: ; preds = %entry
|
||||
br i1 undef, label %cond.false, label %cond.true
|
||||
|
||||
cond.true: ; preds = %if.end
|
||||
unreachable
|
||||
|
||||
cond.false: ; preds = %if.end
|
||||
br i1 undef, label %cond.false28, label %cond.true20
|
||||
|
||||
cond.true20: ; preds = %cond.false
|
||||
unreachable
|
||||
|
||||
cond.false28: ; preds = %cond.false
|
||||
br label %for.body40
|
||||
|
||||
for.body40: ; preds = %for.inc50, %cond.false28
|
||||
%indvars.iv123 = phi i64 [ 3, %cond.false28 ], [ %indvars.iv.next124, %for.inc50 ]
|
||||
%step.0121 = phi i32 [ 1, %cond.false28 ], [ %step.1, %for.inc50 ]
|
||||
br i1 undef, label %if.then46, label %for.inc50
|
||||
|
||||
if.then46: ; preds = %for.body40
|
||||
%inc47 = add nsw i32 %step.0121, 1
|
||||
br label %for.inc50
|
||||
|
||||
for.inc50: ; preds = %if.then46, %for.body40
|
||||
%k.1 = phi i32 [ undef, %for.body40 ], [ %inc47, %if.then46 ]
|
||||
%step.1 = phi i32 [ %step.0121, %for.body40 ], [ %inc47, %if.then46 ]
|
||||
%indvars.iv.next124 = add i64 %indvars.iv123, 1
|
||||
%lftr.wideiv = trunc i64 %indvars.iv.next124 to i32
|
||||
%exitcond = icmp eq i32 %lftr.wideiv, 256
|
||||
br i1 %exitcond, label %for.end52, label %for.body40
|
||||
|
||||
for.end52: ; preds = %for.inc50
|
||||
unreachable
|
||||
|
||||
return: ; preds = %entry
|
||||
ret void
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user