Skip to content

Commit c6cf63f

Browse files
committed
Adjust resume value of FindLastIV
Use ResumeV = ResumeV == StartValue ? Sentinel : ResumeV to adjust the resume value.
1 parent 1cf21f0 commit c6cf63f

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7687,6 +7687,19 @@ static void fixReductionScalarResumeWhenVectorizingEpilog(
76877687
"AnyOf expected to start by comparing main resume value to original "
76887688
"start value");
76897689
MainResumeValue = Cmp->getOperand(0);
7690+
} else if (RecurrenceDescriptor::isFindLastIVRecurrenceKind(
7691+
RdxDesc.getRecurrenceKind())) {
7692+
using namespace llvm::PatternMatch;
7693+
Value *Cmp, *OrigResumeV;
7694+
bool IsExpectedPattern =
7695+
match(MainResumeValue, m_Select(m_OneUse(m_Value(Cmp)),
7696+
m_Specific(RdxDesc.getSentinelValue()),
7697+
m_Value(OrigResumeV))) &&
7698+
match(Cmp,
7699+
m_SpecificICmp(ICmpInst::ICMP_EQ, m_Specific(OrigResumeV),
7700+
m_Specific(RdxDesc.getRecurrenceStartValue())));
7701+
assert(IsExpectedPattern && "Unexpected reduction resume pattern");
7702+
MainResumeValue = OrigResumeV;
76907703
}
76917704
PHINode *MainResumePhi = cast<PHINode>(MainResumeValue);
76927705

@@ -10282,6 +10295,19 @@ preparePlanForEpilogueVectorLoop(VPlan &Plan, Loop *L,
1028210295
cast<Instruction>(ResumeV)->getParent()->getFirstNonPHI());
1028310296
ResumeV =
1028410297
Builder.CreateICmpNE(ResumeV, RdxDesc.getRecurrenceStartValue());
10298+
} else if (RecurrenceDescriptor::isFindLastIVRecurrenceKind(RK)) {
10299+
// VPReductionPHIRecipe for FindLastIV reductions requires an adjustment
10300+
// to the resume value. The resume value is adjusted to the sentinel
10301+
// value when the final value from the main vector loop equals the start
10302+
// value. This ensures correctness when the start value might not be
10303+
// less than the minimum value of a monotonically increasing induction
10304+
// variable.
10305+
IRBuilder<> Builder(
10306+
cast<Instruction>(ResumeV)->getParent()->getFirstNonPHI());
10307+
Value *Cmp =
10308+
Builder.CreateICmpEQ(ResumeV, RdxDesc.getRecurrenceStartValue());
10309+
ResumeV =
10310+
Builder.CreateSelect(Cmp, RdxDesc.getSentinelValue(), ResumeV);
1028510311
}
1028610312
} else {
1028710313
// Retrieve the induction resume values for wide inductions from

llvm/test/Transforms/LoopVectorize/epilog-iv-select-cmp.ll

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ define i64 @select_icmp_const(ptr %a, i64 %n) {
4040
; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label %[[VEC_EPILOG_SCALAR_PH]], label %[[VEC_EPILOG_PH]]
4141
; CHECK: [[VEC_EPILOG_PH]]:
4242
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
43-
; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi i64 [ [[RDX_SELECT]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 3, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
43+
; CHECK-NEXT: [[BC_MERGE_RDX1:%.*]] = phi i64 [ [[RDX_SELECT]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 3, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
44+
; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[BC_MERGE_RDX1]], 3
45+
; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = select i1 [[TMP14]], i64 -9223372036854775808, i64 [[BC_MERGE_RDX1]]
4446
; CHECK-NEXT: [[N_MOD_VF2:%.*]] = urem i64 [[N]], 4
4547
; CHECK-NEXT: [[N_VEC3:%.*]] = sub i64 [[N]], [[N_MOD_VF2]]
4648
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[BC_RESUME_VAL]], i64 0
@@ -144,7 +146,9 @@ define i64 @select_fcmp_const_fast(ptr %a, i64 %n) {
144146
; CHECK-NEXT: br i1 [[MIN_EPILOG_ITERS_CHECK]], label %[[VEC_EPILOG_SCALAR_PH]], label %[[VEC_EPILOG_PH]]
145147
; CHECK: [[VEC_EPILOG_PH]]:
146148
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 0, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
147-
; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = phi i64 [ [[RDX_SELECT]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 2, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
149+
; CHECK-NEXT: [[BC_MERGE_RDX1:%.*]] = phi i64 [ [[RDX_SELECT]], %[[VEC_EPILOG_ITER_CHECK]] ], [ 2, %[[VECTOR_MAIN_LOOP_ITER_CHECK]] ]
150+
; CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[BC_MERGE_RDX1]], 2
151+
; CHECK-NEXT: [[BC_MERGE_RDX:%.*]] = select i1 [[TMP14]], i64 -9223372036854775808, i64 [[BC_MERGE_RDX1]]
148152
; CHECK-NEXT: [[N_MOD_VF2:%.*]] = urem i64 [[N]], 4
149153
; CHECK-NEXT: [[N_VEC3:%.*]] = sub i64 [[N]], [[N_MOD_VF2]]
150154
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i64> poison, i64 [[BC_RESUME_VAL]], i64 0

0 commit comments

Comments
 (0)