[llvm] 9aa004a - [ConstraintElimination] Convert NewIndices to vector and rename (NFCI).

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 5 08:25:37 PDT 2022


Author: Florian Hahn
Date: 2022-10-05T16:25:00+01:00
New Revision: 9aa004a04c0ef5f6f317fa3e28ee96713bd4a2cd

URL: https://github.com/llvm/llvm-project/commit/9aa004a04c0ef5f6f317fa3e28ee96713bd4a2cd
DIFF: https://github.com/llvm/llvm-project/commit/9aa004a04c0ef5f6f317fa3e28ee96713bd4a2cd.diff

LOG: [ConstraintElimination] Convert NewIndices to vector and rename (NFCI).

The callers of getConstraint only require a list of new variables.
Update the naming and types to make this clearer.

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 2b87b0155ec0..fd10497ad8ff 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -137,17 +137,18 @@ class ConstraintInfo {
 
   /// Turn a comparison of the form \p Op0 \p Pred \p Op1 into a vector of
   /// constraints, using indices from the corresponding constraint system.
-  /// Additional indices for newly discovered values are added to \p NewIndices.
+  /// New variables that need to be added to the system are collected in
+  /// \p NewVariables.
   ConstraintTy getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
-                             DenseMap<Value *, unsigned> &NewIndices) const;
+                             SmallVectorImpl<Value *> &NewVariables) const;
 
   /// Turn a condition \p CmpI into a vector of constraints, using indices from
-  /// the corresponding constraint system. Additional indices for newly
-  /// discovered values are added to \p NewIndices.
+  /// the corresponding constraint system. New variables that need to be added
+  /// to the system are collected in \p NewVariables.
   ConstraintTy getConstraint(CmpInst *Cmp,
-                             DenseMap<Value *, unsigned> &NewIndices) const {
+                             SmallVectorImpl<Value *> &NewVariables) {
     return getConstraint(Cmp->getPredicate(), Cmp->getOperand(0),
-                         Cmp->getOperand(1), NewIndices);
+                         Cmp->getOperand(1), NewVariables);
   }
 
   /// Try to add information from \p A \p Pred \p B to the unsigned/signed
@@ -289,7 +290,8 @@ decompose(Value *V, SmallVector<PreconditionTy, 4> &Preconditions,
 
 ConstraintTy
 ConstraintInfo::getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
-                              DenseMap<Value *, unsigned> &NewIndices) const {
+                              SmallVectorImpl<Value *> &NewVariables) const {
+  assert(NewVariables.empty() && "NewVariables must be empty when passed in");
   bool IsEq = false;
   // Try to convert Pred to one of ULE/SLT/SLE/SLT.
   switch (Pred) {
@@ -343,25 +345,29 @@ ConstraintInfo::getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
   auto VariablesA = llvm::drop_begin(ADec);
   auto VariablesB = llvm::drop_begin(BDec);
 
-  // First try to look up \p V in Value2Index and NewIndices. Otherwise add a
-  // new entry to NewIndices.
-  auto GetOrAddIndex = [&Value2Index, &NewIndices](Value *V) -> unsigned {
+  // First try to look up \p V in Value2Index and NewVariables. Otherwise add a
+  // new entry to NewVariables.
+  DenseMap<Value *, unsigned> NewIndexMap;
+  auto GetOrAddIndex = [&Value2Index, &NewVariables,
+                        &NewIndexMap](Value *V) -> unsigned {
     auto V2I = Value2Index.find(V);
     if (V2I != Value2Index.end())
       return V2I->second;
     auto Insert =
-        NewIndices.insert({V, Value2Index.size() + NewIndices.size() + 1});
+        NewIndexMap.insert({V, Value2Index.size() + NewVariables.size() + 1});
+    if (Insert.second)
+      NewVariables.push_back(V);
     return Insert.first->second;
   };
 
-  // Make sure all variables have entries in Value2Index or NewIndices.
+  // Make sure all variables have entries in Value2Index or NewVariables.
   for (const auto &KV : concat<DecompEntry>(VariablesA, VariablesB))
     GetOrAddIndex(KV.Variable);
 
   // Build result constraint, by first adding all coefficients from A and then
   // subtracting all coefficients from B.
   ConstraintTy Res(
-      SmallVector<int64_t, 8>(Value2Index.size() + NewIndices.size() + 1, 0),
+      SmallVector<int64_t, 8>(Value2Index.size() + NewVariables.size() + 1, 0),
       IsSigned);
   // Collect variables that are known to be positive in all uses in the
   // constraint.
@@ -389,28 +395,23 @@ ConstraintInfo::getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1,
   R[0] = OffsetSum;
   Res.Preconditions = std::move(Preconditions);
 
-  // Remove any (Coefficient, Variable) entry where the Coefficient is 0 for the
-  // new variables that need to be added to the system. Set NewIndexNeeded to
-  // true if any of the new variables has a non-zero coefficient.
-  bool NewIndexNeeded = false;
-  for (unsigned I = 0; I < NewIndices.size(); ++I) {
+  // Remove any (Coefficient, Variable) entry where the Coefficient is 0 for new
+  // variables.
+  while (!NewVariables.empty()) {
     int64_t Last = R.back();
-    if (Last != 0) {
-      NewIndexNeeded = true;
+    if (Last != 0)
       break;
-    }
     R.pop_back();
+    Value *RemovedV = NewVariables.pop_back_val();
+    NewIndexMap.erase(RemovedV);
   }
-  // All new variables had Coefficients of 0, so no new variables are needed.
-  if (!NewIndexNeeded)
-    NewIndices.clear();
 
   // Add extra constraints for variables that are known positive.
   for (auto &KV : KnownPositiveVariables) {
     if (!KV.second || (Value2Index.find(KV.first) == Value2Index.end() &&
-                       NewIndices.find(KV.first) == NewIndices.end()))
+                       NewIndexMap.find(KV.first) == NewIndexMap.end()))
       continue;
-    SmallVector<int64_t, 8> C(Value2Index.size() + NewIndices.size() + 1, 0);
+    SmallVector<int64_t, 8> C(Value2Index.size() + NewVariables.size() + 1, 0);
     C[GetOrAddIndex(KV.first)] = -1;
     Res.ExtraInfo.push_back(C);
   }
@@ -426,14 +427,13 @@ bool ConstraintTy::isValid(const ConstraintInfo &Info) const {
 
 bool ConstraintInfo::doesHold(CmpInst::Predicate Pred, Value *A,
                               Value *B) const {
-  DenseMap<Value *, unsigned> NewIndices;
-  auto R = getConstraint(Pred, A, B, NewIndices);
+  SmallVector<Value *> NewVariables;
+  auto R = getConstraint(Pred, A, B, NewVariables);
 
-  if (!NewIndices.empty())
+  if (!NewVariables.empty())
     return false;
 
-  // TODO: properly check NewIndices.
-  return NewIndices.empty() && R.Preconditions.empty() && !R.IsEq &&
+  return NewVariables.empty() && R.Preconditions.empty() && !R.IsEq &&
          !R.empty() &&
          getCS(CmpInst::isSigned(Pred)).isConditionImplied(R.Coefficients);
 }
@@ -624,8 +624,8 @@ void ConstraintInfo::addFact(CmpInst::Predicate Pred, Value *A, Value *B,
                              SmallVectorImpl<StackEntry> &DFSInStack) {
   // If the constraint has a pre-condition, skip the constraint if it does not
   // hold.
-  DenseMap<Value *, unsigned> NewIndices;
-  auto R = getConstraint(Pred, A, B, NewIndices);
+  SmallVector<Value *> NewVariables;
+  auto R = getConstraint(Pred, A, B, NewVariables);
   if (!R.isValid(*this))
     return;
 
@@ -641,13 +641,14 @@ void ConstraintInfo::addFact(CmpInst::Predicate Pred, Value *A, Value *B,
 
   Added |= CSToUse.addVariableRowFill(R.Coefficients);
 
-  // If R has been added to the system, queue it for removal once it goes
-  // out-of-scope.
+  // If R has been added to the system, add the new variables and queue it for
+  // removal once it goes out-of-scope.
   if (Added) {
     SmallVector<Value *, 2> ValuesToRelease;
-    for (auto &KV : NewIndices) {
-      getValue2Index(R.IsSigned).insert(KV);
-      ValuesToRelease.push_back(KV.first);
+    auto &Value2Index = getValue2Index(R.IsSigned);
+    for (Value *V : NewVariables) {
+      Value2Index.insert({V, Value2Index.size() + 1});
+      ValuesToRelease.push_back(V);
     }
 
     LLVM_DEBUG({
@@ -675,9 +676,9 @@ tryToSimplifyOverflowMath(IntrinsicInst *II, ConstraintInfo &Info,
                           SmallVectorImpl<Instruction *> &ToRemove) {
   auto DoesConditionHold = [](CmpInst::Predicate Pred, Value *A, Value *B,
                               ConstraintInfo &Info) {
-    DenseMap<Value *, unsigned> NewIndices;
-    auto R = Info.getConstraint(Pred, A, B, NewIndices);
-    if (R.size() < 2 || !NewIndices.empty() || !R.isValid(Info))
+    SmallVector<Value *> NewVariables;
+    auto R = Info.getConstraint(Pred, A, B, NewVariables);
+    if (R.size() < 2 || !NewVariables.empty() || !R.isValid(Info))
       return false;
 
     auto &CSToUse = Info.getCS(CmpInst::isSigned(Pred));
@@ -801,9 +802,9 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT) {
           continue;
 
         LLVM_DEBUG(dbgs() << "Checking " << *Cmp << "\n");
-        DenseMap<Value *, unsigned> NewIndices;
-        auto R = Info.getConstraint(Cmp, NewIndices);
-        if (R.IsEq || R.empty() || !NewIndices.empty() || !R.isValid(Info))
+        SmallVector<Value *> NewVariables;
+        auto R = Info.getConstraint(Cmp, NewVariables);
+        if (R.IsEq || R.empty() || !NewVariables.empty() || !R.isValid(Info))
           continue;
 
         auto &CSToUse = Info.getCS(R.IsSigned);


        


More information about the llvm-commits mailing list