[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-min-max-pred.ll
blobcd0206fdcbf8eaf41eeb393ed5a703b64d13cf74
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -mtriple=aarch64  %s -o - | FileCheck %s --check-prefixes=CHECK
4 ; These tests just check that the plumbing is in place for @llvm.smax, @llvm.umax,
5 ; @llvm.smin, @llvm.umin.
7 ; tests for smax:
9 define <vscale x 16 x i8> @smax_select_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
10 ; CHECK-LABEL: smax_select_i8:
11 ; CHECK:       // %bb.0:
12 ; CHECK-NEXT:    smax z0.b, p0/m, z0.b, z1.b
13 ; CHECK-NEXT:    ret
14   %sel = call <vscale x 16 x i8> @llvm.smax.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b)
15   %out = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %sel, <vscale x 16 x i8> %a
16   ret <vscale x 16 x i8> %out
19 define <vscale x 8 x i16> @smax_select_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
20 ; CHECK-LABEL: smax_select_i16:
21 ; CHECK:       // %bb.0:
22 ; CHECK-NEXT:    smax z0.h, p0/m, z0.h, z1.h
23 ; CHECK-NEXT:    ret
24   %sel = call <vscale x 8 x i16> @llvm.smax.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b)
25   %out = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %sel, <vscale x 8 x i16> %a
26   ret <vscale x 8 x i16> %out
29 define <vscale x 4 x i32> @smax_select_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
30 ; CHECK-LABEL: smax_select_i32:
31 ; CHECK:       // %bb.0:
32 ; CHECK-NEXT:    smax z0.s, p0/m, z0.s, z1.s
33 ; CHECK-NEXT:    ret
34   %sel = call <vscale x 4 x i32> @llvm.smax.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b)
35   %out = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %sel, <vscale x 4 x i32> %a
36   ret <vscale x 4 x i32> %out
39 define <vscale x 2 x i64> @smax_select_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
40 ; CHECK-LABEL: smax_select_i64:
41 ; CHECK:       // %bb.0:
42 ; CHECK-NEXT:    smax z0.d, p0/m, z0.d, z1.d
43 ; CHECK-NEXT:    ret
44   %sel = call <vscale x 2 x i64> @llvm.smax.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
45   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a
46   ret <vscale x 2 x i64> %out
49 ; tests for umax:
51 define <vscale x 16 x i8> @umax_select_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
52 ; CHECK-LABEL: umax_select_i8:
53 ; CHECK:       // %bb.0:
54 ; CHECK-NEXT:    umax z0.b, p0/m, z0.b, z1.b
55 ; CHECK-NEXT:    ret
56   %sel = call <vscale x 16 x i8> @llvm.umax.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b)
57   %out = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %sel, <vscale x 16 x i8> %a
58   ret <vscale x 16 x i8> %out
61 define <vscale x 8 x i16> @umax_select_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
62 ; CHECK-LABEL: umax_select_i16:
63 ; CHECK:       // %bb.0:
64 ; CHECK-NEXT:    umax z0.h, p0/m, z0.h, z1.h
65 ; CHECK-NEXT:    ret
66   %sel = call <vscale x 8 x i16> @llvm.umax.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b)
67   %out = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %sel, <vscale x 8 x i16> %a
68   ret <vscale x 8 x i16> %out
71 define <vscale x 4 x i32> @umax_select_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
72 ; CHECK-LABEL: umax_select_i32:
73 ; CHECK:       // %bb.0:
74 ; CHECK-NEXT:    umax z0.s, p0/m, z0.s, z1.s
75 ; CHECK-NEXT:    ret
76   %sel = call <vscale x 4 x i32> @llvm.umax.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b)
77   %out = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %sel, <vscale x 4 x i32> %a
78   ret <vscale x 4 x i32> %out
81 define <vscale x 2 x i64> @umax_select_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
82 ; CHECK-LABEL: umax_select_i64:
83 ; CHECK:       // %bb.0:
84 ; CHECK-NEXT:    umax z0.d, p0/m, z0.d, z1.d
85 ; CHECK-NEXT:    ret
86   %sel = call <vscale x 2 x i64> @llvm.umax.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
87   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a
88   ret <vscale x 2 x i64> %out
91 ; tests for smin:
93 define <vscale x 16 x i8> @smin_select_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
94 ; CHECK-LABEL: smin_select_i8:
95 ; CHECK:       // %bb.0:
96 ; CHECK-NEXT:    smin z0.b, p0/m, z0.b, z1.b
97 ; CHECK-NEXT:    ret
98   %sel = call <vscale x 16 x i8> @llvm.smin.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b)
99   %out = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %sel, <vscale x 16 x i8> %a
100   ret <vscale x 16 x i8> %out
103 define <vscale x 8 x i16> @smin_select_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
104 ; CHECK-LABEL: smin_select_i16:
105 ; CHECK:       // %bb.0:
106 ; CHECK-NEXT:    smin z0.h, p0/m, z0.h, z1.h
107 ; CHECK-NEXT:    ret
108   %sel = call <vscale x 8 x i16> @llvm.smin.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b)
109   %out = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %sel, <vscale x 8 x i16> %a
110   ret <vscale x 8 x i16> %out
113 define <vscale x 4 x i32> @smin_select_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
114 ; CHECK-LABEL: smin_select_i32:
115 ; CHECK:       // %bb.0:
116 ; CHECK-NEXT:    smin z0.s, p0/m, z0.s, z1.s
117 ; CHECK-NEXT:    ret
118   %sel = call <vscale x 4 x i32> @llvm.smin.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b)
119   %out = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %sel, <vscale x 4 x i32> %a
120   ret <vscale x 4 x i32> %out
123 define <vscale x 2 x i64> @smin_select_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
124 ; CHECK-LABEL: smin_select_i64:
125 ; CHECK:       // %bb.0:
126 ; CHECK-NEXT:    smin z0.d, p0/m, z0.d, z1.d
127 ; CHECK-NEXT:    ret
128   %sel = call <vscale x 2 x i64> @llvm.smin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
129   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a
130   ret <vscale x 2 x i64> %out
133 ; tests for umin:
135 define <vscale x 16 x i8> @umin_select_i8(<vscale x 16 x i1> %pg, <vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {
136 ; CHECK-LABEL: umin_select_i8:
137 ; CHECK:       // %bb.0:
138 ; CHECK-NEXT:    umin z0.b, p0/m, z0.b, z1.b
139 ; CHECK-NEXT:    ret
140   %sel = call <vscale x 16 x i8> @llvm.umin.nxv16i8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b)
141   %out = select <vscale x 16 x i1> %pg, <vscale x 16 x i8> %sel, <vscale x 16 x i8> %a
142   ret <vscale x 16 x i8> %out
145 define <vscale x 8 x i16> @umin_select_i16(<vscale x 8 x i1> %pg, <vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
146 ; CHECK-LABEL: umin_select_i16:
147 ; CHECK:       // %bb.0:
148 ; CHECK-NEXT:    umin z0.h, p0/m, z0.h, z1.h
149 ; CHECK-NEXT:    ret
150   %sel = call <vscale x 8 x i16> @llvm.umin.nxv8i16(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b)
151   %out = select <vscale x 8 x i1> %pg, <vscale x 8 x i16> %sel, <vscale x 8 x i16> %a
152   ret <vscale x 8 x i16> %out
155 define <vscale x 4 x i32> @umin_select_i32(<vscale x 4 x i1> %pg, <vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
156 ; CHECK-LABEL: umin_select_i32:
157 ; CHECK:       // %bb.0:
158 ; CHECK-NEXT:    umin z0.s, p0/m, z0.s, z1.s
159 ; CHECK-NEXT:    ret
160   %sel = call <vscale x 4 x i32> @llvm.umin.nxv4i32(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b)
161   %out = select <vscale x 4 x i1> %pg, <vscale x 4 x i32> %sel, <vscale x 4 x i32> %a
162   ret <vscale x 4 x i32> %out
165 define <vscale x 2 x i64> @umin_select_i64(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
166 ; CHECK-LABEL: umin_select_i64:
167 ; CHECK:       // %bb.0:
168 ; CHECK-NEXT:    umin z0.d, p0/m, z0.d, z1.d
169 ; CHECK-NEXT:    ret
170   %sel = call <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
171   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a
172   ret <vscale x 2 x i64> %out
176 define <vscale x 2 x i64> @umin_select_i64_multiuse(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b, ptr %p) {
177 ; CHECK-LABEL: umin_select_i64_multiuse:
178 ; CHECK:       // %bb.0:
179 ; CHECK-NEXT:    ptrue p1.d
180 ; CHECK-NEXT:    umin z1.d, p1/m, z1.d, z0.d
181 ; CHECK-NEXT:    mov z0.d, p0/m, z1.d
182 ; CHECK-NEXT:    st1d { z1.d }, p1, [x0]
183 ; CHECK-NEXT:    ret
184   %sel = call <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
185   store <vscale x 2 x i64> %sel, ptr %p
186   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %a
187   ret <vscale x 2 x i64> %out
190 define <vscale x 2 x i64> @smin_select_i64_c(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
191 ; CHECK-LABEL: smin_select_i64_c:
192 ; CHECK:       // %bb.0:
193 ; CHECK-NEXT:    smin z1.d, p0/m, z1.d, z0.d
194 ; CHECK-NEXT:    mov z0.d, z1.d
195 ; CHECK-NEXT:    ret
196   %sel = call <vscale x 2 x i64> @llvm.smin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
197   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %b
198   ret <vscale x 2 x i64> %out
201 define <vscale x 2 x i64> @smax_select_i64_c(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
202 ; CHECK-LABEL: smax_select_i64_c:
203 ; CHECK:       // %bb.0:
204 ; CHECK-NEXT:    smax z1.d, p0/m, z1.d, z0.d
205 ; CHECK-NEXT:    mov z0.d, z1.d
206 ; CHECK-NEXT:    ret
207   %sel = call <vscale x 2 x i64> @llvm.smax.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
208   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %b
209   ret <vscale x 2 x i64> %out
212 define <vscale x 2 x i64> @umin_select_i64_c(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
213 ; CHECK-LABEL: umin_select_i64_c:
214 ; CHECK:       // %bb.0:
215 ; CHECK-NEXT:    umin z1.d, p0/m, z1.d, z0.d
216 ; CHECK-NEXT:    mov z0.d, z1.d
217 ; CHECK-NEXT:    ret
218   %sel = call <vscale x 2 x i64> @llvm.umin.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
219   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %b
220   ret <vscale x 2 x i64> %out
223 define <vscale x 2 x i64> @umax_select_i64_c(<vscale x 2 x i1> %pg, <vscale x 2 x i64> %a, <vscale x 2 x i64> %b) {
224 ; CHECK-LABEL: umax_select_i64_c:
225 ; CHECK:       // %bb.0:
226 ; CHECK-NEXT:    umax z1.d, p0/m, z1.d, z0.d
227 ; CHECK-NEXT:    mov z0.d, z1.d
228 ; CHECK-NEXT:    ret
229   %sel = call <vscale x 2 x i64> @llvm.umax.nxv2i64(<vscale x 2 x i64> %a, <vscale x 2 x i64> %b)
230   %out = select <vscale x 2 x i1> %pg, <vscale x 2 x i64> %sel, <vscale x 2 x i64> %b
231   ret <vscale x 2 x i64> %out
235 declare <vscale x  16 x i8> @llvm.smax.nxv16i8(<vscale x  16 x i8>, <vscale x  16 x i8>)
236 declare <vscale x  8 x i16> @llvm.smax.nxv8i16(<vscale x  8 x i16>, <vscale x  8 x i16>)
237 declare <vscale x  4 x i32> @llvm.smax.nxv4i32(<vscale x  4 x i32>, <vscale x  4 x i32>)
238 declare <vscale x  2 x i64> @llvm.smax.nxv2i64(<vscale x  2 x i64>, <vscale x  2 x i64>)
240 declare <vscale x  16 x i8> @llvm.umax.nxv16i8(<vscale x  16 x i8>, <vscale x  16 x i8>)
241 declare <vscale x  8 x i16> @llvm.umax.nxv8i16(<vscale x  8 x i16>, <vscale x  8 x i16>)
242 declare <vscale x  4 x i32> @llvm.umax.nxv4i32(<vscale x  4 x i32>, <vscale x  4 x i32>)
243 declare <vscale x  2 x i64> @llvm.umax.nxv2i64(<vscale x  2 x i64>, <vscale x  2 x i64>)
245 declare <vscale x  16 x i8> @llvm.smin.nxv16i8(<vscale x  16 x i8>, <vscale x  16 x i8>)
246 declare <vscale x  8 x i16> @llvm.smin.nxv8i16(<vscale x  8 x i16>, <vscale x  8 x i16>)
247 declare <vscale x  4 x i32> @llvm.smin.nxv4i32(<vscale x  4 x i32>, <vscale x  4 x i32>)
248 declare <vscale x  2 x i64> @llvm.smin.nxv2i64(<vscale x  2 x i64>, <vscale x  2 x i64>)
250 declare <vscale x  16 x i8> @llvm.umin.nxv16i8(<vscale x  16 x i8>, <vscale x  16 x i8>)
251 declare <vscale x  8 x i16> @llvm.umin.nxv8i16(<vscale x  8 x i16>, <vscale x  8 x i16>)
252 declare <vscale x  4 x i32> @llvm.umin.nxv4i32(<vscale x  4 x i32>, <vscale x  4 x i32>)
253 declare <vscale x  2 x i64> @llvm.umin.nxv2i64(<vscale x  2 x i64>, <vscale x  2 x i64>)