• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -instcombine -S | FileCheck %s
2
3declare <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16>)
4declare <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16>)
5
6;
7; Vector Demanded Bits
8;
9
10; Only bottom 4 elements required.
11define <4 x float> @demand_vcvtph2ps_128(<8 x i16> %A) {
12; CHECK-LABEL: @demand_vcvtph2ps_128
13; CHECK-NEXT: %1 = tail call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> %A)
14; CHECK-NEXT: ret <4 x float> %1
15  %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>
16  %2 = tail call <4 x float> @llvm.x86.vcvtph2ps.128(<8 x i16> %1)
17  ret <4 x float> %2
18}
19
20; All 8 elements required.
21define <8 x float> @demand_vcvtph2ps_256(<8 x i16> %A) {
22; CHECK-LABEL: @demand_vcvtph2ps_256
23; CHECK-NEXT: %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>
24; CHECK-NEXT: %2 = tail call <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16> %1)
25; CHECK-NEXT: ret <8 x float> %2
26  %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>
27  %2 = tail call <8 x float> @llvm.x86.vcvtph2ps.256(<8 x i16> %1)
28  ret <8 x float> %2
29}
30
31;
32; Constant Folding
33;
34
35define <4 x float> @fold_vcvtph2ps_128() {
36; CHECK-LABEL: @fold_vcvtph2ps_128
37; CHECK-NEXT: ret <4 x float> <float 0.000000e+00, float 5.000000e-01, float 1.000000e+00, float -0.000000e+00>
38  %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>)
39  ret <4 x float> %1
40}
41
42define <8 x float> @fold_vcvtph2ps_256() {
43; CHECK-LABEL: @fold_vcvtph2ps_256
44; 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>
45  %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>)
46  ret <8 x float> %1
47}
48
49define <4 x float> @fold_vcvtph2ps_128_zero() {
50; CHECK-LABEL: @fold_vcvtph2ps_128_zero
51; CHECK-NEXT: ret <4 x float> zeroinitializer
52  %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>)
53  ret <4 x float> %1
54}
55
56define <8 x float> @fold_vcvtph2ps_256_zero() {
57; CHECK-LABEL: @fold_vcvtph2ps_256_zero
58; CHECK-NEXT: ret <8 x float> zeroinitializer
59  %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>)
60  ret <8 x float> %1
61}
62