diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2023-01-22 01:09:13 +0300 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2023-01-22 01:15:27 +0300 |
commit | ab06a74738c661230b5f26675ab8e3a188f5ac4b (patch) | |
tree | f655601e532d0e6d8adc49e51a77bba05630e7ed /llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp | |
parent | 5638156a1ccf89a15c31497500986c7d9b45991b (diff) | |
download | llvm-ab06a74738c661230b5f26675ab8e3a188f5ac4b.zip llvm-ab06a74738c661230b5f26675ab8e3a188f5ac4b.tar.gz llvm-ab06a74738c661230b5f26675ab8e3a188f5ac4b.tar.bz2 |
[NFC][SCEV] Reflow `getRelevantLoop()` into an exhaustive switch
Diffstat (limited to 'llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp index c027638..abb1496 100644 --- a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp +++ b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp @@ -678,16 +678,32 @@ const Loop *SCEVExpander::getRelevantLoop(const SCEV *S) { if (!Pair.second) return Pair.first->second; - if (isa<SCEVConstant>(S)) - // A constant has no relevant loops. - return nullptr; - if (const SCEVUnknown *U = dyn_cast<SCEVUnknown>(S)) { - if (const Instruction *I = dyn_cast<Instruction>(U->getValue())) - return Pair.first->second = SE.LI.getLoopFor(I->getParent()); - // A non-instruction has no relevant loops. - return nullptr; + switch (S->getSCEVType()) { + case scConstant: + return nullptr; // A constant has no relevant loops. + case scTruncate: + case scZeroExtend: + case scSignExtend: + case scPtrToInt: { + const SCEVCastExpr *C = cast<SCEVCastExpr>(S); + const Loop *Result = getRelevantLoop(C->getOperand()); + return RelevantLoops[C] = Result; + } + case scUDivExpr: { + const SCEVUDivExpr *D = cast<SCEVUDivExpr>(S); + const Loop *Result = PickMostRelevantLoop( + getRelevantLoop(D->getLHS()), getRelevantLoop(D->getRHS()), SE.DT); + return RelevantLoops[D] = Result; } - if (const SCEVNAryExpr *N = dyn_cast<SCEVNAryExpr>(S)) { + case scAddExpr: + case scMulExpr: + case scAddRecExpr: + case scUMaxExpr: + case scSMaxExpr: + case scUMinExpr: + case scSMinExpr: + case scSequentialUMinExpr: { + const SCEVNAryExpr *N = cast<SCEVNAryExpr>(S); const Loop *L = nullptr; if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) L = AR->getLoop(); @@ -695,14 +711,15 @@ const Loop *SCEVExpander::getRelevantLoop(const SCEV *S) { L = PickMostRelevantLoop(L, getRelevantLoop(Op), SE.DT); return RelevantLoops[N] = L; } - if (const SCEVCastExpr *C = dyn_cast<SCEVCastExpr>(S)) { - const Loop *Result = getRelevantLoop(C->getOperand()); - return RelevantLoops[C] = Result; + case scUnknown: { + const SCEVUnknown *U = cast<SCEVUnknown>(S); + if (const Instruction *I = dyn_cast<Instruction>(U->getValue())) + return Pair.first->second = SE.LI.getLoopFor(I->getParent()); + // A non-instruction has no relevant loops. + return nullptr; } - if (const SCEVUDivExpr *D = dyn_cast<SCEVUDivExpr>(S)) { - const Loop *Result = PickMostRelevantLoop( - getRelevantLoop(D->getLHS()), getRelevantLoop(D->getRHS()), SE.DT); - return RelevantLoops[D] = Result; + case scCouldNotCompute: + llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!"); } llvm_unreachable("Unexpected SCEV type!"); } |