Skip to content

Commit 58303ad

Browse files
committed
Relax equality no wrap constraints & remove swap handling
1 parent c0cf491 commit 58303ad

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7751,17 +7751,10 @@ Instruction *InstCombinerImpl::visitICmpInst(ICmpInst &I) {
77517751
bool I1NUW = I1->hasNoUnsignedWrap();
77527752
bool I0NSW = I0->hasNoSignedWrap();
77537753
bool I1NSW = I1->hasNoSignedWrap();
7754-
bool Swaped = false;
77557754
if ((UnsignedCmp && I0NUW && I1NUW) || (SignedCmp && I0NSW && I1NSW) ||
7756-
(EqualityCmp && I0NUW && I0NSW && I1NUW && I1NSW)) {
7757-
if (I0->getOpcode() == Instruction::Add &&
7758-
I1->getOpcode() == Instruction::Sub) {
7759-
std::swap(I0, I1);
7760-
Swaped = true;
7761-
}
7755+
(EqualityCmp && ((I0NUW && I1NUW) || (I0NSW && I1NSW)))) {
77627756
if (match(I0, m_Sub(m_Value(A), m_Value(B))) &&
7763-
(match(I1, m_Add(m_Specific(A), m_Specific(B))) ||
7764-
match(I1, m_Add(m_Specific(B), m_Specific(A))))) {
7757+
match(I1, m_Add(m_Specific(A), m_Specific(B)))) {
77657758
return new ICmpInst(Swaped ? Pred : I.getSwappedPredicate(), B,
77667759
ConstantInt::get(Op0->getType(), 0));
77677760
}

llvm/test/Transforms/InstCombine/icmp-subadd.ll

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ define i1 @test-same-operands-sub-add-nsw-nuw-icmp-eq(i8 %a, i8 %b) {
5353
define i1 @test-same-operands-sub-add-nsw-icmp-eq(i8 %a, i8 %b) {
5454
; CHECK-LABEL: define i1 @test-same-operands-sub-add-nsw-icmp-eq(
5555
; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
56-
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 [[A]], [[B]]
57-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[A]], [[B]]
58-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[SUB]], [[ADD]]
56+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B]], 0
5957
; CHECK-NEXT: ret i1 [[CMP]]
6058
;
6159
%sub = sub nsw i8 %a, %b
@@ -64,10 +62,13 @@ define i1 @test-same-operands-sub-add-nsw-icmp-eq(i8 %a, i8 %b) {
6462
ret i1 %cmp
6563
}
6664

65+
; Should floded by foldICmpCommutative in the future
6766
define i1 @test-add-sub-nsw-icmp-sgt(i8 %a, i8 %b) {
6867
; CHECK-LABEL: define i1 @test-add-sub-nsw-icmp-sgt(
6968
; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
70-
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[B]], 0
69+
; CHECK-NEXT: [[SUB:%.*]] = sub nsw i8 [[A]], [[B]]
70+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[A]], [[B]]
71+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[ADD]], [[SUB]]
7172
; CHECK-NEXT: ret i1 [[CMP]]
7273
;
7374
%sub = sub nsw i8 %a, %b
@@ -76,10 +77,14 @@ define i1 @test-add-sub-nsw-icmp-sgt(i8 %a, i8 %b) {
7677
ret i1 %cmp
7778
}
7879

80+
; Should floded by foldICmpCommutative in the future
7981
define i1 @test-add-sub-nuw-icmp-uge(i8 %a, i8 %b) {
8082
; CHECK-LABEL: define i1 @test-add-sub-nuw-icmp-uge(
8183
; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
82-
; CHECK-NEXT: ret i1 true
84+
; CHECK-NEXT: [[SUB:%.*]] = sub nuw i8 [[A]], [[B]]
85+
; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[A]], [[B]]
86+
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[ADD]], [[SUB]]
87+
; CHECK-NEXT: ret i1 [[CMP]]
8388
;
8489
%sub = sub nuw i8 %a, %b
8590
%add = add nuw i8 %a, %b
@@ -102,10 +107,14 @@ define i1 @test-add-sub-nuw-icmp-sge(i8 %a, i8 %b) {
102107
ret i1 %cmp
103108
}
104109

110+
; Should floded by foldICmpCommutative in the future
105111
define i1 @test-add-swap-sub-nuw-icmp-uge(i8 %a, i8 %b) {
106112
; CHECK-LABEL: define i1 @test-add-swap-sub-nuw-icmp-uge(
107113
; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
108-
; CHECK-NEXT: ret i1 true
114+
; CHECK-NEXT: [[SUB:%.*]] = sub nuw i8 [[A]], [[B]]
115+
; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[B]], [[A]]
116+
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[ADD]], [[SUB]]
117+
; CHECK-NEXT: ret i1 [[CMP]]
109118
;
110119
%sub = sub nuw i8 %a, %b
111120
%add = add nuw i8 %b, %a

0 commit comments

Comments
 (0)