xref: /llvm-project/llvm/test/Transforms/AggressiveInstCombine/X86/fptosisat.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=aggressive-instcombine -mtriple x86_64-none-eabi -mattr=avx2 -S | FileCheck %s
3
4define i64 @f32_i32(float %in) {
5; CHECK-LABEL: @f32_i32(
6; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[IN:%.*]] to i64
7; CHECK-NEXT:    [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647)
8; CHECK-NEXT:    [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648)
9; CHECK-NEXT:    ret i64 [[MAX]]
10;
11  %conv = fptosi float %in to i64
12  %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)
13  %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648)
14  ret i64 %max
15}
16
17define i64 @f32_i31(float %in) {
18; CHECK-LABEL: @f32_i31(
19; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[IN:%.*]] to i64
20; CHECK-NEXT:    [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823)
21; CHECK-NEXT:    [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824)
22; CHECK-NEXT:    ret i64 [[MAX]]
23;
24  %conv = fptosi float %in to i64
25  %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823)
26  %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824)
27  ret i64 %max
28}
29
30define i32 @f32_i16(float %in) {
31; CHECK-LABEL: @f32_i16(
32; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[IN:%.*]] to i32
33; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767)
34; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768)
35; CHECK-NEXT:    ret i32 [[MAX]]
36;
37  %conv = fptosi float %in to i32
38  %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767)
39  %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768)
40  ret i32 %max
41}
42
43define i32 @f32_i8(float %in) {
44; CHECK-LABEL: @f32_i8(
45; CHECK-NEXT:    [[CONV:%.*]] = fptosi float [[IN:%.*]] to i32
46; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 127)
47; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -128)
48; CHECK-NEXT:    ret i32 [[MAX]]
49;
50  %conv = fptosi float %in to i32
51  %min = call i32 @llvm.smin.i32(i32 %conv, i32 127)
52  %max = call i32 @llvm.smax.i32(i32 %min, i32 -128)
53  ret i32 %max
54}
55
56define i64 @f64_i32(double %in) {
57; CHECK-LABEL: @f64_i32(
58; CHECK-NEXT:    [[CONV:%.*]] = fptosi double [[IN:%.*]] to i64
59; CHECK-NEXT:    [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647)
60; CHECK-NEXT:    [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648)
61; CHECK-NEXT:    ret i64 [[MAX]]
62;
63  %conv = fptosi double %in to i64
64  %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)
65  %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648)
66  ret i64 %max
67}
68
69define i64 @f64_i31(double %in) {
70; CHECK-LABEL: @f64_i31(
71; CHECK-NEXT:    [[CONV:%.*]] = fptosi double [[IN:%.*]] to i64
72; CHECK-NEXT:    [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823)
73; CHECK-NEXT:    [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824)
74; CHECK-NEXT:    ret i64 [[MAX]]
75;
76  %conv = fptosi double %in to i64
77  %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823)
78  %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824)
79  ret i64 %max
80}
81
82define i32 @f64_i16(double %in) {
83; CHECK-LABEL: @f64_i16(
84; CHECK-NEXT:    [[CONV:%.*]] = fptosi double [[IN:%.*]] to i32
85; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767)
86; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768)
87; CHECK-NEXT:    ret i32 [[MAX]]
88;
89  %conv = fptosi double %in to i32
90  %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767)
91  %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768)
92  ret i32 %max
93}
94
95define i64 @f16_i32(half %in) {
96; CHECK-LABEL: @f16_i32(
97; CHECK-NEXT:    [[CONV:%.*]] = fptosi half [[IN:%.*]] to i64
98; CHECK-NEXT:    [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 2147483647)
99; CHECK-NEXT:    [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -2147483648)
100; CHECK-NEXT:    ret i64 [[MAX]]
101;
102  %conv = fptosi half %in to i64
103  %min = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)
104  %max = call i64 @llvm.smax.i64(i64 %min, i64 -2147483648)
105  ret i64 %max
106}
107
108define i64 @f16_i31(half %in) {
109; CHECK-LABEL: @f16_i31(
110; CHECK-NEXT:    [[CONV:%.*]] = fptosi half [[IN:%.*]] to i64
111; CHECK-NEXT:    [[MIN:%.*]] = call i64 @llvm.smin.i64(i64 [[CONV]], i64 1073741823)
112; CHECK-NEXT:    [[MAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MIN]], i64 -1073741824)
113; CHECK-NEXT:    ret i64 [[MAX]]
114;
115  %conv = fptosi half %in to i64
116  %min = call i64 @llvm.smin.i64(i64 %conv, i64 1073741823)
117  %max = call i64 @llvm.smax.i64(i64 %min, i64 -1073741824)
118  ret i64 %max
119}
120
121define i32 @f16_i16(half %in) {
122; CHECK-LABEL: @f16_i16(
123; CHECK-NEXT:    [[CONV:%.*]] = fptosi half [[IN:%.*]] to i32
124; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 32767)
125; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -32768)
126; CHECK-NEXT:    ret i32 [[MAX]]
127;
128  %conv = fptosi half %in to i32
129  %min = call i32 @llvm.smin.i32(i32 %conv, i32 32767)
130  %max = call i32 @llvm.smax.i32(i32 %min, i32 -32768)
131  ret i32 %max
132}
133
134define i32 @f16_i8(half %in) {
135; CHECK-LABEL: @f16_i8(
136; CHECK-NEXT:    [[CONV:%.*]] = fptosi half [[IN:%.*]] to i32
137; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.smin.i32(i32 [[CONV]], i32 127)
138; CHECK-NEXT:    [[MAX:%.*]] = call i32 @llvm.smax.i32(i32 [[MIN]], i32 -128)
139; CHECK-NEXT:    ret i32 [[MAX]]
140;
141  %conv = fptosi half %in to i32
142  %min = call i32 @llvm.smin.i32(i32 %conv, i32 127)
143  %max = call i32 @llvm.smax.i32(i32 %min, i32 -128)
144  ret i32 %max
145}
146
147define <4 x i64> @v4f32_i32(<4 x float> %in) {
148; CHECK-LABEL: @v4f32_i32(
149; CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f32(<4 x float> [[IN:%.*]])
150; CHECK-NEXT:    [[TMP2:%.*]] = sext <4 x i32> [[TMP1]] to <4 x i64>
151; CHECK-NEXT:    ret <4 x i64> [[TMP2]]
152;
153  %conv = fptosi <4 x float> %in to <4 x i64>
154  %min = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)
155  %max = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %min, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)
156  ret <4 x i64> %max
157}
158
159define <8 x i32> @v8f16_i16(<8 x half> %in) {
160; CHECK-LABEL: @v8f16_i16(
161; CHECK-NEXT:    [[CONV:%.*]] = fptosi <8 x half> [[IN:%.*]] to <8 x i32>
162; CHECK-NEXT:    [[MIN:%.*]] = call <8 x i32> @llvm.smin.v8i32(<8 x i32> [[CONV]], <8 x i32> splat (i32 32767))
163; CHECK-NEXT:    [[MAX:%.*]] = call <8 x i32> @llvm.smax.v8i32(<8 x i32> [[MIN]], <8 x i32> splat (i32 -32768))
164; CHECK-NEXT:    ret <8 x i32> [[MAX]]
165;
166  %conv = fptosi <8 x half> %in to <8 x i32>
167  %min = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>)
168  %max = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %min, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>)
169  ret <8 x i32> %max
170}
171
172
173declare i64 @llvm.smin.i64(i64, i64)
174declare i64 @llvm.smax.i64(i64, i64)
175declare i32 @llvm.smin.i32(i32, i32)
176declare i32 @llvm.smax.i32(i32, i32)
177declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>)
178declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>)
179declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)
180declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)
181declare <8 x i64> @llvm.smin.v8i64(<8 x i64>, <8 x i64>)
182declare <8 x i64> @llvm.smax.v8i64(<8 x i64>, <8 x i64>)
183declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)
184declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>)
185declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)
186declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)
187