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 Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Verify that instcombine is able to fold identity shuffles. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @identity_test_vpermd(<8 x i32> %a0) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test_vpermd( 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x i32> %a0 10*9880d681SAndroid Build Coastguard Worker; 11*9880d681SAndroid Build Coastguard Worker %a = tail call <8 x i32> @llvm.x86.avx2.permd(<8 x i32> %a0, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>) 12*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %a 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @identity_test_vpermps(<8 x float> %a0) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test_vpermps( 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x float> %a0 18*9880d681SAndroid Build Coastguard Worker; 19*9880d681SAndroid Build Coastguard Worker %a = tail call <8 x float> @llvm.x86.avx2.permps(<8 x float> %a0, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>) 20*9880d681SAndroid Build Coastguard Worker ret <8 x float> %a 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; Instcombine should be able to fold the following shuffle to a builtin shufflevector 24*9880d681SAndroid Build Coastguard Worker; with a shuffle mask of all zeroes. 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @zero_test_vpermd(<8 x i32> %a0) { 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @zero_test_vpermd( 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> %a0, <8 x i32> undef, <8 x i32> zeroinitializer 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x i32> [[TMP1]] 30*9880d681SAndroid Build Coastguard Worker; 31*9880d681SAndroid Build Coastguard Worker %a = tail call <8 x i32> @llvm.x86.avx2.permd(<8 x i32> %a0, <8 x i32> zeroinitializer) 32*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %a 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @zero_test_vpermps(<8 x float> %a0) { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @zero_test_vpermps( 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> %a0, <8 x float> undef, <8 x i32> zeroinitializer 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x float> [[TMP1]] 39*9880d681SAndroid Build Coastguard Worker; 40*9880d681SAndroid Build Coastguard Worker %a = tail call <8 x float> @llvm.x86.avx2.permps(<8 x float> %a0, <8 x i32> zeroinitializer) 41*9880d681SAndroid Build Coastguard Worker ret <8 x float> %a 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Verify that instcombine is able to fold constant shuffles. 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @shuffle_test_vpermd(<8 x i32> %a0) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shuffle_test_vpermd( 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> %a0, <8 x i32> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x i32> [[TMP1]] 50*9880d681SAndroid Build Coastguard Worker; 51*9880d681SAndroid Build Coastguard Worker %a = tail call <8 x i32> @llvm.x86.avx2.permd(<8 x i32> %a0, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>) 52*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %a 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @shuffle_test_vpermps(<8 x float> %a0) { 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @shuffle_test_vpermps( 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> %a0, <8 x float> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x float> [[TMP1]] 59*9880d681SAndroid Build Coastguard Worker; 60*9880d681SAndroid Build Coastguard Worker %a = tail call <8 x float> @llvm.x86.avx2.permps(<8 x float> %a0, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>) 61*9880d681SAndroid Build Coastguard Worker ret <8 x float> %a 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; Verify that instcombine is able to fold constant shuffles with undef mask elements. 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @undef_test_vpermd(<8 x i32> %a0) { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @undef_test_vpermd( 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> %a0, <8 x i32> undef, <8 x i32> <i32 undef, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x i32> [[TMP1]] 70*9880d681SAndroid Build Coastguard Worker; 71*9880d681SAndroid Build Coastguard Worker %a = tail call <8 x i32> @llvm.x86.avx2.permd(<8 x i32> %a0, <8 x i32> <i32 undef, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>) 72*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %a 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @undef_test_vpermps(<8 x float> %a0) { 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @undef_test_vpermps( 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> %a0, <8 x float> undef, <8 x i32> <i32 undef, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0> 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x float> [[TMP1]] 79*9880d681SAndroid Build Coastguard Worker; 80*9880d681SAndroid Build Coastguard Worker %a = tail call <8 x float> @llvm.x86.avx2.permps(<8 x float> %a0, <8 x i32> <i32 undef, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>) 81*9880d681SAndroid Build Coastguard Worker ret <8 x float> %a 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerdeclare <8 x i32> @llvm.x86.avx2.permd(<8 x i32>, <8 x i32>) 85*9880d681SAndroid Build Coastguard Workerdeclare <8 x float> @llvm.x86.avx2.permps(<8 x float>, <8 x i32>) 86