1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Verify that instcombine is able to fold identity shuffles. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @identity_test(<16 x i8> %InVec) { 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test( 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> %InVec 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <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>) 11*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @identity_test_avx2(<32 x i8> %InVec) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test_avx2( 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> %InVec 17*9880d681SAndroid Build Coastguard Worker; 18*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 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, 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>) 19*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; Verify that instcombine is able to fold byte shuffles with zero masks. 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fold_to_zero_vector(<16 x i8> %InVec) { 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_to_zero_vector( 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> zeroinitializer 27*9880d681SAndroid Build Coastguard Worker; 28*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>) 29*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @fold_to_zero_vector_avx2(<32 x i8> %InVec) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_to_zero_vector_avx2( 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> zeroinitializer 35*9880d681SAndroid Build Coastguard Worker; 36*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>) 37*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; Instcombine should be able to fold the following byte shuffle to a builtin shufflevector 41*9880d681SAndroid Build Coastguard Worker; with a shuffle mask of all zeroes. 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @splat_test(<16 x i8> %InVec) { 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @splat_test( 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> undef, <16 x i32> zeroinitializer 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 47*9880d681SAndroid Build Coastguard Worker; 48*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> zeroinitializer) 49*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; In the test case below, elements in the low 128-bit lane of the result 53*9880d681SAndroid Build Coastguard Worker; vector are equal to the lower byte of %InVec (shuffle index 0). 54*9880d681SAndroid Build Coastguard Worker; Elements in the high 128-bit lane of the result vector are equal to 55*9880d681SAndroid Build Coastguard Worker; the lower byte in the high 128-bit lane of %InVec (shuffle index 16). 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @splat_test_avx2(<32 x i8> %InVec) { 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @splat_test_avx2( 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> undef, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 61*9880d681SAndroid Build Coastguard Worker; 62*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> zeroinitializer) 63*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; Each of the byte shuffles in the following tests is equivalent to a blend between 67*9880d681SAndroid Build Coastguard Worker; vector %InVec and a vector of all zeroes. 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend1(<16 x i8> %InVec) { 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend1( 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 16, i32 1, i32 16, i32 3, i32 16, i32 5, i32 16, i32 7, i32 16, i32 9, i32 16, i32 11, i32 16, i32 13, i32 16, i32 15> 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 73*9880d681SAndroid Build Coastguard Worker; 74*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 1, i8 -128, i8 3, i8 -128, i8 5, i8 -128, i8 7, i8 -128, i8 9, i8 -128, i8 11, i8 -128, i8 13, i8 -128, i8 15>) 75*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend2(<16 x i8> %InVec) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend2( 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 16, i32 16, i32 2, i32 3, i32 16, i32 16, i32 6, i32 7, i32 16, i32 16, i32 10, i32 11, i32 16, i32 16, i32 14, i32 15> 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 82*9880d681SAndroid Build Coastguard Worker; 83*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 -128, i8 2, i8 3, i8 -128, i8 -128, i8 6, i8 7, i8 -128, i8 -128, i8 10, i8 11, i8 -128, i8 -128, i8 14, i8 15>) 84*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend3(<16 x i8> %InVec) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend3( 89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 16, i32 16, i32 16, i32 16, i32 4, i32 5, i32 6, i32 7, i32 16, i32 16, i32 16, i32 16, i32 12, i32 13, i32 14, i32 15> 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 91*9880d681SAndroid Build Coastguard Worker; 92*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 12, i8 13, i8 14, i8 15>) 93*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend4(<16 x i8> %InVec) { 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend4( 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 100*9880d681SAndroid Build Coastguard Worker; 101*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>) 102*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend5(<16 x i8> %InVec) { 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend5( 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 109*9880d681SAndroid Build Coastguard Worker; 110*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>) 111*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend6(<16 x i8> %InVec) { 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend6( 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 1, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 118*9880d681SAndroid Build Coastguard Worker; 119*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>) 120*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend1_avx2(<32 x i8> %InVec) { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend1_avx2( 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 32, i32 1, i32 32, i32 3, i32 32, i32 5, i32 32, i32 7, i32 32, i32 9, i32 32, i32 11, i32 32, i32 13, i32 32, i32 15, i32 48, i32 17, i32 48, i32 19, i32 48, i32 21, i32 48, i32 23, i32 48, i32 25, i32 48, i32 27, i32 48, i32 29, i32 48, i32 31> 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 127*9880d681SAndroid Build Coastguard Worker; 128*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 1, i8 -128, i8 3, i8 -128, i8 5, i8 -128, i8 7, i8 -128, i8 9, i8 -128, i8 11, i8 -128, i8 13, i8 -128, i8 15, i8 -128, i8 1, i8 -128, i8 3, i8 -128, i8 5, i8 -128, i8 7, i8 -128, i8 9, i8 -128, i8 11, i8 -128, i8 13, i8 -128, i8 15>) 129*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 130*9880d681SAndroid Build Coastguard Worker} 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend2_avx2(<32 x i8> %InVec) { 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend2_avx2( 134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 32, i32 32, i32 2, i32 3, i32 32, i32 32, i32 6, i32 7, i32 32, i32 32, i32 10, i32 11, i32 32, i32 32, i32 14, i32 15, i32 48, i32 48, i32 18, i32 19, i32 48, i32 48, i32 22, i32 23, i32 48, i32 48, i32 26, i32 27, i32 48, i32 48, i32 30, i32 31> 135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 136*9880d681SAndroid Build Coastguard Worker; 137*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 -128, i8 2, i8 3, i8 -128, i8 -128, i8 6, i8 7, i8 -128, i8 -128, i8 10, i8 11, i8 -128, i8 -128, i8 14, i8 15, i8 -128, i8 -128, i8 2, i8 3, i8 -128, i8 -128, i8 6, i8 7, i8 -128, i8 -128, i8 10, i8 11, i8 -128, i8 -128, i8 14, i8 15>) 138*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend3_avx2(<32 x i8> %InVec) { 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend3_avx2( 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 32, i32 32, i32 32, i32 32, i32 4, i32 5, i32 6, i32 7, i32 32, i32 32, i32 32, i32 32, i32 12, i32 13, i32 14, i32 15, i32 48, i32 48, i32 48, i32 48, i32 20, i32 21, i32 22, i32 23, i32 48, i32 48, i32 48, i32 48, i32 28, i32 29, i32 30, i32 31> 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 145*9880d681SAndroid Build Coastguard Worker; 146*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 12, i8 13, i8 14, i8 15, i8 -128, i8 -128, i8 -128, i8 -128, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 12, i8 13, i8 14, i8 15>) 147*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend4_avx2(<32 x i8> %InVec) { 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend4_avx2( 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31> 153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 154*9880d681SAndroid Build Coastguard Worker; 155*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>) 156*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend5_avx2(<32 x i8> %InVec) { 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend5_avx2( 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 16, i32 17, i32 18, i32 19, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48> 162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 163*9880d681SAndroid Build Coastguard Worker; 164*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 0, i8 1, i8 2, i8 3, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>) 165*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend6_avx2(<32 x i8> %InVec) { 169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend6_avx2( 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 1, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 16, i32 17, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48> 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 172*9880d681SAndroid Build Coastguard Worker; 173*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 0, i8 1, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>) 174*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker; movq idiom. 178*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @movq_idiom(<16 x i8> %InVec) { 179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @movq_idiom( 180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16> 181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 182*9880d681SAndroid Build Coastguard Worker; 183*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>) 184*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @movq_idiom_avx2(<32 x i8> %InVec) { 188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @movq_idiom_avx2( 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48> 190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 191*9880d681SAndroid Build Coastguard Worker; 192*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>) 193*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker; Vector permutations using byte shuffles. 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @permute1(<16 x i8> %InVec) { 199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute1( 200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15> 201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 202*9880d681SAndroid Build Coastguard Worker; 203*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 4, i8 5, i8 6, i8 7, i8 4, i8 5, i8 6, i8 7, i8 12, i8 13, i8 14, i8 15, i8 12, i8 13, i8 14, i8 15>) 204*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @permute2(<16 x i8> %InVec) { 208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute2( 209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 211*9880d681SAndroid Build Coastguard Worker; 212*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>) 213*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 214*9880d681SAndroid Build Coastguard Worker} 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @permute1_avx2(<32 x i8> %InVec) { 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute1_avx2( 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15, i32 20, i32 21, i32 22, i32 23, i32 20, i32 21, i32 22, i32 23, i32 28, i32 29, i32 30, i32 31, i32 28, i32 29, i32 30, i32 31> 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 220*9880d681SAndroid Build Coastguard Worker; 221*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 4, i8 5, i8 6, i8 7, i8 4, i8 5, i8 6, i8 7, i8 12, i8 13, i8 14, i8 15, i8 12, i8 13, i8 14, i8 15, i8 4, i8 5, i8 6, i8 7, i8 4, i8 5, i8 6, i8 7, i8 12, i8 13, i8 14, i8 15, i8 12, i8 13, i8 14, i8 15>) 222*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 223*9880d681SAndroid Build Coastguard Worker} 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @permute2_avx2(<32 x i8> %InVec) { 226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute2_avx2( 227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23> 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 229*9880d681SAndroid Build Coastguard Worker; 230*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>) 231*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 232*9880d681SAndroid Build Coastguard Worker} 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker; Test that instcombine correctly folds a pshufb with values that 235*9880d681SAndroid Build Coastguard Worker; are not -128 and that are not encoded in four bits. 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @identity_test2_2(<16 x i8> %InVec) { 238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test2_2( 239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> %InVec 240*9880d681SAndroid Build Coastguard Worker; 241*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>) 242*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @identity_test_avx2_2(<32 x i8> %InVec) { 246*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test_avx2_2( 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> %InVec 248*9880d681SAndroid Build Coastguard Worker; 249*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 16, i8 33, i8 66, i8 19, i8 36, i8 69, i8 22, i8 39, i8 72, i8 25, i8 42, i8 75, i8 28, i8 45, i8 78, i8 31, i8 48, i8 81, i8 34, i8 51, i8 84, i8 37, i8 54, i8 87, i8 40, i8 57, i8 90, i8 43, i8 60, i8 93, i8 46, i8 63>) 250*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fold_to_zero_vector_2(<16 x i8> %InVec) { 254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_to_zero_vector_2( 255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> zeroinitializer 256*9880d681SAndroid Build Coastguard Worker; 257*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -125, i8 -1, i8 -53, i8 -32, i8 -4, i8 -7, i8 -33, i8 -66, i8 -99, i8 -120, i8 -100, i8 -22, i8 -17, i8 -1, i8 -11, i8 -15>) 258*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @fold_to_zero_vector_avx2_2(<32 x i8> %InVec) { 262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_to_zero_vector_avx2_2( 263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> zeroinitializer 264*9880d681SAndroid Build Coastguard Worker; 265*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -127, i8 -1, i8 -53, i8 -32, i8 -4, i8 -7, i8 -33, i8 -66, i8 -99, i8 -120, i8 -100, i8 -22, i8 -17, i8 -1, i8 -11, i8 -15, i8 -126, i8 -2, i8 -52, i8 -31, i8 -5, i8 -8, i8 -34, i8 -67, i8 -100, i8 -119, i8 -101, i8 -23, i8 -16, i8 -2, i8 -12, i8 -16>) 266*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @permute3(<16 x i8> %InVec) { 270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute3( 271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 273*9880d681SAndroid Build Coastguard Worker; 274*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 48, i8 17, i8 34, i8 51, i8 20, i8 37, i8 54, i8 23, i8 16, i8 49, i8 66, i8 19, i8 52, i8 69, i8 22, i8 55>) 275*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @permute3_avx2(<32 x i8> %InVec) { 279*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute3_avx2( 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15, i32 20, i32 21, i32 22, i32 23, i32 20, i32 21, i32 22, i32 23, i32 28, i32 29, i32 30, i32 31, i32 28, i32 29, i32 30, i32 31> 281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 282*9880d681SAndroid Build Coastguard Worker; 283*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 52, i8 21, i8 38, i8 55, i8 20, i8 37, i8 54, i8 23, i8 28, i8 61, i8 78, i8 31, i8 60, i8 29, i8 30, i8 79, i8 52, i8 21, i8 38, i8 55, i8 20, i8 53, i8 102, i8 23, i8 92, i8 93, i8 94, i8 95, i8 108, i8 109, i8 110, i8 111>) 284*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 285*9880d681SAndroid Build Coastguard Worker} 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Worker; FIXME: Verify that instcombine is able to fold constant byte shuffles with undef mask elements. 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fold_with_undef_elts(<16 x i8> %InVec) { 290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_with_undef_elts( 291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 16, i32 undef, i32 16, i32 1, i32 16, i32 undef, i32 16, i32 2, i32 16, i32 undef, i32 16, i32 3, i32 16, i32 undef, i32 16> 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> [[TMP1]] 293*9880d681SAndroid Build Coastguard Worker; 294*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 -128, i8 undef, i8 -128, i8 1, i8 -128, i8 undef, i8 -128, i8 2, i8 -128, i8 undef, i8 -128, i8 3, i8 -128, i8 undef, i8 -128>) 295*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 296*9880d681SAndroid Build Coastguard Worker} 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @fold_with_undef_elts_avx2(<32 x i8> %InVec) { 299*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_with_undef_elts_avx2( 300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 32, i32 undef, i32 32, i32 1, i32 32, i32 undef, i32 32, i32 2, i32 32, i32 undef, i32 32, i32 3, i32 32, i32 undef, i32 32, i32 16, i32 48, i32 undef, i32 48, i32 17, i32 48, i32 undef, i32 48, i32 18, i32 48, i32 undef, i32 48, i32 19, i32 48, i32 undef, i32 48> 301*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> [[TMP1]] 302*9880d681SAndroid Build Coastguard Worker; 303*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 -128, i8 undef, i8 -128, i8 1, i8 -128, i8 undef, i8 -128, i8 2, i8 -128, i8 undef, i8 -128, i8 3, i8 -128, i8 undef, i8 -128, i8 0, i8 -128, i8 undef, i8 -128, i8 1, i8 -128, i8 undef, i8 -128, i8 2, i8 -128, i8 undef, i8 -128, i8 3, i8 -128, i8 undef, i8 -128>) 304*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 305*9880d681SAndroid Build Coastguard Worker} 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fold_with_allundef_elts(<16 x i8> %InVec) { 308*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_with_allundef_elts( 309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <16 x i8> undef 310*9880d681SAndroid Build Coastguard Worker; 311*9880d681SAndroid Build Coastguard Worker %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> undef) 312*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %1 313*9880d681SAndroid Build Coastguard Worker} 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @fold_with_allundef_elts_avx2(<32 x i8> %InVec) { 316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_with_allundef_elts_avx2( 317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <32 x i8> undef 318*9880d681SAndroid Build Coastguard Worker; 319*9880d681SAndroid Build Coastguard Worker %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> undef) 320*9880d681SAndroid Build Coastguard Worker ret <32 x i8> %1 321*9880d681SAndroid Build Coastguard Worker} 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Workerdeclare <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8>, <16 x i8>) 324*9880d681SAndroid Build Coastguard Workerdeclare <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8>, <32 x i8>) 325