[llvm] [InstCombine] Drop `samesign` flag in `foldAndOrOfICmpsWithConstEq` (PR #112489)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 16 00:12:20 PDT 2024
https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/112489
In https://github.com/llvm/llvm-project/commit/5dbfca30c1a672cd0c5089df2b4fdd171436643a we assume that RHS is poison implies LHS is also poison. It doesn't hold after introducing samesign flag.
This patch drops the `samesign` flag on RHS if the original expression is a logical and/or.
It is an alternative to https://github.com/llvm/llvm-project/pull/112475.
Closes #112467.
>From bbcf082482f4bff8f3b785e33ea9b19e5127ddb9 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 16 Oct 2024 14:51:38 +0800
Subject: [PATCH 1/2] [InstCombine] Add pre-commit tests. NFC.
---
.../Transforms/InstCombine/and-or-icmp-min-max.ll | 11 +++++++++++
.../Transforms/InstCombine/and-or-icmp-nullptr.ll | 13 +++++++++++++
2 files changed, 24 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll b/llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll
index 058847a75bde7f..5beaef384fd09b 100644
--- a/llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll
+++ b/llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll
@@ -689,6 +689,17 @@ define i1 @sge_and_max_logical(i8 %x, i8 %y) {
ret i1 %r
}
+define i1 @sge_and_max_logical_samesign(i8 %x, i8 %y) {
+; CHECK-LABEL: @sge_and_max_logical_samesign(
+; CHECK-NEXT: [[CMPEQ:%.*]] = icmp samesign eq i8 [[X:%.*]], 127
+; CHECK-NEXT: ret i1 [[CMPEQ]]
+;
+ %cmp = icmp sge i8 %x, %y
+ %cmpeq = icmp samesign eq i8 %x, 127
+ %r = select i1 %cmp, i1 %cmpeq, i1 false
+ ret i1 %r
+}
+
define i1 @sge_and_max_commute(i8 %x, i8 %y) {
; CHECK-LABEL: @sge_and_max_commute(
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127
diff --git a/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll b/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll
index d533cc7048536c..ae25f4b57ef804 100644
--- a/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll
+++ b/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll
@@ -592,6 +592,19 @@ define i1 @sgt_and_min_logical(ptr %x, ptr %y) {
ret i1 %r
}
+define i1 @sgt_and_min_logical_samesign(ptr %x, ptr %y) {
+; CHECK-LABEL: @sgt_and_min_logical_samesign(
+; CHECK-NEXT: [[CMPEQ:%.*]] = icmp samesign eq ptr [[X:%.*]], null
+; CHECK-NEXT: [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null
+; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %cmp = icmp sgt ptr %x, %y
+ %cmpeq = icmp samesign eq ptr %x, null
+ %r = select i1 %cmp, i1 %cmpeq, i1 false
+ ret i1 %r
+}
+
define i1 @sle_or_not_min(ptr %x, ptr %y) {
; CHECK-LABEL: @sle_or_not_min(
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
>From 30d05edfd87d325e5beaa4e655ee1a12a2c3aac2 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Wed, 16 Oct 2024 14:52:51 +0800
Subject: [PATCH 2/2] [InstCombine] Drop `samesign` flag in
`foldAndOrOfICmpsWithConstEq`
---
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 8 +++++++-
llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll | 2 +-
llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll | 2 +-
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 64bee4ab974ede..c8407e8ba5aba8 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -3369,8 +3369,14 @@ Value *InstCombinerImpl::foldAndOrOfICmps(ICmpInst *LHS, ICmpInst *RHS,
// We can convert this case to bitwise and, because both operands are used
// on the LHS, and as such poison from both will propagate.
if (Value *V = foldAndOrOfICmpsWithConstEq(RHS, LHS, IsAnd,
- /*IsLogical*/ false, Builder, Q))
+ /*IsLogical=*/false, Builder, Q)) {
+ // If RHS is still used, we should drop samesign flag.
+ if (IsLogical && RHS->hasSameSign() && !RHS->use_empty()) {
+ RHS->setSameSign(false);
+ addToWorklist(RHS);
+ }
return V;
+ }
if (Value *V = foldIsPowerOf2OrZero(LHS, RHS, IsAnd, Builder, *this))
return V;
diff --git a/llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll b/llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll
index 5beaef384fd09b..cc55c4a39a2678 100644
--- a/llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll
+++ b/llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll
@@ -691,7 +691,7 @@ define i1 @sge_and_max_logical(i8 %x, i8 %y) {
define i1 @sge_and_max_logical_samesign(i8 %x, i8 %y) {
; CHECK-LABEL: @sge_and_max_logical_samesign(
-; CHECK-NEXT: [[CMPEQ:%.*]] = icmp samesign eq i8 [[X:%.*]], 127
+; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127
; CHECK-NEXT: ret i1 [[CMPEQ]]
;
%cmp = icmp sge i8 %x, %y
diff --git a/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll b/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll
index ae25f4b57ef804..8650b89c3b9ef3 100644
--- a/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll
+++ b/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll
@@ -594,7 +594,7 @@ define i1 @sgt_and_min_logical(ptr %x, ptr %y) {
define i1 @sgt_and_min_logical_samesign(ptr %x, ptr %y) {
; CHECK-LABEL: @sgt_and_min_logical_samesign(
-; CHECK-NEXT: [[CMPEQ:%.*]] = icmp samesign eq ptr [[X:%.*]], null
+; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
; CHECK-NEXT: [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null
; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
; CHECK-NEXT: ret i1 [[R]]
More information about the llvm-commits
mailing list