1 ; RUN: llc -O3 -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s 2 3 ; Test swap removal when a vector splat must be adjusted to make it legal. 4 ; 5 ; Test generated from following C code: 6 ; 7 ; vector char vc = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; 8 ; vector char vcr; 9 ; vector short vs = {0, 1, 2, 3, 4, 5, 6, 7}; 10 ; vector short vsr; 11 ; vector int vi = {0, 1, 2, 3}; 12 ; vector int vir; 13 ; 14 ; void cfoo () 15 ; { 16 ; vcr = (vector char){vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], 17 ; vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5], vc[5]}; 18 ; } 19 ; 20 ; void sfoo () 21 ; { 22 ; vsr = (vector short){vs[6], vs[6], vs[6], vs[6], 23 ; vs[6], vs[6], vs[6], vs[6]}; 24 ; } 25 ; 26 ; void ifoo () 27 ; { 28 ; vir = (vector int){vi[1], vi[1], vi[1], vi[1]}; 29 ; } 30 31 @vc = global <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, align 16 32 @vs = global <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, align 16 33 @vi = global <4 x i32> <i32 0, i32 1, i32 2, i32 3>, align 16 34 @vcr = common global <16 x i8> zeroinitializer, align 16 35 @vsr = common global <8 x i16> zeroinitializer, align 16 36 @vir = common global <4 x i32> zeroinitializer, align 16 37 38 ; Function Attrs: nounwind 39 define void @cfoo() { 40 entry: 41 %0 = load <16 x i8>, <16 x i8>* @vc, align 16 42 %vecinit30 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 43 store <16 x i8> %vecinit30, <16 x i8>* @vcr, align 16 44 ret void 45 } 46 47 ; Function Attrs: nounwind 48 define void @sfoo() { 49 entry: 50 %0 = load <8 x i16>, <8 x i16>* @vs, align 16 51 %vecinit14 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> <i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6, i32 6> 52 store <8 x i16> %vecinit14, <8 x i16>* @vsr, align 16 53 ret void 54 } 55 56 ; Function Attrs: nounwind 57 define void @ifoo() { 58 entry: 59 %0 = load <4 x i32>, <4 x i32>* @vi, align 16 60 %vecinit6 = shufflevector <4 x i32> %0, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 61 store <4 x i32> %vecinit6, <4 x i32>* @vir, align 16 62 ret void 63 } 64 65 ; Justification: 66 ; Byte splat of element 5 (BE) becomes element 15-5 = 10 (LE) 67 ; which becomes (10+8)%16 = 2 (LE swapped). 68 ; 69 ; Halfword splat of element 6 (BE) becomes element 7-6 = 1 (LE) 70 ; which becomes (1+4)%8 = 5 (LE swapped). 71 ; 72 ; Word splat of element 1 (BE) becomes element 3-1 = 2 (LE) 73 ; which becomes (2+2)%4 = 0 (LE swapped). 74 75 ; CHECK-NOT: xxpermdi 76 ; CHECK-NOT: xxswapd 77 78 ; CHECK-LABEL: @cfoo 79 ; CHECK: lxvd2x 80 ; CHECK: vspltb {{[0-9]+}}, {{[0-9]+}}, 2 81 ; CHECK: stxvd2x 82 83 ; CHECK-LABEL: @sfoo 84 ; CHECK: lxvd2x 85 ; CHECK: vsplth {{[0-9]+}}, {{[0-9]+}}, 5 86 ; CHECK: stxvd2x 87 88 ; CHECK-LABEL: @ifoo 89 ; CHECK: lxvd2x 90 ; CHECK: vspltw {{[0-9]+}}, {{[0-9]+}}, 0 91 ; CHECK: stxvd2x 92