[llvm] [InstCombine] Fold selection between less than zero and one (PR #69961)

via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 23 12:03:11 PDT 2023


https://github.com/elhewaty created https://github.com/llvm/llvm-project/pull/69961

- [InstCombine] Add test coverage for selection between less than zero and one(NFC)
- [InstCombine] Fold selection between less than zero and one
 Alive2: https://alive2.llvm.org/ce/z/NFLjSG
 Fixes: https://github.com/llvm/llvm-project/issues/68227


>From 669bcbbe753816956b7e555a8f86bcb520623453 Mon Sep 17 00:00:00 2001
From: Mohamed Atef <mohamedatef1698 at gmail.com>
Date: Mon, 23 Oct 2023 21:37:47 +0300
Subject: [PATCH 1/2] [InstCombine] Add test coverage for selection between
 less than zero and one(NFC)

---
 llvm/test/Transforms/InstCombine/icmp-select.ll | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/llvm/test/Transforms/InstCombine/icmp-select.ll b/llvm/test/Transforms/InstCombine/icmp-select.ll
index 0d723c9df32e2f4..60c98698ed09268 100644
--- a/llvm/test/Transforms/InstCombine/icmp-select.ll
+++ b/llvm/test/Transforms/InstCombine/icmp-select.ll
@@ -5,6 +5,19 @@ declare void @use(i8)
 declare void @use.i1(i1)
 declare i8 @llvm.umin.i8(i8, i8)
 
+define i32 @test_icmp_select_lte_0(i32 %0) {
+; CHECK-LABEL: @test_icmp_select_lte_0(
+; CHECK-NEXT:    [[CML:%.*]] = icmp eq i32 [[TMP0:%.*]], 0
+; CHECK-NEXT:    [[LSHR:%.*]] = lshr i32 [[TMP0]], 31
+; CHECK-NEXT:    [[RE:%.*]] = select i1 [[CML]], i32 1, i32 [[LSHR]]
+; CHECK-NEXT:    ret i32 [[RE]]
+;
+  %cml = icmp eq i32 %0, 0
+  %lshr = lshr i32 %0, 31
+  %re = select i1 %cml, i32 1, i32 %lshr
+  ret i32 %re
+}
+
 define i1 @icmp_select_const(i8 %x, i8 %y) {
 ; CHECK-LABEL: @icmp_select_const(
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[X:%.*]], 0

>From e25e74fcde189fd2f56ffa6562d8af84945e3d48 Mon Sep 17 00:00:00 2001
From: Mohamed Atef <mohamedatef1698 at gmail.com>
Date: Mon, 23 Oct 2023 21:59:52 +0300
Subject: [PATCH 2/2] [InstCombine] Fold selection between less than zero and
 one

---
 .../Transforms/InstCombine/InstCombineSelect.cpp   | 14 ++++++++++++++
 llvm/test/Transforms/InstCombine/icmp-select.ll    |  5 ++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 7a15c0dee492b5a..4fd3f4f594d7a77 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -3415,6 +3415,20 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
                                 TrueVal);
   }
 
+  // select (icmp eq a, 0), 1, (lshr a, 31) -> icmp sle a, 0,
+  // which is then converted to icmp sle a, 1
+  CmpInst::Predicate Pred;
+  Value *A;
+  const APInt *C;
+  if (match(CondVal, m_Cmp(Pred, m_Value(A), m_Zero())) &&
+      match(TrueVal, m_One()) &&
+      match(FalseVal, m_LShr(m_Specific(A), m_APInt(C))) &&
+      Pred == ICmpInst::ICMP_EQ && *C == 31) {
+    auto *Cond = Builder.CreateICmpSLE(A,
+                                       ConstantInt::getNullValue(A->getType()));
+    return new ZExtInst(Cond, A->getType());
+  }
+
   if (Instruction *R = foldSelectOfBools(SI))
     return R;
 
diff --git a/llvm/test/Transforms/InstCombine/icmp-select.ll b/llvm/test/Transforms/InstCombine/icmp-select.ll
index 60c98698ed09268..7fe37200788dc5e 100644
--- a/llvm/test/Transforms/InstCombine/icmp-select.ll
+++ b/llvm/test/Transforms/InstCombine/icmp-select.ll
@@ -7,9 +7,8 @@ declare i8 @llvm.umin.i8(i8, i8)
 
 define i32 @test_icmp_select_lte_0(i32 %0) {
 ; CHECK-LABEL: @test_icmp_select_lte_0(
-; CHECK-NEXT:    [[CML:%.*]] = icmp eq i32 [[TMP0:%.*]], 0
-; CHECK-NEXT:    [[LSHR:%.*]] = lshr i32 [[TMP0]], 31
-; CHECK-NEXT:    [[RE:%.*]] = select i1 [[CML]], i32 1, i32 [[LSHR]]
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[TMP0:%.*]], 1
+; CHECK-NEXT:    [[RE:%.*]] = zext i1 [[TMP2]] to i32
 ; CHECK-NEXT:    ret i32 [[RE]]
 ;
   %cml = icmp eq i32 %0, 0



More information about the llvm-commits mailing list