[llvm] Fixes #104875 (PR #107741)

via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 8 00:23:30 PDT 2024


https://github.com/braw-lee created https://github.com/llvm/llvm-project/pull/107741

This is still a WIP, creating PR to get some help

>From db927812544255d358c29526e179bbbba84a6766 Mon Sep 17 00:00:00 2001
From: Kushal Pal <kushalpal109 at gmail.com>
Date: Sun, 8 Sep 2024 12:42:14 +0530
Subject: [PATCH 1/2] [InstCombine] Add pre-commit tests.

Signed-off-by: Kushal Pal <kushalpal109 at gmail.com>
---
 .../InstCombine/clamp-with-unsigned-minmax.ll     | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
 create mode 100644 llvm/test/Transforms/InstCombine/clamp-with-unsigned-minmax.ll

diff --git a/llvm/test/Transforms/InstCombine/clamp-with-unsigned-minmax.ll b/llvm/test/Transforms/InstCombine/clamp-with-unsigned-minmax.ll
new file mode 100644
index 00000000000000..a0ad83204ecbbb
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/clamp-with-unsigned-minmax.ll
@@ -0,0 +1,15 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
+
+define i32 @clamp_pattern_with_signed_icmp_unsigned_min(i32 %input ) {
+; CHECK-LABEL: @clamp_pattern_with_signed_icmp_unsigned_min(
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[INPUT:%.*]], 0
+; CHECK-NEXT:    [[TMP2:%.*]] = tail call i32 @llvm.umin.i32(i32 [[INPUT]], i32 255)
+; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 0, i32 [[TMP2]]
+; CHECK-NEXT:    ret i32 [[TMP3]]
+;
+  %1 = icmp slt i32 %input, 0
+  %2 = tail call i32 @llvm.umin.i32(i32 %input, i32 255)
+  %3 = select i1 %1, i32 0, i32 %2
+  ret i32 %3
+}

>From 9bd0b438eed93327726e797e1ba45b35e6e468ec Mon Sep 17 00:00:00 2001
From: Kushal Pal <kushalpal109 at gmail.com>
Date: Sat, 7 Sep 2024 15:06:14 +0530
Subject: [PATCH 2/2] [InstCombine] Fold select((i <s 0) ? 0 : umin(i, 255)) ->
 smax(0, umin(i,255))

Signed-off-by: Kushal Pal <kushalpal109 at gmail.com>
---
 llvm/lib/Analysis/ValueTracking.cpp                         | 5 +++++
 .../Transforms/InstCombine/clamp-with-unsigned-minmax.ll    | 6 ++----
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 173faa32a3878d..82700fb8be8fb5 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -8139,6 +8139,11 @@ static SelectPatternResult matchClamp(CmpInst::Predicate Pred,
     if (match(FalseVal, m_UMax(m_Specific(CmpLHS), m_APInt(C2))) &&
         C1->ugt(*C2) && Pred == CmpInst::ICMP_UGT)
       return {SPF_UMIN, SPNB_NA, false};
+
+    // (X <s C1) ? C1 : UMIN(X, C2) ==> SMAX(UMIN(X, C2), C1)
+    if (match(FalseVal, m_UMin(m_Specific(CmpLHS), m_APInt(C2))) &&
+        C1->slt(*C2) && Pred == CmpInst::ICMP_SLT)
+      return {SPF_SMAX, SPNB_NA, false};
   }
   return {SPF_UNKNOWN, SPNB_NA, false};
 }
diff --git a/llvm/test/Transforms/InstCombine/clamp-with-unsigned-minmax.ll b/llvm/test/Transforms/InstCombine/clamp-with-unsigned-minmax.ll
index a0ad83204ecbbb..a53b739fbd009a 100644
--- a/llvm/test/Transforms/InstCombine/clamp-with-unsigned-minmax.ll
+++ b/llvm/test/Transforms/InstCombine/clamp-with-unsigned-minmax.ll
@@ -3,10 +3,8 @@
 
 define i32 @clamp_pattern_with_signed_icmp_unsigned_min(i32 %input ) {
 ; CHECK-LABEL: @clamp_pattern_with_signed_icmp_unsigned_min(
-; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[INPUT:%.*]], 0
-; CHECK-NEXT:    [[TMP2:%.*]] = tail call i32 @llvm.umin.i32(i32 [[INPUT]], i32 255)
-; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP1]], i32 0, i32 [[TMP2]]
-; CHECK-NEXT:    ret i32 [[TMP3]]
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @llvm.umin.i32(i32 [[INPUT:%.*]], i32 255)
+; CHECK-NEXT:    ret i32 [[TMP1]]
 ;
   %1 = icmp slt i32 %input, 0
   %2 = tail call i32 @llvm.umin.i32(i32 %input, i32 255)



More information about the llvm-commits mailing list