[llvm] [AMDGPU] Fix FMA Combine (PR #119217)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 9 06:35:27 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Piotr Sobczak (piotrAMD)
<details>
<summary>Changes</summary>
Update the check in the FMA combine to check dot10-insts instead of dot7-insts.
The target of the combine, v_dot2_f32_f16, is available only if dot10-insts target feature is enabled.
The issue probably dates back to the change that split out dot10-insts out of dot7-insts.
As far as I can see, this does not affect any current targets, but if a future target has dot7-insts, but not dot10-insts that would cause a crash ("cannot select") for the input ir in the test.
---
Full diff: https://github.com/llvm/llvm-project/pull/119217.diff
2 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/SIISelLowering.cpp (+1-1)
- (added) llvm/test/CodeGen/AMDGPU/fma_combine.ll (+70)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index f89fe8faa600ba..8dfebd36a962e1 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -14696,7 +14696,7 @@ SDValue SITargetLowering::performFMACombine(SDNode *N,
EVT VT = N->getValueType(0);
SDLoc SL(N);
- if (!Subtarget->hasDot7Insts() || VT != MVT::f32)
+ if (!Subtarget->hasDot10Insts() || VT != MVT::f32)
return SDValue();
// FMA((F32)S0.x, (F32)S1. x, FMA((F32)S0.y, (F32)S1.y, (F32)z)) ->
diff --git a/llvm/test/CodeGen/AMDGPU/fma_combine.ll b/llvm/test/CodeGen/AMDGPU/fma_combine.ll
new file mode 100644
index 00000000000000..0414018862d071
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/fma_combine.ll
@@ -0,0 +1,70 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr="+dot7-insts,-dot10-insts,-dot5-insts" < %s | FileCheck %s -check-prefix=DISABLED
+; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -mattr="+dot7-insts,+dot10-insts,-dot5-insts" < %s | FileCheck %s -check-prefix=ENABLED
+
+; Test that FMACombine is disabled for a target without dot10-insts, and enabled for a target with dot10-insts.
+
+define amdgpu_kernel void @func() {
+; DISABLED-LABEL: func:
+; DISABLED: ; %bb.0: ; %bb
+; DISABLED-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0
+; DISABLED-NEXT: v_mov_b32_e32 v2, 0
+; DISABLED-NEXT: s_mov_b32 vcc_lo, exec_lo
+; DISABLED-NEXT: .LBB0_1: ; %main
+; DISABLED-NEXT: ; =>This Inner Loop Header: Depth=1
+; DISABLED-NEXT: ds_load_b128 v[3:6], v1
+; DISABLED-NEXT: ds_store_b32 v1, v0
+; DISABLED-NEXT: s_waitcnt lgkmcnt(1)
+; DISABLED-NEXT: v_fma_mix_f32 v2, v4, v3, v2 op_sel_hi:[1,1,0]
+; DISABLED-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
+; DISABLED-NEXT: v_fma_mix_f32 v2, v4, v3, v2 op_sel:[1,1,0] op_sel_hi:[1,1,0]
+; DISABLED-NEXT: v_add_f32_e32 v2, 0, v2
+; DISABLED-NEXT: s_cbranch_vccnz .LBB0_1
+; DISABLED-NEXT: ; %bb.2: ; %DummyReturnBlock
+; DISABLED-NEXT: s_endpgm
+;
+; ENABLED-LABEL: func:
+; ENABLED: ; %bb.0: ; %bb
+; ENABLED-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0
+; ENABLED-NEXT: v_mov_b32_e32 v2, 0
+; ENABLED-NEXT: s_mov_b32 vcc_lo, exec_lo
+; ENABLED-NEXT: .LBB0_1: ; %main
+; ENABLED-NEXT: ; =>This Inner Loop Header: Depth=1
+; ENABLED-NEXT: ds_load_b128 v[3:6], v1
+; ENABLED-NEXT: ds_store_b32 v1, v0
+; ENABLED-NEXT: s_waitcnt lgkmcnt(1)
+; ENABLED-NEXT: v_dot2_f32_f16 v2, v4, v3, v2
+; ENABLED-NEXT: s_delay_alu instid0(VALU_DEP_1)
+; ENABLED-NEXT: v_add_f32_e32 v2, 0, v2
+; ENABLED-NEXT: s_cbranch_vccnz .LBB0_1
+; ENABLED-NEXT: ; %bb.2: ; %DummyReturnBlock
+; ENABLED-NEXT: s_endpgm
+bb:
+ br label %main
+
+main: ; preds = %main, %bb
+ %.sroa.3 = phi float [ 0.000000e+00, %bb ], [ %i17, %main ]
+ %.sroa.4 = phi float [ 0.000000e+00, %bb ], [ %.sroa.3, %main ]
+ %i = load <8 x half>, ptr addrspace(3) null, align 16
+ %i1 = bitcast <8 x half> %i to i128
+ %i2 = trunc i128 %i1 to i32
+ %i3 = bitcast i32 %i2 to <2 x half>
+ %.sroa.1 = extractelement <2 x half> %i3, i64 0
+ %.sroa.2 = extractelement <2 x half> %i3, i64 1
+ %i4 = shufflevector <8 x half> %i, <8 x half> zeroinitializer, <2 x i32> <i32 2, i32 3>
+ %i5 = fpext <2 x half> %i4 to <2 x float>
+ %i6 = fpext half %.sroa.1 to float
+ %i7 = fpext half %.sroa.2 to float
+ %i8 = extractelement <2 x float> %i5, i64 0
+ %i9 = fmul contract float %i8, %i6
+ %i10 = fadd contract float %.sroa.3, %i9
+ %i11 = extractelement <2 x float> %i5, i64 1
+ %i12 = fmul contract float %i11, %i7
+ %i13 = fadd contract float %i12, %i10
+ %i14 = insertelement <2 x float> zeroinitializer, float %i13, i64 0
+ %i15 = insertelement <2 x float> %i14, float %.sroa.4, i64 1
+ %i16 = fadd <2 x float> %i15, zeroinitializer
+ store <2 x half> zeroinitializer, ptr addrspace(3) null, align 4
+ %i17 = extractelement <2 x float> %i16, i64 0
+ br label %main
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/119217
More information about the llvm-commits
mailing list