@@ -137,3 +137,104 @@ entry:
137
137
%add = fsub double %mul , %a
138
138
ret double %add
139
139
}
140
+
141
+ define float @fma_combine_no_ice () {
142
+ ; CHECK-FAST-LABEL: fma_combine_no_ice:
143
+ ; CHECK-FAST: # %bb.0:
144
+ ; CHECK-FAST-NEXT: addis 3, 2, .LCPI4_0@toc@ha
145
+ ; CHECK-FAST-NEXT: addis 4, 2, .LCPI4_1@toc@ha
146
+ ; CHECK-FAST-NEXT: lfs 0, .LCPI4_0@toc@l(3)
147
+ ; CHECK-FAST-NEXT: lfsx 2, 0, 3
148
+ ; CHECK-FAST-NEXT: addis 3, 2, .LCPI4_2@toc@ha
149
+ ; CHECK-FAST-NEXT: lfs 3, .LCPI4_1@toc@l(4)
150
+ ; CHECK-FAST-NEXT: lfs 1, .LCPI4_2@toc@l(3)
151
+ ; CHECK-FAST-NEXT: xsmaddasp 3, 2, 0
152
+ ; CHECK-FAST-NEXT: xsmaddasp 1, 2, 3
153
+ ; CHECK-FAST-NEXT: xsnmsubasp 1, 3, 2
154
+ ; CHECK-FAST-NEXT: blr
155
+ ;
156
+ ; CHECK-FAST-NOVSX-LABEL: fma_combine_no_ice:
157
+ ; CHECK-FAST-NOVSX: # %bb.0:
158
+ ; CHECK-FAST-NOVSX-NEXT: addis 3, 2, .LCPI4_0@toc@ha
159
+ ; CHECK-FAST-NOVSX-NEXT: lfs 0, .LCPI4_0@toc@l(3)
160
+ ; CHECK-FAST-NOVSX-NEXT: addis 3, 2, .LCPI4_1@toc@ha
161
+ ; CHECK-FAST-NOVSX-NEXT: lfs 1, 0(3)
162
+ ; CHECK-FAST-NOVSX-NEXT: lfs 2, .LCPI4_1@toc@l(3)
163
+ ; CHECK-FAST-NOVSX-NEXT: addis 3, 2, .LCPI4_2@toc@ha
164
+ ; CHECK-FAST-NOVSX-NEXT: fmadds 0, 1, 2, 0
165
+ ; CHECK-FAST-NOVSX-NEXT: lfs 2, .LCPI4_2@toc@l(3)
166
+ ; CHECK-FAST-NOVSX-NEXT: fmadds 2, 1, 0, 2
167
+ ; CHECK-FAST-NOVSX-NEXT: fnmsubs 1, 0, 1, 2
168
+ ; CHECK-FAST-NOVSX-NEXT: blr
169
+ ;
170
+ ; CHECK-LABEL: fma_combine_no_ice:
171
+ ; CHECK: # %bb.0:
172
+ ; CHECK-NEXT: addis 3, 2, .LCPI4_0@toc@ha
173
+ ; CHECK-NEXT: addis 4, 2, .LCPI4_1@toc@ha
174
+ ; CHECK-NEXT: lfs 0, .LCPI4_0@toc@l(3)
175
+ ; CHECK-NEXT: lfsx 2, 0, 3
176
+ ; CHECK-NEXT: addis 3, 2, .LCPI4_2@toc@ha
177
+ ; CHECK-NEXT: lfs 3, .LCPI4_1@toc@l(4)
178
+ ; CHECK-NEXT: lfs 1, .LCPI4_2@toc@l(3)
179
+ ; CHECK-NEXT: xsmaddasp 3, 2, 0
180
+ ; CHECK-NEXT: xsmaddasp 1, 2, 3
181
+ ; CHECK-NEXT: xsnmsubasp 1, 3, 2
182
+ ; CHECK-NEXT: blr
183
+ %tmp = load float , float * undef , align 4
184
+ %tmp2 = load float , float * undef , align 4
185
+ %tmp3 = fmul fast float %tmp , 0x3FE372D780000000
186
+ %tmp4 = fadd fast float %tmp3 , 1 .000000e+00
187
+ %tmp5 = fmul fast float %tmp2 , %tmp4
188
+ %tmp6 = load float , float * undef , align 4
189
+ %tmp7 = load float , float * undef , align 4
190
+ %tmp8 = fmul fast float %tmp7 , 0x3FE372D780000000
191
+ %tmp9 = fsub fast float -1 .000000e+00 , %tmp8
192
+ %tmp10 = fmul fast float %tmp9 , %tmp6
193
+ %tmp11 = fadd fast float %tmp5 , 5.000000e-01
194
+ %tmp12 = fadd fast float %tmp11 , %tmp10
195
+ ret float %tmp12
196
+ }
197
+
198
+ ; This would crash while trying getNegatedExpression().
199
+ define double @getNegatedExpression_crash (double %x , double %y ) {
200
+ ; CHECK-FAST-LABEL: getNegatedExpression_crash:
201
+ ; CHECK-FAST: # %bb.0:
202
+ ; CHECK-FAST-NEXT: addis 3, 2, .LCPI5_1@toc@ha
203
+ ; CHECK-FAST-NEXT: addis 4, 2, .LCPI5_0@toc@ha
204
+ ; CHECK-FAST-NEXT: lfs 3, .LCPI5_1@toc@l(3)
205
+ ; CHECK-FAST-NEXT: lfs 4, .LCPI5_0@toc@l(4)
206
+ ; CHECK-FAST-NEXT: xssubdp 0, 1, 3
207
+ ; CHECK-FAST-NEXT: xsmaddadp 3, 1, 4
208
+ ; CHECK-FAST-NEXT: xsmaddadp 0, 3, 2
209
+ ; CHECK-FAST-NEXT: fmr 1, 0
210
+ ; CHECK-FAST-NEXT: blr
211
+ ;
212
+ ; CHECK-FAST-NOVSX-LABEL: getNegatedExpression_crash:
213
+ ; CHECK-FAST-NOVSX: # %bb.0:
214
+ ; CHECK-FAST-NOVSX-NEXT: addis 3, 2, .LCPI5_0@toc@ha
215
+ ; CHECK-FAST-NOVSX-NEXT: addis 4, 2, .LCPI5_1@toc@ha
216
+ ; CHECK-FAST-NOVSX-NEXT: lfs 0, .LCPI5_0@toc@l(3)
217
+ ; CHECK-FAST-NOVSX-NEXT: lfs 3, .LCPI5_1@toc@l(4)
218
+ ; CHECK-FAST-NOVSX-NEXT: fmadd 3, 1, 3, 0
219
+ ; CHECK-FAST-NOVSX-NEXT: fsub 0, 1, 0
220
+ ; CHECK-FAST-NOVSX-NEXT: fmadd 1, 3, 2, 0
221
+ ; CHECK-FAST-NOVSX-NEXT: blr
222
+ ;
223
+ ; CHECK-LABEL: getNegatedExpression_crash:
224
+ ; CHECK: # %bb.0:
225
+ ; CHECK-NEXT: addis 3, 2, .LCPI5_1@toc@ha
226
+ ; CHECK-NEXT: addis 4, 2, .LCPI5_0@toc@ha
227
+ ; CHECK-NEXT: lfs 3, .LCPI5_1@toc@l(3)
228
+ ; CHECK-NEXT: lfs 4, .LCPI5_0@toc@l(4)
229
+ ; CHECK-NEXT: xssubdp 0, 1, 3
230
+ ; CHECK-NEXT: xsmaddadp 3, 1, 4
231
+ ; CHECK-NEXT: xsmaddadp 0, 3, 2
232
+ ; CHECK-NEXT: fmr 1, 0
233
+ ; CHECK-NEXT: blr
234
+ %neg = fneg fast double %x
235
+ %fma = call fast double @llvm.fma.f64 (double %neg , double 42 .0 , double -1 .0 )
236
+ %add = fadd fast double %x , 1 .0
237
+ %fma1 = call fast double @llvm.fma.f64 (double %fma , double %y , double %add )
238
+ ret double %fma1
239
+ }
240
+ declare double @llvm.fma.f64 (double , double , double ) nounwind readnone
0 commit comments