1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mtriple=x86_64-unknown-linux-gnu -mcpu=core-avx2 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test that we correctly fold a shuffle that performs a swizzle of another 4*9880d681SAndroid Build Coastguard Worker; shuffle node according to the rule 5*9880d681SAndroid Build Coastguard Worker; shuffle (shuffle (x, undef, M0), undef, M1) -> shuffle(x, undef, M2) 6*9880d681SAndroid Build Coastguard Worker; 7*9880d681SAndroid Build Coastguard Worker; We only do this if the resulting mask is legal to avoid introducing an 8*9880d681SAndroid Build Coastguard Worker; illegal shuffle that is expanded into a sub-optimal sequence of instructions 9*9880d681SAndroid Build Coastguard Worker; during lowering stage. 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; Check that we produce a single vector permute / shuffle in all cases. 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @swizzle_1(<8 x i32> %v) { 14*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i32> %v, <8 x i32> undef, <8 x i32> <i32 3, i32 1, i32 2, i32 0, i32 7, i32 5, i32 6, i32 4> 15*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 7, i32 5, i32 6, i32 4> 16*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %2 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: swizzle_1 19*9880d681SAndroid Build Coastguard Worker; CHECK: vpermd 20*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpermd 21*9880d681SAndroid Build Coastguard Worker; CHECK: ret 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @swizzle_2(<8 x i32> %v) { 25*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i32> %v, <8 x i32> undef, <8 x i32> <i32 6, i32 7, i32 4, i32 5, i32 0, i32 1, i32 2, i32 3> 26*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <8 x i32> <i32 6, i32 7, i32 4, i32 5, i32 0, i32 1, i32 2, i32 3> 27*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %2 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: swizzle_2 30*9880d681SAndroid Build Coastguard Worker; CHECK: vpshufd $78 31*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpermd 32*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpshufd 33*9880d681SAndroid Build Coastguard Worker; CHECK: ret 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @swizzle_3(<8 x i32> %v) { 37*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i32> %v, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 38*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 2, i32 3, i32 0, i32 1> 39*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %2 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: swizzle_3 42*9880d681SAndroid Build Coastguard Worker; CHECK: vpshufd $78 43*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpermd 44*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpshufd 45*9880d681SAndroid Build Coastguard Worker; CHECK: ret 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @swizzle_4(<8 x i32> %v) { 49*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i32> %v, <8 x i32> undef, <8 x i32> <i32 4, i32 7, i32 5, i32 6, i32 3, i32 2, i32 0, i32 1> 50*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <8 x i32> <i32 4, i32 7, i32 5, i32 6, i32 3, i32 2, i32 0, i32 1> 51*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %2 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: swizzle_4 54*9880d681SAndroid Build Coastguard Worker; CHECK: vpermd 55*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpermd 56*9880d681SAndroid Build Coastguard Worker; CHECK: ret 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @swizzle_5(<8 x i32> %v) { 60*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i32> %v, <8 x i32> undef, <8 x i32> <i32 7, i32 4, i32 6, i32 5, i32 0, i32 2, i32 1, i32 3> 61*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <8 x i32> <i32 7, i32 4, i32 6, i32 5, i32 0, i32 2, i32 1, i32 3> 62*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %2 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: swizzle_5 65*9880d681SAndroid Build Coastguard Worker; CHECK: vpermd 66*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpermd 67*9880d681SAndroid Build Coastguard Worker; CHECK: ret 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @swizzle_6(<8 x i32> %v) { 71*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i32> %v, <8 x i32> undef, <8 x i32> <i32 2, i32 1, i32 3, i32 0, i32 4, i32 7, i32 6, i32 5> 72*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <8 x i32> <i32 2, i32 1, i32 3, i32 0, i32 4, i32 7, i32 6, i32 5> 73*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %2 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: swizzle_6 76*9880d681SAndroid Build Coastguard Worker; CHECK: vpermd 77*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpermd 78*9880d681SAndroid Build Coastguard Worker; CHECK: ret 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @swizzle_7(<8 x i32> %v) { 82*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i32> %v, <8 x i32> undef, <8 x i32> <i32 0, i32 3, i32 1, i32 2, i32 5, i32 4, i32 6, i32 7> 83*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <8 x i32> <i32 0, i32 3, i32 1, i32 2, i32 5, i32 4, i32 6, i32 7> 84*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %2 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: swizzle_7 87*9880d681SAndroid Build Coastguard Worker; CHECK: vpermd 88*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vpermd 89*9880d681SAndroid Build Coastguard Worker; CHECK: ret 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker 92