mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-24 04:32:09 +00:00
LoopVectorize: Handle single edge PHIs
We might encouter single edge PHIs - handle them with an identity select. Fixes PR15990. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182199 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
edc399aceb
commit
688b5103eb
@ -2105,7 +2105,6 @@ InnerLoopVectorizer::vectorizeBlockInLoop(LoopVectorizationLegality *Legal,
|
|||||||
// optimizations will clean it up.
|
// optimizations will clean it up.
|
||||||
|
|
||||||
unsigned NumIncoming = P->getNumIncomingValues();
|
unsigned NumIncoming = P->getNumIncomingValues();
|
||||||
assert(NumIncoming > 1 && "Invalid PHI");
|
|
||||||
|
|
||||||
// Generate a sequence of selects of the form:
|
// Generate a sequence of selects of the form:
|
||||||
// SELECT(Mask3, In3,
|
// SELECT(Mask3, In3,
|
||||||
@ -2117,10 +2116,11 @@ InnerLoopVectorizer::vectorizeBlockInLoop(LoopVectorizationLegality *Legal,
|
|||||||
VectorParts &In0 = getVectorValue(P->getIncomingValue(In));
|
VectorParts &In0 = getVectorValue(P->getIncomingValue(In));
|
||||||
|
|
||||||
for (unsigned part = 0; part < UF; ++part) {
|
for (unsigned part = 0; part < UF; ++part) {
|
||||||
// We don't need to 'select' the first PHI operand because it is
|
// We might have single edge PHIs (blocks) - use an identity
|
||||||
// the default value if all of the other masks don't match.
|
// 'select' for the first PHI operand.
|
||||||
if (In == 0)
|
if (In == 0)
|
||||||
Entry[part] = In0[part];
|
Entry[part] = Builder.CreateSelect(Cond[part], In0[part],
|
||||||
|
In0[part]);
|
||||||
else
|
else
|
||||||
// Select between the current value and the previous incoming edge
|
// Select between the current value and the previous incoming edge
|
||||||
// based on the incoming mask.
|
// based on the incoming mask.
|
||||||
|
@ -37,3 +37,25 @@ if.end21: ; preds = %lor.lhs.false
|
|||||||
if.end25: ; preds = %entry
|
if.end25: ; preds = %entry
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; PR15990
|
||||||
|
; We can have basic blocks with single entry PHI nodes.
|
||||||
|
define void @single_entry_phi(i32* %a, i32 *%b) {
|
||||||
|
entry:
|
||||||
|
br label %for.cond1.preheader
|
||||||
|
|
||||||
|
for.cond1.preheader:
|
||||||
|
%inc10 = phi i32 [ 0, %entry ], [ %inc, %for.end ]
|
||||||
|
br label %for.end
|
||||||
|
|
||||||
|
for.end:
|
||||||
|
%malicious.phi = phi i32 [ 0, %for.cond1.preheader ]
|
||||||
|
%inc = add nsw i32 %inc10, 1
|
||||||
|
%tobool = icmp eq i32 %inc, 0
|
||||||
|
br i1 %tobool, label %for.cond.for.end5, label %for.cond1.preheader
|
||||||
|
|
||||||
|
for.cond.for.end5:
|
||||||
|
%and.lcssa = phi i32 [ %malicious.phi, %for.end ]
|
||||||
|
store i32 %and.lcssa, i32* %a, align 4
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user