From 258a0a3a551745e7250d7831e6b477e49708a08c Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Thu, 27 Jan 2022 13:31:23 +0000 Subject: [PATCH] [ConstraintElimination] Use simplified constraint for == 0. When checking x == 0, checking x u<= 0 is sufficient and simpler than x u>= 0 && x u<= 0. https://alive2.llvm.org/ce/z/btM7d3 ---------------------------------------- define i1 @src(i4 %a) { %0: %c = icmp eq i4 %a, 0 ret i1 %c } => define i1 @tgt(i4 %a) { %0: %c = icmp ule i4 %a, 0 ret i1 %c } Transformation seems to be correct! --- llvm/lib/Transforms/Scalar/ConstraintElimination.cpp | 4 ++++ llvm/test/Transforms/ConstraintElimination/ne.ll | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp index 0c4d7c8..e108135 100644 --- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp +++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp @@ -187,6 +187,10 @@ getConstraint(CmpInst::Predicate Pred, Value *Op0, Value *Op1, Value2Index, NewIndices); if (Pred == CmpInst::ICMP_EQ) { + if (match(Op1, m_Zero())) + return getConstraint(CmpInst::ICMP_ULE, Op0, Op1, Value2Index, + NewIndices); + auto A = getConstraint(CmpInst::ICMP_UGE, Op0, Op1, Value2Index, NewIndices); auto B = diff --git a/llvm/test/Transforms/ConstraintElimination/ne.ll b/llvm/test/Transforms/ConstraintElimination/ne.ll index 084c24f..2f6a54b 100644 --- a/llvm/test/Transforms/ConstraintElimination/ne.ll +++ b/llvm/test/Transforms/ConstraintElimination/ne.ll @@ -56,7 +56,7 @@ define i1 @test_ne_eq_0(i8 %a, i8 %b) { ; CHECK-NEXT: [[C_3:%.*]] = icmp eq i8 [[A]], [[B]] ; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], [[C_3]] ; CHECK-NEXT: [[C_4:%.*]] = icmp eq i8 [[A]], 0 -; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] +; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], false ; CHECK-NEXT: [[T_2:%.*]] = icmp ugt i8 [[A]], 0 ; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], true ; CHECK-NEXT: [[T_3:%.*]] = icmp uge i8 [[A]], 1 @@ -75,7 +75,7 @@ define i1 @test_ne_eq_0(i8 %a, i8 %b) { ; CHECK-NEXT: [[C_9:%.*]] = icmp eq i8 [[A]], [[B]] ; CHECK-NEXT: [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_9]] ; CHECK-NEXT: [[C_10:%.*]] = icmp eq i8 [[A]], 0 -; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], [[C_10]] +; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], true ; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i8 [[A]], 0 ; CHECK-NEXT: [[RES_13:%.*]] = xor i1 [[RES_12]], false ; CHECK-NEXT: [[F_3:%.*]] = icmp uge i8 [[A]], 1 @@ -221,7 +221,7 @@ define i1 @test_ne_eq_1(i8 %a, i8 %b) { ; CHECK-NEXT: [[C_11:%.*]] = icmp eq i8 [[A]], [[B]] ; CHECK-NEXT: [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_11]] ; CHECK-NEXT: [[F_1:%.*]] = icmp eq i8 [[A]], 0 -; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], [[F_1]] +; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], false ; CHECK-NEXT: [[T_3:%.*]] = icmp ugt i8 [[A]], 0 ; CHECK-NEXT: [[RES_13:%.*]] = xor i1 [[RES_12]], true ; CHECK-NEXT: [[T_4:%.*]] = icmp uge i8 [[A]], 1 -- 2.7.4