[llvm] [AMDGPU] Do not fold clamp when only one max source has modifiers (PR #224517)

Arseniy Obolenskiy via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 21 06:48:52 PDT 2026


https://github.com/aobolensk updated https://github.com/llvm/llvm-project/pull/224517

>From af88010bda74cde1fb415bb033ce4515365372ff Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Fri, 18 Sep 2026 07:11:22 +0200
Subject: [PATCH 1/3] [AMDGPU] Do not fold clamp when only one max source has
 modifiers

---
 llvm/lib/Target/AMDGPU/SIFoldOperands.cpp     |  2 +-
 .../AMDGPU/clamp-omod-special-case.mir        | 52 +++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
index f92b2643cbdf9..23d9610f4295e 100644
--- a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
+++ b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
@@ -2326,7 +2326,7 @@ SIFoldOperandsImpl::isClamp(const MachineInstr &MI) const {
         (Op == AMDGPU::V_PK_MAX_F16 || Op == AMDGPU::V_PK_MAX_NUM_BF16)
             ? SISrcMods::OP_SEL_1
             : 0u;
-    if (Src0Mods != UnsetMods && Src1Mods != UnsetMods)
+    if (Src0Mods != UnsetMods || Src1Mods != UnsetMods)
       return nullptr;
     return Src0;
   }
diff --git a/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir b/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
index 8d5017f17f612..10880fb3d80cd 100644
--- a/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
+++ b/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
@@ -498,3 +498,55 @@ body:             |
     %3:vgpr_32 = nsz nofpexcept V_MUL_F32_e64 0, killed %2, 0, 1056964608, 0, 0, implicit $mode, implicit $exec
 
 ...
+
+---
+# GCN-LABEL: name: clamp_no_src_mods
+# GCN: %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 1, 0, implicit $mode, implicit $exec
+# GCN-NEXT: S_ENDPGM 0, implicit %2
+name:            clamp_no_src_mods
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $vgpr0, $vgpr1
+
+    %0:vgpr_32 = COPY $vgpr0
+    %1:vgpr_32 = COPY $vgpr1
+    %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
+    %3:vgpr_32 = nofpexcept V_MAX_F32_e64 0, killed %2, 0, killed %2, 1, 0, implicit $mode, implicit $exec
+    S_ENDPGM 0, implicit %3
+...
+
+---
+# max(x, |x|) is not x, so the clamp cannot be folded into the def of x.
+# GCN-LABEL: name: clamp_abs_src1_only
+# GCN: %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
+# GCN-NEXT: %3:vgpr_32 = nofpexcept V_MAX_F32_e64 0, killed %2, 2, killed %2, 1, 0, implicit $mode, implicit $exec
+name:            clamp_abs_src1_only
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $vgpr0, $vgpr1
+
+    %0:vgpr_32 = COPY $vgpr0
+    %1:vgpr_32 = COPY $vgpr1
+    %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
+    %3:vgpr_32 = nofpexcept V_MAX_F32_e64 0, killed %2, 2, killed %2, 1, 0, implicit $mode, implicit $exec
+    S_ENDPGM 0, implicit %3
+...
+
+---
+# GCN-LABEL: name: clamp_abs_src0_only
+# GCN: %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
+# GCN-NEXT: %3:vgpr_32 = nofpexcept V_MAX_F32_e64 2, killed %2, 0, killed %2, 1, 0, implicit $mode, implicit $exec
+name:            clamp_abs_src0_only
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $vgpr0, $vgpr1
+
+    %0:vgpr_32 = COPY $vgpr0
+    %1:vgpr_32 = COPY $vgpr1
+    %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
+    %3:vgpr_32 = nofpexcept V_MAX_F32_e64 2, killed %2, 0, killed %2, 1, 0, implicit $mode, implicit $exec
+    S_ENDPGM 0, implicit %3
+...

>From 2d22d1651a976bf22d2ccbf153186d54947119e6 Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Mon, 21 Sep 2026 07:42:47 +0200
Subject: [PATCH 2/3] rm 1 test

---
 .../CodeGen/AMDGPU/clamp-omod-special-case.mir  | 17 -----------------
 1 file changed, 17 deletions(-)

diff --git a/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir b/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
index 10880fb3d80cd..7cd6521a1b56c 100644
--- a/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
+++ b/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
@@ -533,20 +533,3 @@ body:             |
     %3:vgpr_32 = nofpexcept V_MAX_F32_e64 0, killed %2, 2, killed %2, 1, 0, implicit $mode, implicit $exec
     S_ENDPGM 0, implicit %3
 ...
-
----
-# GCN-LABEL: name: clamp_abs_src0_only
-# GCN: %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
-# GCN-NEXT: %3:vgpr_32 = nofpexcept V_MAX_F32_e64 2, killed %2, 0, killed %2, 1, 0, implicit $mode, implicit $exec
-name:            clamp_abs_src0_only
-tracksRegLiveness: true
-body:             |
-  bb.0:
-    liveins: $vgpr0, $vgpr1
-
-    %0:vgpr_32 = COPY $vgpr0
-    %1:vgpr_32 = COPY $vgpr1
-    %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
-    %3:vgpr_32 = nofpexcept V_MAX_F32_e64 2, killed %2, 0, killed %2, 1, 0, implicit $mode, implicit $exec
-    S_ENDPGM 0, implicit %3
-...

>From d29cd2fffc5bcda9b36cff6e69731f99fc31ce1c Mon Sep 17 00:00:00 2001
From: Arseniy Obolenskiy <arseniy.obolenskiy at amd.com>
Date: Mon, 21 Sep 2026 15:12:22 +0200
Subject: [PATCH 3/3] Revert "rm 1 test"

This reverts commit 2d22d1651a976bf22d2ccbf153186d54947119e6.
---
 .../CodeGen/AMDGPU/clamp-omod-special-case.mir  | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir b/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
index 7cd6521a1b56c..10880fb3d80cd 100644
--- a/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
+++ b/llvm/test/CodeGen/AMDGPU/clamp-omod-special-case.mir
@@ -533,3 +533,20 @@ body:             |
     %3:vgpr_32 = nofpexcept V_MAX_F32_e64 0, killed %2, 2, killed %2, 1, 0, implicit $mode, implicit $exec
     S_ENDPGM 0, implicit %3
 ...
+
+---
+# GCN-LABEL: name: clamp_abs_src0_only
+# GCN: %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
+# GCN-NEXT: %3:vgpr_32 = nofpexcept V_MAX_F32_e64 2, killed %2, 0, killed %2, 1, 0, implicit $mode, implicit $exec
+name:            clamp_abs_src0_only
+tracksRegLiveness: true
+body:             |
+  bb.0:
+    liveins: $vgpr0, $vgpr1
+
+    %0:vgpr_32 = COPY $vgpr0
+    %1:vgpr_32 = COPY $vgpr1
+    %2:vgpr_32 = nofpexcept V_ADD_F32_e64 0, %0, 0, %1, 0, 0, implicit $mode, implicit $exec
+    %3:vgpr_32 = nofpexcept V_MAX_F32_e64 2, killed %2, 0, killed %2, 1, 0, implicit $mode, implicit $exec
+    S_ENDPGM 0, implicit %3
+...



More information about the llvm-commits mailing list