Skip to content

Commit bc0c4db

Browse files
authored
[SCEV] Add dedicated AffineAddRec matcher + loop matchers (NFC). (#141141)
Add dedicated m_scev_AffineAddRec matcher with complementing m_Loop() and m_SpecificLoop matchers. PR: #141141
1 parent 1593bf4 commit bc0c4db

File tree

4 files changed

+49
-12
lines changed

4 files changed

+49
-12
lines changed

llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,48 @@ m_scev_UDiv(const Op0_t &Op0, const Op1_t &Op1) {
196196
return m_scev_Binary<SCEVUDivExpr>(Op0, Op1);
197197
}
198198

199+
inline class_match<const Loop> m_Loop() { return class_match<const Loop>(); }
200+
201+
/// Match an affine SCEVAddRecExpr.
202+
template <typename Op0_t, typename Op1_t, typename Loop_t>
203+
struct SCEVAffineAddRec_match {
204+
SCEVBinaryExpr_match<SCEVAddRecExpr, Op0_t, Op1_t> Ops;
205+
Loop_t Loop;
206+
207+
SCEVAffineAddRec_match(Op0_t Op0, Op1_t Op1, Loop_t Loop)
208+
: Ops(Op0, Op1), Loop(Loop) {}
209+
210+
bool match(const SCEV *S) const {
211+
return Ops.match(S) && Loop.match(cast<SCEVAddRecExpr>(S)->getLoop());
212+
}
213+
};
214+
215+
/// Match a specified const Loop*.
216+
struct specificloop_ty {
217+
const Loop *L;
218+
219+
specificloop_ty(const Loop *L) : L(L) {}
220+
221+
bool match(const Loop *L) const { return L == this->L; }
222+
};
223+
224+
inline specificloop_ty m_SpecificLoop(const Loop *L) { return L; }
225+
226+
inline bind_ty<const Loop> m_Loop(const Loop *&L) { return L; }
227+
199228
template <typename Op0_t, typename Op1_t>
200-
inline SCEVBinaryExpr_match<SCEVAddRecExpr, Op0_t, Op1_t>
229+
inline SCEVAffineAddRec_match<Op0_t, Op1_t, class_match<const Loop>>
201230
m_scev_AffineAddRec(const Op0_t &Op0, const Op1_t &Op1) {
202-
return m_scev_Binary<SCEVAddRecExpr>(Op0, Op1);
231+
return SCEVAffineAddRec_match<Op0_t, Op1_t, class_match<const Loop>>(
232+
Op0, Op1, m_Loop());
233+
}
234+
235+
template <typename Op0_t, typename Op1_t, typename Loop_t>
236+
inline SCEVAffineAddRec_match<Op0_t, Op1_t, Loop_t>
237+
m_scev_AffineAddRec(const Op0_t &Op0, const Op1_t &Op1, const Loop_t &L) {
238+
return SCEVAffineAddRec_match<Op0_t, Op1_t, Loop_t>(Op0, Op1, L);
203239
}
240+
204241
} // namespace SCEVPatternMatch
205242
} // namespace llvm
206243

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12530,14 +12530,14 @@ static bool IsKnownPredicateViaAddRecStart(ScalarEvolution &SE,
1253012530
return false;
1253112531

1253212532
const SCEV *LStart, *RStart, *Step;
12533-
if (!match(LHS, m_scev_AffineAddRec(m_SCEV(LStart), m_SCEV(Step))) ||
12534-
!match(RHS, m_scev_AffineAddRec(m_SCEV(RStart), m_scev_Specific(Step))))
12533+
const Loop *L;
12534+
if (!match(LHS,
12535+
m_scev_AffineAddRec(m_SCEV(LStart), m_SCEV(Step), m_Loop(L))) ||
12536+
!match(RHS, m_scev_AffineAddRec(m_SCEV(RStart), m_scev_Specific(Step),
12537+
m_SpecificLoop(L))))
1253512538
return false;
1253612539
const SCEVAddRecExpr *LAR = cast<SCEVAddRecExpr>(LHS);
1253712540
const SCEVAddRecExpr *RAR = cast<SCEVAddRecExpr>(RHS);
12538-
if (LAR->getLoop() != RAR->getLoop())
12539-
return false;
12540-
1254112541
SCEV::NoWrapFlags NW = ICmpInst::isSigned(Pred) ?
1254212542
SCEV::FlagNSW : SCEV::FlagNUW;
1254312543
if (!LAR->getNoWrapFlags(NW) || !RAR->getNoWrapFlags(NW))

llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -808,8 +808,7 @@ static bool isLoopCounter(PHINode* Phi, Loop *L,
808808
return false;
809809

810810
const SCEV *S = SE->getSCEV(Phi);
811-
if (!match(S, m_scev_AffineAddRec(m_SCEV(), m_scev_One())) ||
812-
cast<SCEVAddRecExpr>(S)->getLoop() != L)
811+
if (!match(S, m_scev_AffineAddRec(m_SCEV(), m_scev_One(), m_SpecificLoop(L))))
813812
return false;
814813

815814
int LatchIdx = Phi->getBasicBlockIndex(L->getLoopLatch());

llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -556,13 +556,14 @@ static void DoInitialMatch(const SCEV *S, Loop *L,
556556

557557
// Look at addrec operands.
558558
const SCEV *Start, *Step;
559-
if (match(S, m_scev_AffineAddRec(m_SCEV(Start), m_SCEV(Step))) &&
559+
const Loop *ARLoop;
560+
if (match(S,
561+
m_scev_AffineAddRec(m_SCEV(Start), m_SCEV(Step), m_Loop(ARLoop))) &&
560562
!Start->isZero()) {
561563
DoInitialMatch(Start, L, Good, Bad, SE);
562564
DoInitialMatch(SE.getAddRecExpr(SE.getConstant(S->getType(), 0), Step,
563565
// FIXME: AR->getNoWrapFlags()
564-
cast<SCEVAddRecExpr>(S)->getLoop(),
565-
SCEV::FlagAnyWrap),
566+
ARLoop, SCEV::FlagAnyWrap),
566567
L, Good, Bad, SE);
567568
return;
568569
}

0 commit comments

Comments
 (0)