1; RUN: llvm-as < %s | llvm-dis | FileCheck -strict-whitespace %s
2; RUN: opt -S < %s | FileCheck -strict-whitespace %s
3; RUN: verify-uselistorder %s
4
5@addr   = external global i64
6@select = external global i1
7@vec    = external global <3 x float>
8@arr    = external global [3 x float]
9
10declare float @foo(float)
11
12define float @none(float %x, float %y) {
13entry:
14; CHECK:  %vec = load <3 x float>, <3 x float>* @vec
15  %vec    = load <3 x float>, <3 x float>* @vec
16; CHECK:  %select = load i1, i1* @select
17  %select = load i1, i1* @select
18; CHECK:  %arr = load [3 x float], [3 x float]* @arr
19  %arr    = load [3 x float], [3 x float]* @arr
20
21; CHECK:  %a = fadd float %x, %y
22  %a = fadd float %x, %y
23; CHECK:  %a_vec = fadd <3 x float> %vec, %vec
24  %a_vec = fadd <3 x float> %vec, %vec
25; CHECK:  %b = fsub float %x, %y
26  %b = fsub float %x, %y
27; CHECK:  %b_vec = fsub <3 x float> %vec, %vec
28  %b_vec = fsub <3 x float> %vec, %vec
29; CHECK:  %c = fmul float %x, %y
30  %c = fmul float %x, %y
31; CHECK:  %c_vec = fmul <3 x float> %vec, %vec
32  %c_vec = fmul <3 x float> %vec, %vec
33; CHECK:  %d = fdiv float %x, %y
34  %d = fdiv float %x, %y
35; CHECK:  %d_vec = fdiv <3 x float> %vec, %vec
36  %d_vec = fdiv <3 x float> %vec, %vec
37; CHECK:  %e = frem float %x, %y
38  %e = frem float %x, %y
39; CHECK:  %e_vec = frem <3 x float> %vec, %vec
40  %e_vec = frem <3 x float> %vec, %vec
41; CHECK:  %f = fneg float %x
42  %f = fneg float %x
43; CHECK:  %f_vec = fneg <3 x float> %vec
44  %f_vec = fneg <3 x float> %vec
45; CHECK:  ret float %f
46  ret  float %f
47}
48
49; CHECK: no_nan
50define float @no_nan(float %x, float %y) {
51entry:
52; CHECK:  %vec = load <3 x float>, <3 x float>* @vec
53  %vec    = load <3 x float>, <3 x float>* @vec
54; CHECK:  %select = load i1, i1* @select
55  %select = load i1, i1* @select
56; CHECK:  %arr = load [3 x float], [3 x float]* @arr
57  %arr    = load [3 x float], [3 x float]* @arr
58
59; CHECK:  %a = fadd nnan float %x, %y
60  %a = fadd nnan float %x, %y
61; CHECK:  %a_vec = fadd nnan <3 x float> %vec, %vec
62  %a_vec = fadd nnan <3 x float> %vec, %vec
63; CHECK:  %b = fsub nnan float %x, %y
64  %b = fsub nnan float %x, %y
65; CHECK:  %b_vec = fsub nnan <3 x float> %vec, %vec
66  %b_vec = fsub nnan <3 x float> %vec, %vec
67; CHECK:  %c = fmul nnan float %x, %y
68  %c = fmul nnan float %x, %y
69; CHECK:  %c_vec = fmul nnan <3 x float> %vec, %vec
70  %c_vec = fmul nnan <3 x float> %vec, %vec
71; CHECK:  %d = fdiv nnan float %x, %y
72  %d = fdiv nnan float %x, %y
73; CHECK:  %d_vec = fdiv nnan <3 x float> %vec, %vec
74  %d_vec = fdiv nnan <3 x float> %vec, %vec
75; CHECK:  %e = frem nnan float %x, %y
76  %e = frem nnan float %x, %y
77; CHECK:  %e_vec = frem nnan <3 x float> %vec, %vec
78  %e_vec = frem nnan <3 x float> %vec, %vec
79; CHECK:  %f = fneg nnan float %x
80  %f = fneg nnan float %x
81; CHECK:  %f_vec = fneg nnan <3 x float> %vec
82  %f_vec = fneg nnan <3 x float> %vec
83; CHECK:  ret float %f
84  ret float %f
85}
86
87; CHECK: @contract(
88define float @contract(float %x, float %y) {
89entry:
90; CHECK: %a = fsub contract float %x, %y
91  %a = fsub contract float %x, %y
92; CHECK: %b = fadd contract float %x, %y
93  %b = fadd contract float %x, %y
94; CHECK: %c = fmul contract float %a, %b
95  %c = fmul contract float %a, %b
96  ret float %c
97}
98
99; CHECK: @reassoc(
100define float @reassoc(float %x, float %y) {
101; CHECK: %a = fsub reassoc float %x, %y
102  %a = fsub reassoc float %x, %y
103; CHECK: %b = fmul reassoc float %x, %y
104  %b = fmul reassoc float %x, %y
105; CHECK: %c = call reassoc float @foo(float %b)
106  %c = call reassoc float @foo(float %b)
107  ret float %c
108}
109
110; CHECK: @afn(
111define float @afn(float %x, float %y) {
112; CHECK: %a = fdiv afn float %x, %y
113  %a = fdiv afn float %x, %y
114; CHECK: %b = frem afn float %x, %y
115  %b = frem afn float %x, %y
116; CHECK: %c = call afn float @foo(float %b)
117  %c = call afn float @foo(float %b)
118  ret float %c
119}
120
121; CHECK: no_nan_inf
122define float @no_nan_inf(float %x, float %y) {
123entry:
124; CHECK:  %vec = load <3 x float>, <3 x float>* @vec
125  %vec    = load <3 x float>, <3 x float>* @vec
126; CHECK:  %select = load i1, i1* @select
127  %select = load i1, i1* @select
128; CHECK:  %arr = load [3 x float], [3 x float]* @arr
129  %arr    = load [3 x float], [3 x float]* @arr
130
131; CHECK:  %a = fadd nnan ninf float %x, %y
132  %a = fadd ninf nnan float %x, %y
133; CHECK:  %a_vec = fadd nnan <3 x float> %vec, %vec
134  %a_vec = fadd nnan <3 x float> %vec, %vec
135; CHECK:  %b = fsub nnan float %x, %y
136  %b = fsub nnan float %x, %y
137; CHECK:  %b_vec = fsub nnan ninf <3 x float> %vec, %vec
138  %b_vec = fsub ninf nnan <3 x float> %vec, %vec
139; CHECK:  %c = fmul nnan float %x, %y
140  %c = fmul nnan float %x, %y
141; CHECK:  %c_vec = fmul nnan <3 x float> %vec, %vec
142  %c_vec = fmul nnan <3 x float> %vec, %vec
143; CHECK:  %d = fdiv nnan ninf float %x, %y
144  %d = fdiv ninf nnan float %x, %y
145; CHECK:  %d_vec = fdiv nnan <3 x float> %vec, %vec
146  %d_vec = fdiv nnan <3 x float> %vec, %vec
147; CHECK:  %e = frem nnan float %x, %y
148  %e = frem nnan float %x, %y
149; CHECK:  %e_vec = frem nnan ninf <3 x float> %vec, %vec
150  %e_vec = frem ninf nnan <3 x float> %vec, %vec
151; CHECK:  ret float %e
152  ret float %e
153}
154
155; CHECK: mixed_flags
156define float @mixed_flags(float %x, float %y) {
157entry:
158; CHECK:  %vec = load <3 x float>, <3 x float>* @vec
159  %vec    = load <3 x float>, <3 x float>* @vec
160; CHECK:  %select = load i1, i1* @select
161  %select = load i1, i1* @select
162; CHECK:  %arr = load [3 x float], [3 x float]* @arr
163  %arr    = load [3 x float], [3 x float]* @arr
164
165; CHECK:  %a = fadd nnan ninf afn float %x, %y
166  %a = fadd ninf nnan afn float %x, %y
167; CHECK:  %a_vec = fadd reassoc nnan <3 x float> %vec, %vec
168  %a_vec = fadd reassoc nnan <3 x float> %vec, %vec
169; CHECK:  %b = fsub fast float %x, %y
170  %b = fsub nnan nsz fast float %x, %y
171; CHECK:  %b_vec = fsub nnan <3 x float> %vec, %vec
172  %b_vec = fsub nnan <3 x float> %vec, %vec
173; CHECK:  %c = fmul fast float %x, %y
174  %c = fmul nsz fast arcp float %x, %y
175; CHECK:  %c_vec = fmul nsz <3 x float> %vec, %vec
176  %c_vec = fmul nsz <3 x float> %vec, %vec
177; CHECK:  %d = fdiv nnan ninf arcp float %x, %y
178  %d = fdiv arcp ninf nnan float %x, %y
179; CHECK:  %d_vec = fdiv fast <3 x float> %vec, %vec
180  %d_vec = fdiv fast nnan arcp <3 x float> %vec, %vec
181; CHECK:  %e = frem nnan nsz float %x, %y
182  %e = frem nnan nsz float %x, %y
183; CHECK:  %e_vec = frem nnan <3 x float> %vec, %vec
184  %e_vec = frem nnan <3 x float> %vec, %vec
185; CHECK:  %f = fneg nnan nsz float %x
186  %f = fneg nnan nsz float %x
187; CHECK:  %f_vec = fneg fast <3 x float> %vec
188  %f_vec = fneg fast <3 x float> %vec
189; CHECK:  ret float %f
190  ret float %f
191}
192
193; CHECK: @fmf_calls(
194define float @fmf_calls(float %x, float %y) {
195entry:
196; CHECK:  %vec = load <3 x float>, <3 x float>* @vec
197  %vec    = load <3 x float>, <3 x float>* @vec
198; CHECK:  %select = load i1, i1* @select
199  %select = load i1, i1* @select
200; CHECK:  %arr = load [3 x float], [3 x float]* @arr
201  %arr    = load [3 x float], [3 x float]* @arr
202
203; CHECK:  %a = call nnan ninf afn float @extfunc(float %x, float %y)
204  %a = call ninf nnan afn float @extfunc(float %x, float %y)
205; CHECK:  %a_vec = call reassoc nnan <3 x float> @extfunc_vec(<3 x float> %vec, <3 x float> %vec)
206  %a_vec = call reassoc nnan <3 x float> @extfunc_vec(<3 x float> %vec, <3 x float> %vec)
207; CHECK:  %b = call nnan ninf afn float (...) @var_extfunc(float %x, float %y)
208  %b = call ninf nnan afn float (...) @var_extfunc(float %x, float %y)
209; CHECK:  %b_vec = call reassoc nnan <3 x float> (...) @var_extfunc_vec(<3 x float> %vec, <3 x float> %vec)
210  %b_vec = call reassoc nnan <3 x float> (...) @var_extfunc_vec(<3 x float> %vec, <3 x float> %vec)
211; CHECK:  ret float %a
212  ret float %a
213}
214
215declare float @extfunc(float, float)
216declare <3 x float> @extfunc_vec(<3 x float>, <3 x float>)
217declare float @var_extfunc(...)
218declare <3 x float> @var_extfunc_vec(...)
219