[llvm] ce2f9ba - [SCCP] Add helper for getting constant range (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 9 03:42:49 PST 2022
Author: Nikita Popov
Date: 2022-11-09T12:42:36+01:00
New Revision: ce2f9ba2c9354df84579dd00187e2fbb9215a0e9
URL: https://github.com/llvm/llvm-project/commit/ce2f9ba2c9354df84579dd00187e2fbb9215a0e9
DIFF: https://github.com/llvm/llvm-project/commit/ce2f9ba2c9354df84579dd00187e2fbb9215a0e9.diff
LOG: [SCCP] Add helper for getting constant range (NFC)
Add a helper for the recurring pattern of getting a constant range
if the value lattice element is one, or a full range otherwise.
Added:
Modified:
llvm/lib/Transforms/Utils/SCCPSolver.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/SCCPSolver.cpp b/llvm/lib/Transforms/Utils/SCCPSolver.cpp
index 79d4ab9803b6..55e1aa10fb56 100644
--- a/llvm/lib/Transforms/Utils/SCCPSolver.cpp
+++ b/llvm/lib/Transforms/Utils/SCCPSolver.cpp
@@ -449,6 +449,7 @@ class SCCPInstVisitor : public InstVisitor<SCCPInstVisitor> {
bool isStructLatticeConstant(Function *F, StructType *STy);
Constant *getConstant(const ValueLatticeElement &LV) const;
+ ConstantRange getConstantRange(const ValueLatticeElement &LV, Type *Ty) const;
SmallPtrSetImpl<Function *> &getArgumentTrackedFunctions() {
return TrackingIncomingArguments;
@@ -529,6 +530,15 @@ Constant *SCCPInstVisitor::getConstant(const ValueLatticeElement &LV) const {
return nullptr;
}
+ConstantRange
+SCCPInstVisitor::getConstantRange(const ValueLatticeElement &LV,
+ Type *Ty) const {
+ assert(Ty->isIntOrIntVectorTy() && "Should be int or int vector");
+ if (LV.isConstantRange())
+ return LV.getConstantRange();
+ return ConstantRange::getFull(Ty->getScalarSizeInBits());
+}
+
void SCCPInstVisitor::markArgInFuncSpecialization(
Function *F, const SmallVectorImpl<ArgInfo> &Args) {
assert(!Args.empty() && "Specialization without arguments");
@@ -827,13 +837,10 @@ void SCCPInstVisitor::visitCastInst(CastInst &I) {
// Fold the constant as we build.
Constant *C = ConstantFoldCastOperand(I.getOpcode(), OpC, I.getType(), DL);
markConstant(&I, C);
- } else if (I.getDestTy()->isIntegerTy()) {
+ } else if (I.getDestTy()->isIntegerTy() &&
+ I.getSrcTy()->isIntOrIntVectorTy()) {
auto &LV = getValueState(&I);
- ConstantRange OpRange =
- OpSt.isConstantRange()
- ? OpSt.getConstantRange()
- : ConstantRange::getFull(
- I.getOperand(0)->getType()->getScalarSizeInBits());
+ ConstantRange OpRange = getConstantRange(OpSt, I.getSrcTy());
Type *DestTy = I.getDestTy();
// Vectors where all elements have the same known constant range are treated
@@ -1012,13 +1019,8 @@ void SCCPInstVisitor::visitBinaryOperator(Instruction &I) {
return markOverdefined(&I);
// Try to simplify to a constant range.
- ConstantRange A = ConstantRange::getFull(I.getType()->getScalarSizeInBits());
- ConstantRange B = ConstantRange::getFull(I.getType()->getScalarSizeInBits());
- if (V1State.isConstantRange())
- A = V1State.getConstantRange();
- if (V2State.isConstantRange())
- B = V2State.getConstantRange();
-
+ ConstantRange A = getConstantRange(V1State, I.getType());
+ ConstantRange B = getConstantRange(V2State, I.getType());
ConstantRange R = A.binaryOp(cast<BinaryOperator>(&I)->getOpcode(), B);
mergeInValue(&I, ValueLatticeElement::getRange(R));
@@ -1293,10 +1295,7 @@ void SCCPInstVisitor::handleCallResult(CallBase &CB) {
// Combine range info for the original value with the new range from the
// condition.
- auto CopyOfCR = CopyOfVal.isConstantRange()
- ? CopyOfVal.getConstantRange()
- : ConstantRange::getFull(
- DL.getTypeSizeInBits(CopyOf->getType()));
+ auto CopyOfCR = getConstantRange(CopyOfVal, CopyOf->getType());
auto NewCR = ImposedCR.intersectWith(CopyOfCR);
// If the existing information is != x, do not use the information from
// a chained predicate, as the != x information is more likely to be
@@ -1338,11 +1337,7 @@ void SCCPInstVisitor::handleCallResult(CallBase &CB) {
SmallVector<ConstantRange, 2> OpRanges;
for (Value *Op : II->args()) {
const ValueLatticeElement &State = getValueState(Op);
- if (State.isConstantRange())
- OpRanges.push_back(State.getConstantRange());
- else
- OpRanges.push_back(
- ConstantRange::getFull(Op->getType()->getScalarSizeInBits()));
+ OpRanges.push_back(getConstantRange(State, Op->getType()));
}
ConstantRange Result =
More information about the llvm-commits
mailing list