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

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


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

Only rely on the contract flags.

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

>From 6ef0664a965569ea681d56bfc0fb5f879ed6e688 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Sat, 5 Sep 2026 14:30:49 +0200
Subject: [PATCH] GlobalISel: Drop AllowFPOpFusion from CombinerHelper FMA
 formation

Only rely on the contract flags.

Co-authored-by: Claude (Claude-Opus-4.8) <noreply at anthropic.com>
---
 .../lib/CodeGen/GlobalISel/CombinerHelper.cpp |   5 +-
 .../AMDGPU/GlobalISel/combine-fma-add-mul.ll  | 633 +-------------
 .../AMDGPU/GlobalISel/combine-fma-sub-mul.ll  | 812 ++++++++++++------
 .../GlobalISel/combine-fma-sub-neg-mul.ll     | 307 +++++--
 4 files changed, 803 insertions(+), 954 deletions(-)

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:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -496,28 +354,12 @@ define half @test_half_add_mul_contract(half %x, half %y, half %z) {
 ; GFX10-NEXT:    v_fma_f16 v0, v0, v1, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_half_add_mul_contract:
-; 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_contract:
 ; 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]
-; GFX9-UNSAFE-LABEL: test_half_add_mul_contract:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_fma_f16 v0, v0, v1, v2
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_half_add_mul_contract:
-; 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 contract half %x, %y
   %b = fadd contract half %a, %z
@@ -532,12 +374,6 @@ define half @test_half_add_mul_rhs(half %x, half %y, half %z) {
 ; GFX9-NEXT:    v_add_f16_e32 v0, v2, v0
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_half_add_mul_rhs:
-; 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_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -551,23 +387,12 @@ define half @test_half_add_mul_rhs(half %x, half %y, half %z) {
 ; GFX10-NEXT:    v_add_f16_e32 v0, v2, v0
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_half_add_mul_rhs:
-; 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_rhs:
 ; 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, v2, v0
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_half_add_mul_rhs:
-; 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 %z, %a
@@ -581,12 +406,6 @@ define half @test_half_add_mul_rhs_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_rhs_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_rhs_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -599,28 +418,12 @@ define half @test_half_add_mul_rhs_contract(half %x, half %y, half %z) {
 ; GFX10-NEXT:    v_fma_f16 v0, v0, v1, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_half_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_f16 v0, v0, v1, v2
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_half_add_mul_rhs_contract:
 ; 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, v2, v0
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_half_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_f16 v0, v0, v1, v2
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_half_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_f16 v0, v0, v1, v2
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract half %x, %y
   %b = fadd contract half %z, %a
@@ -635,12 +438,6 @@ define double @test_double_add_mul(double %x, double %y, double %z) {
 ; GFX9-NEXT:    v_add_f64 v[0:1], v[0:1], v[4:5]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_double_add_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_double_add_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -655,12 +452,6 @@ define double @test_double_add_mul(double %x, double %y, double %z) {
 ; GFX10-NEXT:    v_add_f64 v[0:1], v[0:1], v[4:5]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_double_add_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_double_add_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -680,12 +471,6 @@ define double @test_double_add_mul_contract(double %x, double %y, double %z) {
 ; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_double_add_mul_contract:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_double_add_mul_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -698,27 +483,11 @@ define double @test_double_add_mul_contract(double %x, double %y, double %z) {
 ; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_double_add_mul_contract:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_double_add_mul_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
 ; GFX10-DENORM-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_double_add_mul_contract:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_double_add_mul:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract double %x, %y
   %b = fadd contract double %a, %z
@@ -733,12 +502,6 @@ define double @test_double_add_mul_rhs(double %x, double %y, double %z) {
 ; GFX9-NEXT:    v_add_f64 v[0:1], v[4:5], v[0:1]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_double_add_mul_rhs:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_double_add_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -753,12 +516,6 @@ define double @test_double_add_mul_rhs(double %x, double %y, double %z) {
 ; GFX10-NEXT:    v_add_f64 v[0:1], v[4:5], v[0:1]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_double_add_mul_rhs:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_double_add_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -778,12 +535,6 @@ define double @test_double_add_mul_rhs_contract(double %x, double %y, double %z)
 ; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_double_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_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_double_add_mul_rhs_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -796,27 +547,11 @@ define double @test_double_add_mul_rhs_contract(double %x, double %y, double %z)
 ; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_double_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_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_double_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_f64 v[0:1], v[0:1], v[2:3], v[4:5]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_double_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_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_double_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_f64 v[0:1], v[0:1], v[2:3], v[4:5]
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract double %x, %y
   %b = fadd contract double %z, %a
@@ -837,15 +572,6 @@ define <4 x float> @test_4xfloat_add_mul(<4 x float> %x, <4 x float> %y, <4 x fl
 ; GFX9-NEXT:    v_add_f32_e32 v3, v3, v11
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_4xfloat_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, v4, v8
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v1, v1, v5, v9
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v2, v2, v6, v10
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v3, v3, v7, v11
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_4xfloat_add_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -868,15 +594,6 @@ define <4 x float> @test_4xfloat_add_mul(<4 x float> %x, <4 x float> %y, <4 x fl
 ; GFX10-NEXT:    v_add_f32_e32 v3, v3, v11
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_4xfloat_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, v4, v8
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v1, v1, v5, v9
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v2, v2, v6, v10
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v3, v3, v7, v11
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_4xfloat_add_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -901,15 +618,6 @@ define <4 x float> @test_4xfloat_add_mul_contract(<4 x float> %x, <4 x float> %y
 ; GFX9-NEXT:    v_fma_f32 v3, v3, v7, v11
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_4xfloat_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, v4, v8
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v1, v1, v5, v9
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v2, v2, v6, v10
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v3, v3, v7, v11
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_4xfloat_add_mul_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -928,15 +636,6 @@ define <4 x float> @test_4xfloat_add_mul_contract(<4 x float> %x, <4 x float> %y
 ; GFX10-NEXT:    v_fma_f32 v3, v3, v7, v11
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_4xfloat_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, v4, v8
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v1, v1, v5, v9
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v2, v2, v6, v10
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v3, v3, v7, v11
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_4xfloat_add_mul_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -945,22 +644,6 @@ define <4 x float> @test_4xfloat_add_mul_contract(<4 x float> %x, <4 x float> %y
 ; GFX10-DENORM-NEXT:    v_fma_f32 v2, v2, v6, v10
 ; GFX10-DENORM-NEXT:    v_fma_f32 v3, v3, v7, v11
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_4xfloat_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, v4, v8
-; GFX9-UNSAFE-NEXT:    v_fma_f32 v1, v1, v5, v9
-; GFX9-UNSAFE-NEXT:    v_fma_f32 v2, v2, v6, v10
-; GFX9-UNSAFE-NEXT:    v_fma_f32 v3, v3, v7, v11
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_4xfloat_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, v4, v8
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v1, v1, v5, v9
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v2, v2, v6, v10
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v3, v3, v7, v11
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract <4 x float> %x, %y
   %b = fadd contract <4 x float> %a, %z
@@ -979,14 +662,6 @@ define <3 x float> @test_3xfloat_add_mul_rhs(<3 x float> %x, <3 x float> %y, <3
 ; GFX9-NEXT:    v_add_f32_e32 v2, v8, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_3xfloat_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, v3, v6
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v1, v1, v4, v7
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v2, v2, v5, v8
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_3xfloat_add_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1006,14 +681,6 @@ define <3 x float> @test_3xfloat_add_mul_rhs(<3 x float> %x, <3 x float> %y, <3
 ; GFX10-NEXT:    v_add_f32_e32 v2, v8, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_3xfloat_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, v3, v6
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v1, v1, v4, v7
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v2, v2, v5, v8
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_3xfloat_add_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1036,14 +703,6 @@ define <3 x float> @test_3xfloat_add_mul_rhs_contract(<3 x float> %x, <3 x float
 ; GFX9-NEXT:    v_fma_f32 v2, v2, v5, v8
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_3xfloat_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, v3, v6
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v1, v1, v4, v7
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v2, v2, v5, v8
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_3xfloat_add_mul_rhs_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1060,14 +719,6 @@ define <3 x float> @test_3xfloat_add_mul_rhs_contract(<3 x float> %x, <3 x float
 ; GFX10-NEXT:    v_fma_f32 v2, v2, v5, v8
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_3xfloat_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, v3, v6
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v1, v1, v4, v7
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v2, v2, v5, v8
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_3xfloat_add_mul_rhs_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1075,20 +726,6 @@ define <3 x float> @test_3xfloat_add_mul_rhs_contract(<3 x float> %x, <3 x float
 ; GFX10-DENORM-NEXT:    v_fma_f32 v1, v1, v4, v7
 ; GFX10-DENORM-NEXT:    v_fma_f32 v2, v2, v5, v8
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_3xfloat_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, v3, v6
-; GFX9-UNSAFE-NEXT:    v_fma_f32 v1, v1, v4, v7
-; GFX9-UNSAFE-NEXT:    v_fma_f32 v2, v2, v5, v8
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_3xfloat_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, v3, v6
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v1, v1, v4, v7
-; GFX10-UNSAFE-NEXT:    v_fma_f32 v2, v2, v5, v8
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract <3 x float> %x, %y
   %b = fadd contract <3 x float> %z, %a
@@ -1105,13 +742,6 @@ define <4 x half> @test_4xhalf_add_mul(<4 x half> %x, <4 x half> %y, <4 x half>
 ; GFX9-NEXT:    v_pk_add_f16 v1, v1, v5
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_4xhalf_add_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_4xhalf_add_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1130,13 +760,6 @@ define <4 x half> @test_4xhalf_add_mul(<4 x half> %x, <4 x half> %y, <4 x half>
 ; GFX10-NEXT:    v_pk_add_f16 v1, v1, v5
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_4xhalf_add_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_4xhalf_add_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1145,12 +768,6 @@ define <4 x half> @test_4xhalf_add_mul(<4 x half> %x, <4 x half> %y, <4 x half>
 ; GFX10-DENORM-NEXT:    v_pk_add_f16 v0, v0, v4
 ; GFX10-DENORM-NEXT:    v_pk_add_f16 v1, v1, v5
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_4xhalf_add_mul:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX10-UNSAFE-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul <4 x half> %x, %y
   %b = fadd <4 x half> %a, %z
@@ -1165,13 +782,6 @@ define <4 x half> @test_4xhalf_add_mul_contract(<4 x half> %x, <4 x half> %y, <4
 ; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_4xhalf_add_mul_contract:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_4xhalf_add_mul_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1188,13 +798,6 @@ define <4 x half> @test_4xhalf_add_mul_contract(<4 x half> %x, <4 x half> %y, <4
 ; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_4xhalf_add_mul_contract:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_4xhalf_add_mul_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1203,18 +806,6 @@ define <4 x half> @test_4xhalf_add_mul_contract(<4 x half> %x, <4 x half> %y, <4
 ; GFX10-DENORM-NEXT:    v_pk_add_f16 v0, v0, v4
 ; GFX10-DENORM-NEXT:    v_pk_add_f16 v1, v1, v5
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_4xhalf_add_mul_contract:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX9-UNSAFE-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_4xhalf_add_mul_contract:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX10-UNSAFE-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract <4 x half> %x, %y
   %b = fadd contract <4 x half> %a, %z
@@ -1231,13 +822,6 @@ define <3 x half> @test_3xhalf_add_mul_rhs(<3 x half> %x, <3 x half> %y, <3 x ha
 ; GFX9-NEXT:    v_pk_add_f16 v1, v5, v1
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_3xhalf_add_mul_rhs:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_3xhalf_add_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1256,13 +840,6 @@ define <3 x half> @test_3xhalf_add_mul_rhs(<3 x half> %x, <3 x half> %y, <3 x ha
 ; GFX10-NEXT:    v_pk_add_f16 v1, v5, v1
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_3xhalf_add_mul_rhs:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_3xhalf_add_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1285,13 +862,6 @@ define <3 x half> @test_3xhalf_add_mul_rhs_contract(<3 x half> %x, <3 x half> %y
 ; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_3xhalf_add_mul_rhs_contract:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_3xhalf_add_mul_rhs_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1308,13 +878,6 @@ define <3 x half> @test_3xhalf_add_mul_rhs_contract(<3 x half> %x, <3 x half> %y
 ; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_3xhalf_add_mul_rhs_contract:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_3xhalf_add_mul_rhs_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1323,18 +886,6 @@ define <3 x half> @test_3xhalf_add_mul_rhs_contract(<3 x half> %x, <3 x half> %y
 ; GFX10-DENORM-NEXT:    v_pk_add_f16 v0, v4, v0
 ; GFX10-DENORM-NEXT:    v_pk_add_f16 v1, v5, v1
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_3xhalf_add_mul_rhs_contract:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX9-UNSAFE-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_3xhalf_add_mul_rhs_contract:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_pk_fma_f16 v0, v0, v2, v4
-; GFX10-UNSAFE-NEXT:    v_pk_fma_f16 v1, v1, v3, v5
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul contract <3 x half> %x, %y
   %b = fadd contract <3 x half> %z, %a
@@ -1355,15 +906,6 @@ define <4 x double> @test_4xdouble_add_mul(<4 x double> %x, <4 x double> %y, <4
 ; GFX9-NEXT:    v_add_f64 v[6:7], v[6:7], v[22:23]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_4xdouble_add_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_4xdouble_add_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1390,15 +932,6 @@ define <4 x double> @test_4xdouble_add_mul(<4 x double> %x, <4 x double> %y, <4
 ; GFX10-NEXT:    v_add_f64 v[6:7], v[6:7], v[22:23]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_4xdouble_add_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_4xdouble_add_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1411,22 +944,6 @@ define <4 x double> @test_4xdouble_add_mul(<4 x double> %x, <4 x double> %y, <4
 ; GFX10-DENORM-NEXT:    v_add_f64 v[4:5], v[4:5], v[20:21]
 ; GFX10-DENORM-NEXT:    v_add_f64 v[6:7], v[6:7], v[22:23]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_4xdouble_add_mul:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]
-; GFX9-UNSAFE-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]
-; GFX9-UNSAFE-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]
-; GFX9-UNSAFE-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_4xdouble_add_mul:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]
-; GFX10-UNSAFE-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]
-; GFX10-UNSAFE-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]
-; GFX10-UNSAFE-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul <4 x double> %x, %y
   %b = fadd <4 x double> %a, %z
@@ -1443,15 +960,6 @@ define <4 x double> @test_4xdouble_add_mul_contract(<4 x double> %x, <4 x double
 ; GFX9-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_4xdouble_add_mul_contract:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_4xdouble_add_mul_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1470,15 +978,6 @@ define <4 x double> @test_4xdouble_add_mul_contract(<4 x double> %x, <4 x double
 ; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_4xdouble_add_mul_contract:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_4xdouble_add_mul_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1505,14 +1004,6 @@ define <3 x double> @test_3xdouble_add_mul_rhs(<3 x double> %x, <3 x double> %y,
 ; GFX9-NEXT:    v_add_f64 v[4:5], v[16:17], v[4:5]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_3xdouble_add_mul_rhs:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_3xdouble_add_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1535,14 +1026,6 @@ define <3 x double> @test_3xdouble_add_mul_rhs(<3 x double> %x, <3 x double> %y,
 ; GFX10-NEXT:    v_add_f64 v[4:5], v[16:17], v[4:5]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_3xdouble_add_mul_rhs:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_3xdouble_add_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1553,20 +1036,6 @@ define <3 x double> @test_3xdouble_add_mul_rhs(<3 x double> %x, <3 x double> %y,
 ; GFX10-DENORM-NEXT:    v_add_f64 v[2:3], v[14:15], v[2:3]
 ; GFX10-DENORM-NEXT:    v_add_f64 v[4:5], v[16:17], v[4:5]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
-; GFX9-UNSAFE-LABEL: test_3xdouble_add_mul_rhs:
-; GFX9-UNSAFE:       ; %bb.0: ; %.entry
-; GFX9-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-UNSAFE-NEXT:    v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]
-; GFX9-UNSAFE-NEXT:    v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]
-; GFX9-UNSAFE-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
-; GFX9-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
-; GFX10-UNSAFE-LABEL: test_3xdouble_add_mul_rhs:
-; GFX10-UNSAFE:       ; %bb.0: ; %.entry
-; GFX10-UNSAFE-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-UNSAFE-NEXT:    v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]
-; GFX10-UNSAFE-NEXT:    v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]
-; GFX10-UNSAFE-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
-; GFX10-UNSAFE-NEXT:    s_setpc_b64 s[30:31]
 .entry:
   %a = fmul <3 x double> %x, %y
   %b = fadd <3 x double> %z, %a
@@ -1582,14 +1051,6 @@ define <3 x double> @test_3xdouble_add_mul_rhs_contract(<3 x double> %x, <3 x do
 ; GFX9-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_3xdouble_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_f64 v[0:1], v[0:1], v[6:7], v[12:13]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_3xdouble_add_mul_rhs_contract:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -1606,14 +1067,6 @@ define <3 x double> @test_3xdouble_add_mul_rhs_contract(<3 x double> %x, <3 x do
 ; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_3xdouble_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_f64 v[0:1], v[0:1], v[6:7], v[12:13]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_3xdouble_add_mul_rhs_contract:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-mul.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-mul.ll
index 113ba59751364..7067d1c6cafef 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-mul.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-mul.ll
@@ -1,12 +1,8 @@
 ; 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
-; RUN: llc -global-isel -mtriple=amdgpu11.00 -mattr=+real-true16 -fp-contract=fast < %s | FileCheck -check-prefixes=GFX11-CONTRACT,GFX11-CONTRACT-TRUE16 %s
-; RUN: llc -global-isel -mtriple=amdgpu11.00 -mattr=-real-true16 -fp-contract=fast < %s | FileCheck -check-prefixes=GFX11-CONTRACT,GFX11-CONTRACT-FAKE16 %s
 ; RUN: llc -global-isel -mtriple=amdgpu11.00 -mattr=+real-true16 --denormal-fp-math=preserve-sign < %s | FileCheck -check-prefixes=GFX11-DENORM,GFX11-DENORM-TRUE16 %s
 ; RUN: llc -global-isel -mtriple=amdgpu11.00 -mattr=-real-true16 --denormal-fp-math=preserve-sign < %s | FileCheck -check-prefixes=GFX11-DENORM,GFX11-DENORM-FAKE16 %s
 
@@ -21,12 +17,6 @@ define float @test_f32_sub_mul(float %x, float %y, float %z) {
 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f32_sub_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_sub_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -40,24 +30,12 @@ define float @test_f32_sub_mul(float %x, float %y, float %z) {
 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f32_sub_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_sub_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]
 ;
-; GFX11-CONTRACT-LABEL: test_f32_sub_mul:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v0, v0, v1, -v2
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_f32_sub_mul:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -71,6 +49,42 @@ define float @test_f32_sub_mul(float %x, float %y, float %z) {
   ret float %b
 }
 
+define float @test_f32_sub_mul_contract(float %x, float %y, float %z) {
+; GFX9-LABEL: test_f32_sub_mul_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f32 v0, v0, v1, -v2
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_f32_sub_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_f32 v0, v0, v1, -v2
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_f32_sub_mul_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f32 v0, v0, v1, -v2
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_f32_sub_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]
+;
+; GFX11-DENORM-LABEL: test_f32_sub_mul_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_fma_f32 v0, v0, v1, -v2
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract float %x, %y
+  %b = fsub contract float %a, %z
+  ret float %b
+}
+
 define float @test_f32_sub_mul_rhs(float %x, float %y, float %z) {
 ; GFX9-LABEL: test_f32_sub_mul_rhs:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -79,12 +93,6 @@ define float @test_f32_sub_mul_rhs(float %x, float %y, float %z) {
 ; GFX9-NEXT:    v_sub_f32_e32 v0, v2, v0
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f32_sub_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_sub_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -98,24 +106,12 @@ define float @test_f32_sub_mul_rhs(float %x, float %y, float %z) {
 ; GFX10-NEXT:    v_sub_f32_e32 v0, v2, v0
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f32_sub_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_sub_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]
 ;
-; GFX11-CONTRACT-LABEL: test_f32_sub_mul_rhs:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v0, -v0, v1, v2
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_f32_sub_mul_rhs:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -129,6 +125,42 @@ define float @test_f32_sub_mul_rhs(float %x, float %y, float %z) {
   ret float %b
 }
 
+define float @test_f32_sub_mul_rhs_contract(float %x, float %y, float %z) {
+; GFX9-LABEL: test_f32_sub_mul_rhs_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f32 v0, -v0, v1, v2
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_f32_sub_mul_rhs_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_f32 v0, -v0, v1, v2
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_f32_sub_mul_rhs_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f32 v0, -v0, v1, v2
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_f32_sub_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]
+;
+; GFX11-DENORM-LABEL: test_f32_sub_mul_rhs_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_fma_f32 v0, -v0, v1, v2
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract float %x, %y
+  %b = fsub contract float %z, %a
+  ret float %b
+}
+
 define half @test_half_sub_mul(half %x, half %y, half %z) {
 ; GFX9-LABEL: test_half_sub_mul:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -137,12 +169,6 @@ define half @test_half_sub_mul(half %x, half %y, half %z) {
 ; GFX9-NEXT:    v_sub_f16_e32 v0, v0, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_half_sub_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_sub_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -156,12 +182,6 @@ define half @test_half_sub_mul(half %x, half %y, half %z) {
 ; GFX10-NEXT:    v_sub_f16_e32 v0, v0, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_half_sub_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_sub_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -169,18 +189,6 @@ define half @test_half_sub_mul(half %x, half %y, half %z) {
 ; GFX10-DENORM-NEXT:    v_sub_f16_e32 v0, v0, v2
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-TRUE16-LABEL: test_half_sub_mul:
-; GFX11-CONTRACT-TRUE16:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-TRUE16-NEXT:    v_fma_f16 v0.l, v0.l, v1.l, -v2.l
-; GFX11-CONTRACT-TRUE16-NEXT:    s_setpc_b64 s[30:31]
-;
-; GFX11-CONTRACT-FAKE16-LABEL: test_half_sub_mul:
-; GFX11-CONTRACT-FAKE16:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-FAKE16-NEXT:    v_fma_f16 v0, v0, v1, -v2
-; GFX11-CONTRACT-FAKE16-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-TRUE16-LABEL: test_half_sub_mul:
 ; GFX11-DENORM-TRUE16:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -202,6 +210,53 @@ define half @test_half_sub_mul(half %x, half %y, half %z) {
   ret half %b
 }
 
+define half @test_half_sub_mul_contract(half %x, half %y, half %z) {
+; GFX9-LABEL: test_half_sub_mul_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f16 v0, v0, v1, -v2
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_half_sub_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_legacy_f16 v0, v0, v1, -v2
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_half_sub_mul_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f16 v0, v0, v1, -v2
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_half_sub_mul_contract:
+; 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_sub_f16_e32 v0, v0, v2
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-TRUE16-LABEL: test_half_sub_mul_contract:
+; GFX11-DENORM-TRUE16:       ; %bb.0: ; %.entry
+; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-TRUE16-NEXT:    v_mul_f16_e32 v0.l, v0.l, v1.l
+; GFX11-DENORM-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-DENORM-TRUE16-NEXT:    v_sub_f16_e32 v0.l, v0.l, v2.l
+; GFX11-DENORM-TRUE16-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-FAKE16-LABEL: test_half_sub_mul_contract:
+; GFX11-DENORM-FAKE16:       ; %bb.0: ; %.entry
+; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-FAKE16-NEXT:    v_mul_f16_e32 v0, v0, v1
+; GFX11-DENORM-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-DENORM-FAKE16-NEXT:    v_sub_f16_e32 v0, v0, v2
+; GFX11-DENORM-FAKE16-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract half %x, %y
+  %b = fsub contract half %a, %z
+  ret half %b
+}
+
 define half @test_half_sub_mul_rhs(half %x, half %y, half %z) {
 ; GFX9-LABEL: test_half_sub_mul_rhs:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -210,12 +265,6 @@ define half @test_half_sub_mul_rhs(half %x, half %y, half %z) {
 ; GFX9-NEXT:    v_sub_f16_e32 v0, v2, v0
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_half_sub_mul_rhs:
-; 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_sub_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -229,12 +278,6 @@ define half @test_half_sub_mul_rhs(half %x, half %y, half %z) {
 ; GFX10-NEXT:    v_sub_f16_e32 v0, v2, v0
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_half_sub_mul_rhs:
-; 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_sub_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -242,18 +285,6 @@ define half @test_half_sub_mul_rhs(half %x, half %y, half %z) {
 ; GFX10-DENORM-NEXT:    v_sub_f16_e32 v0, v2, v0
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-TRUE16-LABEL: test_half_sub_mul_rhs:
-; GFX11-CONTRACT-TRUE16:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-TRUE16-NEXT:    v_fma_f16 v0.l, -v0.l, v1.l, v2.l
-; GFX11-CONTRACT-TRUE16-NEXT:    s_setpc_b64 s[30:31]
-;
-; GFX11-CONTRACT-FAKE16-LABEL: test_half_sub_mul_rhs:
-; GFX11-CONTRACT-FAKE16:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-FAKE16-NEXT:    v_fma_f16 v0, -v0, v1, v2
-; GFX11-CONTRACT-FAKE16-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-TRUE16-LABEL: test_half_sub_mul_rhs:
 ; GFX11-DENORM-TRUE16:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -275,6 +306,53 @@ define half @test_half_sub_mul_rhs(half %x, half %y, half %z) {
   ret half %b
 }
 
+define half @test_half_sub_mul_rhs_contract(half %x, half %y, half %z) {
+; GFX9-LABEL: test_half_sub_mul_rhs_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f16 v0, -v0, v1, v2
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_half_sub_mul_rhs_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_legacy_f16 v0, -v0, v1, v2
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_half_sub_mul_rhs_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f16 v0, -v0, v1, v2
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_half_sub_mul_rhs_contract:
+; 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_sub_f16_e32 v0, v2, v0
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-TRUE16-LABEL: test_half_sub_mul_rhs_contract:
+; GFX11-DENORM-TRUE16:       ; %bb.0: ; %.entry
+; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-TRUE16-NEXT:    v_mul_f16_e32 v0.l, v0.l, v1.l
+; GFX11-DENORM-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-DENORM-TRUE16-NEXT:    v_sub_f16_e32 v0.l, v2.l, v0.l
+; GFX11-DENORM-TRUE16-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-FAKE16-LABEL: test_half_sub_mul_rhs_contract:
+; GFX11-DENORM-FAKE16:       ; %bb.0: ; %.entry
+; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-FAKE16-NEXT:    v_mul_f16_e32 v0, v0, v1
+; GFX11-DENORM-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)
+; GFX11-DENORM-FAKE16-NEXT:    v_sub_f16_e32 v0, v2, v0
+; GFX11-DENORM-FAKE16-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract half %x, %y
+  %b = fsub contract half %z, %a
+  ret half %b
+}
+
 define double @test_double_sub_mul(double %x, double %y, double %z) {
 ; GFX9-LABEL: test_double_sub_mul:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -283,12 +361,6 @@ define double @test_double_sub_mul(double %x, double %y, double %z) {
 ; GFX9-NEXT:    v_add_f64 v[0:1], v[0:1], -v[4:5]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_double_sub_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_double_sub_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -303,12 +375,6 @@ define double @test_double_sub_mul(double %x, double %y, double %z) {
 ; GFX10-NEXT:    v_add_f64 v[0:1], v[0:1], -v[4:5]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_double_sub_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_double_sub_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -316,12 +382,6 @@ define double @test_double_sub_mul(double %x, double %y, double %z) {
 ; GFX10-DENORM-NEXT:    v_add_f64 v[0:1], v[0:1], -v[4:5]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-LABEL: test_double_sub_mul:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_double_sub_mul:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -335,6 +395,42 @@ define double @test_double_sub_mul(double %x, double %y, double %z) {
   ret double %b
 }
 
+define double @test_double_sub_mul_contract(double %x, double %y, double %z) {
+; GFX9-LABEL: test_double_sub_mul_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_double_sub_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_double_sub_mul_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_double_sub_mul_contract:
+; GFX10-DENORM:       ; %bb.0: ; %.entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-LABEL: test_double_sub_mul_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_fma_f64 v[0:1], v[0:1], v[2:3], -v[4:5]
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract double %x, %y
+  %b = fsub contract double %a, %z
+  ret double %b
+}
+
 define double @test_double_sub_mul_rhs(double %x, double %y, double %z) {
 ; GFX9-LABEL: test_double_sub_mul_rhs:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -343,12 +439,6 @@ define double @test_double_sub_mul_rhs(double %x, double %y, double %z) {
 ; GFX9-NEXT:    v_add_f64 v[0:1], v[4:5], -v[0:1]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_double_sub_mul_rhs:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_double_sub_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -363,12 +453,6 @@ define double @test_double_sub_mul_rhs(double %x, double %y, double %z) {
 ; GFX10-NEXT:    v_add_f64 v[0:1], v[4:5], -v[0:1]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_double_sub_mul_rhs:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_double_sub_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -376,12 +460,6 @@ define double @test_double_sub_mul_rhs(double %x, double %y, double %z) {
 ; GFX10-DENORM-NEXT:    v_add_f64 v[0:1], v[4:5], -v[0:1]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-LABEL: test_double_sub_mul_rhs:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_double_sub_mul_rhs:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -395,6 +473,42 @@ define double @test_double_sub_mul_rhs(double %x, double %y, double %z) {
   ret double %b
 }
 
+define double @test_double_sub_mul_rhs_contract(double %x, double %y, double %z) {
+; GFX9-LABEL: test_double_sub_mul_rhs_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_double_sub_mul_rhs_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_double_sub_mul_rhs_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_double_sub_mul_rhs_contract:
+; GFX10-DENORM:       ; %bb.0: ; %.entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-LABEL: test_double_sub_mul_rhs_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], v[4:5]
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract double %x, %y
+  %b = fsub contract double %z, %a
+  ret double %b
+}
+
 define <4 x float> @test_v4f32_sub_mul(<4 x float> %x, <4 x float> %y, <4 x float> %z) {
 ; GFX9-LABEL: test_v4f32_sub_mul:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -409,15 +523,6 @@ define <4 x float> @test_v4f32_sub_mul(<4 x float> %x, <4 x float> %y, <4 x floa
 ; GFX9-NEXT:    v_sub_f32_e32 v3, v3, v11
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f32_sub_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, v4, -v8
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v1, v1, v5, -v9
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v2, v2, v6, -v10
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v3, v3, v7, -v11
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f32_sub_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -440,15 +545,6 @@ define <4 x float> @test_v4f32_sub_mul(<4 x float> %x, <4 x float> %y, <4 x floa
 ; GFX10-NEXT:    v_sub_f32_e32 v3, v3, v11
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f32_sub_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, v4, -v8
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v1, v1, v5, -v9
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v2, v2, v6, -v10
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v3, v3, v7, -v11
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f32_sub_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -458,15 +554,6 @@ define <4 x float> @test_v4f32_sub_mul(<4 x float> %x, <4 x float> %y, <4 x floa
 ; GFX10-DENORM-NEXT:    v_mad_f32 v3, v3, v7, -v11
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-LABEL: test_v4f32_sub_mul:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v0, v0, v4, -v8
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v1, v1, v5, -v9
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v2, v2, v6, -v10
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v3, v3, v7, -v11
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_v4f32_sub_mul:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -482,6 +569,57 @@ define <4 x float> @test_v4f32_sub_mul(<4 x float> %x, <4 x float> %y, <4 x floa
   ret <4 x float> %b
 }
 
+define <4 x float> @test_v4f32_sub_mul_contract(<4 x float> %x, <4 x float> %y, <4 x float> %z) {
+; GFX9-LABEL: test_v4f32_sub_mul_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f32 v0, v0, v4, -v8
+; GFX9-NEXT:    v_fma_f32 v1, v1, v5, -v9
+; GFX9-NEXT:    v_fma_f32 v2, v2, v6, -v10
+; GFX9-NEXT:    v_fma_f32 v3, v3, v7, -v11
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f32_sub_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_f32 v0, v0, v4, -v8
+; GFX9-DENORM-NEXT:    v_mad_f32 v1, v1, v5, -v9
+; GFX9-DENORM-NEXT:    v_mad_f32 v2, v2, v6, -v10
+; GFX9-DENORM-NEXT:    v_mad_f32 v3, v3, v7, -v11
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f32_sub_mul_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f32 v0, v0, v4, -v8
+; GFX10-NEXT:    v_fma_f32 v1, v1, v5, -v9
+; GFX10-NEXT:    v_fma_f32 v2, v2, v6, -v10
+; GFX10-NEXT:    v_fma_f32 v3, v3, v7, -v11
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f32_sub_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, v4, -v8
+; GFX10-DENORM-NEXT:    v_fma_f32 v1, v1, v5, -v9
+; GFX10-DENORM-NEXT:    v_fma_f32 v2, v2, v6, -v10
+; GFX10-DENORM-NEXT:    v_fma_f32 v3, v3, v7, -v11
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-LABEL: test_v4f32_sub_mul_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_fma_f32 v0, v0, v4, -v8
+; GFX11-DENORM-NEXT:    v_fma_f32 v1, v1, v5, -v9
+; GFX11-DENORM-NEXT:    v_fma_f32 v2, v2, v6, -v10
+; GFX11-DENORM-NEXT:    v_fma_f32 v3, v3, v7, -v11
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract <4 x float> %x, %y
+  %b = fsub contract <4 x float> %a, %z
+  ret <4 x float> %b
+}
+
 define <4 x float> @test_v4f32_sub_mul_rhs(<4 x float> %x, <4 x float> %y, <4 x float> %z) {
 ; GFX9-LABEL: test_v4f32_sub_mul_rhs:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -496,15 +634,6 @@ define <4 x float> @test_v4f32_sub_mul_rhs(<4 x float> %x, <4 x float> %y, <4 x
 ; GFX9-NEXT:    v_sub_f32_e32 v3, v11, v3
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f32_sub_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, v4, v8
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v1, -v1, v5, v9
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v2, -v2, v6, v10
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v3, -v3, v7, v11
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f32_sub_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -527,15 +656,6 @@ define <4 x float> @test_v4f32_sub_mul_rhs(<4 x float> %x, <4 x float> %y, <4 x
 ; GFX10-NEXT:    v_sub_f32_e32 v3, v11, v3
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f32_sub_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, v4, v8
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v1, -v1, v5, v9
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v2, -v2, v6, v10
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v3, -v3, v7, v11
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f32_sub_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -545,15 +665,6 @@ define <4 x float> @test_v4f32_sub_mul_rhs(<4 x float> %x, <4 x float> %y, <4 x
 ; GFX10-DENORM-NEXT:    v_mad_f32 v3, -v3, v7, v11
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-LABEL: test_v4f32_sub_mul_rhs:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v0, -v0, v4, v8
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v1, -v1, v5, v9
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v2, -v2, v6, v10
-; GFX11-CONTRACT-NEXT:    v_fma_f32 v3, -v3, v7, v11
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_v4f32_sub_mul_rhs:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -569,6 +680,57 @@ define <4 x float> @test_v4f32_sub_mul_rhs(<4 x float> %x, <4 x float> %y, <4 x
   ret <4 x float> %b
 }
 
+define <4 x float> @test_v4f32_sub_mul_rhs_contract(<4 x float> %x, <4 x float> %y, <4 x float> %z) {
+; GFX9-LABEL: test_v4f32_sub_mul_rhs_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f32 v0, -v0, v4, v8
+; GFX9-NEXT:    v_fma_f32 v1, -v1, v5, v9
+; GFX9-NEXT:    v_fma_f32 v2, -v2, v6, v10
+; GFX9-NEXT:    v_fma_f32 v3, -v3, v7, v11
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f32_sub_mul_rhs_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_f32 v0, -v0, v4, v8
+; GFX9-DENORM-NEXT:    v_mad_f32 v1, -v1, v5, v9
+; GFX9-DENORM-NEXT:    v_mad_f32 v2, -v2, v6, v10
+; GFX9-DENORM-NEXT:    v_mad_f32 v3, -v3, v7, v11
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f32_sub_mul_rhs_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f32 v0, -v0, v4, v8
+; GFX10-NEXT:    v_fma_f32 v1, -v1, v5, v9
+; GFX10-NEXT:    v_fma_f32 v2, -v2, v6, v10
+; GFX10-NEXT:    v_fma_f32 v3, -v3, v7, v11
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f32_sub_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, v4, v8
+; GFX10-DENORM-NEXT:    v_fma_f32 v1, -v1, v5, v9
+; GFX10-DENORM-NEXT:    v_fma_f32 v2, -v2, v6, v10
+; GFX10-DENORM-NEXT:    v_fma_f32 v3, -v3, v7, v11
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-LABEL: test_v4f32_sub_mul_rhs_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_fma_f32 v0, -v0, v4, v8
+; GFX11-DENORM-NEXT:    v_fma_f32 v1, -v1, v5, v9
+; GFX11-DENORM-NEXT:    v_fma_f32 v2, -v2, v6, v10
+; GFX11-DENORM-NEXT:    v_fma_f32 v3, -v3, v7, v11
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract <4 x float> %x, %y
+  %b = fsub contract <4 x float> %z, %a
+  ret <4 x float> %b
+}
+
 define <4 x half> @test_v4f16_sub_mul(<4 x half> %x, <4 x half> %y, <4 x half> %z) {
 ; GFX9-LABEL: test_v4f16_sub_mul:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -579,13 +741,6 @@ define <4 x half> @test_v4f16_sub_mul(<4 x half> %x, <4 x half> %y, <4 x half> %
 ; GFX9-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f16_sub_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,0,1] neg_hi:[0,0,1]
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,0,1] neg_hi:[0,0,1]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f16_sub_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -604,13 +759,6 @@ define <4 x half> @test_v4f16_sub_mul(<4 x half> %x, <4 x half> %y, <4 x half> %
 ; GFX10-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f16_sub_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,0,1] neg_hi:[0,0,1]
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,0,1] neg_hi:[0,0,1]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f16_sub_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -620,13 +768,6 @@ define <4 x half> @test_v4f16_sub_mul(<4 x half> %x, <4 x half> %y, <4 x half> %
 ; GFX10-DENORM-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-LABEL: test_v4f16_sub_mul:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,0,1] neg_hi:[0,0,1]
-; GFX11-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,0,1] neg_hi:[0,0,1]
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_v4f16_sub_mul:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -642,6 +783,54 @@ define <4 x half> @test_v4f16_sub_mul(<4 x half> %x, <4 x half> %y, <4 x half> %
   ret <4 x half> %b
 }
 
+define <4 x half> @test_v4f16_sub_mul_contract(<4 x half> %x, <4 x half> %y, <4 x half> %z) {
+; GFX9-LABEL: test_v4f16_sub_mul_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,0,1] neg_hi:[0,0,1]
+; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,0,1] neg_hi:[0,0,1]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f16_sub_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_pk_mul_f16 v0, v0, v2
+; GFX9-DENORM-NEXT:    v_pk_mul_f16 v1, v1, v3
+; GFX9-DENORM-NEXT:    v_pk_add_f16 v0, v0, v4 neg_lo:[0,1] neg_hi:[0,1]
+; GFX9-DENORM-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f16_sub_mul_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,0,1] neg_hi:[0,0,1]
+; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,0,1] neg_hi:[0,0,1]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f16_sub_mul_contract:
+; GFX10-DENORM:       ; %bb.0: ; %.entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_pk_mul_f16 v0, v0, v2
+; GFX10-DENORM-NEXT:    v_pk_mul_f16 v1, v1, v3
+; GFX10-DENORM-NEXT:    v_pk_add_f16 v0, v0, v4 neg_lo:[0,1] neg_hi:[0,1]
+; GFX10-DENORM-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-LABEL: test_v4f16_sub_mul_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_pk_mul_f16 v0, v0, v2
+; GFX11-DENORM-NEXT:    v_pk_mul_f16 v1, v1, v3
+; GFX11-DENORM-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
+; GFX11-DENORM-NEXT:    v_pk_add_f16 v0, v0, v4 neg_lo:[0,1] neg_hi:[0,1]
+; GFX11-DENORM-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract <4 x half> %x, %y
+  %b = fsub contract <4 x half> %a, %z
+  ret <4 x half> %b
+}
+
 define <4 x half> @test_v4f16_sub_mul_rhs(<4 x half> %x, <4 x half> %y, <4 x half> %z) {
 ; GFX9-LABEL: test_v4f16_sub_mul_rhs:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -652,13 +841,6 @@ define <4 x half> @test_v4f16_sub_mul_rhs(<4 x half> %x, <4 x half> %y, <4 x hal
 ; GFX9-NEXT:    v_pk_add_f16 v1, v5, v1
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f16_sub_mul_rhs:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[1,0,0] neg_hi:[1,0,0]
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[1,0,0] neg_hi:[1,0,0]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f16_sub_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -677,13 +859,6 @@ define <4 x half> @test_v4f16_sub_mul_rhs(<4 x half> %x, <4 x half> %y, <4 x hal
 ; GFX10-NEXT:    v_pk_add_f16 v1, v5, v1
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f16_sub_mul_rhs:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[1,0,0] neg_hi:[1,0,0]
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[1,0,0] neg_hi:[1,0,0]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f16_sub_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -693,13 +868,6 @@ define <4 x half> @test_v4f16_sub_mul_rhs(<4 x half> %x, <4 x half> %y, <4 x hal
 ; GFX10-DENORM-NEXT:    v_pk_add_f16 v1, v5, v1
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-LABEL: test_v4f16_sub_mul_rhs:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[1,0,0] neg_hi:[1,0,0]
-; GFX11-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[1,0,0] neg_hi:[1,0,0]
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_v4f16_sub_mul_rhs:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -715,6 +883,54 @@ define <4 x half> @test_v4f16_sub_mul_rhs(<4 x half> %x, <4 x half> %y, <4 x hal
   ret <4 x half> %b
 }
 
+define <4 x half> @test_v4f16_sub_mul_rhs_contract(<4 x half> %x, <4 x half> %y, <4 x half> %z) {
+; GFX9-LABEL: test_v4f16_sub_mul_rhs_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[1,0,0] neg_hi:[1,0,0]
+; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[1,0,0] neg_hi:[1,0,0]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f16_sub_mul_rhs_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_pk_mul_f16 v0, v0, v2 neg_lo:[0,1] neg_hi:[0,1]
+; GFX9-DENORM-NEXT:    v_pk_mul_f16 v1, v1, v3 neg_lo:[0,1] neg_hi:[0,1]
+; GFX9-DENORM-NEXT:    v_pk_add_f16 v0, v4, v0
+; GFX9-DENORM-NEXT:    v_pk_add_f16 v1, v5, v1
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f16_sub_mul_rhs_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[1,0,0] neg_hi:[1,0,0]
+; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[1,0,0] neg_hi:[1,0,0]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f16_sub_mul_rhs_contract:
+; GFX10-DENORM:       ; %bb.0: ; %.entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_pk_mul_f16 v0, v0, v2 neg_lo:[0,1] neg_hi:[0,1]
+; GFX10-DENORM-NEXT:    v_pk_mul_f16 v1, v1, v3 neg_lo:[0,1] neg_hi:[0,1]
+; GFX10-DENORM-NEXT:    v_pk_add_f16 v0, v4, v0
+; GFX10-DENORM-NEXT:    v_pk_add_f16 v1, v5, v1
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-LABEL: test_v4f16_sub_mul_rhs_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_pk_mul_f16 v0, v0, v2 neg_lo:[0,1] neg_hi:[0,1]
+; GFX11-DENORM-NEXT:    v_pk_mul_f16 v1, v1, v3 neg_lo:[0,1] neg_hi:[0,1]
+; GFX11-DENORM-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
+; GFX11-DENORM-NEXT:    v_pk_add_f16 v0, v4, v0
+; GFX11-DENORM-NEXT:    v_pk_add_f16 v1, v5, v1
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract <4 x half> %x, %y
+  %b = fsub contract <4 x half> %z, %a
+  ret <4 x half> %b
+}
+
 define <4 x double> @test_v4f64_sub_mul(<4 x double> %x, <4 x double> %y, <4 x double> %z) {
 ; GFX9-LABEL: test_v4f64_sub_mul:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -729,15 +945,6 @@ define <4 x double> @test_v4f64_sub_mul(<4 x double> %x, <4 x double> %y, <4 x d
 ; GFX9-NEXT:    v_add_f64 v[6:7], v[6:7], -v[22:23]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f64_sub_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], -v[16:17]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], -v[18:19]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], -v[20:21]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], -v[22:23]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f64_sub_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -764,15 +971,6 @@ define <4 x double> @test_v4f64_sub_mul(<4 x double> %x, <4 x double> %y, <4 x d
 ; GFX10-NEXT:    v_add_f64 v[6:7], v[6:7], -v[22:23]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f64_sub_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], -v[16:17]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], -v[18:19]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], -v[20:21]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], -v[22:23]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f64_sub_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -786,15 +984,6 @@ define <4 x double> @test_v4f64_sub_mul(<4 x double> %x, <4 x double> %y, <4 x d
 ; GFX10-DENORM-NEXT:    v_add_f64 v[6:7], v[6:7], -v[22:23]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-LABEL: test_v4f64_sub_mul:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], -v[16:17]
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], -v[18:19]
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], -v[20:21]
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], -v[22:23]
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_v4f64_sub_mul:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -815,6 +1004,57 @@ define <4 x double> @test_v4f64_sub_mul(<4 x double> %x, <4 x double> %y, <4 x d
   ret <4 x double> %b
 }
 
+define <4 x double> @test_v4f64_sub_mul_contract(<4 x double> %x, <4 x double> %y, <4 x double> %z) {
+; GFX9-LABEL: test_v4f64_sub_mul_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], -v[16:17]
+; GFX9-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], -v[18:19]
+; GFX9-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], -v[20:21]
+; GFX9-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], -v[22:23]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f64_sub_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], -v[16:17]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], -v[18:19]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], -v[20:21]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], -v[22:23]
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f64_sub_mul_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], -v[16:17]
+; GFX10-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], -v[18:19]
+; GFX10-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], -v[20:21]
+; GFX10-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], -v[22:23]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f64_sub_mul_contract:
+; GFX10-DENORM:       ; %bb.0: ; %.entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], -v[16:17]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], -v[18:19]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], -v[20:21]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], -v[22:23]
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-LABEL: test_v4f64_sub_mul_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_fma_f64 v[0:1], v[0:1], v[8:9], -v[16:17]
+; GFX11-DENORM-NEXT:    v_fma_f64 v[2:3], v[2:3], v[10:11], -v[18:19]
+; GFX11-DENORM-NEXT:    v_fma_f64 v[4:5], v[4:5], v[12:13], -v[20:21]
+; GFX11-DENORM-NEXT:    v_fma_f64 v[6:7], v[6:7], v[14:15], -v[22:23]
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract <4 x double> %x, %y
+  %b = fsub contract <4 x double> %a, %z
+  ret <4 x double> %b
+}
+
 define <4 x double> @test_v4f64_sub_mul_rhs(<4 x double> %x, <4 x double> %y, <4 x double> %z) {
 ; GFX9-LABEL: test_v4f64_sub_mul_rhs:
 ; GFX9:       ; %bb.0: ; %.entry
@@ -829,15 +1069,6 @@ define <4 x double> @test_v4f64_sub_mul_rhs(<4 x double> %x, <4 x double> %y, <4
 ; GFX9-NEXT:    v_add_f64 v[6:7], v[22:23], -v[6:7]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f64_sub_mul_rhs:
-; GFX9-CONTRACT:       ; %bb.0: ; %.entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], v[16:17]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], v[18:19]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], v[20:21]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], v[22:23]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f64_sub_mul_rhs:
 ; GFX9-DENORM:       ; %bb.0: ; %.entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -864,15 +1095,6 @@ define <4 x double> @test_v4f64_sub_mul_rhs(<4 x double> %x, <4 x double> %y, <4
 ; GFX10-NEXT:    v_add_f64 v[6:7], v[22:23], -v[6:7]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f64_sub_mul_rhs:
-; GFX10-CONTRACT:       ; %bb.0: ; %.entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], v[16:17]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], v[18:19]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], v[20:21]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], v[22:23]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f64_sub_mul_rhs:
 ; GFX10-DENORM:       ; %bb.0: ; %.entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -886,15 +1108,6 @@ define <4 x double> @test_v4f64_sub_mul_rhs(<4 x double> %x, <4 x double> %y, <4
 ; GFX10-DENORM-NEXT:    v_add_f64 v[6:7], v[22:23], -v[6:7]
 ; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX11-CONTRACT-LABEL: test_v4f64_sub_mul_rhs:
-; GFX11-CONTRACT:       ; %bb.0: ; %.entry
-; GFX11-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], v[16:17]
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], v[18:19]
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], v[20:21]
-; GFX11-CONTRACT-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], v[22:23]
-; GFX11-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX11-DENORM-LABEL: test_v4f64_sub_mul_rhs:
 ; GFX11-DENORM:       ; %bb.0: ; %.entry
 ; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -914,3 +1127,54 @@ define <4 x double> @test_v4f64_sub_mul_rhs(<4 x double> %x, <4 x double> %y, <4
   %b = fsub <4 x double> %z, %a
   ret <4 x double> %b
 }
+
+define <4 x double> @test_v4f64_sub_mul_rhs_contract(<4 x double> %x, <4 x double> %y, <4 x double> %z) {
+; GFX9-LABEL: test_v4f64_sub_mul_rhs_contract:
+; GFX9:       ; %bb.0: ; %.entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], v[16:17]
+; GFX9-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], v[18:19]
+; GFX9-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], v[20:21]
+; GFX9-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], v[22:23]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f64_sub_mul_rhs_contract:
+; GFX9-DENORM:       ; %bb.0: ; %.entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], v[16:17]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], v[18:19]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], v[20:21]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], v[22:23]
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f64_sub_mul_rhs_contract:
+; GFX10:       ; %bb.0: ; %.entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], v[16:17]
+; GFX10-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], v[18:19]
+; GFX10-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], v[20:21]
+; GFX10-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], v[22:23]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f64_sub_mul_rhs_contract:
+; GFX10-DENORM:       ; %bb.0: ; %.entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], v[16:17]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], v[18:19]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], v[20:21]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], v[22:23]
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX11-DENORM-LABEL: test_v4f64_sub_mul_rhs_contract:
+; GFX11-DENORM:       ; %bb.0: ; %.entry
+; GFX11-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX11-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], v[16:17]
+; GFX11-DENORM-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], v[18:19]
+; GFX11-DENORM-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], v[20:21]
+; GFX11-DENORM-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], v[22:23]
+; GFX11-DENORM-NEXT:    s_setpc_b64 s[30:31]
+.entry:
+  %a = fmul contract <4 x double> %x, %y
+  %b = fsub contract <4 x double> %z, %a
+  ret <4 x double> %b
+}
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-neg-mul.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-neg-mul.ll
index cb97224578b82..ef4174c88b970 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-neg-mul.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fma-sub-neg-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
 
 ; fold (fsub (fneg (fmul, x, y)), z) -> (fma (fneg x), y, (fneg z))
@@ -15,12 +13,6 @@ define float @test_f32_sub_ext_neg_mul(float %x, float %y, float %z) {
 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f32_sub_ext_neg_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_sub_ext_neg_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -34,12 +26,6 @@ define float @test_f32_sub_ext_neg_mul(float %x, float %y, float %z) {
 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f32_sub_ext_neg_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_sub_ext_neg_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -52,6 +38,37 @@ entry:
   ret float %c
 }
 
+define float @test_f32_sub_ext_neg_mul_contract(float %x, float %y, float %z) {
+; GFX9-LABEL: test_f32_sub_ext_neg_mul_contract:
+; GFX9:       ; %bb.0: ; %entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f32 v0, v0, -v1, -v2
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_f32_sub_ext_neg_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_f32 v0, v0, -v1, -v2
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_f32_sub_ext_neg_mul_contract:
+; GFX10:       ; %bb.0: ; %entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f32 v0, v0, -v1, -v2
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_f32_sub_ext_neg_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]
+entry:
+  %a = fmul contract float %x, %y
+  %b = fneg contract float %a
+  %c = fsub contract float %b, %z
+  ret float %c
+}
+
 define half @test_f16_sub_ext_neg_mul(half %x, half %y, half %z) {
 ; GFX9-LABEL: test_f16_sub_ext_neg_mul:
 ; GFX9:       ; %bb.0: ; %entry
@@ -60,12 +77,6 @@ define half @test_f16_sub_ext_neg_mul(half %x, half %y, half %z) {
 ; GFX9-NEXT:    v_sub_f16_e32 v0, v0, v2
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f16_sub_ext_neg_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_f16_sub_ext_neg_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -79,12 +90,6 @@ define half @test_f16_sub_ext_neg_mul(half %x, half %y, half %z) {
 ; GFX10-NEXT:    v_sub_f16_e32 v0, v0, v2
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f16_sub_ext_neg_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_f16_sub_ext_neg_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -98,6 +103,38 @@ entry:
   ret half %c
 }
 
+define half @test_f16_sub_ext_neg_mul_contract(half %x, half %y, half %z) {
+; GFX9-LABEL: test_f16_sub_ext_neg_mul_contract:
+; GFX9:       ; %bb.0: ; %entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f16 v0, v0, -v1, -v2
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_f16_sub_ext_neg_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_legacy_f16 v0, v0, -v1, -v2
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_f16_sub_ext_neg_mul_contract:
+; GFX10:       ; %bb.0: ; %entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f16 v0, v0, -v1, -v2
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_f16_sub_ext_neg_mul_contract:
+; GFX10-DENORM:       ; %bb.0: ; %entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_mul_f16_e64 v0, v0, -v1
+; GFX10-DENORM-NEXT:    v_sub_f16_e32 v0, v0, v2
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+entry:
+  %a = fmul contract half %x, %y
+  %b = fneg contract half %a
+  %c = fsub contract half %b, %z
+  ret half %c
+}
+
 define double @test_f64_sub_ext_neg_mul(double %x, double %y, double %z) {
 ; GFX9-LABEL: test_f64_sub_ext_neg_mul:
 ; GFX9:       ; %bb.0: ; %entry
@@ -106,12 +143,6 @@ define double @test_f64_sub_ext_neg_mul(double %x, double %y, double %z) {
 ; GFX9-NEXT:    v_add_f64 v[0:1], -v[0:1], -v[4:5]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_f64_sub_ext_neg_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], -v[4:5]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_f64_sub_ext_neg_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -126,12 +157,6 @@ define double @test_f64_sub_ext_neg_mul(double %x, double %y, double %z) {
 ; GFX10-NEXT:    v_add_f64 v[0:1], -v[0:1], -v[4:5]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_f64_sub_ext_neg_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], -v[4:5]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_f64_sub_ext_neg_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -145,6 +170,37 @@ entry:
   ret double %c
 }
 
+define double @test_f64_sub_ext_neg_mul_contract(double %x, double %y, double %z) {
+; GFX9-LABEL: test_f64_sub_ext_neg_mul_contract:
+; GFX9:       ; %bb.0: ; %entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], -v[4:5]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_f64_sub_ext_neg_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], -v[4:5]
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_f64_sub_ext_neg_mul_contract:
+; GFX10:       ; %bb.0: ; %entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], -v[4:5]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_f64_sub_ext_neg_mul_contract:
+; GFX10-DENORM:       ; %bb.0: ; %entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[2:3], -v[4:5]
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+entry:
+  %a = fmul contract double %x, %y
+  %b = fneg contract double %a
+  %c = fsub contract double %b, %z
+  ret double %c
+}
+
 ; fold (fsub (fneg (fmul, x, y)), z) -> (fma (fneg x), y, (fneg z))
 define <4 x float> @test_v4f32_sub_ext_neg_mul(<4 x float> %x, <4 x float> %y, <4 x float> %z) {
 ; GFX9-LABEL: test_v4f32_sub_ext_neg_mul:
@@ -160,15 +216,6 @@ define <4 x float> @test_v4f32_sub_ext_neg_mul(<4 x float> %x, <4 x float> %y, <
 ; GFX9-NEXT:    v_sub_f32_e32 v3, v3, v11
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f32_sub_ext_neg_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, -v4, -v8
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v1, v1, -v5, -v9
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v2, v2, -v6, -v10
-; GFX9-CONTRACT-NEXT:    v_fma_f32 v3, v3, -v7, -v11
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f32_sub_ext_neg_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -191,15 +238,6 @@ define <4 x float> @test_v4f32_sub_ext_neg_mul(<4 x float> %x, <4 x float> %y, <
 ; GFX10-NEXT:    v_sub_f32_e32 v3, v3, v11
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f32_sub_ext_neg_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, -v4, -v8
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v1, v1, -v5, -v9
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v2, v2, -v6, -v10
-; GFX10-CONTRACT-NEXT:    v_fma_f32 v3, v3, -v7, -v11
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f32_sub_ext_neg_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -215,6 +253,49 @@ entry:
   ret <4 x float> %c
 }
 
+define <4 x float> @test_v4f32_sub_ext_neg_mul_contract(<4 x float> %x, <4 x float> %y, <4 x float> %z) {
+; GFX9-LABEL: test_v4f32_sub_ext_neg_mul_contract:
+; GFX9:       ; %bb.0: ; %entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f32 v0, v0, -v4, -v8
+; GFX9-NEXT:    v_fma_f32 v1, v1, -v5, -v9
+; GFX9-NEXT:    v_fma_f32 v2, v2, -v6, -v10
+; GFX9-NEXT:    v_fma_f32 v3, v3, -v7, -v11
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f32_sub_ext_neg_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_mad_f32 v0, v0, -v4, -v8
+; GFX9-DENORM-NEXT:    v_mad_f32 v1, v1, -v5, -v9
+; GFX9-DENORM-NEXT:    v_mad_f32 v2, v2, -v6, -v10
+; GFX9-DENORM-NEXT:    v_mad_f32 v3, v3, -v7, -v11
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f32_sub_ext_neg_mul_contract:
+; GFX10:       ; %bb.0: ; %entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f32 v0, v0, -v4, -v8
+; GFX10-NEXT:    v_fma_f32 v1, v1, -v5, -v9
+; GFX10-NEXT:    v_fma_f32 v2, v2, -v6, -v10
+; GFX10-NEXT:    v_fma_f32 v3, v3, -v7, -v11
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f32_sub_ext_neg_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, -v4, -v8
+; GFX10-DENORM-NEXT:    v_fma_f32 v1, v1, -v5, -v9
+; GFX10-DENORM-NEXT:    v_fma_f32 v2, v2, -v6, -v10
+; GFX10-DENORM-NEXT:    v_fma_f32 v3, v3, -v7, -v11
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+entry:
+  %a = fmul contract <4 x float> %x, %y
+  %b = fneg contract <4 x float> %a
+  %c = fsub contract <4 x float> %b, %z
+  ret <4 x float> %c
+}
+
 define <4 x half> @test_v4f16_sub_ext_neg_mul(<4 x half> %x, <4 x half> %y, <4 x half> %z) {
 ; GFX9-LABEL: test_v4f16_sub_ext_neg_mul:
 ; GFX9:       ; %bb.0: ; %entry
@@ -225,13 +306,6 @@ define <4 x half> @test_v4f16_sub_ext_neg_mul(<4 x half> %x, <4 x half> %y, <4 x
 ; GFX9-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f16_sub_ext_neg_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,1,1] neg_hi:[0,1,1]
-; GFX9-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,1,1] neg_hi:[0,1,1]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f16_sub_ext_neg_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -250,13 +324,6 @@ define <4 x half> @test_v4f16_sub_ext_neg_mul(<4 x half> %x, <4 x half> %y, <4 x
 ; GFX10-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f16_sub_ext_neg_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,1,1] neg_hi:[0,1,1]
-; GFX10-CONTRACT-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,1,1] neg_hi:[0,1,1]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f16_sub_ext_neg_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -272,6 +339,45 @@ entry:
   ret <4 x half> %c
 }
 
+define <4 x half> @test_v4f16_sub_ext_neg_mul_contract(<4 x half> %x, <4 x half> %y, <4 x half> %z) {
+; GFX9-LABEL: test_v4f16_sub_ext_neg_mul_contract:
+; GFX9:       ; %bb.0: ; %entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,1,1] neg_hi:[0,1,1]
+; GFX9-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,1,1] neg_hi:[0,1,1]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f16_sub_ext_neg_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_pk_mul_f16 v0, v0, v2 neg_lo:[0,1] neg_hi:[0,1]
+; GFX9-DENORM-NEXT:    v_pk_mul_f16 v1, v1, v3 neg_lo:[0,1] neg_hi:[0,1]
+; GFX9-DENORM-NEXT:    v_pk_add_f16 v0, v0, v4 neg_lo:[0,1] neg_hi:[0,1]
+; GFX9-DENORM-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f16_sub_ext_neg_mul_contract:
+; GFX10:       ; %bb.0: ; %entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_pk_fma_f16 v0, v0, v2, v4 neg_lo:[0,1,1] neg_hi:[0,1,1]
+; GFX10-NEXT:    v_pk_fma_f16 v1, v1, v3, v5 neg_lo:[0,1,1] neg_hi:[0,1,1]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f16_sub_ext_neg_mul_contract:
+; GFX10-DENORM:       ; %bb.0: ; %entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_pk_mul_f16 v0, v0, v2 neg_lo:[0,1] neg_hi:[0,1]
+; GFX10-DENORM-NEXT:    v_pk_mul_f16 v1, v1, v3 neg_lo:[0,1] neg_hi:[0,1]
+; GFX10-DENORM-NEXT:    v_pk_add_f16 v0, v0, v4 neg_lo:[0,1] neg_hi:[0,1]
+; GFX10-DENORM-NEXT:    v_pk_add_f16 v1, v1, v5 neg_lo:[0,1] neg_hi:[0,1]
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+entry:
+  %a = fmul contract <4 x half> %x, %y
+  %b = fneg contract <4 x half> %a
+  %c = fsub contract <4 x half> %b, %z
+  ret <4 x half> %c
+}
+
 define <4 x double> @test_v4f64_sub_ext_neg_mul(<4 x double> %x, <4 x double> %y, <4 x double> %z) {
 ; GFX9-LABEL: test_v4f64_sub_ext_neg_mul:
 ; GFX9:       ; %bb.0: ; %entry
@@ -286,15 +392,6 @@ define <4 x double> @test_v4f64_sub_ext_neg_mul(<4 x double> %x, <4 x double> %y
 ; GFX9-NEXT:    v_add_f64 v[6:7], -v[6:7], -v[22:23]
 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX9-CONTRACT-LABEL: test_v4f64_sub_ext_neg_mul:
-; GFX9-CONTRACT:       ; %bb.0: ; %entry
-; GFX9-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], -v[16:17]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], -v[18:19]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], -v[20:21]
-; GFX9-CONTRACT-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], -v[22:23]
-; GFX9-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX9-DENORM-LABEL: test_v4f64_sub_ext_neg_mul:
 ; GFX9-DENORM:       ; %bb.0: ; %entry
 ; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -321,15 +418,6 @@ define <4 x double> @test_v4f64_sub_ext_neg_mul(<4 x double> %x, <4 x double> %y
 ; GFX10-NEXT:    v_add_f64 v[6:7], -v[6:7], -v[22:23]
 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
 ;
-; GFX10-CONTRACT-LABEL: test_v4f64_sub_ext_neg_mul:
-; GFX10-CONTRACT:       ; %bb.0: ; %entry
-; GFX10-CONTRACT-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], -v[16:17]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], -v[18:19]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], -v[20:21]
-; GFX10-CONTRACT-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], -v[22:23]
-; GFX10-CONTRACT-NEXT:    s_setpc_b64 s[30:31]
-;
 ; GFX10-DENORM-LABEL: test_v4f64_sub_ext_neg_mul:
 ; GFX10-DENORM:       ; %bb.0: ; %entry
 ; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -348,3 +436,46 @@ entry:
   %c = fsub <4 x double> %b, %z
   ret <4 x double> %c
 }
+
+define <4 x double> @test_v4f64_sub_ext_neg_mul_contract(<4 x double> %x, <4 x double> %y, <4 x double> %z) {
+; GFX9-LABEL: test_v4f64_sub_ext_neg_mul_contract:
+; GFX9:       ; %bb.0: ; %entry
+; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], -v[16:17]
+; GFX9-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], -v[18:19]
+; GFX9-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], -v[20:21]
+; GFX9-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], -v[22:23]
+; GFX9-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX9-DENORM-LABEL: test_v4f64_sub_ext_neg_mul_contract:
+; GFX9-DENORM:       ; %bb.0: ; %entry
+; GFX9-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX9-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], -v[16:17]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], -v[18:19]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], -v[20:21]
+; GFX9-DENORM-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], -v[22:23]
+; GFX9-DENORM-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-LABEL: test_v4f64_sub_ext_neg_mul_contract:
+; GFX10:       ; %bb.0: ; %entry
+; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], -v[16:17]
+; GFX10-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], -v[18:19]
+; GFX10-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], -v[20:21]
+; GFX10-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], -v[22:23]
+; GFX10-NEXT:    s_setpc_b64 s[30:31]
+;
+; GFX10-DENORM-LABEL: test_v4f64_sub_ext_neg_mul_contract:
+; GFX10-DENORM:       ; %bb.0: ; %entry
+; GFX10-DENORM-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GFX10-DENORM-NEXT:    v_fma_f64 v[0:1], -v[0:1], v[8:9], -v[16:17]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[2:3], -v[2:3], v[10:11], -v[18:19]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[4:5], -v[4:5], v[12:13], -v[20:21]
+; GFX10-DENORM-NEXT:    v_fma_f64 v[6:7], -v[6:7], v[14:15], -v[22:23]
+; GFX10-DENORM-NEXT:    s_setpc_b64 s[30:31]
+entry:
+  %a = fmul contract <4 x double> %x, %y
+  %b = fneg contract <4 x double> %a
+  %c = fsub contract <4 x double> %b, %z
+  ret <4 x double> %c
+}



More information about the llvm-commits mailing list