[llvm] [InstCombine] Drop `samesign` in InstCombine (PR #112480)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 16 02:01:43 PDT 2024
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/112480
>From d1794638aaa1225061877b6c128e295a7518384a Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 16 Oct 2024 13:08:57 +0800
Subject: [PATCH 1/6] [InstCombine] Add pre-commit tests. NFC.
---
llvm/test/Transforms/InstCombine/icmp.ll | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll
index 5e80134b153be7..b6548fc1bc07e7 100644
--- a/llvm/test/Transforms/InstCombine/icmp.ll
+++ b/llvm/test/Transforms/InstCombine/icmp.ll
@@ -3203,6 +3203,21 @@ define i1 @icmp_and_or_lshr(i32 %x, i32 %y) {
ret i1 %ret
}
+define i1 @icmp_and_or_lshr_samesign(i32 %x, i32 %y) {
+; CHECK-LABEL: @icmp_and_or_lshr_samesign(
+; CHECK-NEXT: [[SHF1:%.*]] = shl nuw i32 1, [[Y:%.*]]
+; CHECK-NEXT: [[OR2:%.*]] = or i32 [[SHF1]], 1
+; CHECK-NEXT: [[AND3:%.*]] = and i32 [[X:%.*]], [[OR2]]
+; CHECK-NEXT: [[RET:%.*]] = icmp samesign ne i32 [[AND3]], 0
+; CHECK-NEXT: ret i1 [[RET]]
+;
+ %shf = lshr i32 %x, %y
+ %or = or i32 %shf, %x
+ %and = and i32 %or, 1
+ %ret = icmp samesign ne i32 %and, 0
+ ret i1 %ret
+}
+
define <2 x i1> @icmp_and_or_lshr_vec(<2 x i32> %x, <2 x i32> %y) {
; CHECK-LABEL: @icmp_and_or_lshr_vec(
; CHECK-NEXT: [[SHF:%.*]] = lshr <2 x i32> [[X:%.*]], [[Y:%.*]]
>From e1c281dc421aedfa8c7f63f59bc7ced2ff2f6fcf Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 16 Oct 2024 13:20:36 +0800
Subject: [PATCH 2/6] [InstCombine] Drop `samesign` in
`InstCombinerImpl::foldICmpAndConstConst`
---
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 1 +
llvm/test/Transforms/InstCombine/icmp.ll | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 7129499e0f8f9d..64e3f11f5837b4 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -1844,6 +1844,7 @@ Instruction *InstCombinerImpl::foldICmpAndConstConst(ICmpInst &Cmp,
/*HasNUW=*/true),
One, Or->getName());
Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
+ Cmp.setSameSign(false);
return replaceOperand(Cmp, 0, NewAnd);
}
}
diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll
index b6548fc1bc07e7..7cafb4885ff0ee 100644
--- a/llvm/test/Transforms/InstCombine/icmp.ll
+++ b/llvm/test/Transforms/InstCombine/icmp.ll
@@ -3208,7 +3208,7 @@ define i1 @icmp_and_or_lshr_samesign(i32 %x, i32 %y) {
; CHECK-NEXT: [[SHF1:%.*]] = shl nuw i32 1, [[Y:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i32 [[SHF1]], 1
; CHECK-NEXT: [[AND3:%.*]] = and i32 [[X:%.*]], [[OR2]]
-; CHECK-NEXT: [[RET:%.*]] = icmp samesign ne i32 [[AND3]], 0
+; CHECK-NEXT: [[RET:%.*]] = icmp ne i32 [[AND3]], 0
; CHECK-NEXT: ret i1 [[RET]]
;
%shf = lshr i32 %x, %y
>From 6b64a2b3cc84913703bb4613ebd10e65f4fee071 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 16 Oct 2024 13:27:32 +0800
Subject: [PATCH 3/6] [InstCombine] Drop `samesign` in
`InstCombinerImpl::foldICmpAndShift`
---
.../Transforms/InstCombine/InstCombineCompares.cpp | 1 +
llvm/test/Transforms/InstCombine/icmp-and-shift.ll | 13 +++++++++++++
2 files changed, 14 insertions(+)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 64e3f11f5837b4..a750feab0e509f 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -1738,6 +1738,7 @@ Instruction *InstCombinerImpl::foldICmpAndShift(ICmpInst &Cmp,
// Compute X & (C2 << Y).
Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
+ Cmp.setSameSign(false);
return replaceOperand(Cmp, 0, NewAnd);
}
diff --git a/llvm/test/Transforms/InstCombine/icmp-and-shift.ll b/llvm/test/Transforms/InstCombine/icmp-and-shift.ll
index 684ece21b1166e..d092363309fec0 100644
--- a/llvm/test/Transforms/InstCombine/icmp-and-shift.ll
+++ b/llvm/test/Transforms/InstCombine/icmp-and-shift.ll
@@ -619,6 +619,19 @@ define i1 @test_shr_and_1_ne_0(i32 %a, i32 %b) {
ret i1 %cmp
}
+define i1 @test_shr_and_1_ne_0_samesign(i32 %a, i32 %b) {
+; CHECK-LABEL: @test_shr_and_1_ne_0_samesign(
+; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i32 1, [[B:%.*]]
+; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[A:%.*]], [[TMP1]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP2]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %shr = lshr i32 %a, %b
+ %and = and i32 %shr, 1
+ %cmp = icmp samesign ne i32 %and, 0
+ ret i1 %cmp
+}
+
define i1 @test_const_shr_and_1_ne_0(i32 %b) {
; CHECK-LABEL: @test_const_shr_and_1_ne_0(
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i32 1, [[B:%.*]]
>From 867bb0d1482491768307fcb000670a27693fa63f Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 16 Oct 2024 13:35:20 +0800
Subject: [PATCH 4/6] [InstCombine] Drop `samesign` in
`InstCombinerImpl::foldSelectEqualityTest`
---
.../Transforms/InstCombine/InstCombineSelect.cpp | 1 +
.../Transforms/InstCombine/icmp-equality-test.ll | 16 ++++++++++++++++
2 files changed, 17 insertions(+)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 8be2eeed84adfc..623694663aa1be 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -1448,6 +1448,7 @@ Instruction *InstCombinerImpl::foldSelectEqualityTest(SelectInst &Sel) {
m_c_SpecificICmp(ICmpInst::ICMP_EQ, m_Specific(X), m_Specific(Y))))
return nullptr;
+ cast<ICmpInst>(XeqY)->setSameSign(false);
return replaceInstUsesWith(Sel, XeqY);
}
diff --git a/llvm/test/Transforms/InstCombine/icmp-equality-test.ll b/llvm/test/Transforms/InstCombine/icmp-equality-test.ll
index c2740ca7fe8aa9..b9d8f2d54def3d 100644
--- a/llvm/test/Transforms/InstCombine/icmp-equality-test.ll
+++ b/llvm/test/Transforms/InstCombine/icmp-equality-test.ll
@@ -33,6 +33,22 @@ entry:
ret i1 %equal
}
+define i1 @icmp_equality_test_constant_samesign(i42 %X, i42 %Y) {
+; CHECK-LABEL: @icmp_equality_test_constant_samesign(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i42 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: ret i1 [[XEQY]]
+;
+entry:
+ %XeqC = icmp eq i42 %X, -42
+ %YeqC = icmp eq i42 %Y, -42
+ %XeqY = icmp samesign eq i42 %X, %Y
+ %not.YeqC = xor i1 %YeqC, true
+ %and = select i1 %not.YeqC, i1 %XeqY, i1 false
+ %equal = select i1 %XeqC, i1 %YeqC, i1 %and
+ ret i1 %equal
+}
+
define i1 @icmp_equality_test_swift_optional_pointers(i64 %X, i64 %Y) {
; CHECK-LABEL: @icmp_equality_test_swift_optional_pointers(
; CHECK-NEXT: entry:
>From 596ed89cccd019e03bb7a4ab225718c85362433b Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 16 Oct 2024 16:35:25 +0800
Subject: [PATCH 5/6] [InstCombine] Address review comments.
---
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index a750feab0e509f..c80bdacee5f9fc 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -1738,8 +1738,8 @@ Instruction *InstCombinerImpl::foldICmpAndShift(ICmpInst &Cmp,
// Compute X & (C2 << Y).
Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
- Cmp.setSameSign(false);
- return replaceOperand(Cmp, 0, NewAnd);
+ return ICmpInst::Create(Instruction::ICmp, Cmp.getPredicate(), NewAnd,
+ Cmp.getOperand(1));
}
return nullptr;
@@ -1845,8 +1845,8 @@ Instruction *InstCombinerImpl::foldICmpAndConstConst(ICmpInst &Cmp,
/*HasNUW=*/true),
One, Or->getName());
Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
- Cmp.setSameSign(false);
- return replaceOperand(Cmp, 0, NewAnd);
+ return ICmpInst::Create(Instruction::ICmp, Cmp.getPredicate(), NewAnd,
+ Cmp.getOperand(1));
}
}
}
>From a5be045ea9fa6dadc12d40f8b5afafb65c5fbce9 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 16 Oct 2024 16:59:27 +0800
Subject: [PATCH 6/6] [InstCombine] Address review comments. NFC.
---
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index c80bdacee5f9fc..18a6fdcec1728e 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -1738,8 +1738,7 @@ Instruction *InstCombinerImpl::foldICmpAndShift(ICmpInst &Cmp,
// Compute X & (C2 << Y).
Value *NewAnd = Builder.CreateAnd(Shift->getOperand(0), NewShift);
- return ICmpInst::Create(Instruction::ICmp, Cmp.getPredicate(), NewAnd,
- Cmp.getOperand(1));
+ return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
}
return nullptr;
@@ -1845,8 +1844,7 @@ Instruction *InstCombinerImpl::foldICmpAndConstConst(ICmpInst &Cmp,
/*HasNUW=*/true),
One, Or->getName());
Value *NewAnd = Builder.CreateAnd(A, NewOr, And->getName());
- return ICmpInst::Create(Instruction::ICmp, Cmp.getPredicate(), NewAnd,
- Cmp.getOperand(1));
+ return new ICmpInst(Cmp.getPredicate(), NewAnd, Cmp.getOperand(1));
}
}
}
More information about the llvm-commits
mailing list