[llvm] [ConstraintElim] Add range support for Constraint Elimination (PR #118458)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 3 01:55:33 PST 2024
https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/118458
None
>From b8bae4478454bfdbaac042a1729b5d5dff057d7f Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Tue, 3 Dec 2024 17:54:42 +0800
Subject: [PATCH] [ConstraintElim] Add range support for Constraint Elimination
---
.../Scalar/ConstraintElimination.cpp | 64 ++++++++++++++++++-
1 file changed, 62 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index 4884c23f16e12a..b41255f1dbe7c6 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -1600,8 +1600,68 @@ void ConstraintInfo::addFact(CmpInst::Predicate Pred, Value *A, Value *B,
DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned,
std::move(ValuesToRelease));
- if (!R.IsSigned) {
- for (Value *V : NewVariables) {
+ // Add range information from attributes and metadata.
+ for (auto *V : NewVariables) {
+ if (V->getType()->getScalarSizeInBits() >= 64)
+ continue;
+ std::optional<ConstantRange> CR;
+ if (const auto *Arg = dyn_cast<Argument>(V)) {
+ CR = Arg->getRange();
+ } else if (const auto *CB = dyn_cast<CallBase>(V)) {
+ CR = CB->getRange();
+ } else if (const auto *I = dyn_cast<Instruction>(V)) {
+ if (auto *Range = I->getMetadata(LLVMContext::MD_range))
+ CR = getConstantRangeFromMetadata(*Range);
+ }
+ if (CR) {
+ if (R.IsSigned) {
+ int64_t MaxVal = CR->getSignedMax().getSExtValue();
+ int64_t MinVal = CR->getSignedMin().getSExtValue();
+ if (MaxVal != MaxConstraintValue) {
+ ConstraintTy VarPos(
+ SmallVector<int64_t, 8>(Value2Index.size() + 1, 0), false,
+ false, false);
+ VarPos.Coefficients[0] = MaxVal;
+ VarPos.Coefficients[Value2Index[V]] = 1;
+ CSToUse.addVariableRow(VarPos.Coefficients);
+ DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned,
+ SmallVector<Value *, 2>());
+ }
+ if (MinVal != MinSignedConstraintValue) {
+ ConstraintTy VarPos(
+ SmallVector<int64_t, 8>(Value2Index.size() + 1, 0), false,
+ false, false);
+ VarPos.Coefficients[0] = MinVal;
+ VarPos.Coefficients[Value2Index[V]] = -1;
+ CSToUse.addVariableRow(VarPos.Coefficients);
+ DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned,
+ SmallVector<Value *, 2>());
+ }
+ } else {
+ uint64_t MaxVal = CR->getUnsignedMax().getZExtValue();
+ uint64_t MinVal = CR->getUnsignedMin().getZExtValue();
+ if (MaxVal < static_cast<uint64_t>(MaxConstraintValue)) {
+ ConstraintTy VarPos(
+ SmallVector<int64_t, 8>(Value2Index.size() + 1, 0), false,
+ false, false);
+ VarPos.Coefficients[0] = MaxVal;
+ VarPos.Coefficients[Value2Index[V]] = 1;
+ CSToUse.addVariableRow(VarPos.Coefficients);
+ DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned,
+ SmallVector<Value *, 2>());
+ }
+ MinVal =
+ std::min(MinVal, static_cast<uint64_t>(MaxConstraintValue - 1));
+ ConstraintTy VarPos(
+ SmallVector<int64_t, 8>(Value2Index.size() + 1, 0), false, false,
+ false);
+ VarPos.Coefficients[0] = MinVal;
+ VarPos.Coefficients[Value2Index[V]] = -1;
+ CSToUse.addVariableRow(VarPos.Coefficients);
+ DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned,
+ SmallVector<Value *, 2>());
+ }
+ } else if (!R.IsSigned) {
ConstraintTy VarPos(SmallVector<int64_t, 8>(Value2Index.size() + 1, 0),
false, false, false);
VarPos.Coefficients[Value2Index[V]] = -1;
More information about the llvm-commits
mailing list