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