[llvm] 258a0a3 - [ConstraintElimination] Use simplified constraint for == 0.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 27 05:31:33 PST 2022
Author: Florian Hahn
Date: 2022-01-27T13:31:23Z
New Revision: 258a0a3a551745e7250d7831e6b477e49708a08c
URL: https://github.com/llvm/llvm-project/commit/258a0a3a551745e7250d7831e6b477e49708a08c
DIFF: https://github.com/llvm/llvm-project/commit/258a0a3a551745e7250d7831e6b477e49708a08c.diff
LOG: [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!
Added:
Modified:
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
llvm/test/Transforms/ConstraintElimination/ne.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index 0c4d7c8ecb483..e108135d41a57 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 084c24ff84c8f..2f6a54b7441ac 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
More information about the llvm-commits
mailing list