1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple aarch64-apple-ios -run-pass=aarch64-prelegalizer-combiner %s -o - | FileCheck %s 3 4# Check that we canonicalize shuffle_vector(Src1, Src2, mask(0,1,2,3)) 5# into concat_vector(Src1, Src2). 6--- 7name: shuffle_vector_to_concat_vector_0123 8tracksRegLiveness: true 9body: | 10 bb.1: 11 liveins: $d0, $d1 12 13 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_0123 14 ; CHECK: liveins: $d0, $d1 15 ; CHECK-NEXT: {{ $}} 16 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0 17 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1 18 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY]](<2 x s32>), [[COPY1]](<2 x s32>) 19 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<4 x s32>) 20 %0:_(<2 x s32>) = COPY $d0 21 %1:_(<2 x s32>) = COPY $d1 22 %2:_(<4 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(0, 1, 2, 3) 23 RET_ReallyLR implicit %2 24... 25# Check that we canonicalize shuffle_vector(Src1, Src2, mask(2,3,0,1,2,3)) 26# into concat_vector(Src2, Src1, Src2). 27--- 28name: shuffle_vector_to_concat_vector_230123 29tracksRegLiveness: true 30body: | 31 bb.1: 32 liveins: $d0, $d1 33 34 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_230123 35 ; CHECK: liveins: $d0, $d1 36 ; CHECK-NEXT: {{ $}} 37 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0 38 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1 39 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<6 x s32>) = G_CONCAT_VECTORS [[COPY1]](<2 x s32>), [[COPY]](<2 x s32>), [[COPY1]](<2 x s32>) 40 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<6 x s32>) 41 %0:_(<2 x s32>) = COPY $d0 42 %1:_(<2 x s32>) = COPY $d1 43 %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,3,0,1,2,3) 44 RET_ReallyLR implicit %2 45... 46# Check that we canonicalize shuffle_vector(Src1, Src2, mask(2,undef,0,1,undef,3)) 47# into concat_vector(Src2, Src1, Src2). 48--- 49name: shuffle_vector_to_concat_vector_2undef01undef3 50tracksRegLiveness: true 51body: | 52 bb.1: 53 liveins: $d0, $d1 54 55 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_2undef01undef3 56 ; CHECK: liveins: $d0, $d1 57 ; CHECK-NEXT: {{ $}} 58 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0 59 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1 60 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<6 x s32>) = G_CONCAT_VECTORS [[COPY1]](<2 x s32>), [[COPY]](<2 x s32>), [[COPY1]](<2 x s32>) 61 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<6 x s32>) 62 %0:_(<2 x s32>) = COPY $d0 63 %1:_(<2 x s32>) = COPY $d1 64 %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,-1,0,1,-1,3) 65 RET_ReallyLR implicit %2 66... 67# Check that we don't canonicalize shuffle_vector into concat_vectors 68# when the sources get half mixed. 69--- 70name: shuffle_vector_to_concat_vector_mixed_src_200123_neg 71tracksRegLiveness: true 72body: | 73 bb.1: 74 liveins: $d0, $d1 75 76 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_mixed_src_200123_neg 77 ; CHECK: liveins: $d0, $d1 78 ; CHECK-NEXT: {{ $}} 79 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0 80 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1 81 ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<6 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<2 x s32>), [[COPY1]], shufflemask(2, 0, 0, 1, 2, 3) 82 ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<6 x s32>) 83 %0:_(<2 x s32>) = COPY $d0 84 %1:_(<2 x s32>) = COPY $d1 85 %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,0,0,1,2,3) 86 RET_ReallyLR implicit %2 87... 88# Check that we produce implicit_def while canonicalizing shuffle_vector(Src1, Src2, mask(2,undef,undef,undef,undef,1)) 89# into concat_vector(Src2, undef, Src1). 90--- 91name: shuffle_vector_to_concat_vector_2undef1 92tracksRegLiveness: true 93body: | 94 bb.1: 95 liveins: $d0, $d1 96 97 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_2undef1 98 ; CHECK: liveins: $d0, $d1 99 ; CHECK-NEXT: {{ $}} 100 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0 101 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1 102 ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<2 x s32>) = G_IMPLICIT_DEF 103 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<6 x s32>) = G_CONCAT_VECTORS [[COPY1]](<2 x s32>), [[DEF]](<2 x s32>), [[COPY]](<2 x s32>) 104 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<6 x s32>) 105 %0:_(<2 x s32>) = COPY $d0 106 %1:_(<2 x s32>) = COPY $d1 107 %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,-1,-1,-1,-1,1) 108 RET_ReallyLR implicit %2 109... 110# Check that we don't canonicalize shuffle_vector into concat_vectors 111# if a source is flipped. 112--- 113name: shuffle_vector_to_concat_vector_src_flipped_230132_neg 114tracksRegLiveness: true 115body: | 116 bb.1: 117 liveins: $d0, $d1 118 119 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_src_flipped_230132_neg 120 ; CHECK: liveins: $d0, $d1 121 ; CHECK-NEXT: {{ $}} 122 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0 123 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1 124 ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<6 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<2 x s32>), [[COPY1]], shufflemask(2, 3, 0, 1, 3, 2) 125 ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<6 x s32>) 126 %0:_(<2 x s32>) = COPY $d0 127 %1:_(<2 x s32>) = COPY $d1 128 %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,3,0,1,3,2) 129 RET_ReallyLR implicit %2 130... 131# Check that we don't canonicalize shuffle_vector into concat_vectors 132# if a source is flipped and the other half is undef. 133--- 134name: shuffle_vector_to_concat_vector_src_flipped_23013undef_neg 135tracksRegLiveness: true 136body: | 137 bb.1: 138 liveins: $d0, $d1 139 140 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_src_flipped_23013undef_neg 141 ; CHECK: liveins: $d0, $d1 142 ; CHECK-NEXT: {{ $}} 143 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0 144 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1 145 ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<6 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<2 x s32>), [[COPY1]], shufflemask(2, 3, 0, 1, 3, undef) 146 ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<6 x s32>) 147 %0:_(<2 x s32>) = COPY $d0 148 %1:_(<2 x s32>) = COPY $d1 149 %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,3,0,1,3,-1) 150 RET_ReallyLR implicit %2 151... 152 153# Check that we canonicalize shuffle_vector(Src1, Src2, mask(0,1,2,3,4,5,6,7)) 154# into concat_vector(Src1, Src2) with bigger vector type. 155--- 156name: shuffle_vector_to_concat_vector_01234567 157tracksRegLiveness: true 158body: | 159 bb.1: 160 liveins: $q0, $q1 161 162 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_01234567 163 ; CHECK: liveins: $q0, $q1 164 ; CHECK-NEXT: {{ $}} 165 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 166 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1 167 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>) 168 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<8 x s32>) 169 %0:_(<4 x s32>) = COPY $q0 170 %1:_(<4 x s32>) = COPY $q1 171 %2:_(<8 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(0, 1, 2, 3, 4, 5, 6, 7) 172 RET_ReallyLR implicit %2 173... 174# Check that we canonicalize shuffle_vector(Src1, Src2, mask(4,5,6,7,0,1,2,3)) 175# into concat_vector(Src2, Src1, Src2) with bigger vector type. 176--- 177name: shuffle_vector_to_concat_vector_45670123 178tracksRegLiveness: true 179body: | 180 bb.1: 181 liveins: $q0, $q1 182 183 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_45670123 184 ; CHECK: liveins: $q0, $q1 185 ; CHECK-NEXT: {{ $}} 186 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 187 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1 188 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x s32>) = G_CONCAT_VECTORS [[COPY1]](<4 x s32>), [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>) 189 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<12 x s32>) 190 %0:_(<4 x s32>) = COPY $q0 191 %1:_(<4 x s32>) = COPY $q1 192 %2:_(<12 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,6,7,0,1,2,3,4,5,6,7) 193 RET_ReallyLR implicit %2 194... 195# Check that we canonicalize shuffle_vector(Src1, Src2, mask(4,5,undef,undef,0,1,2,3,undef,undef,6,7)) 196# into concat_vector(Src2, Src1, Src2) with bigger vector type. 197--- 198name: shuffle_vector_to_concat_vector_45undefundef0123undefundef67 199tracksRegLiveness: true 200body: | 201 bb.1: 202 liveins: $q0, $q1 203 204 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_45undefundef0123undefundef67 205 ; CHECK: liveins: $q0, $q1 206 ; CHECK-NEXT: {{ $}} 207 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 208 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1 209 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x s32>) = G_CONCAT_VECTORS [[COPY1]](<4 x s32>), [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>) 210 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<12 x s32>) 211 %0:_(<4 x s32>) = COPY $q0 212 %1:_(<4 x s32>) = COPY $q1 213 %2:_(<12 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,-1,-1,0,1,2,3,-1,-1,6,7) 214 RET_ReallyLR implicit %2 215... 216# Check that we don't canonicalize shuffle_vector into concat_vectors 217# when the sources get half mixed with bigger vector type. 218--- 219name: shuffle_vector_to_concat_vector_mixed_src_456000123_neg 220tracksRegLiveness: true 221body: | 222 bb.1: 223 liveins: $q0, $q1 224 225 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_mixed_src_456000123_neg 226 ; CHECK: liveins: $q0, $q1 227 ; CHECK-NEXT: {{ $}} 228 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 229 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1 230 ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<8 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<4 x s32>), [[COPY1]], shufflemask(4, 5, 6, 0, 0, 1, 2, 3) 231 ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<8 x s32>) 232 %0:_(<4 x s32>) = COPY $q0 233 %1:_(<4 x s32>) = COPY $q1 234 %2:_(<8 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,6,0,0,1,2,3) 235 RET_ReallyLR implicit %2 236... 237# Check that we produce implicit_def while canonicalizing shuffle_vector(Src1, Src2, mask(2,undef,undef,undef,undef,1)) 238# into concat_vector(Src2, undef, Src1) with bigger vector type. 239--- 240name: shuffle_vector_to_concat_vector_45undefundefundefundefundefundefundefundef23 241tracksRegLiveness: true 242body: | 243 bb.1: 244 liveins: $q0, $q1 245 246 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_45undefundefundefundefundefundefundefundef23 247 ; CHECK: liveins: $q0, $q1 248 ; CHECK-NEXT: {{ $}} 249 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 250 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1 251 ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF 252 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x s32>) = G_CONCAT_VECTORS [[COPY1]](<4 x s32>), [[DEF]](<4 x s32>), [[COPY]](<4 x s32>) 253 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<12 x s32>) 254 %0:_(<4 x s32>) = COPY $q0 255 %1:_(<4 x s32>) = COPY $q1 256 %2:_(<12 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,-1,-1,-1,-1,-1,-1,-1,-1,2,3) 257 RET_ReallyLR implicit %2 258... 259# Check that we don't canonicalize shuffle_vector into concat_vectors 260# when we grab less than the full vectors. 261--- 262name: shuffle_vector_to_concat_vector_4501_neg 263tracksRegLiveness: true 264body: | 265 bb.1: 266 liveins: $q0, $q1 267 268 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_4501_neg 269 ; CHECK: liveins: $q0, $q1 270 ; CHECK-NEXT: {{ $}} 271 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 272 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1 273 ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<4 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<4 x s32>), [[COPY1]], shufflemask(4, 5, 0, 1) 274 ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<4 x s32>) 275 %0:_(<4 x s32>) = COPY $q0 276 %1:_(<4 x s32>) = COPY $q1 277 %2:_(<4 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,0,1) 278 RET_ReallyLR implicit %2 279... 280# Check that we don't canonicalize shuffle_vector into concat_vectors 281# if a source is flipped and the other half is undef with bigger vector. 282--- 283name: shuffle_vector_to_concat_vector_src_flipped_4567012367undefundef_neg 284tracksRegLiveness: true 285body: | 286 bb.1: 287 liveins: $q0, $q1 288 289 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_src_flipped_4567012367undefundef_neg 290 ; CHECK: liveins: $q0, $q1 291 ; CHECK-NEXT: {{ $}} 292 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 293 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1 294 ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<12 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<4 x s32>), [[COPY1]], shufflemask(4, 5, 6, 7, 0, 1, 2, 3, 6, 7, undef, undef) 295 ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<12 x s32>) 296 %0:_(<4 x s32>) = COPY $q0 297 %1:_(<4 x s32>) = COPY $q1 298 %2:_(<12 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,6,7,0,1,2,3,6,7,-1,-1) 299 RET_ReallyLR implicit %2 300... 301# Check that we canonicalize shuffle_vector(Src1, Src2, mask(4,5,undef,undef,0,1,2,3,undef,undef,6,7)) 302# into concat_vector(Src2, Src1, Src2) with vector of pointers. 303--- 304name: shuffle_vector_to_concat_vector_45undefundef0123undefundef67_ptr 305tracksRegLiveness: true 306body: | 307 bb.1: 308 liveins: $q0_q1, $q2_q3 309 310 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_45undefundef0123undefundef67_ptr 311 ; CHECK: liveins: $q0_q1, $q2_q3 312 ; CHECK-NEXT: {{ $}} 313 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x p0>) = COPY $q0_q1 314 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x p0>) = COPY $q2_q3 315 ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x p0>) = G_CONCAT_VECTORS [[COPY1]](<4 x p0>), [[COPY]](<4 x p0>), [[COPY1]](<4 x p0>) 316 ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<12 x p0>) 317 %0:_(<4 x p0>) = COPY $q0_q1 318 %1:_(<4 x p0>) = COPY $q2_q3 319 %2:_(<12 x p0>) = G_SHUFFLE_VECTOR %0(<4 x p0>), %1(<4 x p0>), shufflemask(4,5,-1,-1,0,1,2,3,-1,-1,6,7) 320 RET_ReallyLR implicit %2 321... 322# Check that we don't canonicalize shuffle_vector into concat_vectors 323# when the sources get half mixed with vector of pointers. 324--- 325name: shuffle_vector_to_concat_vector_mixed_src_456000123_neg_ptr 326tracksRegLiveness: true 327body: | 328 bb.1: 329 liveins: $q0_q1, $q2_q3 330 331 ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_mixed_src_456000123_neg_ptr 332 ; CHECK: liveins: $q0_q1, $q2_q3 333 ; CHECK-NEXT: {{ $}} 334 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x p0>) = COPY $q0_q1 335 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x p0>) = COPY $q2_q3 336 ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<8 x p0>) = G_SHUFFLE_VECTOR [[COPY]](<4 x p0>), [[COPY1]], shufflemask(4, 5, 6, 0, 0, 1, 2, 3) 337 ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<8 x p0>) 338 %0:_(<4 x p0>) = COPY $q0_q1 339 %1:_(<4 x p0>) = COPY $q2_q3 340 %2:_(<8 x p0>) = G_SHUFFLE_VECTOR %0(<4 x p0>), %1(<4 x p0>), shufflemask(4,5,6,0,0,1,2,3) 341 RET_ReallyLR implicit %2 342... 343 344# Check that shuffle_vector gets combined into concat_vectors then the 345# concat_vectors gets combined into build_vector. 346--- 347name: shuffle_vector_to_build_vector_ptr 348tracksRegLiveness: true 349body: | 350 bb.1: 351 liveins: $x0, $x1, $x2, $x3 352 353 ; CHECK-LABEL: name: shuffle_vector_to_build_vector_ptr 354 ; CHECK: liveins: $x0, $x1, $x2, $x3 355 ; CHECK-NEXT: {{ $}} 356 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 357 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 358 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2 359 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(p0) = COPY $x3 360 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x p0>) = G_BUILD_VECTOR [[COPY]](p0), [[COPY1]](p0), [[COPY2]](p0), [[COPY3]](p0) 361 ; CHECK-NEXT: RET_ReallyLR implicit [[BUILD_VECTOR]](<4 x p0>) 362 %0:_(p0) = COPY $x0 363 %1:_(p0) = COPY $x1 364 %2:_(p0) = COPY $x2 365 %3:_(p0) = COPY $x3 366 %4:_(<2 x p0>) = G_BUILD_VECTOR %0(p0), %1 367 %5:_(<2 x p0>) = G_BUILD_VECTOR %2(p0), %3 368 %6:_(<4 x p0>) = G_SHUFFLE_VECTOR %4(<2 x p0>), %5(<2 x p0>), shufflemask(0,1,2,3) 369 RET_ReallyLR implicit %6 370... 371 372# Check that shuffle_vector on scalars gets combined into build_vector. 373--- 374name: shuffle_vector_on_scalars_to_build_vector_ptr 375tracksRegLiveness: true 376body: | 377 bb.1: 378 liveins: $x0, $x1 379 380 ; CHECK-LABEL: name: shuffle_vector_on_scalars_to_build_vector_ptr 381 ; CHECK: liveins: $x0, $x1 382 ; CHECK-NEXT: {{ $}} 383 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 384 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 385 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x p0>) = G_BUILD_VECTOR [[COPY]](p0), [[COPY1]](p0), [[COPY]](p0), [[COPY1]](p0) 386 ; CHECK-NEXT: RET_ReallyLR implicit [[BUILD_VECTOR]](<4 x p0>) 387 %0:_(p0) = COPY $x0 388 %1:_(p0) = COPY $x1 389 %6:_(<4 x p0>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0,1,0,1) 390 RET_ReallyLR implicit %6 391... 392 393# Check that shuffle_vector on scalars gets combined into build_vector, 394# even if we swap the order of the operands. 395--- 396name: shuffle_vector_on_scalars_to_build_vector_swap_ptr 397tracksRegLiveness: true 398body: | 399 bb.1: 400 liveins: $x0, $x1 401 402 ; CHECK-LABEL: name: shuffle_vector_on_scalars_to_build_vector_swap_ptr 403 ; CHECK: liveins: $x0, $x1 404 ; CHECK-NEXT: {{ $}} 405 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 406 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 407 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x p0>) = G_BUILD_VECTOR [[COPY1]](p0), [[COPY]](p0) 408 ; CHECK-NEXT: RET_ReallyLR implicit [[BUILD_VECTOR]](<2 x p0>) 409 %0:_(p0) = COPY $x0 410 %1:_(p0) = COPY $x1 411 %6:_(<2 x p0>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(1,0) 412 RET_ReallyLR implicit %6 413... 414 415# Check that we properly use undef values when shuffle_vector 416# on scalars gets lowered to build_vector. 417--- 418name: shuffle_vector_on_scalars_to_build_vector_with_undef 419tracksRegLiveness: true 420body: | 421 bb.1: 422 liveins: $x0, $x1 423 424 ; CHECK-LABEL: name: shuffle_vector_on_scalars_to_build_vector_with_undef 425 ; CHECK: liveins: $x0, $x1 426 ; CHECK-NEXT: {{ $}} 427 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 428 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 429 ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF 430 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s64>) = G_BUILD_VECTOR [[COPY]](s64), [[DEF]](s64), [[DEF]](s64), [[COPY1]](s64) 431 ; CHECK-NEXT: RET_ReallyLR implicit [[BUILD_VECTOR]](<4 x s64>) 432 %0:_(s64) = COPY $x0 433 %1:_(s64) = COPY $x1 434 %6:_(<4 x s64>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0,-1,-1,1) 435 RET_ReallyLR implicit %6 436... 437 438# Check that shuffle_vector on scalars gets combined into a plain 439# copy when the resulting type is a scalar as well and the sizes 440# are compatible. 441--- 442name: shuffle_vector_on_scalars_to_copy_ptr 443tracksRegLiveness: true 444body: | 445 bb.1: 446 liveins: $x0 447 448 ; CHECK-LABEL: name: shuffle_vector_on_scalars_to_copy_ptr 449 ; CHECK: liveins: $x0 450 ; CHECK-NEXT: {{ $}} 451 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 452 ; CHECK-NEXT: RET_ReallyLR implicit [[COPY]](p0) 453 %0:_(p0) = COPY $x0 454 %6:_(p0) = G_SHUFFLE_VECTOR %0, %0, shufflemask(0) 455 RET_ReallyLR implicit %6 456... 457--- 458name: shuffle_vector_to_copy_lhs 459tracksRegLiveness: true 460body: | 461 bb.1: 462 liveins: $x0, $x1 463 464 ; CHECK-LABEL: name: shuffle_vector_to_copy_lhs 465 ; CHECK: liveins: $x0, $x1 466 ; CHECK-NEXT: {{ $}} 467 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x0 468 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 469 ; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[COPY]](<2 x s32>), [[C]](s64) 470 ; CHECK-NEXT: RET_ReallyLR implicit [[EVEC]](s32) 471 %0:_(<2 x s32>) = COPY $x0 472 %1:_(<2 x s32>) = COPY $x1 473 %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(1) 474 RET_ReallyLR implicit %6 475... 476--- 477name: shuffle_vector_to_copy_rhs 478tracksRegLiveness: true 479body: | 480 bb.1: 481 liveins: $x0, $x1 482 483 ; CHECK-LABEL: name: shuffle_vector_to_copy_rhs 484 ; CHECK: liveins: $x0, $x1 485 ; CHECK-NEXT: {{ $}} 486 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x1 487 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 488 ; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[COPY]](<2 x s32>), [[C]](s64) 489 ; CHECK-NEXT: RET_ReallyLR implicit [[EVEC]](s32) 490 %0:_(<2 x s32>) = COPY $x0 491 %1:_(<2 x s32>) = COPY $x1 492 %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(2) 493 RET_ReallyLR implicit %6 494... 495--- 496name: shuffle_vector_to_copy_undef 497tracksRegLiveness: true 498body: | 499 bb.1: 500 liveins: $x0, $x1 501 502 ; CHECK-LABEL: name: shuffle_vector_to_copy_undef 503 ; CHECK: liveins: $x0, $x1 504 ; CHECK-NEXT: {{ $}} 505 ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF 506 ; CHECK-NEXT: RET_ReallyLR implicit [[DEF]](s32) 507 %0:_(<2 x s32>) = COPY $x0 508 %1:_(<2 x s32>) = COPY $x1 509 %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(-1) 510 RET_ReallyLR implicit %6 511... 512