[llvm] [AMGDPU] Add gfx1251 V_PK_MIN/MAX_NUM_F64 (PR #203596)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 12 10:59:08 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-amdgpu

Author: Stanislav Mekhanoshin (rampitec)

<details>
<summary>Changes</summary>

Also legalizes v2f64 fcanonicalize.


---

Patch is 401.31 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/203596.diff


11 Files Affected:

- (modified) llvm/lib/Target/AMDGPU/SIISelLowering.cpp (+11-4) 
- (modified) llvm/lib/Target/AMDGPU/SIInstructions.td (+6) 
- (modified) llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp (+4) 
- (modified) llvm/lib/Target/AMDGPU/VOP3PInstructions.td (+7) 
- (modified) llvm/test/CodeGen/AMDGPU/fcanonicalize.ll (+2762-229) 
- (modified) llvm/test/CodeGen/AMDGPU/maximumnum.ll (+1357) 
- (modified) llvm/test/CodeGen/AMDGPU/minimumnum.ll (+1317) 
- (modified) llvm/test/CodeGen/AMDGPU/packed-fp64.ll (+552) 
- (modified) llvm/test/MC/AMDGPU/gfx1251_asm_vop3p.s (+96) 
- (modified) llvm/test/MC/AMDGPU/gfx1251_err.s (+78) 
- (modified) llvm/test/MC/Disassembler/AMDGPU/gfx1251_dasm_vop3p.txt (+72) 


``````````diff
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index 30950f8f5d9e5..cf2c55cc360f8 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -905,11 +905,18 @@ SITargetLowering::SITargetLowering(const TargetMachine &TM,
                          Custom);
     }
     if (Subtarget->hasPackedFP64Ops()) {
-      setOperationAction({ISD::FADD, ISD::FMUL, ISD::FMA, ISD::FNEG},
+      setOperationAction({ISD::FADD, ISD::FMUL, ISD::FMA, ISD::FNEG,
+                          ISD::FMINNUM_IEEE, ISD::FMAXNUM_IEEE,
+                          ISD::FCANONICALIZE},
                          MVT::v2f64, Legal);
-      setOperationAction({ISD::FADD, ISD::FMUL, ISD::FMA, ISD::FNEG},
-                         {MVT::v4f64, MVT::v8f64, MVT::v16f64, MVT::v32f64},
-                         Custom);
+      setOperationAction(
+          {ISD::FMINNUM, ISD::FMAXNUM, ISD::FMINIMUMNUM, ISD::FMAXIMUMNUM},
+          MVT::v2f64, Custom);
+      setOperationAction(
+          {ISD::FADD, ISD::FMUL, ISD::FMA, ISD::FNEG, ISD::FMINNUM_IEEE,
+           ISD::FMAXNUM_IEEE, ISD::FMINNUM, ISD::FMAXNUM, ISD::FMINIMUMNUM,
+           ISD::FMAXIMUMNUM, ISD::FCANONICALIZE},
+          {MVT::v4f64, MVT::v8f64, MVT::v16f64, MVT::v32f64}, Custom);
     }
   }
 
diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td
index 6b09faba5ddcc..a00f526919b90 100644
--- a/llvm/lib/Target/AMDGPU/SIInstructions.td
+++ b/llvm/lib/Target/AMDGPU/SIInstructions.td
@@ -3801,6 +3801,12 @@ multiclass SelectCanonicalizeAsMax<
     // FIXME: Should have VOP3P subtarget predicate
     let OtherPredicates = f16_preds;
   }
+
+  def : GCNPat<
+    (fcanonicalize (v2f64 (VOP3PMods v2f64:$src, i32:$src_mods))),
+    (V_PK_MAX_NUM_F64 $src_mods, $src, $src_mods, $src)> {
+    let OtherPredicates = !listconcat(f64_preds, [HasPackedFP64Ops]);
+  }
 }
 
 // On pre-gfx9 targets, v_max_*/v_min_* did not respect the denormal
diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
index d134f5020096c..7c515172791e3 100644
--- a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
@@ -3849,6 +3849,10 @@ bool isPacked64BitInst(unsigned Opc) {
   case AMDGPU::V_PK_MUL_F64_gfx1250:
   case AMDGPU::V_PK_FMA_F64:
   case AMDGPU::V_PK_FMA_F64_gfx1250:
+  case AMDGPU::V_PK_MAX_NUM_F64:
+  case AMDGPU::V_PK_MAX_NUM_F64_gfx1250:
+  case AMDGPU::V_PK_MIN_NUM_F64:
+  case AMDGPU::V_PK_MIN_NUM_F64_gfx1250:
     return true;
   default:
     return false;
diff --git a/llvm/lib/Target/AMDGPU/VOP3PInstructions.td b/llvm/lib/Target/AMDGPU/VOP3PInstructions.td
index d44fab6046ac7..7acd2a08a3886 100644
--- a/llvm/lib/Target/AMDGPU/VOP3PInstructions.td
+++ b/llvm/lib/Target/AMDGPU/VOP3PInstructions.td
@@ -164,6 +164,11 @@ defm V_PK_MIN_U16 : VOP3PInst<"v_pk_min_u16", VOP3P_Profile<VOP_V2I16_V2I16_V2I1
 defm V_PK_MAX_I16 : VOP3PInst<"v_pk_max_i16", VOP3P_Profile<VOP_V2I16_V2I16_V2I16>, smax>;
 defm V_PK_MAX_U16 : VOP3PInst<"v_pk_max_u16", VOP3P_Profile<VOP_V2I16_V2I16_V2I16>, umax>;
 
+let SubtargetPredicate = HasPackedFP64Ops, SchedRW = [WriteDouble] in {
+defm V_PK_MAX_NUM_F64 : VOP3PInst<"v_pk_max_num_f64", V_PK_VOP2_F64_Profile, fmaxnum_like>;
+defm V_PK_MIN_NUM_F64 : VOP3PInst<"v_pk_min_num_f64", V_PK_VOP2_F64_Profile, fminnum_like>;
+}
+
 let SubtargetPredicate = HasIEEEMinimumMaximumInsts, ReadsModeReg = 0 in {
 defm V_PK_MAXIMUM_F16 : VOP3PInst<"v_pk_maximum_f16", VOP3P_Profile<VOP_V2F16_V2F16_V2F16, VOP3_PACKED>, fmaximum>;
 defm V_PK_MINIMUM_F16 : VOP3PInst<"v_pk_minimum_f16", VOP3P_Profile<VOP_V2F16_V2F16_V2F16, VOP3_PACKED>, fminimum>;
@@ -2705,6 +2710,8 @@ let PostEncoderMethod = "postEncodeVOP3<true, true, false>" in {
 defm V_PK_FMA_F64      : VOP3P_Real_gfx1250<0x3b>;
 defm V_PK_MUL_F64      : VOP3P_Real_gfx1250<0x3c>;
 defm V_PK_ADD_F64      : VOP3P_Real_gfx1250<0x4b>;
+defm V_PK_MAX_NUM_F64  : VOP3P_Real_gfx1250<0x4e>;
+defm V_PK_MIN_NUM_F64  : VOP3P_Real_gfx1250<0x4f>;
 
 let AssemblerPredicate = isGFX1250Plus in
 def : AMDGPUMnemonicAlias<"v_fma_mix_f32_f16",  "v_fma_mix_f32">;
diff --git a/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll b/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
index 6b7ddd9a49087..fe29690466184 100644
--- a/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
+++ b/llvm/test/CodeGen/AMDGPU/fcanonicalize.ll
@@ -13,6 +13,10 @@
 ; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-TRUE16,GFX12-GISEL-TRUE16 %s
 ; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG,GFX12-FAKE16,GFX12-SDAG-FAKE16 %s
 ; RUN: llc -global-isel=1 -new-reg-bank-select -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL,GFX12-FAKE16,GFX12-GISEL-FAKE16 %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1251 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX1251,GFX12-TRUE16,GFX1251-TRUE16,GFX1251-SDAG-TRUE16 %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1251 -mattr=+real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX1251,GFX12-TRUE16,GFX1251-TRUE16,GFX1251-GISEL-TRUE16 %s
+; RUN: llc -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1251 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX1251,GFX12-FAKE16,GFX1251-FAKE16,GFX1251-SDAG-FAKE16 %s
+; RUN: llc -global-isel=1 -amdgpu-scalarize-global-loads=false -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1251 -mattr=-real-true16 < %s | FileCheck -check-prefixes=GFX12,GFX1251,GFX12-FAKE16,GFX1251-FAKE16,GFX1251-GISEL-FAKE16 %s
 
 declare float @llvm.fabs.f32(float) #0
 declare float @llvm.canonicalize.f32(float) #0
@@ -125,6 +129,54 @@ define amdgpu_kernel void @v_test_canonicalize_var_f32(ptr addrspace(1) %out) #1
 ; GFX12-GISEL-NEXT:    v_max_num_f32_e64 v0, s2, s2
 ; GFX12-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
 ; GFX12-GISEL-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-TRUE16-LABEL: v_test_canonicalize_var_f32:
+; GFX1251-SDAG-TRUE16:       ; %bb.0:
+; GFX1251-SDAG-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-SDAG-TRUE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_loadcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    v_max_num_f32_e32 v1, v1, v1
+; GFX1251-SDAG-TRUE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-TRUE16-LABEL: v_test_canonicalize_var_f32:
+; GFX1251-GISEL-TRUE16:       ; %bb.0:
+; GFX1251-GISEL-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b32 s2, s[0:1], 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    v_max_num_f32_e64 v0, s2, s2
+; GFX1251-GISEL-TRUE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-FAKE16-LABEL: v_test_canonicalize_var_f32:
+; GFX1251-SDAG-FAKE16:       ; %bb.0:
+; GFX1251-SDAG-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-SDAG-FAKE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_loadcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    v_max_num_f32_e32 v1, v1, v1
+; GFX1251-SDAG-FAKE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-FAKE16-LABEL: v_test_canonicalize_var_f32:
+; GFX1251-GISEL-FAKE16:       ; %bb.0:
+; GFX1251-GISEL-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b32 s2, s[0:1], 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    v_max_num_f32_e64 v0, s2, s2
+; GFX1251-GISEL-FAKE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-FAKE16-NEXT:    s_endpgm
   %val = load float, ptr addrspace(1) %out
   %canonicalized = call float @llvm.canonicalize.f32(float %val)
   store float %canonicalized, ptr addrspace(1) %out
@@ -247,6 +299,46 @@ define amdgpu_kernel void @s_test_canonicalize_var_f32(ptr addrspace(1) %out, fl
 ; GFX12-GISEL-NEXT:    v_max_num_f32_e64 v0, s2, s2
 ; GFX12-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
 ; GFX12-GISEL-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-TRUE16-LABEL: s_test_canonicalize_var_f32:
+; GFX1251-SDAG-TRUE16:       ; %bb.0:
+; GFX1251-SDAG-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-TRUE16-NEXT:    s_load_b96 s[0:2], s[4:5], 0x0 nv
+; GFX1251-SDAG-TRUE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    v_max_num_f32_e64 v1, s2, s2
+; GFX1251-SDAG-TRUE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-TRUE16-LABEL: s_test_canonicalize_var_f32:
+; GFX1251-GISEL-TRUE16:       ; %bb.0:
+; GFX1251-GISEL-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b96 s[0:2], s[4:5], 0x0 nv
+; GFX1251-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    v_max_num_f32_e64 v0, s2, s2
+; GFX1251-GISEL-TRUE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-FAKE16-LABEL: s_test_canonicalize_var_f32:
+; GFX1251-SDAG-FAKE16:       ; %bb.0:
+; GFX1251-SDAG-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-FAKE16-NEXT:    s_load_b96 s[0:2], s[4:5], 0x0 nv
+; GFX1251-SDAG-FAKE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    v_max_num_f32_e64 v1, s2, s2
+; GFX1251-SDAG-FAKE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-FAKE16-LABEL: s_test_canonicalize_var_f32:
+; GFX1251-GISEL-FAKE16:       ; %bb.0:
+; GFX1251-GISEL-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b96 s[0:2], s[4:5], 0x0 nv
+; GFX1251-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    v_max_num_f32_e64 v0, s2, s2
+; GFX1251-GISEL-FAKE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-FAKE16-NEXT:    s_endpgm
   %canonicalized = call float @llvm.canonicalize.f32(float %val)
   store float %canonicalized, ptr addrspace(1) %out
   ret void
@@ -348,6 +440,54 @@ define amdgpu_kernel void @v_test_canonicalize_fabs_var_f32(ptr addrspace(1) %ou
 ; GFX12-GISEL-NEXT:    v_max_num_f32_e64 v0, |s2|, |s2|
 ; GFX12-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
 ; GFX12-GISEL-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-TRUE16-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX1251-SDAG-TRUE16:       ; %bb.0:
+; GFX1251-SDAG-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-SDAG-TRUE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_loadcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    v_max_num_f32_e64 v1, |v1|, |v1|
+; GFX1251-SDAG-TRUE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-TRUE16-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX1251-GISEL-TRUE16:       ; %bb.0:
+; GFX1251-GISEL-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b32 s2, s[0:1], 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    v_max_num_f32_e64 v0, |s2|, |s2|
+; GFX1251-GISEL-TRUE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-FAKE16-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX1251-SDAG-FAKE16:       ; %bb.0:
+; GFX1251-SDAG-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-SDAG-FAKE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_loadcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    v_max_num_f32_e64 v1, |v1|, |v1|
+; GFX1251-SDAG-FAKE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-FAKE16-LABEL: v_test_canonicalize_fabs_var_f32:
+; GFX1251-GISEL-FAKE16:       ; %bb.0:
+; GFX1251-GISEL-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b32 s2, s[0:1], 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    v_max_num_f32_e64 v0, |s2|, |s2|
+; GFX1251-GISEL-FAKE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-FAKE16-NEXT:    s_endpgm
   %val = load float, ptr addrspace(1) %out
   %val.fabs = call float @llvm.fabs.f32(float %val)
   %canonicalized = call float @llvm.canonicalize.f32(float %val.fabs)
@@ -451,6 +591,54 @@ define amdgpu_kernel void @v_test_canonicalize_fneg_fabs_var_f32(ptr addrspace(1
 ; GFX12-GISEL-NEXT:    v_max_num_f32_e64 v0, -|s2|, -|s2|
 ; GFX12-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
 ; GFX12-GISEL-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-TRUE16-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX1251-SDAG-TRUE16:       ; %bb.0:
+; GFX1251-SDAG-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-SDAG-TRUE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_loadcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    v_max_num_f32_e64 v1, -|v1|, -|v1|
+; GFX1251-SDAG-TRUE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-TRUE16-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX1251-GISEL-TRUE16:       ; %bb.0:
+; GFX1251-GISEL-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b32 s2, s[0:1], 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    v_max_num_f32_e64 v0, -|s2|, -|s2|
+; GFX1251-GISEL-TRUE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-FAKE16-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX1251-SDAG-FAKE16:       ; %bb.0:
+; GFX1251-SDAG-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-SDAG-FAKE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_loadcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    v_max_num_f32_e64 v1, -|v1|, -|v1|
+; GFX1251-SDAG-FAKE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-FAKE16-LABEL: v_test_canonicalize_fneg_fabs_var_f32:
+; GFX1251-GISEL-FAKE16:       ; %bb.0:
+; GFX1251-GISEL-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b32 s2, s[0:1], 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    v_max_num_f32_e64 v0, -|s2|, -|s2|
+; GFX1251-GISEL-FAKE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-FAKE16-NEXT:    s_endpgm
   %val = load float, ptr addrspace(1) %out
   %val.fabs = call float @llvm.fabs.f32(float %val)
   %val.fabs.fneg = fneg float %val.fabs
@@ -555,6 +743,54 @@ define amdgpu_kernel void @v_test_canonicalize_fneg_var_f32(ptr addrspace(1) %ou
 ; GFX12-GISEL-NEXT:    v_max_num_f32_e64 v0, -s2, -s2
 ; GFX12-GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
 ; GFX12-GISEL-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-TRUE16-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX1251-SDAG-TRUE16:       ; %bb.0:
+; GFX1251-SDAG-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-SDAG-TRUE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_wait_loadcnt 0x0
+; GFX1251-SDAG-TRUE16-NEXT:    v_max_num_f32_e64 v1, -v1, -v1
+; GFX1251-SDAG-TRUE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-TRUE16-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX1251-GISEL-TRUE16:       ; %bb.0:
+; GFX1251-GISEL-TRUE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-GISEL-TRUE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    s_load_b32 s2, s[0:1], 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-TRUE16-NEXT:    v_max_num_f32_e64 v0, -s2, -s2
+; GFX1251-GISEL-TRUE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-TRUE16-NEXT:    s_endpgm
+;
+; GFX1251-SDAG-FAKE16-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX1251-SDAG-FAKE16:       ; %bb.0:
+; GFX1251-SDAG-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-SDAG-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-SDAG-FAKE16-NEXT:    v_mov_b32_e32 v0, 0
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    global_load_b32 v1, v0, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_wait_loadcnt 0x0
+; GFX1251-SDAG-FAKE16-NEXT:    v_max_num_f32_e64 v1, -v1, -v1
+; GFX1251-SDAG-FAKE16-NEXT:    global_store_b32 v0, v1, s[0:1]
+; GFX1251-SDAG-FAKE16-NEXT:    s_endpgm
+;
+; GFX1251-GISEL-FAKE16-LABEL: v_test_canonicalize_fneg_var_f32:
+; GFX1251-GISEL-FAKE16:       ; %bb.0:
+; GFX1251-GISEL-FAKE16-NEXT:    s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0 nv
+; GFX1251-GISEL-FAKE16-NEXT:    v_mov_b32_e32 v1, 0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    s_load_b32 s2, s[0:1], 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    s_wait_kmcnt 0x0
+; GFX1251-GISEL-FAKE16-NEXT:    v_max_num_f32_e64 v0, -s2, -s2
+; GFX1251-GISEL-FAKE16-NEXT:    global_store_b32 v1, v0, s[0:1]
+; GFX1251-GISEL-FAKE16-NEXT:    s_endpgm
   %val = load float, ptr addrspace(1) %out
   %val.fneg = fneg float %val
   %canonicalized = call float @llvm.canonicalize.f32(float %val.fneg)
@@ -592,13 +828,37 @@ de...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/203596


More information about the llvm-commits mailing list