diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 17:50:40 +0900 |
---|---|---|
committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 17:50:40 +0900 |
commit | fea7da1b00cc97d742faede2df96c7d327950f49 (patch) | |
tree | 4de1d6b4ddc69f4f32daabb11ad5c71ab0cf895e /llvm/lib/Transforms/Scalar/ConstraintElimination.cpp | |
parent | 9b99dde0d47102625d93c5d1cbbc04951025a6c9 (diff) | |
parent | 0aa930a41f2d1ebf1fa90ec42da8f96d15a4dcbb (diff) | |
download | llvm-users/chapuni/cov/single/nextcount.zip llvm-users/chapuni/cov/single/nextcount.tar.gz llvm-users/chapuni/cov/single/nextcount.tar.bz2 |
Merge branch 'users/chapuni/cov/single/nextcount-base' into users/chapuni/cov/single/nextcountusers/chapuni/cov/single/nextcount
Diffstat (limited to 'llvm/lib/Transforms/Scalar/ConstraintElimination.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/ConstraintElimination.cpp | 75 |
1 files changed, 37 insertions, 38 deletions
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp index ead07ed..91a3c3f 100644 --- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp +++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp @@ -216,7 +216,7 @@ struct StackEntry { StackEntry(unsigned NumIn, unsigned NumOut, bool IsSigned, SmallVector<Value *, 2> ValuesToRelease) : NumIn(NumIn), NumOut(NumOut), IsSigned(IsSigned), - ValuesToRelease(ValuesToRelease) {} + ValuesToRelease(std::move(ValuesToRelease)) {} }; struct ConstraintTy { @@ -726,8 +726,8 @@ ConstraintInfo::getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1, } for (const auto &KV : VariablesB) { - if (SubOverflow(R[GetOrAddIndex(KV.Variable)], KV.Coefficient, - R[GetOrAddIndex(KV.Variable)])) + auto &Coeff = R[GetOrAddIndex(KV.Variable)]; + if (SubOverflow(Coeff, KV.Coefficient, Coeff)) return {}; auto I = KnownNonNegativeVariables.insert({KV.Variable, KV.IsKnownNonNegative}); @@ -759,9 +759,9 @@ ConstraintInfo::getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1, if (!KV.second || (!Value2Index.contains(KV.first) && !NewIndexMap.contains(KV.first))) continue; - SmallVector<int64_t, 8> C(Value2Index.size() + NewVariables.size() + 1, 0); + auto &C = Res.ExtraInfo.emplace_back( + Value2Index.size() + NewVariables.size() + 1, 0); C[GetOrAddIndex(KV.first)] = -1; - Res.ExtraInfo.push_back(C); } return Res; } @@ -1591,53 +1591,52 @@ void ConstraintInfo::addFact(CmpInst::Predicate Pred, Value *A, Value *B, LLVM_DEBUG(dbgs() << "Adding '"; dumpUnpackedICmp(dbgs(), Pred, A, B); dbgs() << "'\n"); - bool Added = false; auto &CSToUse = getCS(R.IsSigned); if (R.Coefficients.empty()) return; - Added |= CSToUse.addVariableRowFill(R.Coefficients); + bool Added = CSToUse.addVariableRowFill(R.Coefficients); + if (!Added) + return; // 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; - auto &Value2Index = getValue2Index(R.IsSigned); - for (Value *V : NewVariables) { - Value2Index.insert({V, Value2Index.size() + 1}); - ValuesToRelease.push_back(V); - } - - LLVM_DEBUG({ - dbgs() << " constraint: "; - dumpConstraint(R.Coefficients, getValue2Index(R.IsSigned)); - dbgs() << "\n"; - }); + SmallVector<Value *, 2> ValuesToRelease; + auto &Value2Index = getValue2Index(R.IsSigned); + for (Value *V : NewVariables) { + Value2Index.insert({V, Value2Index.size() + 1}); + ValuesToRelease.push_back(V); + } - DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned, - std::move(ValuesToRelease)); - - if (!R.IsSigned) { - for (Value *V : NewVariables) { - ConstraintTy VarPos(SmallVector<int64_t, 8>(Value2Index.size() + 1, 0), - false, false, false); - VarPos.Coefficients[Value2Index[V]] = -1; - CSToUse.addVariableRow(VarPos.Coefficients); - DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned, - SmallVector<Value *, 2>()); - } - } + LLVM_DEBUG({ + dbgs() << " constraint: "; + dumpConstraint(R.Coefficients, getValue2Index(R.IsSigned)); + dbgs() << "\n"; + }); - if (R.isEq()) { - // Also add the inverted constraint for equality constraints. - for (auto &Coeff : R.Coefficients) - Coeff *= -1; - CSToUse.addVariableRowFill(R.Coefficients); + DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned, + std::move(ValuesToRelease)); + if (!R.IsSigned) { + for (Value *V : NewVariables) { + ConstraintTy VarPos(SmallVector<int64_t, 8>(Value2Index.size() + 1, 0), + false, false, false); + VarPos.Coefficients[Value2Index[V]] = -1; + CSToUse.addVariableRow(VarPos.Coefficients); DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned, SmallVector<Value *, 2>()); } } + + if (R.isEq()) { + // Also add the inverted constraint for equality constraints. + for (auto &Coeff : R.Coefficients) + Coeff *= -1; + CSToUse.addVariableRowFill(R.Coefficients); + + DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned, + SmallVector<Value *, 2>()); + } } static bool replaceSubOverflowUses(IntrinsicInst *II, Value *A, Value *B, |