@@ -137,3 +137,104 @@ entry:
137137 %add = fsub double %mul , %a
138138 ret double %add
139139}
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