1; RUN: llvm-as < %s | llvm-dis | FileCheck %s
2; RUN: opt -S < %s | FileCheck %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:  ret  float %e
42  ret  float %e
43}
44
45; CHECK: no_nan
46define float @no_nan(float %x, float %y) {
47entry:
48; CHECK:  %vec = load <3 x float>, <3 x float>* @vec
49  %vec    = load  <3 x float>,  <3 x float>* @vec
50; CHECK:  %select = load i1, i1* @select
51  %select = load i1, i1* @select
52; CHECK:  %arr = load  [3 x float],  [3 x float]* @arr
53  %arr    = load  [3 x float],  [3 x float]* @arr
54
55; CHECK:  %a = fadd nnan  float %x, %y
56  %a = fadd nnan  float %x, %y
57; CHECK:  %a_vec = fadd nnan  <3 x float> %vec, %vec
58  %a_vec = fadd nnan  <3 x float> %vec, %vec
59; CHECK:  %b = fsub nnan  float %x, %y
60  %b = fsub nnan  float %x, %y
61; CHECK:  %b_vec = fsub nnan  <3 x float> %vec, %vec
62  %b_vec = fsub nnan  <3 x float> %vec, %vec
63; CHECK:  %c = fmul nnan  float %x, %y
64  %c = fmul nnan  float %x, %y
65; CHECK:  %c_vec = fmul nnan  <3 x float> %vec, %vec
66  %c_vec = fmul nnan <3 x float> %vec, %vec
67; CHECK:  %d = fdiv nnan  float %x, %y
68  %d = fdiv nnan float %x, %y
69; CHECK:  %d_vec = fdiv nnan  <3 x float> %vec, %vec
70  %d_vec = fdiv nnan <3 x float> %vec, %vec
71; CHECK:  %e = frem nnan  float %x, %y
72  %e = frem nnan  float %x, %y
73; CHECK:  %e_vec = frem nnan  <3 x float> %vec, %vec
74  %e_vec = frem nnan  <3 x float> %vec, %vec
75; CHECK:  ret float %e
76  ret float %e
77}
78
79; CHECK: @contract(
80define float @contract(float %x, float %y) {
81entry:
82; CHECK: %a = fsub contract float %x, %y
83  %a = fsub contract float %x, %y
84; CHECK: %b = fadd contract float %x, %y
85  %b = fadd contract float %x, %y
86; CHECK: %c = fmul contract float %a, %b
87  %c = fmul contract float %a, %b
88  ret float %c
89}
90
91; CHECK: @reassoc(
92define float @reassoc(float %x, float %y) {
93; CHECK: %a = fsub reassoc float %x, %y
94  %a = fsub reassoc float %x, %y
95; CHECK: %b = fmul reassoc float %x, %y
96  %b = fmul reassoc float %x, %y
97; CHECK: %c = call reassoc float @foo(float %b)
98  %c = call reassoc float @foo(float %b)
99  ret float %c
100}
101
102; CHECK: @afn(
103define float @afn(float %x, float %y) {
104; CHECK: %a = fdiv afn float %x, %y
105  %a = fdiv afn float %x, %y
106; CHECK: %b = frem afn float %x, %y
107  %b = frem afn float %x, %y
108; CHECK: %c = call afn float @foo(float %b)
109  %c = call afn float @foo(float %b)
110  ret float %c
111}
112
113; CHECK: no_nan_inf
114define float @no_nan_inf(float %x, float %y) {
115entry:
116; CHECK:  %vec = load <3 x float>, <3 x float>* @vec
117  %vec    = load <3 x float>, <3 x float>* @vec
118; CHECK:  %select = load i1, i1* @select
119  %select = load i1, i1* @select
120; CHECK:  %arr = load [3 x float], [3 x float]* @arr
121  %arr    = load [3 x float], [3 x float]* @arr
122
123; CHECK:  %a = fadd nnan ninf  float %x, %y
124  %a = fadd ninf nnan  float %x, %y
125; CHECK:  %a_vec = fadd nnan  <3 x float> %vec, %vec
126  %a_vec = fadd nnan  <3 x float> %vec, %vec
127; CHECK:  %b = fsub nnan  float %x, %y
128  %b = fsub nnan  float %x, %y
129; CHECK:  %b_vec = fsub nnan ninf  <3 x float> %vec, %vec
130  %b_vec = fsub ninf nnan  <3 x float> %vec, %vec
131; CHECK:  %c = fmul nnan  float %x, %y
132  %c = fmul nnan  float %x, %y
133; CHECK:  %c_vec = fmul nnan  <3 x float> %vec, %vec
134  %c_vec = fmul nnan <3 x float> %vec, %vec
135; CHECK:  %d = fdiv nnan ninf  float %x, %y
136  %d = fdiv ninf nnan float %x, %y
137; CHECK:  %d_vec = fdiv nnan  <3 x float> %vec, %vec
138  %d_vec = fdiv nnan <3 x float> %vec, %vec
139; CHECK:  %e = frem nnan  float %x, %y
140  %e = frem nnan  float %x, %y
141; CHECK:  %e_vec = frem nnan ninf  <3 x float> %vec, %vec
142  %e_vec = frem ninf nnan  <3 x float> %vec, %vec
143; CHECK:  ret  float %e
144  ret  float %e
145}
146
147; CHECK: mixed_flags
148define float @mixed_flags(float %x, float %y) {
149entry:
150; CHECK:  %vec = load <3 x float>, <3 x float>* @vec
151  %vec    = load <3 x float>, <3 x float>* @vec
152; CHECK:  %select = load i1, i1* @select
153  %select = load i1, i1* @select
154; CHECK:  %arr    = load [3 x float], [3 x float]* @arr
155  %arr    = load [3 x float], [3 x float]* @arr
156
157; CHECK:  %a = fadd nnan ninf afn float %x, %y
158  %a = fadd ninf nnan afn float %x, %y
159; CHECK:  %a_vec = fadd reassoc nnan <3 x float> %vec, %vec
160  %a_vec = fadd reassoc nnan <3 x float> %vec, %vec
161; CHECK:  %b = fsub fast float %x, %y
162  %b = fsub nnan nsz fast float %x, %y
163; CHECK:  %b_vec = fsub nnan <3 x float> %vec, %vec
164  %b_vec = fsub nnan <3 x float> %vec, %vec
165; CHECK:  %c = fmul fast float %x, %y
166  %c = fmul nsz fast arcp float %x, %y
167; CHECK:  %c_vec = fmul nsz <3 x float> %vec, %vec
168  %c_vec = fmul nsz <3 x float> %vec, %vec
169; CHECK:  %d = fdiv nnan ninf arcp float %x, %y
170  %d = fdiv arcp ninf nnan float %x, %y
171; CHECK:  %d_vec = fdiv fast <3 x float> %vec, %vec
172  %d_vec = fdiv fast nnan arcp <3 x float> %vec, %vec
173; CHECK:  %e = frem nnan nsz float %x, %y
174  %e = frem nnan nsz float %x, %y
175; CHECK:  %e_vec = frem nnan <3 x float> %vec, %vec
176  %e_vec = frem nnan <3 x float> %vec, %vec
177; CHECK:  ret  float %e
178  ret  float %e
179}
180