[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