@@ -17,9 +17,7 @@ define float @fma_from_freeze_mul_add_left_with_nnan(float %x, float %y) {
17
17
; CHECK-LABEL: fma_from_freeze_mul_add_left_with_nnan:
18
18
; CHECK: ; %bb.0:
19
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
20
+ ; CHECK-NEXT: v_fma_f32 v0, v0, v1, 1.0
23
21
; CHECK-NEXT: s_setpc_b64 s[30:31]
24
22
%mul = fmul nnan contract afn float %x , %y
25
23
%mul.fr = freeze float %mul
@@ -43,9 +41,7 @@ define float @fma_from_freeze_mul_add_right_with_nnan(float %x, float %y) {
43
41
; CHECK-LABEL: fma_from_freeze_mul_add_right_with_nnan:
44
42
; CHECK: ; %bb.0:
45
43
; 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
44
+ ; CHECK-NEXT: v_fma_f32 v0, v0, v1, 1.0
49
45
; CHECK-NEXT: s_setpc_b64 s[30:31]
50
46
%mul = fmul nnan contract float %x , %y
51
47
%mul.fr = freeze float %mul
@@ -69,9 +65,7 @@ define float @fma_from_freeze_mul_sub_left_with_nnan(float %x, float %y) {
69
65
; CHECK-LABEL: fma_from_freeze_mul_sub_left_with_nnan:
70
66
; CHECK: ; %bb.0:
71
67
; 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
68
+ ; CHECK-NEXT: v_fma_f32 v0, v0, v1, -1.0
75
69
; CHECK-NEXT: s_setpc_b64 s[30:31]
76
70
%mul = fmul nnan contract float %x , %y
77
71
%mul.fr = freeze float %mul
@@ -95,12 +89,42 @@ define float @fma_from_freeze_mul_sub_right_with_nnan(float %x, float %y) {
95
89
; CHECK-LABEL: fma_from_freeze_mul_sub_right_with_nnan:
96
90
; CHECK: ; %bb.0:
97
91
; 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
92
+ ; CHECK-NEXT: v_fma_f32 v0, -v0, v1, 1.0
101
93
; CHECK-NEXT: s_setpc_b64 s[30:31]
102
94
%mul = fmul nnan contract float %x , %y
103
95
%mul.fr = freeze float %mul
104
96
%sub = fsub nnan contract float 1 .000000e+00 , %mul.fr
105
97
ret float %sub
106
98
}
99
+
100
+ define float @fma_freeze_sink_multiple_maybe_poison_nnan_add (float %x , float %y ) {
101
+ ; CHECK-LABEL: fma_freeze_sink_multiple_maybe_poison_nnan_add:
102
+ ; CHECK: ; %bb.0:
103
+ ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
104
+ ; CHECK-NEXT: v_dual_subrev_f32 v0, 1.0, v0 :: v_dual_add_f32 v1, 1.0, v1
105
+ ; CHECK-NEXT: s_delay_alu instid0(VALU_DEP_1)
106
+ ; CHECK-NEXT: v_fma_f32 v0, v0, v1, 1.0
107
+ ; CHECK-NEXT: s_setpc_b64 s[30:31]
108
+ %fsub_x = fsub nnan contract float %x , 1 .000000e+00
109
+ %fadd_y = fadd nnan contract float %y , 1 .000000e+00
110
+ %mul = fmul nnan contract float %fsub_x , %fadd_y
111
+ %mul.fr = freeze float %mul
112
+ %add = fadd nnan contract float %mul.fr , 1 .000000e+00
113
+ ret float %add
114
+ }
115
+
116
+ define float @fma_freeze_sink_multiple_maybe_poison_nnan_sub (float %x , float %y ) {
117
+ ; CHECK-LABEL: fma_freeze_sink_multiple_maybe_poison_nnan_sub:
118
+ ; CHECK: ; %bb.0:
119
+ ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
120
+ ; CHECK-NEXT: v_dual_add_f32 v0, 1.0, v0 :: v_dual_add_f32 v1, -1.0, v1
121
+ ; CHECK-NEXT: s_delay_alu instid0(VALU_DEP_1)
122
+ ; CHECK-NEXT: v_fma_f32 v0, v0, v1, -1.0
123
+ ; CHECK-NEXT: s_setpc_b64 s[30:31]
124
+ %fadd_x = fadd nnan contract float %x , 1 .000000e+00
125
+ %fsub_y = fsub nnan contract float %y , 1 .000000e+00
126
+ %mul = fmul nnan contract float %fadd_x , %fsub_y
127
+ %mul.fr = freeze float %mul
128
+ %sub = fsub nnan contract float %mul.fr , 1 .000000e+00
129
+ ret float %sub
130
+ }
0 commit comments