[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / Scalarizer / intrinsics.ll
blobb277a5bf355f38ba091804cdae0d61bb26d935c5
1 ; RUN: opt -S -scalarizer %s | FileCheck %s
2 ; RUN: opt -S -passes='function(scalarizer)' %s | FileCheck %s
4 ; Unary fp
5 declare <2 x float> @llvm.sqrt.v2f32(<2 x float>)
7 ; Binary fp
8 declare <2 x float> @llvm.minnum.v2f32(<2 x float>, <2 x float>)
9 declare <2 x float> @llvm.minimum.v2f32(<2 x float>, <2 x float>)
10 declare <2 x float> @llvm.maximum.v2f32(<2 x float>, <2 x float>)
12 ; Ternary fp
13 declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>)
15 ; Unary int
16 declare <2 x i32> @llvm.bswap.v2i32(<2 x i32>)
18 ; Unary int plus constant scalar operand
19 declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1)
21 ; Unary fp plus any scalar operand
22 declare <2 x float> @llvm.powi.v2f32(<2 x float>, i32)
24 ; Binary int plus constant scalar operand
25 declare <2 x i32> @llvm.smul.fix.sat.v2i32(<2 x i32>, <2 x i32>, i32)
26 declare <2 x i32> @llvm.umul.fix.sat.v2i32(<2 x i32>, <2 x i32>, i32)
29 ; CHECK-LABEL: @scalarize_sqrt_v2f32(
30 ; CHECK: %sqrt.i0 = call float @llvm.sqrt.f32(float %x.i0)
31 ; CHECK: %sqrt.i1 = call float @llvm.sqrt.f32(float %x.i1)
32 ; CHECK: %sqrt.upto0 = insertelement <2 x float> undef, float %sqrt.i0, i32 0
33 ; CHECK: %sqrt = insertelement <2 x float> %sqrt.upto0, float %sqrt.i1, i32 1
34 ; CHECK: ret <2 x float> %sqrt
35 define <2 x float> @scalarize_sqrt_v2f32(<2 x float> %x) #0 {
36   %sqrt = call <2 x float> @llvm.sqrt.v2f32(<2 x float> %x)
37   ret <2 x float> %sqrt
40 ; CHECK-LABEL: @scalarize_minnum_v2f32(
41 ; CHECK: %minnum.i0 = call float @llvm.minnum.f32(float %x.i0, float %y.i0)
42 ; CHECK: %minnum.i1 = call float @llvm.minnum.f32(float %x.i1, float %y.i1)
43 ; CHECK: %minnum.upto0 = insertelement <2 x float> undef, float %minnum.i0, i32 0
44 ; CHECK: %minnum = insertelement <2 x float> %minnum.upto0, float %minnum.i1, i32 1
45 ; CHECK: ret <2 x float> %minnum
46 define <2 x float> @scalarize_minnum_v2f32(<2 x float> %x, <2 x float> %y) #0 {
47   %minnum = call <2 x float> @llvm.minnum.v2f32(<2 x float> %x, <2 x float> %y)
48   ret <2 x float> %minnum
51 ; CHECK-LABEL: @scalarize_minimum_v2f32(
52 ; CHECK: %minimum.i0 = call float @llvm.minimum.f32(float %x.i0, float %y.i0)
53 ; CHECK: %minimum.i1 = call float @llvm.minimum.f32(float %x.i1, float %y.i1)
54 ; CHECK: %minimum.upto0 = insertelement <2 x float> undef, float %minimum.i0, i32 0
55 ; CHECK: %minimum = insertelement <2 x float> %minimum.upto0, float %minimum.i1, i32 1
56 ; CHECK: ret <2 x float> %minimum
57 define <2 x float> @scalarize_minimum_v2f32(<2 x float> %x, <2 x float> %y) #0 {
58   %minimum = call <2 x float> @llvm.minimum.v2f32(<2 x float> %x, <2 x float> %y)
59   ret <2 x float> %minimum
62 ; CHECK-LABEL: @scalarize_maximum_v2f32(
63 ; CHECK: %maximum.i0 = call float @llvm.maximum.f32(float %x.i0, float %y.i0)
64 ; CHECK: %maximum.i1 = call float @llvm.maximum.f32(float %x.i1, float %y.i1)
65 ; CHECK: %maximum.upto0 = insertelement <2 x float> undef, float %maximum.i0, i32 0
66 ; CHECK: %maximum = insertelement <2 x float> %maximum.upto0, float %maximum.i1, i32 1
67 ; CHECK: ret <2 x float> %maximum
68 define <2 x float> @scalarize_maximum_v2f32(<2 x float> %x, <2 x float> %y) #0 {
69   %maximum = call <2 x float> @llvm.maximum.v2f32(<2 x float> %x, <2 x float> %y)
70   ret <2 x float> %maximum
73 ; CHECK-LABEL: @scalarize_fma_v2f32(
74 ; CHECK: %fma.i0 = call float @llvm.fma.f32(float %x.i0, float %y.i0, float %z.i0)
75 ; CHECK: %fma.i1 = call float @llvm.fma.f32(float %x.i1, float %y.i1, float %z.i1)
76 ; CHECK: %fma.upto0 = insertelement <2 x float> undef, float %fma.i0, i32 0
77 ; CHECK: %fma = insertelement <2 x float> %fma.upto0, float %fma.i1, i32 1
78 ; CHECK: ret <2 x float> %fma
79 define <2 x float> @scalarize_fma_v2f32(<2 x float> %x, <2 x float> %y, <2 x float> %z) #0 {
80   %fma = call <2 x float> @llvm.fma.v2f32(<2 x float> %x, <2 x float> %y, <2 x float> %z)
81   ret <2 x float> %fma
84 ; CHECK-LABEL: @scalarize_bswap_v2i32(
85 ; CHECK: %bswap.i0 = call i32 @llvm.bswap.i32(i32 %x.i0)
86 ; CHECK: %bswap.i1 = call i32 @llvm.bswap.i32(i32 %x.i1)
87 ; CHECK: %bswap.upto0 = insertelement <2 x i32> undef, i32 %bswap.i0, i32 0
88 ; CHECK: %bswap = insertelement <2 x i32> %bswap.upto0, i32 %bswap.i1, i32 1
89 ; CHECK: ret <2 x i32> %bswap
90 define <2 x i32> @scalarize_bswap_v2i32(<2 x i32> %x) #0 {
91   %bswap = call <2 x i32> @llvm.bswap.v2i32(<2 x i32> %x)
92   ret <2 x i32> %bswap
95 ; CHECK-LABEL: @scalarize_ctlz_v2i32(
96 ; CHECK: %ctlz.i0 = call i32 @llvm.ctlz.i32(i32 %x.i0, i1 true)
97 ; CHECK: %ctlz.i1 = call i32 @llvm.ctlz.i32(i32 %x.i1, i1 true)
98 ; CHECK: %ctlz.upto0 = insertelement <2 x i32> undef, i32 %ctlz.i0, i32 0
99 ; CHECK: %ctlz = insertelement <2 x i32> %ctlz.upto0, i32 %ctlz.i1, i32 1
100 ; CHECK: ret <2 x i32> %ctlz
101 define <2 x i32> @scalarize_ctlz_v2i32(<2 x i32> %x) #0 {
102   %ctlz = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 true)
103   ret <2 x i32> %ctlz
106 ; CHECK-LABEL: @scalarize_powi_v2f32(
107 ; CHECK: %powi.i0 = call float @llvm.powi.f32(float %x.i0, i32 %y)
108 ; CHECK: %powi.i1 = call float @llvm.powi.f32(float %x.i1, i32 %y)
109 ; CHECK: %powi.upto0 = insertelement <2 x float> undef, float %powi.i0, i32 0
110 ; CHECK: %powi = insertelement <2 x float> %powi.upto0, float %powi.i1, i32 1
111 ; CHECK: ret <2 x float> %powi
112 define <2 x float> @scalarize_powi_v2f32(<2 x float> %x, i32 %y) #0 {
113   %powi = call <2 x float> @llvm.powi.v2f32(<2 x float> %x, i32 %y)
114   ret <2 x float> %powi
117 ; CHECK-LABEL: @scalarize_smul_fix_sat_v2i32(
118 ; CHECK: %smulfixsat.i0 = call i32 @llvm.smul.fix.sat.i32(i32 %x.i0, i32 5, i32 31)
119 ; CHECK: %smulfixsat.i1 = call i32 @llvm.smul.fix.sat.i32(i32 %x.i1, i32 19, i32 31)
120 ; CHECK: %smulfixsat.upto0 = insertelement <2 x i32> undef, i32 %smulfixsat.i0, i32 0
121 ; CHECK: %smulfixsat = insertelement <2 x i32> %smulfixsat.upto0, i32 %smulfixsat.i1, i32 1
122 ; CHECK: ret <2 x i32> %smulfixsat
123 define <2 x i32> @scalarize_smul_fix_sat_v2i32(<2 x i32> %x) #0 {
124   %smulfixsat = call <2 x i32> @llvm.smul.fix.sat.v2i32(<2 x i32> %x, <2 x i32> <i32 5, i32 19>, i32 31)
125   ret <2 x i32> %smulfixsat
128 ; CHECK-LABEL: @scalarize_umul_fix_sat_v2i32(
129 ; CHECK: %umulfixsat.i0 = call i32 @llvm.umul.fix.sat.i32(i32 %x.i0, i32 5, i32 31)
130 ; CHECK: %umulfixsat.i1 = call i32 @llvm.umul.fix.sat.i32(i32 %x.i1, i32 19, i32 31)
131 ; CHECK: %umulfixsat.upto0 = insertelement <2 x i32> undef, i32 %umulfixsat.i0, i32 0
132 ; CHECK: %umulfixsat = insertelement <2 x i32> %umulfixsat.upto0, i32 %umulfixsat.i1, i32 1
133 ; CHECK: ret <2 x i32> %umulfixsat
134 define <2 x i32> @scalarize_umul_fix_sat_v2i32(<2 x i32> %x) #0 {
135   %umulfixsat = call <2 x i32> @llvm.umul.fix.sat.v2i32(<2 x i32> %x, <2 x i32> <i32 5, i32 19>, i32 31)
136   ret <2 x i32> %umulfixsat