[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