[llvm] GlobalISel: Drop AllowFPOpFusion from CombinerHelper FMA formation (PR #221918)

via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 8 01:31:58 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-globalisel

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

Only rely on the contract flags.

Co-authored-by: Claude (Claude-Opus-4.8) <noreply@<!-- -->anthropic.com>

---

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


4 Files Affected:

- (modified) llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp (+3-2) 
- (modified) llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-add-mul.ll (+43-590) 
- (modified) llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-mul.ll (+538-274) 
- (modified) llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-neg-mul.ll (+219-88) 


``````````diff
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index 0ee8a9a204c09..ab3d8f3952819 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -6447,7 +6447,6 @@ bool CombinerHelper::canCombineFMadOrFMA(MachineInstr &MI,
 
   auto *MF = MI.getMF();
   const auto &TLI = *MF->getSubtarget().getTargetLowering();
-  const TargetOptions &Options = MF->getTarget().Options;
   LLT DstType = MRI.getType(MI.getOperand(0).getReg());
 
   if (CanReassociate && !MI.getFlag(MachineInstr::MIFlag::FmReassoc))
@@ -6462,7 +6461,9 @@ bool CombinerHelper::canCombineFMadOrFMA(MachineInstr &MI,
   if (!HasFMAD && !HasFMA)
     return false;
 
-  AllowFusionGlobally = Options.AllowFPOpFusion == FPOpFusion::Fast || HasFMAD;
+  // FMAD (with intermediate rounding) is always safe to form; FMA requires the
+  // contract fast-math flag.
+  AllowFusionGlobally = HasFMAD;
   // If the addition is not contractable, do not combine.
   if (!AllowFusionGlobally && !MI.getFlag(MachineInstr::MIFlag::FmContract))
     return false;
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-add-mul.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-add-mul.ll
index 7a8886b5c0cf7..951823220fedb 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-add-mul.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-add-mul.ll
@@ -1,9 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 ; RUN: llc -global-isel -mtriple=amdgpu9.00 < %s | FileCheck -check-prefix=GFX9 %s
-; RUN: llc -global-isel -mtriple=amdgpu9.00 -fp-contract=fast < %s | FileCheck -check-prefix=GFX9-CONTRACT %s
 ; RUN: llc -global-isel -mtriple=amdgpu9.00 --denormal-fp-math=preserve-sign < %s | FileCheck -check-prefix=GFX9-DENORM %s
 ; RUN: llc -global-isel -mtriple=amdgpu10.10 < %s | FileCheck -check-prefix=GFX10 %s
-; RUN: llc -global-isel -mtriple=amdgpu10.10 -fp-contract=fast < %s | FileCheck -check-prefix=GFX10-CONTRACT %s
 ; RUN: llc -global-isel -mtriple=amdgpu10.10 --denormal-fp-math=preserve-sign < %s | FileCheck -check-prefix=GFX10-DENORM %s
 
 define float @test_f32_add_mul(float %x, float %y, float %z) {
@@ -14,12 +12,6 @@ define float @test_f32_add_mul(float %x, float %y, float %z) {
 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f32_add_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_f32_add_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -33,22 +25,11 @@ define float @test_f32_add_mul(float %x, float %y, float %z) {
 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f32_add_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_f32_add_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
 ; GFX10-DENORM-NEXT:    v_mad_f32 v0, v0, v1, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_f32_add_mul:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul float %x, %y
   %b = fadd float %a, %z
@@ -62,12 +43,6 @@ define float @test_f32_add_mul_contract(float %x, float %y, float %z) {
 ; GFX9-NEXT:    v_fma_f32 v0, v0, v1, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f32_add_mul_contract:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_f32_add_mul_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -80,27 +55,11 @@ define float @test_f32_add_mul_contract(float %x, float %y, float %z) {
 ; GFX10-NEXT:    v_fma_f32 v0, v0, v1, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f32_add_mul_contract:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_f32_add_mul_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
 ; GFX10-DENORM-NEXT:    v_fma_f32 v0, v0, v1, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_f32_add_mul_contract:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_f32_add_mul_contract:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract float %x, %y
   %b = fadd contract float %a, %z
@@ -115,12 +74,6 @@ define float @test_f32_add_mul_rhs(float %x, float %y, float %z) {
 ; GFX9-NEXT:    v_add_f32_e32 v0, v2, v0
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f32_add_mul_rhs:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_f32_add_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -134,22 +87,11 @@ define float @test_f32_add_mul_rhs(float %x, float %y, float %z) {
 ; GFX10-NEXT:    v_add_f32_e32 v0, v2, v0
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f32_add_mul_rhs:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_f32_add_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
 ; GFX10-DENORM-NEXT:    v_mad_f32 v0, v0, v1, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_f32_add_mul_rhs:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul float %x, %y
   %b = fadd float %z, %a
@@ -163,12 +105,6 @@ define float @test_f32_add_mul_rhs_contract(float %x, float %y, float %z) {
 ; GFX9-NEXT:    v_fma_f32 v0, v0, v1, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f32_add_mul_rhs_contract:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_f32_add_mul_rhs_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -181,27 +117,11 @@ define float @test_f32_add_mul_rhs_contract(float %x, float %y, float %z) {
 ; GFX10-NEXT:    v_fma_f32 v0, v0, v1, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f32_add_mul_rhs_contract:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_f32_add_mul_rhs_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
 ; GFX10-DENORM-NEXT:    v_fma_f32 v0, v0, v1, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_f32_add_mul_rhs_contract:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_f32_add_mul_rhs_contract:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract float %x, %y
   %b = fadd contract float %z, %a
@@ -218,14 +138,6 @@ define float @test_add_mul_multiple_defs_z(float %x, float %y, ptr addrspace(1)
 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_add_mul_multiple_defs_z:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_add_mul_multiple_defs_z:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -244,15 +156,6 @@ define float @test_add_mul_multiple_defs_z(float %x, float %y, ptr addrspace(1)
 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_add_mul_multiple_defs_z:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fmac_f32_e32 v2, v0, v1
-; GFX10-CONTRACT-NEXT:    v_mov_b32_e32 v0, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_add_mul_multiple_defs_z:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -261,14 +164,6 @@ define float @test_add_mul_multiple_defs_z(float %x, float %y, ptr addrspace(1)
 ; GFX10-DENORM-NEXT:    v_mac_f32_e32 v2, v0, v1
 ; GFX10-DENORM-NEXT:    v_mov_b32_e32 v0, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_add_mul_multiple_defs_z:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fmac_f32_e32 v2, v0, v1
-; GFX10-UNSAFE-NEXT:    v_mov_b32_e32 v0, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul float %x, %y
   %vec = load <2 x float>, ptr addrspace(1) %vec_ptr
@@ -286,14 +181,6 @@ define float @test_add_mul_multiple_defs_z_contract(float %x, float %y, ptr addr
 ; GFX9-NEXT:    v_fma_f32 v0, v0, v1, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_add_mul_multiple_defs_z_contract:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_add_mul_multiple_defs_z_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -312,15 +199,6 @@ define float @test_add_mul_multiple_defs_z_contract(float %x, float %y, ptr addr
 ; GFX10-NEXT:    v_mov_b32_e32 v0, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_add_mul_multiple_defs_z_contract:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fmac_f32_e32 v2, v0, v1
-; GFX10-CONTRACT-NEXT:    v_mov_b32_e32 v0, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_add_mul_multiple_defs_z_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -329,21 +207,6 @@ define float @test_add_mul_multiple_defs_z_contract(float %x, float %y, ptr addr
 ; GFX10-DENORM-NEXT:    v_fmac_f32_e32 v2, v0, v1
 ; GFX10-DENORM-NEXT:    v_mov_b32_e32 v0, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_add_mul_multiple_defs_z_contract:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_add_mul_multiple_defs_z_contract:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fmac_f32_e32 v2, v0, v1
-; GFX10-UNSAFE-NEXT:    v_mov_b32_e32 v0, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract float %x, %y
   %vec = load <2 x float>, ptr addrspace(1) %vec_ptr
@@ -362,14 +225,6 @@ define float @test_add_mul_rhs_multiple_defs_z(float %x, float %y, ptr addrspace
 ; GFX9-NEXT:    v_add_f32_e32 v0, v2, v0
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_add_mul_rhs_multiple_defs_z:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_add_mul_rhs_multiple_defs_z:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -388,15 +243,6 @@ define float @test_add_mul_rhs_multiple_defs_z(float %x, float %y, ptr addrspace
 ; GFX10-NEXT:    v_add_f32_e32 v0, v2, v0
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_add_mul_rhs_multiple_defs_z:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fmac_f32_e32 v2, v0, v1
-; GFX10-CONTRACT-NEXT:    v_mov_b32_e32 v0, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_add_mul_rhs_multiple_defs_z:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -405,14 +251,6 @@ define float @test_add_mul_rhs_multiple_defs_z(float %x, float %y, ptr addrspace
 ; GFX10-DENORM-NEXT:    v_mac_f32_e32 v2, v0, v1
 ; GFX10-DENORM-NEXT:    v_mov_b32_e32 v0, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_add_mul_rhs_multiple_defs_z:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    global_load_dword v2, v[2:3], off offset:4
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fmac_f32_e32 v2, v0, v1
-; GFX10-UNSAFE-NEXT:    v_mov_b32_e32 v0, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul float %x, %y
   %vec = load <2 x float>, ptr addrspace(1) %vec_ptr
@@ -421,6 +259,49 @@ define float @test_add_mul_rhs_multiple_defs_z(float %x, float %y, ptr addrspace
   ret float %b
 }
 
+define float @test_add_mul_rhs_multiple_defs_z_contract(float %x, float %y, ptr addrspace(1) %vec_ptr) {
+; GFX9-LABEL: test_add_mul_rhs_multiple_defs_z_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    global_load_dword v2, v[2:3], off offset:4
+; GFX9-NEXT:    s_waitcnt vmcnt(0)
+; GFX9-NEXT:    v_fma_f32 v0, v0, v1, v2
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_add_mul_rhs_multiple_defs_z_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    global_load_dword v2, v[2:3], off offset:4
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0)
+; GFX9-DENORM-NEXT:    v_mac_f32_e32 v2, v0, v1
+; GFX9-DENORM-NEXT:    v_mov_b32_e32 v0, v2
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_add_mul_rhs_multiple_defs_z_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    global_load_dword v2, v[2:3], off offset:4
+; GFX10-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-NEXT:    v_fmac_f32_e32 v2, v0, v1
+; GFX10-NEXT:    v_mov_b32_e32 v0, v2
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_add_mul_rhs_multiple_defs_z_contract:
+; GFX10-DENORM:       ; %bb.0: ; %.entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    global_load_dword v2, v[2:3], off offset:4
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0)
+; GFX10-DENORM-NEXT:    v_fmac_f32_e32 v2, v0, v1
+; GFX10-DENORM-NEXT:    v_mov_b32_e32 v0, v2
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract float %x, %y
+  %vec = load <2 x float>, ptr addrspace(1) %vec_ptr
+  %z = extractelement <2 x float> %vec, i64 1
+  %b = fadd contract float %z, %a
+  ret float %b
+}
+
 define half @test_half_add_mul(half %x, half %y, half %z) {
 ; GFX9-LABEL: test_half_add_mul:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -429,12 +310,6 @@ define half @test_half_add_mul(half %x, half %y, half %z) {
 ; GFX9-NEXT:    v_add_f16_e32 v0, v0, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_half_add_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f16 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_half_add_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -448,23 +323,12 @@ define half @test_half_add_mul(half %x, half %y, half %z) {
 ; GFX10-NEXT:    v_add_f16_e32 v0, v0, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_half_add_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f16 v0, v0, v1, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_half_add_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
 ; GFX10-DENORM-NEXT:    v_mul_f16_e32 v0, v0, v1
 ; GFX10-DENORM-NEXT:    v_add_f16_e32 v0, v0, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_half_add_mul:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fma_f16 v0, v0, v1, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul half %x, %y
   %b = fadd half %a, %z
@@ -478,12 +342,6 @@ define half @test_half_add_mul_contract(half %x, half %y, half %z) {
 ; GFX9-NEXT:    v_fma_f16 v0, v0, v1, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_half_add_mul_contract:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f16 v0, v0, v1, v2
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_half_add_mul_contract:
 ; ...
[truncated]

``````````

</details>


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


More information about the llvm-commits mailing list