[llvm] 098b0b1 - [ConstraintElimination] Transfer info from SGE to unsigned system.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 22 06:28:25 PDT 2022
Author: Florian Hahn
Date: 2022-06-22T15:27:59+02:00
New Revision: 098b0b18a7df42434d3cc747c89dd62ddac73afa
URL: https://github.com/llvm/llvm-project/commit/098b0b18a7df42434d3cc747c89dd62ddac73afa
DIFF: https://github.com/llvm/llvm-project/commit/098b0b18a7df42434d3cc747c89dd62ddac73afa.diff
LOG: [ConstraintElimination] Transfer info from SGE to unsigned system.
This patch adds a new transferToOtherSystem helper that tries to
transfer information from signed predicates to the unsigned system and
vice versa.
The initial version adds A >=u B for A >=s B && B >=s 0
https://alive2.llvm.org/ce/z/8b6F9i
Added:
Modified:
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll
llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index 9a3c0ca93bee..f3bbc7708477 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -160,6 +160,12 @@ class ConstraintInfo {
return getConstraint(Cmp->getPredicate(), Cmp->getOperand(0),
Cmp->getOperand(1), NewIndices);
}
+
+ /// Try to add information from \p A \p Pred \p B to the unsigned/signed
+ /// system if \p Pred is signed/unsigned.
+ void transferToOtherSystem(CmpInst::Predicate Pred, Value *A, Value *B,
+ bool IsNegated, unsigned NumIn, unsigned NumOut,
+ SmallVectorImpl<StackEntry> &DFSInStack);
};
} // namespace
@@ -384,6 +390,27 @@ bool ConstraintInfo::doesHold(CmpInst::Predicate Pred, Value *A,
getCS(CmpInst::isSigned(Pred)).isConditionImplied(R.Coefficients);
}
+void ConstraintInfo::transferToOtherSystem(
+ CmpInst::Predicate Pred, Value *A, Value *B, bool IsNegated, unsigned NumIn,
+ unsigned NumOut, SmallVectorImpl<StackEntry> &DFSInStack) {
+ // Check if we can combine facts from the signed and unsigned systems to
+ // derive additional facts.
+ if (!A->getType()->isIntegerTy())
+ return;
+ // FIXME: This currently depends on the order we add facts. Ideally we
+ // would first add all known facts and only then try to add additional
+ // facts.
+ switch (Pred) {
+ default:
+ break;
+ case CmpInst::ICMP_SGE:
+ if (doesHold(CmpInst::ICMP_SGE, B, ConstantInt::get(B->getType(), 0))) {
+ addFact(CmpInst::ICMP_UGE, A, B, IsNegated, NumIn, NumOut, DFSInStack);
+ }
+ break;
+ }
+}
+
namespace {
/// Represents either a condition that holds on entry to a block or a basic
/// block, with their respective Dominator DFS in and out numbers.
@@ -766,6 +793,8 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT) {
// Otherwise, add the condition to the system and stack, if we can
// transform it into a constraint.
Info.addFact(Pred, A, B, CB.Not, CB.NumIn, CB.NumOut, DFSInStack);
+ Info.transferToOtherSystem(Pred, A, B, CB.Not, CB.NumIn, CB.NumOut,
+ DFSInStack);
}
}
diff --git a/llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll b/llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll
index c490f72e914f..97537dd96b5f 100644
--- a/llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll
+++ b/llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll
@@ -368,7 +368,7 @@ define i4 @ptr_N_and_step_signed_positive_explicit_check_constant_step(i8* %src,
; CHECK: step.check:
; CHECK-NEXT: [[STEP_UGE_0:%.*]] = icmp uge i16 [[STEP]], 0
; CHECK-NEXT: [[STEP_ULT_N:%.*]] = icmp ult i16 [[STEP]], [[N]]
-; CHECK-NEXT: [[AND_2:%.*]] = and i1 [[STEP_UGE_0]], [[STEP_ULT_N]]
+; CHECK-NEXT: [[AND_2:%.*]] = and i1 true, [[STEP_ULT_N]]
; CHECK-NEXT: br i1 [[AND_2]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]
; CHECK: ptr.check:
; CHECK-NEXT: [[SRC_STEP:%.*]] = getelementptr inbounds i8, i8* [[SRC]], i16 1
diff --git a/llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll b/llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll
index 8c9b374c42f8..0eb95323a4d6 100644
--- a/llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll
+++ b/llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll
@@ -275,7 +275,7 @@ define i1 @cnt_positive_sge_against_base_with_zext(ptr %p, i32 %cnt) {
; CHECK-NEXT: [[EXT:%.*]] = zext i32 [[CNT]] to i64
; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[EXT]]
; CHECK-NEXT: [[CMP_1:%.*]] = icmp uge ptr [[ADD_PTR]], [[P]]
-; CHECK-NEXT: br i1 [[CMP_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK-NEXT: br i1 true, label [[THEN:%.*]], label [[ELSE:%.*]]
; CHECK: then:
; CHECK-NEXT: ret i1 false
; CHECK: else:
@@ -497,11 +497,11 @@ define i1 @sge_2(i8 %idx) {
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[IDX]], 2
; CHECK-NEXT: [[T_2:%.*]] = icmp uge i8 [[IDX]], 1
-; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[IDX]], 3
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[IDX]], 2
-; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], [[F_1]]
+; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], false
; CHECK-NEXT: ret i1 [[RES_3]]
;
entry:
More information about the llvm-commits
mailing list