mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-04 00:29:28 +00:00
[LoopUtils, LV] Fix PR27246 (first-order recurrences)
This patch ensures that when we detect first-order recurrences, we reject a phi node if its previous value is also a phi node. During vectorization the initial and previous values of the recurrence are shuffled together to create the value for the current iteration. However, phi nodes are not widened like other instructions. This fixes PR27246. Differential Revision: http://reviews.llvm.org/D18971 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265983 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e09329d549
commit
09e9ded8a1
@ -541,7 +541,7 @@ bool RecurrenceDescriptor::isFirstOrderRecurrence(PHINode *Phi, Loop *TheLoop,
|
||||
// Get the previous value. The previous value comes from the latch edge while
|
||||
// the initial value comes form the preheader edge.
|
||||
auto *Previous = dyn_cast<Instruction>(Phi->getIncomingValueForBlock(Latch));
|
||||
if (!Previous || !TheLoop->contains(Previous))
|
||||
if (!Previous || !TheLoop->contains(Previous) || isa<PHINode>(Previous))
|
||||
return false;
|
||||
|
||||
// Ensure every user of the phi node is dominated by the previous value. The
|
||||
|
@ -256,3 +256,44 @@ for.cond.for.end_crit_edge:
|
||||
for.end:
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @PR27246
|
||||
;
|
||||
; int PR27246() {
|
||||
; unsigned int e, n;
|
||||
; for (int i = 1; i < 49; ++i) {
|
||||
; for (int k = i; k > 1; --k)
|
||||
; e = k;
|
||||
; n = e;
|
||||
; }
|
||||
; return n;
|
||||
; }
|
||||
;
|
||||
; CHECK-NOT: vector.ph:
|
||||
;
|
||||
define i32 @PR27246() {
|
||||
entry:
|
||||
br label %for.cond1.preheader
|
||||
|
||||
for.cond1.preheader:
|
||||
%i.016 = phi i32 [ 1, %entry ], [ %inc, %for.cond.cleanup3 ]
|
||||
%e.015 = phi i32 [ undef, %entry ], [ %e.1.lcssa, %for.cond.cleanup3 ]
|
||||
br label %for.cond1
|
||||
|
||||
for.cond.cleanup:
|
||||
%e.1.lcssa.lcssa = phi i32 [ %e.1.lcssa, %for.cond.cleanup3 ]
|
||||
ret i32 %e.1.lcssa.lcssa
|
||||
|
||||
for.cond1:
|
||||
%e.1 = phi i32 [ %k.0, %for.cond1 ], [ %e.015, %for.cond1.preheader ]
|
||||
%k.0 = phi i32 [ %dec, %for.cond1 ], [ %i.016, %for.cond1.preheader ]
|
||||
%cmp2 = icmp sgt i32 %k.0, 1
|
||||
%dec = add nsw i32 %k.0, -1
|
||||
br i1 %cmp2, label %for.cond1, label %for.cond.cleanup3
|
||||
|
||||
for.cond.cleanup3:
|
||||
%e.1.lcssa = phi i32 [ %e.1, %for.cond1 ]
|
||||
%inc = add nuw nsw i32 %i.016, 1
|
||||
%exitcond = icmp eq i32 %inc, 49
|
||||
br i1 %exitcond, label %for.cond.cleanup, label %for.cond1.preheader
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user