xref: /llvm-project/llvm/test/Transforms/InstSimplify/ConstProp/fma.ll (revision b280ee1dd7e9b36ae7aaa3953556e4b7a7f31a29)
1486ed885SArthur Eubanks; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*b280ee1dSBjorn Pettersson; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
3486ed885SArthur Eubanks
4486ed885SArthur Eubanks; Fixes PR20832
5486ed885SArthur Eubanks; Make sure that we correctly fold a fused multiply-add where operands
6486ed885SArthur Eubanks; are all finite constants and addend is zero.
7486ed885SArthur Eubanks
8486ed885SArthur Eubanksdeclare double @llvm.fma.f64(double, double, double)
9486ed885SArthur Eubanks
10486ed885SArthur Eubanks
11486ed885SArthur Eubanksdefine double @PR20832()  {
12486ed885SArthur Eubanks; CHECK-LABEL: @PR20832(
13486ed885SArthur Eubanks; CHECK-NEXT:    ret double 5.600000e+01
14486ed885SArthur Eubanks;
15486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0.0)
16486ed885SArthur Eubanks  ret double %1
17486ed885SArthur Eubanks}
18486ed885SArthur Eubanks
19486ed885SArthur Eubanks; Test builtin fma with all finite non-zero constants.
20486ed885SArthur Eubanksdefine double @test_all_finite()  {
21486ed885SArthur Eubanks; CHECK-LABEL: @test_all_finite(
22486ed885SArthur Eubanks; CHECK-NEXT:    ret double 6.100000e+01
23486ed885SArthur Eubanks;
24486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 5.0)
25486ed885SArthur Eubanks  ret double %1
26486ed885SArthur Eubanks}
27486ed885SArthur Eubanks
28486ed885SArthur Eubanks; Test builtin fma with a +/-NaN addend.
29486ed885SArthur Eubanksdefine double @test_NaN_addend()  {
30486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_addend(
31486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
32486ed885SArthur Eubanks;
33486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0x7FF8000000000000)
34486ed885SArthur Eubanks  ret double %1
35486ed885SArthur Eubanks}
36486ed885SArthur Eubanks
37486ed885SArthur Eubanksdefine double @test_NaN_addend_2()  {
38486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_addend_2(
39486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0xFFF8000000000000
40486ed885SArthur Eubanks;
41486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0xFFF8000000000000)
42486ed885SArthur Eubanks  ret double %1
43486ed885SArthur Eubanks}
44486ed885SArthur Eubanks
45486ed885SArthur Eubanks; Test builtin fma with a +/-Inf addend.
46486ed885SArthur Eubanksdefine double @test_Inf_addend()  {
47486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_addend(
48486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF0000000000000
49486ed885SArthur Eubanks;
50486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0x7FF0000000000000)
51486ed885SArthur Eubanks  ret double %1
52486ed885SArthur Eubanks}
53486ed885SArthur Eubanks
54486ed885SArthur Eubanksdefine double @test_Inf_addend_2()  {
55486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_addend_2(
56486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0xFFF0000000000000
57486ed885SArthur Eubanks;
58486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 8.0, double 0xFFF0000000000000)
59486ed885SArthur Eubanks  ret double %1
60486ed885SArthur Eubanks}
61486ed885SArthur Eubanks
62486ed885SArthur Eubanks; Test builtin fma with one of the operands to the multiply being +/-NaN.
63486ed885SArthur Eubanksdefine double @test_NaN_1()  {
64486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_1(
65486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
66486ed885SArthur Eubanks;
67486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0x7FF8000000000000, double 8.0, double 0.0)
68486ed885SArthur Eubanks  ret double %1
69486ed885SArthur Eubanks}
70486ed885SArthur Eubanks
71486ed885SArthur Eubanksdefine double @test_NaN_2()  {
72486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_2(
73486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
74486ed885SArthur Eubanks;
75486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF8000000000000, double 0.0)
76486ed885SArthur Eubanks  ret double %1
77486ed885SArthur Eubanks}
78486ed885SArthur Eubanks
79486ed885SArthur Eubanksdefine double @test_NaN_3()  {
80486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_3(
81486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0xFFF8000000000000
82486ed885SArthur Eubanks;
83486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0xFFF8000000000000, double 8.0, double 0.0)
84486ed885SArthur Eubanks  ret double %1
85486ed885SArthur Eubanks}
86486ed885SArthur Eubanks
87486ed885SArthur Eubanksdefine double @test_NaN_4()  {
88486ed885SArthur Eubanks; CHECK-LABEL: @test_NaN_4(
89486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0xFFF8000000000000
90486ed885SArthur Eubanks;
91486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF8000000000000, double 0.0)
92486ed885SArthur Eubanks  ret double %1
93486ed885SArthur Eubanks}
94486ed885SArthur Eubanks
95486ed885SArthur Eubanks; Test builtin fma with one of the operands to the multiply being +/-Inf.
96486ed885SArthur Eubanksdefine double @test_Inf_1()  {
97486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_1(
98486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF0000000000000
99486ed885SArthur Eubanks;
100486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 8.0, double 0.0)
101486ed885SArthur Eubanks  ret double %1
102486ed885SArthur Eubanks}
103486ed885SArthur Eubanks
104486ed885SArthur Eubanksdefine double @test_Inf_2()  {
105486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_2(
106486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF0000000000000
107486ed885SArthur Eubanks;
108486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF0000000000000, double 0.0)
109486ed885SArthur Eubanks  ret double %1
110486ed885SArthur Eubanks}
111486ed885SArthur Eubanks
112486ed885SArthur Eubanksdefine double @test_Inf_3()  {
113486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_3(
114486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0xFFF0000000000000
115486ed885SArthur Eubanks;
116486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 8.0, double 0.0)
117486ed885SArthur Eubanks  ret double %1
118486ed885SArthur Eubanks}
119486ed885SArthur Eubanks
120486ed885SArthur Eubanksdefine double @test_Inf_4()  {
121486ed885SArthur Eubanks; CHECK-LABEL: @test_Inf_4(
122486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0xFFF0000000000000
123486ed885SArthur Eubanks;
124486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF0000000000000, double 0.0)
125486ed885SArthur Eubanks  ret double %1
126486ed885SArthur Eubanks}
127486ed885SArthur Eubanks
128486ed885SArthur Eubanks; -inf + inf --> NaN
129486ed885SArthur Eubanks
130486ed885SArthur Eubanksdefine double @inf_product_opposite_inf_addend_1()  {
131486ed885SArthur Eubanks; CHECK-LABEL: @inf_product_opposite_inf_addend_1(
132486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
133486ed885SArthur Eubanks;
134486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 0xFFF0000000000000, double 0x7FF0000000000000)
135486ed885SArthur Eubanks  ret double %1
136486ed885SArthur Eubanks}
137486ed885SArthur Eubanks
138486ed885SArthur Eubanks; inf + -inf --> NaN
139486ed885SArthur Eubanks
140486ed885SArthur Eubanksdefine double @inf_product_opposite_inf_addend_2()  {
141486ed885SArthur Eubanks; CHECK-LABEL: @inf_product_opposite_inf_addend_2(
142486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
143486ed885SArthur Eubanks;
144486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 7.0, double 0x7FF0000000000000, double 0xFFF0000000000000)
145486ed885SArthur Eubanks  ret double %1
146486ed885SArthur Eubanks}
147486ed885SArthur Eubanks
148486ed885SArthur Eubanks; -inf + inf --> NaN
149486ed885SArthur Eubanks
150486ed885SArthur Eubanksdefine double @inf_product_opposite_inf_addend_3()  {
151486ed885SArthur Eubanks; CHECK-LABEL: @inf_product_opposite_inf_addend_3(
152486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
153486ed885SArthur Eubanks;
154486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 42.0, double 0x7FF0000000000000)
155486ed885SArthur Eubanks  ret double %1
156486ed885SArthur Eubanks}
157486ed885SArthur Eubanks
158486ed885SArthur Eubanks; inf + -inf --> NaN
159486ed885SArthur Eubanks
160486ed885SArthur Eubanksdefine double @inf_product_opposite_inf_addend_4()  {
161486ed885SArthur Eubanks; CHECK-LABEL: @inf_product_opposite_inf_addend_4(
162486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
163486ed885SArthur Eubanks;
164486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 42.0, double 0xFFF0000000000000)
165486ed885SArthur Eubanks  ret double %1
166486ed885SArthur Eubanks}
167486ed885SArthur Eubanks
168486ed885SArthur Eubanks; 0 * -inf --> NaN
169486ed885SArthur Eubanks
170486ed885SArthur Eubanksdefine double @inf_times_zero_1()  {
171486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_1(
172486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
173486ed885SArthur Eubanks;
174486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0.0, double 0xFFF0000000000000, double 42.0)
175486ed885SArthur Eubanks  ret double %1
176486ed885SArthur Eubanks}
177486ed885SArthur Eubanks
178486ed885SArthur Eubanks; 0 * inf --> NaN
179486ed885SArthur Eubanks
180486ed885SArthur Eubanksdefine double @inf_times_zero_2()  {
181486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_2(
182486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
183486ed885SArthur Eubanks;
184486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0.0, double 0x7FF0000000000000, double 42.0)
185486ed885SArthur Eubanks  ret double %1
186486ed885SArthur Eubanks}
187486ed885SArthur Eubanks
188486ed885SArthur Eubanks; -inf * 0 --> NaN
189486ed885SArthur Eubanks
190486ed885SArthur Eubanksdefine double @inf_times_zero_3()  {
191486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_3(
192486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
193486ed885SArthur Eubanks;
194486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double 0.0, double 42.0)
195486ed885SArthur Eubanks  ret double %1
196486ed885SArthur Eubanks}
197486ed885SArthur Eubanks
198486ed885SArthur Eubanks; inf * 0 --> NaN
199486ed885SArthur Eubanks
200486ed885SArthur Eubanksdefine double @inf_times_zero_4()  {
201486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_4(
202486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
203486ed885SArthur Eubanks;
204486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double 0.0, double 42.0)
205486ed885SArthur Eubanks  ret double %1
206486ed885SArthur Eubanks}
207486ed885SArthur Eubanks
208486ed885SArthur Eubanks; -0 * -inf --> NaN
209486ed885SArthur Eubanks
210486ed885SArthur Eubanksdefine double @inf_times_zero_5()  {
211486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_5(
212486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
213486ed885SArthur Eubanks;
214486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double -0.0, double 0xFFF0000000000000, double 42.0)
215486ed885SArthur Eubanks  ret double %1
216486ed885SArthur Eubanks}
217486ed885SArthur Eubanks
218486ed885SArthur Eubanks; -0 * inf --> NaN
219486ed885SArthur Eubanks
220486ed885SArthur Eubanksdefine double @inf_times_zero_6()  {
221486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_6(
222486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
223486ed885SArthur Eubanks;
224486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double -0.0, double 0x7FF0000000000000, double 42.0)
225486ed885SArthur Eubanks  ret double %1
226486ed885SArthur Eubanks}
227486ed885SArthur Eubanks
228486ed885SArthur Eubanks; -inf * -0 --> NaN
229486ed885SArthur Eubanks
230486ed885SArthur Eubanksdefine double @inf_times_zero_7()  {
231486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_7(
232486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
233486ed885SArthur Eubanks;
234486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0xFFF0000000000000, double -0.0, double 42.0)
235486ed885SArthur Eubanks  ret double %1
236486ed885SArthur Eubanks}
237486ed885SArthur Eubanks
238486ed885SArthur Eubanks; inf * -0 --> NaN
239486ed885SArthur Eubanks
240486ed885SArthur Eubanksdefine double @inf_times_zero_8()  {
241486ed885SArthur Eubanks; CHECK-LABEL: @inf_times_zero_8(
242486ed885SArthur Eubanks; CHECK-NEXT:    ret double 0x7FF8000000000000
243486ed885SArthur Eubanks;
244486ed885SArthur Eubanks  %1 = call double @llvm.fma.f64(double 0x7FF0000000000000, double -0.0, double 42.0)
245486ed885SArthur Eubanks  ret double %1
246486ed885SArthur Eubanks}
247