[llvm] 981ed72 - [NFC][SCEV] Refactor `createNodeForSelectViaUMinSeq()` out of `createNodeForSelectOrPHIViaUMinSeq()`
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 28 16:38:44 PDT 2022
Author: Roman Lebedev
Date: 2022-04-29T02:37:06+03:00
New Revision: 981ed72a17e4302dfd77ac54d742c08dfb6b35bb
URL: https://github.com/llvm/llvm-project/commit/981ed72a17e4302dfd77ac54d742c08dfb6b35bb
DIFF: https://github.com/llvm/llvm-project/commit/981ed72a17e4302dfd77ac54d742c08dfb6b35bb.diff
LOG: [NFC][SCEV] Refactor `createNodeForSelectViaUMinSeq()` out of `createNodeForSelectOrPHIViaUMinSeq()`
Added:
Modified:
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 42c87359a327..6ff8ce2cdf15 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -5997,13 +5997,13 @@ const SCEV *ScalarEvolution::createNodeForSelectOrPHIInstWithICmpInstCond(
return getUnknown(I);
}
-const SCEV *ScalarEvolution::createNodeForSelectOrPHIViaUMinSeq(
- Value *V, Value *Cond, Value *TrueVal, Value *FalseVal) {
- // For now, only deal with i1-typed `select`s.
- if (!V->getType()->isIntegerTy(1) || !Cond->getType()->isIntegerTy(1) ||
- !TrueVal->getType()->isIntegerTy(1) ||
- !FalseVal->getType()->isIntegerTy(1))
- return getUnknown(V);
+static Optional<const SCEV *>
+createNodeForSelectViaUMinSeq(ScalarEvolution *SE, const SCEV *CondExpr,
+ const SCEV *TrueExpr, const SCEV *FalseExpr) {
+ assert(CondExpr->getType()->isIntegerTy(1) &&
+ TrueExpr->getType() == FalseExpr->getType() &&
+ TrueExpr->getType()->isIntegerTy(1) &&
+ "Unexpected operands of a select.");
// i1 cond ? i1 x : i1 C --> C + (i1 cond ? (i1 x - i1 C) : i1 0)
// --> C + (umin_seq cond, x - C)
@@ -6011,22 +6011,50 @@ const SCEV *ScalarEvolution::createNodeForSelectOrPHIViaUMinSeq(
// i1 cond ? i1 C : i1 x --> C + (i1 cond ? i1 0 : (i1 x - i1 C))
// --> C + (i1 ~cond ? (i1 x - i1 C) : i1 0)
// --> C + (umin_seq ~cond, x - C)
- if (isa<ConstantInt>(TrueVal) || isa<ConstantInt>(FalseVal)) {
- const SCEV *CondExpr = getSCEV(Cond);
- const SCEV *TrueExpr = getSCEV(TrueVal);
- const SCEV *FalseExpr = getSCEV(FalseVal);
- const SCEV *X, *C;
- if (isa<ConstantInt>(TrueVal)) {
- CondExpr = getNotSCEV(CondExpr);
- X = FalseExpr;
- C = TrueExpr;
- } else {
- X = TrueExpr;
- C = FalseExpr;
- }
- return getAddExpr(
- C, getUMinExpr(CondExpr, getMinusSCEV(X, C), /*Sequential=*/true));
+
+ // FIXME: while we can't legally model the case where both of the hands
+ // are fully variable, we only require that the *
diff erence* is constant.
+ if (!isa<SCEVConstant>(TrueExpr) && !isa<SCEVConstant>(FalseExpr))
+ return None;
+
+ const SCEV *X, *C;
+ if (isa<SCEVConstant>(TrueExpr)) {
+ CondExpr = SE->getNotSCEV(CondExpr);
+ X = FalseExpr;
+ C = TrueExpr;
+ } else {
+ X = TrueExpr;
+ C = FalseExpr;
}
+ return SE->getAddExpr(C, SE->getUMinExpr(CondExpr, SE->getMinusSCEV(X, C),
+ /*Sequential=*/true));
+}
+
+static Optional<const SCEV *> createNodeForSelectViaUMinSeq(ScalarEvolution *SE,
+ Value *Cond,
+ Value *TrueVal,
+ Value *FalseVal) {
+ if (!isa<ConstantInt>(TrueVal) && !isa<ConstantInt>(FalseVal))
+ return None;
+
+ return createNodeForSelectViaUMinSeq(
+ SE, SE->getSCEV(Cond), SE->getSCEV(TrueVal), SE->getSCEV(FalseVal));
+}
+
+const SCEV *ScalarEvolution::createNodeForSelectOrPHIViaUMinSeq(
+ Value *V, Value *Cond, Value *TrueVal, Value *FalseVal) {
+ assert(Cond->getType()->isIntegerTy(1) && "Select condition is not an i1?");
+ assert(TrueVal->getType() == FalseVal->getType() &&
+ V->getType() == TrueVal->getType() &&
+ "Types of select hands and of the result must match.");
+
+ // For now, only deal with i1-typed `select`s.
+ if (!V->getType()->isIntegerTy(1))
+ return getUnknown(V);
+
+ if (Optional<const SCEV *> S =
+ createNodeForSelectViaUMinSeq(this, Cond, TrueVal, FalseVal))
+ return *S;
return getUnknown(V);
}
More information about the llvm-commits
mailing list