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 Workerdeclare <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16>) 5*9880d681SAndroid Build Coastguard Workerdeclare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker; Vector Demanded Bits 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; Only bottom 4 elements required. 12*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @demand_vcvtph2ps_128(<8 x i16> %A) { 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @demand_vcvtph2ps_128( 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = tail call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> %A) 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x float> [[TMP1]] 16*9880d681SAndroid Build Coastguard Worker; 17*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i16> %A, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3> 18*9880d681SAndroid Build Coastguard Worker %2 = tail call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> %1) 19*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; All 8 elements required. 23*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @demand_vcvtph2ps_256(<8 x i16> %A) { 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @demand_vcvtph2ps_256( 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i16> %A, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3> 26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[TMP2:%.*]] = tail call <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16> [[TMP1]]) 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x float> [[TMP2]] 28*9880d681SAndroid Build Coastguard Worker; 29*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i16> %A, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3> 30*9880d681SAndroid Build Coastguard Worker %2 = tail call <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16> %1) 31*9880d681SAndroid Build Coastguard Worker ret <8 x float> %2 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; 35*9880d681SAndroid Build Coastguard Worker; Constant Folding 36*9880d681SAndroid Build Coastguard Worker; 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @fold_vcvtph2ps_128() { 39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_vcvtph2ps_128( 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x float> <float 0.000000e+00, float 5.000000e-01, float 1.000000e+00, float -0.000000e+00> 41*9880d681SAndroid Build Coastguard Worker; 42*9880d681SAndroid Build Coastguard Worker %1 = tail call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> <i16 0, i16 14336, i16 15360, i16 32768, i16 16384, i16 31743, i16 48128, i16 49152>) 43*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @fold_vcvtph2ps_256() { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_vcvtph2ps_256( 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x float> <float 0.000000e+00, float 5.000000e-01, float 1.000000e+00, float -0.000000e+00, float 2.000000e+00, float 6.550400e+04, float -1.000000e+00, float -2.000000e+00> 49*9880d681SAndroid Build Coastguard Worker; 50*9880d681SAndroid Build Coastguard Worker %1 = tail call <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16> <i16 0, i16 14336, i16 15360, i16 32768, i16 16384, i16 31743, i16 48128, i16 49152>) 51*9880d681SAndroid Build Coastguard Worker ret <8 x float> %1 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @fold_vcvtph2ps_128_zero() { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_vcvtph2ps_128_zero( 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x float> zeroinitializer 57*9880d681SAndroid Build Coastguard Worker; 58*9880d681SAndroid Build Coastguard Worker %1 = tail call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>) 59*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @fold_vcvtph2ps_256_zero() { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_vcvtph2ps_256_zero( 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <8 x float> zeroinitializer 65*9880d681SAndroid Build Coastguard Worker; 66*9880d681SAndroid Build Coastguard Worker %1 = tail call <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>) 67*9880d681SAndroid Build Coastguard Worker ret <8 x float> %1 68*9880d681SAndroid Build Coastguard Worker} 69