1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4; This is related to https://bugs.llvm.org/show_bug.cgi?id=36682
5
6; All of these can be simplified to a constant true or false value.
7;   * slt i32 %b, 0  -> false
8;   * sgt i32 %b, -1 -> true
9
10define i1 @i32_cast_cmp_slt_int_0_uitofp_float(i32 %i) {
11; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_float(
12; CHECK-NEXT:    ret i1 false
13;
14  %f = uitofp i32 %i to float
15  %b = bitcast float %f to i32
16  %cmp = icmp slt i32 %b, 0
17  ret i1 %cmp
18}
19
20define <2 x i1> @i32_cast_cmp_slt_int_0_uitofp_float_vec(<2 x i32> %i) {
21; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_float_vec(
22; CHECK-NEXT:    ret <2 x i1> zeroinitializer
23;
24  %f = uitofp <2 x i32> %i to <2 x float>
25  %b = bitcast <2 x float> %f to <2 x i32>
26  %cmp = icmp slt <2 x i32> %b, <i32 0, i32 0>
27  ret <2 x i1> %cmp
28}
29
30define <3 x i1> @i32_cast_cmp_slt_int_0_uitofp_float_vec_undef(<3 x i32> %i) {
31; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_float_vec_undef(
32; CHECK-NEXT:    ret <3 x i1> zeroinitializer
33;
34  %f = uitofp <3 x i32> %i to <3 x float>
35  %b = bitcast <3 x float> %f to <3 x i32>
36  %cmp = icmp slt <3 x i32> %b, <i32 0, i32 undef, i32 0>
37  ret <3 x i1> %cmp
38}
39
40define i1 @i32_cast_cmp_sgt_int_m1_uitofp_float(i32 %i) {
41; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_float(
42; CHECK-NEXT:    ret i1 true
43;
44  %f = uitofp i32 %i to float
45  %b = bitcast float %f to i32
46  %cmp = icmp sgt i32 %b, -1
47  ret i1 %cmp
48}
49
50define <2 x i1> @i32_cast_cmp_sgt_int_m1_uitofp_float_vec(<2 x i32> %i) {
51; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_float_vec(
52; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
53;
54  %f = uitofp <2 x i32> %i to <2 x float>
55  %b = bitcast <2 x float> %f to <2 x i32>
56  %cmp = icmp sgt <2 x i32> %b, <i32 -1, i32 -1>
57  ret <2 x i1> %cmp
58}
59
60define <3 x i1> @i32_cast_cmp_sgt_int_m1_uitofp_float_vec_undef(<3 x i32> %i) {
61; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_float_vec_undef(
62; CHECK-NEXT:    ret <3 x i1> <i1 true, i1 true, i1 true>
63;
64  %f = uitofp <3 x i32> %i to <3 x float>
65  %b = bitcast <3 x float> %f to <3 x i32>
66  %cmp = icmp sgt <3 x i32> %b, <i32 -1, i32 undef, i32 -1>
67  ret <3 x i1> %cmp
68}
69
70define i1 @i32_cast_cmp_slt_int_0_uitofp_double(i32 %i) {
71; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_double(
72; CHECK-NEXT:    ret i1 false
73;
74  %f = uitofp i32 %i to double
75  %b = bitcast double %f to i64
76  %cmp = icmp slt i64 %b, 0
77  ret i1 %cmp
78}
79
80define <2 x i1> @i32_cast_cmp_slt_int_0_uitofp_double_vec(<2 x i32> %i) {
81; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_double_vec(
82; CHECK-NEXT:    ret <2 x i1> zeroinitializer
83;
84  %f = uitofp <2 x i32> %i to <2 x double>
85  %b = bitcast <2 x double> %f to <2 x i64>
86  %cmp = icmp slt <2 x i64> %b, <i64 0, i64 0>
87  ret <2 x i1> %cmp
88}
89
90define <3 x i1> @i32_cast_cmp_slt_int_0_uitofp_double_vec_undef(<3 x i32> %i) {
91; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_double_vec_undef(
92; CHECK-NEXT:    ret <3 x i1> zeroinitializer
93;
94  %f = uitofp <3 x i32> %i to <3 x double>
95  %b = bitcast <3 x double> %f to <3 x i64>
96  %cmp = icmp slt <3 x i64> %b, <i64 0, i64 undef, i64 0>
97  ret <3 x i1> %cmp
98}
99
100define i1 @i32_cast_cmp_sgt_int_m1_uitofp_double(i32 %i) {
101; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_double(
102; CHECK-NEXT:    ret i1 true
103;
104  %f = uitofp i32 %i to double
105  %b = bitcast double %f to i64
106  %cmp = icmp sgt i64 %b, -1
107  ret i1 %cmp
108}
109
110define <2 x i1> @i32_cast_cmp_sgt_int_m1_uitofp_double_vec(<2 x i32> %i) {
111; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_double_vec(
112; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
113;
114  %f = uitofp <2 x i32> %i to <2 x double>
115  %b = bitcast <2 x double> %f to <2 x i64>
116  %cmp = icmp sgt <2 x i64> %b, <i64 -1, i64 -1>
117  ret <2 x i1> %cmp
118}
119
120define <3 x i1> @i32_cast_cmp_sgt_int_m1_uitofp_double_vec_undef(<3 x i32> %i) {
121; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_double_vec_undef(
122; CHECK-NEXT:    ret <3 x i1> <i1 true, i1 true, i1 true>
123;
124  %f = uitofp <3 x i32> %i to <3 x double>
125  %b = bitcast <3 x double> %f to <3 x i64>
126  %cmp = icmp sgt <3 x i64> %b, <i64 -1, i64 undef, i64 -1>
127  ret <3 x i1> %cmp
128}
129
130define i1 @i32_cast_cmp_slt_int_0_uitofp_half(i32 %i) {
131; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_half(
132; CHECK-NEXT:    ret i1 false
133;
134  %f = uitofp i32 %i to half
135  %b = bitcast half %f to i16
136  %cmp = icmp slt i16 %b, 0
137  ret i1 %cmp
138}
139
140define <2 x i1> @i32_cast_cmp_slt_int_0_uitofp_half_vec(<2 x i32> %i) {
141; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_half_vec(
142; CHECK-NEXT:    ret <2 x i1> zeroinitializer
143;
144  %f = uitofp <2 x i32> %i to <2 x half>
145  %b = bitcast <2 x half> %f to <2 x i16>
146  %cmp = icmp slt <2 x i16> %b, <i16 0, i16 0>
147  ret <2 x i1> %cmp
148}
149
150define <3 x i1> @i32_cast_cmp_slt_int_0_uitofp_half_vec_undef(<3 x i32> %i) {
151; CHECK-LABEL: @i32_cast_cmp_slt_int_0_uitofp_half_vec_undef(
152; CHECK-NEXT:    ret <3 x i1> zeroinitializer
153;
154  %f = uitofp <3 x i32> %i to <3 x half>
155  %b = bitcast <3 x half> %f to <3 x i16>
156  %cmp = icmp slt <3 x i16> %b, <i16 0, i16 undef, i16 0>
157  ret <3 x i1> %cmp
158}
159
160define i1 @i32_cast_cmp_sgt_int_m1_uitofp_half(i32 %i) {
161; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_half(
162; CHECK-NEXT:    ret i1 true
163;
164  %f = uitofp i32 %i to half
165  %b = bitcast half %f to i16
166  %cmp = icmp sgt i16 %b, -1
167  ret i1 %cmp
168}
169
170define <2 x i1> @i32_cast_cmp_sgt_int_m1_uitofp_half_vec(<2 x i32> %i) {
171; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_half_vec(
172; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
173;
174  %f = uitofp <2 x i32> %i to <2 x half>
175  %b = bitcast <2 x half> %f to <2 x i16>
176  %cmp = icmp sgt <2 x i16> %b, <i16 -1, i16 -1>
177  ret <2 x i1> %cmp
178}
179
180define <3 x i1> @i32_cast_cmp_sgt_int_m1_uitofp_half_vec_undef(<3 x i32> %i) {
181; CHECK-LABEL: @i32_cast_cmp_sgt_int_m1_uitofp_half_vec_undef(
182; CHECK-NEXT:    ret <3 x i1> <i1 true, i1 true, i1 true>
183;
184  %f = uitofp <3 x i32> %i to <3 x half>
185  %b = bitcast <3 x half> %f to <3 x i16>
186  %cmp = icmp sgt <3 x i16> %b, <i16 -1, i16 undef, i16 -1>
187  ret <3 x i1> %cmp
188}
189