[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Other / scalable-vectors-core-ir.ll
blobf04184a417666717cd3441683f3f9ab829dc1a6d
1 ; RUN: opt -S -verify < %s | FileCheck %s
2 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
3 target triple = "aarch64--linux-gnu"
5 ;; Check supported instructions are accepted without dropping 'vscale'.
6 ;; Same order as the LangRef
8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 ;; Unary Operations
10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13 define <vscale x 2 x double> @fneg(<vscale x 2 x double> %val) {
14 ; CHECK-LABEL: @fneg
15 ; CHECK: %r = fneg <vscale x 2 x double> %val
16 ; CHECK-NEXT: ret <vscale x 2 x double> %r
17   %r = fneg <vscale x 2 x double> %val
18   ret <vscale x 2 x double> %r
21 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22 ;; Binary Operations
23 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25 define <vscale x 8 x i16> @add(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
26 ; CHECK-LABEL: @add
27 ; CHECK: %r = add <vscale x 8 x i16> %a, %b
28 ; CHECK-NEXT: ret <vscale x 8 x i16> %r
29   %r = add <vscale x 8 x i16> %a, %b
30   ret <vscale x 8 x i16> %r
33 define <vscale x 4 x float> @fadd(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
34 ; CHECK-LABEL: @fadd
35 ; CHECK: %r = fadd <vscale x 4 x float> %a, %b
36 ; CHECK-NEXT: ret <vscale x 4 x float> %r
37   %r = fadd <vscale x 4 x float> %a, %b
38   ret <vscale x 4 x float> %r
41 define <vscale x 4 x i32> @sub(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
42 ; CHECK-LABEL: @sub
43 ; CHECK: %r = sub <vscale x 4 x i32> %a, %b
44 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
45   %r = sub <vscale x 4 x i32> %a, %b
46   ret <vscale x 4 x i32> %r
49 define <vscale x 4 x float> @fsub(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
50 ; CHECK-LABEL: @fsub
51 ; CHECK: %r = fsub <vscale x 4 x float> %a, %b
52 ; CHECK-NEXT: ret <vscale x 4 x float> %r
53   %r = fsub <vscale x 4 x float> %a, %b
54   ret <vscale x 4 x float> %r
57 define <vscale x 4 x i32> @mul(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
58 ; CHECK-LABEL: @mul
59 ; CHECK: %r = mul <vscale x 4 x i32> %a, %b
60 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
61   %r = mul <vscale x 4 x i32> %a, %b
62   ret <vscale x 4 x i32> %r
65 define <vscale x 4 x float> @fmul(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
66 ; CHECK-LABEL: @fmul
67 ; CHECK: %r = fmul <vscale x 4 x float> %a, %b
68 ; CHECK-NEXT: ret <vscale x 4 x float> %r
69   %r = fmul <vscale x 4 x float> %a, %b
70   ret <vscale x 4 x float> %r
73 define <vscale x 4 x i32> @udiv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
74 ; CHECK-LABEL: @udiv
75 ; CHECK: %r = udiv <vscale x 4 x i32> %a, %b
76 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
77   %r = udiv <vscale x 4 x i32> %a, %b
78   ret <vscale x 4 x i32> %r
81 define <vscale x 4 x i32> @sdiv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
82 ; CHECK-LABEL: @sdiv
83 ; CHECK: %r = sdiv <vscale x 4 x i32> %a, %b
84 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
85   %r = sdiv <vscale x 4 x i32> %a, %b
86   ret <vscale x 4 x i32> %r
89 define <vscale x 4 x float> @fdiv(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
90 ; CHECK-LABEL: @fdiv
91 ; CHECK: %r = fdiv <vscale x 4 x float> %a, %b
92 ; CHECK-NEXT: ret <vscale x 4 x float> %r
93   %r = fdiv <vscale x 4 x float> %a, %b
94   ret <vscale x 4 x float> %r
97 define <vscale x 4 x i32> @urem(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
98 ; CHECK-LABEL: @urem
99 ; CHECK: %r = urem <vscale x 4 x i32> %a, %b
100 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
101   %r = urem <vscale x 4 x i32> %a, %b
102   ret <vscale x 4 x i32> %r
105 define <vscale x 4 x i32> @srem(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
106 ; CHECK-LABEL: @srem
107 ; CHECK: %r = srem <vscale x 4 x i32> %a, %b
108 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
109   %r = srem <vscale x 4 x i32> %a, %b
110   ret <vscale x 4 x i32> %r
113 define <vscale x 4 x float> @frem(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
114 ; CHECK-LABEL: @frem
115 ; CHECK: %r = frem <vscale x 4 x float> %a, %b
116 ; CHECK-NEXT: ret <vscale x 4 x float> %r
117   %r = frem <vscale x 4 x float> %a, %b
118   ret <vscale x 4 x float> %r
121 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
122 ;; Bitwise Binary Operations
123 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
125 define <vscale x 4 x i32> @shl(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
126 ; CHECK-LABEL: @shl
127 ; CHECK: %r = shl <vscale x 4 x i32> %a, %b
128 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
129   %r = shl <vscale x 4 x i32> %a, %b
130   ret <vscale x 4 x i32> %r
133 define <vscale x 4 x i32> @lshr(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
134 ; CHECK-LABEL: @lshr
135 ; CHECK: %r = lshr <vscale x 4 x i32> %a, %b
136 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
137   %r = lshr <vscale x 4 x i32> %a, %b
138   ret <vscale x 4 x i32> %r
141 define <vscale x 4 x i32> @ashr(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
142 ; CHECK-LABEL: @ashr
143 ; CHECK: %r = ashr <vscale x 4 x i32> %a, %b
144 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
145   %r = ashr <vscale x 4 x i32> %a, %b
146   ret <vscale x 4 x i32> %r
149 define <vscale x 4 x i32> @and(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
150 ; CHECK-LABEL: @and
151 ; CHECK: %r = and <vscale x 4 x i32> %a, %b
152 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
153   %r = and <vscale x 4 x i32> %a, %b
154   ret <vscale x 4 x i32> %r
157 define <vscale x 4 x i32> @or(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
158 ; CHECK-LABEL: @or
159 ; CHECK: %r = or <vscale x 4 x i32> %a, %b
160 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
161   %r = or <vscale x 4 x i32> %a, %b
162   ret <vscale x 4 x i32> %r
165 define <vscale x 4 x i32> @xor(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
166 ; CHECK-LABEL: @xor
167 ; CHECK: %r = xor <vscale x 4 x i32> %a, %b
168 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
169   %r = xor <vscale x 4 x i32> %a, %b
170   ret <vscale x 4 x i32> %r
173 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
174 ;; Vector Operations
175 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
177 define i64 @extractelement(<vscale x 2 x i64> %val) {
178 ; CHECK-LABEL: @extractelement
179 ; CHECK: %r = extractelement <vscale x 2 x i64> %val, i32 0
180 ; CHECK-NEXT: ret i64 %r
181   %r = extractelement <vscale x 2 x i64> %val, i32 0
182   ret i64 %r
185 define <vscale x 16 x i8> @insertelement(<vscale x 16 x i8> %vec, i8 %ins) {
186 ; CHECK-LABEL: @insertelement
187 ; CHECK: %r = insertelement <vscale x 16 x i8> %vec, i8 %ins, i32 0
188 ; CHECK-NEXT: ret <vscale x 16 x i8> %r
189   %r = insertelement <vscale x 16 x i8> %vec, i8 %ins, i32 0
190   ret <vscale x 16 x i8> %r
193 define <vscale x 8 x half> @shufflevector(half %val) {
194 ; CHECK-LABEL: @shufflevector
195 ; CHECK: %insvec = insertelement <vscale x 8 x half> undef, half %val, i32 0
196 ; CHECK-NEXT: %r = shufflevector <vscale x 8 x half> %insvec, <vscale x 8 x half> undef, <vscale x 8 x i32> zeroinitializer
197 ; CHECK-NEXT: ret <vscale x 8 x half> %r
198   %insvec = insertelement <vscale x 8 x half> undef, half %val, i32 0
199   %r = shufflevector <vscale x 8 x half> %insvec, <vscale x 8 x half> undef, <vscale x 8 x i32> zeroinitializer
200   ret <vscale x 8 x half> %r
203 define <vscale x 8 x half> @shufflevector2(half %val) {
204 ; CHECK-LABEL: @shufflevector
205 ; CHECK: %insvec = insertelement <vscale x 8 x half> poison, half %val, i32 0
206 ; CHECK-NEXT: %r = shufflevector <vscale x 8 x half> %insvec, <vscale x 8 x half> undef, <vscale x 8 x i32> zeroinitializer
207 ; CHECK-NEXT: ret <vscale x 8 x half> %r
208   %insvec = insertelement <vscale x 8 x half> poison, half %val, i32 0
209   %r = shufflevector <vscale x 8 x half> %insvec, <vscale x 8 x half> undef, <vscale x 8 x i32> zeroinitializer
210   ret <vscale x 8 x half> %r
213 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
214 ;; Memory Access and Addressing Operations
215 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
217 define void @alloca() {
218 ; CHECK-LABEL: @alloca
219 ; CHECK: %vec = alloca <vscale x 4 x i32>
220 ; CHECK-NEXT: ret void
221   %vec = alloca <vscale x 4 x i32>
222   ret void
225 define <vscale x 2 x double> @load(<vscale x 2 x double>* %ptr) {
226 ; CHECK-LABEL: @load
227 ; CHECK: %r = load <vscale x 2 x double>, <vscale x 2 x double>* %ptr
228 ; CHECK-NEXT: ret <vscale x 2 x double> %r
229   %r = load <vscale x 2 x double>, <vscale x 2 x double>* %ptr
230   ret <vscale x 2 x double> %r
233 define void @store(<vscale x 4 x i32> %data, <vscale x 4 x i32>* %ptr) {
234 ; CHECK-LABEL: @store
235 ; CHECK: store <vscale x 4 x i32> %data, <vscale x 4 x i32>* %ptr
236 ; CHECK-NEXT: ret void
237   store <vscale x 4 x i32> %data, <vscale x 4 x i32>* %ptr
238   ret void
241 define <vscale x 4 x float>* @getelementptr(<vscale x 4 x float>* %base) {
242 ; CHECK-LABEL: @getelementptr
243 ; CHECK: %r = getelementptr <vscale x 4 x float>, <vscale x 4 x float>* %base, i64 0
244 ; CHECK-NEXT: ret <vscale x 4 x float>* %r
245   %r = getelementptr <vscale x 4 x float>, <vscale x 4 x float>* %base, i64 0
246   ret <vscale x 4 x float>* %r
249 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
250 ;; Conversion Operations
251 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
253 define <vscale x 4 x i32> @truncto(<vscale x 4 x i64> %val) {
254 ; CHECK-LABEL: @truncto
255 ; CHECK: %r = trunc <vscale x 4 x i64> %val to <vscale x 4 x i32>
256 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
257   %r = trunc <vscale x 4 x i64> %val to <vscale x 4 x i32>
258   ret <vscale x 4 x i32> %r
261 define <vscale x 2 x i64> @zextto(<vscale x 2 x i16> %val) {
262 ; CHECK-LABEL: @zextto
263 ; CHECK: %r = zext <vscale x 2 x i16> %val to <vscale x 2 x i64>
264 ; CHECK-NEXT: ret <vscale x 2 x i64> %r
265   %r = zext <vscale x 2 x i16> %val to <vscale x 2 x i64>
266   ret <vscale x 2 x i64> %r
269 define <vscale x 4 x i32> @sextto(<vscale x 4 x i8> %val) {
270 ; CHECK-LABEL: @sextto
271 ; CHECK: %r = sext <vscale x 4 x i8> %val to <vscale x 4 x i32>
272 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
273   %r = sext <vscale x 4 x i8> %val to <vscale x 4 x i32>
274   ret <vscale x 4 x i32> %r
277 define <vscale x 4 x half> @fptruncto(<vscale x 4 x float> %val) {
278 ; CHECK-LABEL: @fptruncto
279 ; CHECK: %r = fptrunc <vscale x 4 x float> %val to <vscale x 4 x half>
280 ; CHECK-NEXT: ret <vscale x 4 x half> %r
281   %r = fptrunc <vscale x 4 x float> %val to <vscale x 4 x half>
282   ret <vscale x 4 x half> %r
285 define <vscale x 2 x double> @fpextto(<vscale x 2 x half> %val) {
286 ; CHECK-LABEL: @fpextto
287 ; CHECK: %r = fpext <vscale x 2 x half> %val to <vscale x 2 x double>
288 ; CHECK-NEXT: ret <vscale x 2 x double> %r
289   %r = fpext <vscale x 2 x half> %val to <vscale x 2 x double>
290   ret <vscale x 2 x double> %r
293 define <vscale x 4 x i32> @fptouito(<vscale x 4 x float> %val) {
294 ; CHECK-LABEL: @fptoui
295 ; CHECK: %r = fptoui <vscale x 4 x float> %val to <vscale x 4 x i32>
296 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
297   %r = fptoui <vscale x 4 x float> %val to <vscale x 4 x i32>
298   ret <vscale x 4 x i32> %r
301 define <vscale x 4 x i32> @fptosito(<vscale x 4 x float> %val) {
302 ; CHECK-LABEL: @fptosi
303 ; CHECK: %r = fptosi <vscale x 4 x float> %val to <vscale x 4 x i32>
304 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
305   %r = fptosi <vscale x 4 x float> %val to <vscale x 4 x i32>
306   ret <vscale x 4 x i32> %r
309 define <vscale x 4 x float> @uitofpto(<vscale x 4 x i32> %val) {
310 ; CHECK-LABEL: @uitofp
311 ; CHECK: %r = uitofp <vscale x 4 x i32> %val to <vscale x 4 x float>
312 ; CHECK-NEXT: ret <vscale x 4 x float> %r
313   %r = uitofp <vscale x 4 x i32> %val to <vscale x 4 x float>
314   ret <vscale x 4 x float> %r
317 define <vscale x 4 x float> @sitofpto(<vscale x 4 x i32> %val) {
318 ; CHECK-LABEL: @sitofp
319 ; CHECK: %r = sitofp <vscale x 4 x i32> %val to <vscale x 4 x float>
320 ; CHECK-NEXT: ret <vscale x 4 x float> %r
321   %r = sitofp <vscale x 4 x i32> %val to <vscale x 4 x float>
322   ret <vscale x 4 x float> %r
325 define <vscale x 2 x i64> @ptrtointto(<vscale x 2 x i32*> %val) {
326 ; CHECK-LABEL: @ptrtointto
327 ; CHECK: %r = ptrtoint <vscale x 2 x i32*> %val to <vscale x 2 x i64>
328 ; CHECK-NEXT: ret <vscale x 2 x i64> %r
329   %r = ptrtoint <vscale x 2 x i32*> %val to <vscale x 2 x i64>
330   ret <vscale x 2 x i64> %r
333 define <vscale x 2 x i32*> @inttoptrto(<vscale x 2 x i64> %val) {
334 ; CHECK-LABEL: @inttoptrto
335 ; CHECK: %r = inttoptr <vscale x 2 x i64> %val to <vscale x 2 x i32*>
336 ; CHECK-NEXT: ret <vscale x 2 x i32*> %r
337   %r = inttoptr <vscale x 2 x i64> %val to <vscale x 2 x i32*>
338   ret <vscale x 2 x i32*> %r
341 define <vscale x 2 x i64> @bitcastto(<vscale x 2 x double> %a) {
342 ; CHECK-LABEL: @bitcast
343 ; CHECK: %r = bitcast <vscale x 2 x double> %a to <vscale x 2 x i64>
344 ; CHECK-NEXT: ret <vscale x 2 x i64> %r
345   %r = bitcast <vscale x 2 x double> %a to <vscale x 2 x i64>
346   ret <vscale x 2 x i64> %r
349 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
350 ;; Other Operations
351 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
353 define <vscale x 4 x i1> @icmp(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
354 ; CHECK-LABEL: @icmp
355 ; CHECK: %r = icmp eq <vscale x 4 x i32> %a, %b
356 ; CHECK-NEXT: ret <vscale x 4 x i1> %r
357   %r = icmp eq <vscale x 4 x i32> %a, %b
358   ret <vscale x 4 x i1> %r
361 define <vscale x 4 x i1> @fcmp(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
362 ; CHECK-LABEL: @fcmp
363 ; CHECK: %r = fcmp une <vscale x 4 x float> %a, %b
364 ; CHECK-NEXT: ret <vscale x 4 x i1> %r
365   %r = fcmp une <vscale x 4 x float> %a, %b
366   ret <vscale x 4 x i1> %r
369 define <vscale x 16 x i8> @phi(<vscale x 16 x i8> %a, i32 %val) {
370 ; CHECK-LABEL: @phi
371 ; CHECK: %r = phi <vscale x 16 x i8> [ %a, %entry ], [ %added, %iszero ]
372 ; CHECK-NEXT: ret <vscale x 16 x i8> %r
373 entry:
374   %cmp = icmp eq i32 %val, 0
375   br i1 %cmp, label %iszero, label %end
377 iszero:
378   %ins = insertelement <vscale x 16 x i8> undef, i8 1, i32 0
379   %splatone = shufflevector <vscale x 16 x i8> %ins, <vscale x 16 x i8> undef, <vscale x 16 x i32> zeroinitializer
380   %added = add <vscale x 16 x i8> %a, %splatone
381   br label %end
383 end:
384   %r = phi <vscale x 16 x i8> [ %a, %entry ], [ %added, %iszero ]
385   ret <vscale x 16 x i8> %r
388 define <vscale x 8 x half> @select(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x i1> %sval) {
389 ; CHECK-LABEL: @select
390 ; CHECK: %r = select <vscale x 8 x i1> %sval, <vscale x 8 x half> %a, <vscale x 8 x half> %b
391 ; CHECK-NEXT: ret <vscale x 8 x half> %r
392   %r = select <vscale x 8 x i1> %sval, <vscale x 8 x half> %a, <vscale x 8 x half> %b
393   ret <vscale x 8 x half> %r
396 declare <vscale x 4 x i32> @callee(<vscale x 4 x i32>)
397 define <vscale x 4 x i32> @call(<vscale x 4 x i32> %val) {
398 ; CHECK-LABEL: @call
399 ; CHECK: %r = call <vscale x 4 x i32> @callee(<vscale x 4 x i32> %val)
400 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
401   %r = call <vscale x 4 x i32> @callee(<vscale x 4 x i32> %val)
402   ret <vscale x 4 x i32> %r