Skip to content

Commit 8ca220f

Browse files
authored
[NFC][AMDGPU] Add lit tests for FMA combining with freeze and nnan variants (#142628)
`freeze` on `fmul` (without `nnan`) followed by `fadd` or `fsub` into a single `fma` is supported. This patch adds lit tests to verify the optimization behavior for both nnan and non-nnan variants.
1 parent 7263cd4 commit 8ca220f

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 < %s | FileCheck %s
3+
4+
define float @fma_from_freeze_mul_add_left(float %x, float %y) {
5+
; CHECK-LABEL: fma_from_freeze_mul_add_left:
6+
; CHECK: ; %bb.0:
7+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
8+
; CHECK-NEXT: v_fma_f32 v0, v0, v1, 1.0
9+
; CHECK-NEXT: s_setpc_b64 s[30:31]
10+
%mul = fmul contract float %x, %y
11+
%mul.fr = freeze float %mul
12+
%add = fadd contract float %mul.fr, 1.000000e+00
13+
ret float %add
14+
}
15+
16+
define float @fma_from_freeze_mul_add_left_with_nnan(float %x, float %y) {
17+
; CHECK-LABEL: fma_from_freeze_mul_add_left_with_nnan:
18+
; CHECK: ; %bb.0:
19+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
20+
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
21+
; CHECK-NEXT: s_delay_alu instid0(VALU_DEP_1)
22+
; CHECK-NEXT: v_add_f32_e32 v0, 1.0, v0
23+
; CHECK-NEXT: s_setpc_b64 s[30:31]
24+
%mul = fmul nnan contract afn float %x, %y
25+
%mul.fr = freeze float %mul
26+
%add = fadd nnan contract float %mul.fr, 1.000000e+00
27+
ret float %add
28+
}
29+
30+
define float @fma_from_freeze_mul_add_right(float %x, float %y) {
31+
; CHECK-LABEL: fma_from_freeze_mul_add_right:
32+
; CHECK: ; %bb.0:
33+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
34+
; CHECK-NEXT: v_fma_f32 v0, v0, v1, 1.0
35+
; CHECK-NEXT: s_setpc_b64 s[30:31]
36+
%mul = fmul contract float %x, %y
37+
%mul.fr = freeze float %mul
38+
%add = fadd contract float 1.000000e+00, %mul.fr
39+
ret float %add
40+
}
41+
42+
define float @fma_from_freeze_mul_add_right_with_nnan(float %x, float %y) {
43+
; CHECK-LABEL: fma_from_freeze_mul_add_right_with_nnan:
44+
; CHECK: ; %bb.0:
45+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
46+
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
47+
; CHECK-NEXT: s_delay_alu instid0(VALU_DEP_1)
48+
; CHECK-NEXT: v_add_f32_e32 v0, 1.0, v0
49+
; CHECK-NEXT: s_setpc_b64 s[30:31]
50+
%mul = fmul nnan contract float %x, %y
51+
%mul.fr = freeze float %mul
52+
%add = fadd nnan contract float 1.000000e+00, %mul.fr
53+
ret float %add
54+
}
55+
56+
define float @fma_from_freeze_mul_sub_left(float %x, float %y) {
57+
; CHECK-LABEL: fma_from_freeze_mul_sub_left:
58+
; CHECK: ; %bb.0:
59+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
60+
; CHECK-NEXT: v_fma_f32 v0, v0, v1, -1.0
61+
; CHECK-NEXT: s_setpc_b64 s[30:31]
62+
%mul = fmul contract float %x, %y
63+
%mul.fr = freeze float %mul
64+
%sub = fsub contract float %mul.fr, 1.000000e+00
65+
ret float %sub
66+
}
67+
68+
define float @fma_from_freeze_mul_sub_left_with_nnan(float %x, float %y) {
69+
; CHECK-LABEL: fma_from_freeze_mul_sub_left_with_nnan:
70+
; CHECK: ; %bb.0:
71+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
72+
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
73+
; CHECK-NEXT: s_delay_alu instid0(VALU_DEP_1)
74+
; CHECK-NEXT: v_add_f32_e32 v0, -1.0, v0
75+
; CHECK-NEXT: s_setpc_b64 s[30:31]
76+
%mul = fmul nnan contract float %x, %y
77+
%mul.fr = freeze float %mul
78+
%sub = fsub nnan contract float %mul.fr, 1.000000e+00
79+
ret float %sub
80+
}
81+
82+
define float @fma_from_freeze_mul_sub_right(float %x, float %y) {
83+
; CHECK-LABEL: fma_from_freeze_mul_sub_right:
84+
; CHECK: ; %bb.0:
85+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
86+
; CHECK-NEXT: v_fma_f32 v0, -v0, v1, 1.0
87+
; CHECK-NEXT: s_setpc_b64 s[30:31]
88+
%mul = fmul contract float %x, %y
89+
%mul.fr = freeze float %mul
90+
%sub = fsub contract float 1.000000e+00, %mul.fr
91+
ret float %sub
92+
}
93+
94+
define float @fma_from_freeze_mul_sub_right_with_nnan(float %x, float %y) {
95+
; CHECK-LABEL: fma_from_freeze_mul_sub_right_with_nnan:
96+
; CHECK: ; %bb.0:
97+
; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
98+
; CHECK-NEXT: v_mul_f32_e32 v0, v0, v1
99+
; CHECK-NEXT: s_delay_alu instid0(VALU_DEP_1)
100+
; CHECK-NEXT: v_sub_f32_e32 v0, 1.0, v0
101+
; CHECK-NEXT: s_setpc_b64 s[30:31]
102+
%mul = fmul nnan contract float %x, %y
103+
%mul.fr = freeze float %mul
104+
%sub = fsub nnan contract float 1.000000e+00, %mul.fr
105+
ret float %sub
106+
}

0 commit comments

Comments
 (0)