xref: /llvm-project/clang/test/CodeGen/SystemZ/zvector2.c (revision 1e5bfac933ea90ec4361446398551dd6b967c67f)
1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2 // RUN: %clang_cc1 -triple s390x-linux-gnu -target-cpu z14 -fzvector \
3 // RUN:  -O -emit-llvm -o - -W -Wall -Werror %s | FileCheck %s
4 
5 volatile vector float ff, ff2;
6 volatile vector bool int bi;
7 
8 // CHECK-LABEL: define dso_local void @test_assign(
9 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] {
10 // CHECK-NEXT:  [[ENTRY:.*:]]
11 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3:![0-9]+]]
12 // CHECK-NEXT:    store volatile <4 x float> [[TMP0]], ptr @ff, align 8, !tbaa [[TBAA3]]
13 // CHECK-NEXT:    ret void
14 //
15 void test_assign (void)
16 {
17   ff = ff2;
18 }
19 
20 // CHECK-LABEL: define dso_local void @test_pos(
21 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
22 // CHECK-NEXT:  [[ENTRY:.*:]]
23 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
24 // CHECK-NEXT:    store volatile <4 x float> [[TMP0]], ptr @ff, align 8, !tbaa [[TBAA3]]
25 // CHECK-NEXT:    ret void
26 //
27 void test_pos (void)
28 {
29   ff = +ff2;
30 }
31 
32 // CHECK-LABEL: define dso_local void @test_neg(
33 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
34 // CHECK-NEXT:  [[ENTRY:.*:]]
35 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
36 // CHECK-NEXT:    [[FNEG:%.*]] = fneg <4 x float> [[TMP0]]
37 // CHECK-NEXT:    store volatile <4 x float> [[FNEG]], ptr @ff, align 8, !tbaa [[TBAA3]]
38 // CHECK-NEXT:    ret void
39 //
40 void test_neg (void)
41 {
42   ff = -ff2;
43 }
44 
45 // CHECK-LABEL: define dso_local void @test_preinc(
46 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
47 // CHECK-NEXT:  [[ENTRY:.*:]]
48 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
49 // CHECK-NEXT:    [[INC:%.*]] = fadd <4 x float> [[TMP0]], splat (float 1.000000e+00)
50 // CHECK-NEXT:    store volatile <4 x float> [[INC]], ptr @ff2, align 8, !tbaa [[TBAA3]]
51 // CHECK-NEXT:    ret void
52 //
53 void test_preinc (void)
54 {
55   ++ff2;
56 }
57 
58 // CHECK-LABEL: define dso_local void @test_postinc(
59 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
60 // CHECK-NEXT:  [[ENTRY:.*:]]
61 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
62 // CHECK-NEXT:    [[INC:%.*]] = fadd <4 x float> [[TMP0]], splat (float 1.000000e+00)
63 // CHECK-NEXT:    store volatile <4 x float> [[INC]], ptr @ff2, align 8, !tbaa [[TBAA3]]
64 // CHECK-NEXT:    ret void
65 //
66 void test_postinc (void)
67 {
68   ff2++;
69 }
70 
71 // CHECK-LABEL: define dso_local void @test_predec(
72 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
73 // CHECK-NEXT:  [[ENTRY:.*:]]
74 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
75 // CHECK-NEXT:    [[DEC:%.*]] = fadd <4 x float> [[TMP0]], splat (float -1.000000e+00)
76 // CHECK-NEXT:    store volatile <4 x float> [[DEC]], ptr @ff2, align 8, !tbaa [[TBAA3]]
77 // CHECK-NEXT:    ret void
78 //
79 void test_predec (void)
80 {
81   --ff2;
82 }
83 
84 // CHECK-LABEL: define dso_local void @test_postdec(
85 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
86 // CHECK-NEXT:  [[ENTRY:.*:]]
87 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
88 // CHECK-NEXT:    [[DEC:%.*]] = fadd <4 x float> [[TMP0]], splat (float -1.000000e+00)
89 // CHECK-NEXT:    store volatile <4 x float> [[DEC]], ptr @ff2, align 8, !tbaa [[TBAA3]]
90 // CHECK-NEXT:    ret void
91 //
92 void test_postdec (void)
93 {
94   ff2--;
95 }
96 
97 // CHECK-LABEL: define dso_local void @test_add(
98 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
99 // CHECK-NEXT:  [[ENTRY:.*:]]
100 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
101 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
102 // CHECK-NEXT:    [[ADD:%.*]] = fadd <4 x float> [[TMP0]], [[TMP1]]
103 // CHECK-NEXT:    store volatile <4 x float> [[ADD]], ptr @ff, align 8, !tbaa [[TBAA3]]
104 // CHECK-NEXT:    ret void
105 //
106 void test_add (void)
107 {
108   ff = ff + ff2;
109 }
110 
111 // CHECK-LABEL: define dso_local void @test_add_assign(
112 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
113 // CHECK-NEXT:  [[ENTRY:.*:]]
114 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
115 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
116 // CHECK-NEXT:    [[ADD:%.*]] = fadd <4 x float> [[TMP0]], [[TMP1]]
117 // CHECK-NEXT:    store volatile <4 x float> [[ADD]], ptr @ff, align 8, !tbaa [[TBAA3]]
118 // CHECK-NEXT:    ret void
119 //
120 void test_add_assign (void)
121 {
122   ff += ff2;
123 }
124 
125 // CHECK-LABEL: define dso_local void @test_sub(
126 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
127 // CHECK-NEXT:  [[ENTRY:.*:]]
128 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
129 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
130 // CHECK-NEXT:    [[SUB:%.*]] = fsub <4 x float> [[TMP0]], [[TMP1]]
131 // CHECK-NEXT:    store volatile <4 x float> [[SUB]], ptr @ff, align 8, !tbaa [[TBAA3]]
132 // CHECK-NEXT:    ret void
133 //
134 void test_sub (void)
135 {
136   ff = ff - ff2;
137 }
138 
139 // CHECK-LABEL: define dso_local void @test_sub_assign(
140 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
141 // CHECK-NEXT:  [[ENTRY:.*:]]
142 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
143 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
144 // CHECK-NEXT:    [[SUB:%.*]] = fsub <4 x float> [[TMP1]], [[TMP0]]
145 // CHECK-NEXT:    store volatile <4 x float> [[SUB]], ptr @ff, align 8, !tbaa [[TBAA3]]
146 // CHECK-NEXT:    ret void
147 //
148 void test_sub_assign (void)
149 {
150   ff -= ff2;
151 }
152 
153 // CHECK-LABEL: define dso_local void @test_mul(
154 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
155 // CHECK-NEXT:  [[ENTRY:.*:]]
156 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
157 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
158 // CHECK-NEXT:    [[MUL:%.*]] = fmul <4 x float> [[TMP0]], [[TMP1]]
159 // CHECK-NEXT:    store volatile <4 x float> [[MUL]], ptr @ff, align 8, !tbaa [[TBAA3]]
160 // CHECK-NEXT:    ret void
161 //
162 void test_mul (void)
163 {
164   ff = ff * ff2;
165 }
166 
167 // CHECK-LABEL: define dso_local void @test_mul_assign(
168 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
169 // CHECK-NEXT:  [[ENTRY:.*:]]
170 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
171 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
172 // CHECK-NEXT:    [[MUL:%.*]] = fmul <4 x float> [[TMP0]], [[TMP1]]
173 // CHECK-NEXT:    store volatile <4 x float> [[MUL]], ptr @ff, align 8, !tbaa [[TBAA3]]
174 // CHECK-NEXT:    ret void
175 //
176 void test_mul_assign (void)
177 {
178   ff *= ff2;
179 }
180 
181 // CHECK-LABEL: define dso_local void @test_div(
182 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
183 // CHECK-NEXT:  [[ENTRY:.*:]]
184 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
185 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
186 // CHECK-NEXT:    [[DIV:%.*]] = fdiv <4 x float> [[TMP0]], [[TMP1]]
187 // CHECK-NEXT:    store volatile <4 x float> [[DIV]], ptr @ff, align 8, !tbaa [[TBAA3]]
188 // CHECK-NEXT:    ret void
189 //
190 void test_div (void)
191 {
192   ff = ff / ff2;
193 }
194 
195 // CHECK-LABEL: define dso_local void @test_div_assign(
196 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
197 // CHECK-NEXT:  [[ENTRY:.*:]]
198 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
199 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
200 // CHECK-NEXT:    [[DIV:%.*]] = fdiv <4 x float> [[TMP1]], [[TMP0]]
201 // CHECK-NEXT:    store volatile <4 x float> [[DIV]], ptr @ff, align 8, !tbaa [[TBAA3]]
202 // CHECK-NEXT:    ret void
203 //
204 void test_div_assign (void)
205 {
206   ff /= ff2;
207 }
208 
209 // CHECK-LABEL: define dso_local void @test_cmpeq(
210 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
211 // CHECK-NEXT:  [[ENTRY:.*:]]
212 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
213 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
214 // CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq <4 x float> [[TMP0]], [[TMP1]]
215 // CHECK-NEXT:    [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>
216 // CHECK-NEXT:    store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]]
217 // CHECK-NEXT:    ret void
218 //
219 void test_cmpeq (void)
220 {
221   bi = ff == ff2;
222 }
223 
224 // CHECK-LABEL: define dso_local void @test_cmpne(
225 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
226 // CHECK-NEXT:  [[ENTRY:.*:]]
227 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
228 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
229 // CHECK-NEXT:    [[CMP:%.*]] = fcmp une <4 x float> [[TMP0]], [[TMP1]]
230 // CHECK-NEXT:    [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>
231 // CHECK-NEXT:    store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]]
232 // CHECK-NEXT:    ret void
233 //
234 void test_cmpne (void)
235 {
236   bi = ff != ff2;
237 }
238 
239 // CHECK-LABEL: define dso_local void @test_cmpge(
240 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
241 // CHECK-NEXT:  [[ENTRY:.*:]]
242 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
243 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
244 // CHECK-NEXT:    [[CMP:%.*]] = fcmp oge <4 x float> [[TMP0]], [[TMP1]]
245 // CHECK-NEXT:    [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>
246 // CHECK-NEXT:    store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]]
247 // CHECK-NEXT:    ret void
248 //
249 void test_cmpge (void)
250 {
251   bi = ff >= ff2;
252 }
253 
254 // CHECK-LABEL: define dso_local void @test_cmpgt(
255 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
256 // CHECK-NEXT:  [[ENTRY:.*:]]
257 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
258 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
259 // CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt <4 x float> [[TMP0]], [[TMP1]]
260 // CHECK-NEXT:    [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>
261 // CHECK-NEXT:    store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]]
262 // CHECK-NEXT:    ret void
263 //
264 void test_cmpgt (void)
265 {
266   bi = ff > ff2;
267 }
268 
269 // CHECK-LABEL: define dso_local void @test_cmple(
270 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
271 // CHECK-NEXT:  [[ENTRY:.*:]]
272 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
273 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
274 // CHECK-NEXT:    [[CMP:%.*]] = fcmp ole <4 x float> [[TMP0]], [[TMP1]]
275 // CHECK-NEXT:    [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>
276 // CHECK-NEXT:    store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]]
277 // CHECK-NEXT:    ret void
278 //
279 void test_cmple (void)
280 {
281   bi = ff <= ff2;
282 }
283 
284 // CHECK-LABEL: define dso_local void @test_cmplt(
285 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
286 // CHECK-NEXT:  [[ENTRY:.*:]]
287 // CHECK-NEXT:    [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]]
288 // CHECK-NEXT:    [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]]
289 // CHECK-NEXT:    [[CMP:%.*]] = fcmp olt <4 x float> [[TMP0]], [[TMP1]]
290 // CHECK-NEXT:    [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>
291 // CHECK-NEXT:    store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]]
292 // CHECK-NEXT:    ret void
293 //
294 void test_cmplt (void)
295 {
296   bi = ff < ff2;
297 }
298 
299 //.
300 // CHECK: [[TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0}
301 // CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}
302 // CHECK: [[META5]] = !{!"Simple C/C++ TBAA"}
303 //.
304