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