[llvm] a78ce48 - [ConstraintElimination] Introduce struct to manage constraints. (NFC)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 27 04:40:39 PST 2022
Author: Florian Hahn
Date: 2022-01-27T12:40:09Z
New Revision: a78ce48c373572946a51228dda741681d1695d63
URL: https://github.com/llvm/llvm-project/commit/a78ce48c373572946a51228dda741681d1695d63
DIFF: https://github.com/llvm/llvm-project/commit/a78ce48c373572946a51228dda741681d1695d63.diff
LOG: [ConstraintElimination] Introduce struct to manage constraints. (NFC)
This patch adds a struct to manage a list of constraints. It simplifies
a follow-up change, that adds pre-conditions that must hold before a
list of constraints can be used.
Added:
Modified:
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index fcb88b54a094..0c4d7c8ecb48 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -43,6 +43,51 @@ DEBUG_COUNTER(EliminatedCounter, "conds-eliminated",
static int64_t MaxConstraintValue = std::numeric_limits<int64_t>::max();
+namespace {
+struct ConstraintTy {
+ SmallVector<int64_t, 8> Coefficients;
+
+ ConstraintTy(SmallVector<int64_t, 8> Coefficients)
+ : Coefficients(Coefficients) {}
+
+ unsigned size() const { return Coefficients.size(); }
+};
+
+/// Struct to manage a list of constraints.
+struct ConstraintListTy {
+ SmallVector<ConstraintTy, 4> Constraints;
+
+ ConstraintListTy() {}
+
+ ConstraintListTy(const SmallVector<ConstraintTy, 4> &Constraints)
+ : Constraints(Constraints) {}
+
+ void mergeIn(const ConstraintListTy &Other) {
+ append_range(Constraints, Other.Constraints);
+ }
+
+ unsigned size() const { return Constraints.size(); }
+
+ unsigned empty() const { return Constraints.empty(); }
+
+ /// Returns true if any constraint has a non-zero coefficient for any of the
+ /// newly added indices. Zero coefficients for new indices are removed. If it
+ /// returns true, no new variable need to be added to the system.
+ bool needsNewIndices(const DenseMap<Value *, unsigned> &NewIndices) {
+ assert(size() == 1);
+ for (unsigned I = 0; I < NewIndices.size(); ++I) {
+ int64_t Last = get(0).Coefficients.pop_back_val();
+ if (Last != 0)
+ return true;
+ }
+ return false;
+ }
+
+ ConstraintTy &get(unsigned I) { return Constraints[I]; }
+};
+
+} // namespace
+
// Decomposes \p V into a vector of pairs of the form { c, X } where c * X. The
// sum of the pairs equals \p V. The first pair is the constant-factor and X
// must be nullptr. If the expression cannot be decomposed, returns an empty
@@ -113,19 +158,10 @@ static SmallVector<std::pair<int64_t, Value *>, 4> decompose(Value *V) {
return {{0, nullptr}, {1, V}};
}
-struct ConstraintTy {
- SmallVector<int64_t, 8> Coefficients;
-
- ConstraintTy(SmallVector<int64_t, 8> Coefficients)
- : Coefficients(Coefficients) {}
-
- unsigned size() const { return Coefficients.size(); }
-};
-
/// Turn a condition \p CmpI into a vector of constraints, using indices from \p
/// Value2Index. Additional indices for newly discovered values are added to \p
/// NewIndices.
-static SmallVector<ConstraintTy, 4>
+static ConstraintListTy
getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
const DenseMap<Value *, unsigned> &Value2Index,
DenseMap<Value *, unsigned> &NewIndices) {
@@ -155,7 +191,7 @@ getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
getConstraint(CmpInst::ICMP_UGE, Op0, Op1, Value2Index, NewIndices);
auto B =
getConstraint(CmpInst::ICMP_ULE, Op0, Op1, Value2Index, NewIndices);
- append_range(A, B);
+ A.mergeIn(B);
return A;
}
@@ -200,10 +236,10 @@ getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
R[GetOrAddIndex(KV.second)] -= KV.first;
R[0] = Offset1 + Offset2 + (Pred == CmpInst::ICMP_ULT ? -1 : 0);
- return {R};
+ return {{R}};
}
-static SmallVector<ConstraintTy, 4>
+static ConstraintListTy
getConstraint(CmpInst *Cmp, const DenseMap<Value *, unsigned> &Value2Index,
DenseMap<Value *, unsigned> &NewIndices) {
return getConstraint(Cmp->getPredicate(), Cmp->getOperand(0),
@@ -397,21 +433,10 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT) {
if (R.size() != 1)
continue;
- // Check if all coefficients of new indices are 0 after building the
- // constraint. Skip if any of the new indices has a non-null
- // coefficient.
- bool HasNewIndex = false;
- for (unsigned I = 0; I < NewIndices.size(); ++I) {
- int64_t Last = R[0].Coefficients.pop_back_val();
- if (Last != 0) {
- HasNewIndex = true;
- break;
- }
- }
- if (HasNewIndex || R[0].size() == 1)
+ if (R.needsNewIndices(NewIndices) || R.get(0).size() == 1)
continue;
- if (CS.isConditionImplied(R[0].Coefficients)) {
+ if (CS.isConditionImplied(R.get(0).Coefficients)) {
if (!DebugCounter::shouldExecute(EliminatedCounter))
continue;
@@ -432,7 +457,7 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT) {
Changed = true;
}
if (CS.isConditionImplied(
- ConstraintSystem::negate(R[0].Coefficients))) {
+ ConstraintSystem::negate(R.get(0).Coefficients))) {
if (!DebugCounter::shouldExecute(EliminatedCounter))
continue;
@@ -479,7 +504,7 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT) {
LLVM_DEBUG(dbgs() << "Adding " << *CB.Condition << " " << CB.Not << "\n");
bool Added = false;
- for (auto &C : R) {
+ for (auto &C : R.Constraints) {
auto Coeffs = C.Coefficients;
LLVM_DEBUG({
dbgs() << " constraint: ";
More information about the llvm-commits
mailing list