1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4; Test all integer predicates with bool types and true/false constants.
5; Use vectors to provide test coverage that is not duplicated in other folds.
6
7define <2 x i1> @eq_t(<2 x i1> %a) {
8; CHECK-LABEL: @eq_t(
9; CHECK-NEXT:    ret <2 x i1> %a
10;
11  %r = icmp eq <2 x i1> %a, <i1 true, i1 true>
12  ret <2 x i1> %r
13}
14
15define <2 x i1> @eq_t_undef_elt(<2 x i1> %a) {
16; CHECK-LABEL: @eq_t_undef_elt(
17; CHECK-NEXT:    ret <2 x i1> [[A:%.*]]
18;
19  %r = icmp eq <2 x i1> %a, <i1 undef, i1 true>
20  ret <2 x i1> %r
21}
22
23define <2 x i1> @eq_f(<2 x i1> %a) {
24; CHECK-LABEL: @eq_f(
25; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i1> %a, zeroinitializer
26; CHECK-NEXT:    ret <2 x i1> [[R]]
27;
28  %r = icmp eq <2 x i1> %a, <i1 false, i1 false>
29  ret <2 x i1> %r
30}
31
32define <2 x i1> @ne_t(<2 x i1> %a) {
33; CHECK-LABEL: @ne_t(
34; CHECK-NEXT:    [[R:%.*]] = icmp ne <2 x i1> %a, <i1 true, i1 true>
35; CHECK-NEXT:    ret <2 x i1> [[R]]
36;
37  %r = icmp ne <2 x i1> %a, <i1 true, i1 true>
38  ret <2 x i1> %r
39}
40
41define <2 x i1> @ne_f(<2 x i1> %a) {
42; CHECK-LABEL: @ne_f(
43; CHECK-NEXT:    ret <2 x i1> %a
44;
45  %r = icmp ne <2 x i1> %a, <i1 false, i1 false>
46  ret <2 x i1> %r
47}
48
49define <2 x i1> @ugt_t(<2 x i1> %a) {
50; CHECK-LABEL: @ugt_t(
51; CHECK-NEXT:    ret <2 x i1> zeroinitializer
52;
53  %r = icmp ugt <2 x i1> %a, <i1 true, i1 true>
54  ret <2 x i1> %r
55}
56
57define <2 x i1> @ugt_t_undef_elt(<2 x i1> %a) {
58; CHECK-LABEL: @ugt_t_undef_elt(
59; CHECK-NEXT:    ret <2 x i1> zeroinitializer
60;
61  %r = icmp ugt <2 x i1> %a, <i1 true, i1 undef>
62  ret <2 x i1> %r
63}
64
65define <2 x i1> @ugt_f(<2 x i1> %a) {
66; CHECK-LABEL: @ugt_f(
67; CHECK-NEXT:    ret <2 x i1> %a
68;
69  %r = icmp ugt <2 x i1> %a, <i1 false, i1 false>
70  ret <2 x i1> %r
71}
72
73define <2 x i1> @ult_t(<2 x i1> %a) {
74; CHECK-LABEL: @ult_t(
75; CHECK-NEXT:    [[R:%.*]] = icmp ult <2 x i1> %a, <i1 true, i1 true>
76; CHECK-NEXT:    ret <2 x i1> [[R]]
77;
78  %r = icmp ult <2 x i1> %a, <i1 true, i1 true>
79  ret <2 x i1> %r
80}
81
82define <2 x i1> @ult_f(<2 x i1> %a) {
83; CHECK-LABEL: @ult_f(
84; CHECK-NEXT:    ret <2 x i1> zeroinitializer
85;
86  %r = icmp ult <2 x i1> %a, <i1 false, i1 false>
87  ret <2 x i1> %r
88}
89
90define <2 x i1> @sgt_t(<2 x i1> %a) {
91; CHECK-LABEL: @sgt_t(
92; CHECK-NEXT:    [[R:%.*]] = icmp sgt <2 x i1> %a, <i1 true, i1 true>
93; CHECK-NEXT:    ret <2 x i1> [[R]]
94;
95  %r = icmp sgt <2 x i1> %a, <i1 true, i1 true>
96  ret <2 x i1> %r
97}
98
99define <2 x i1> @sgt_f(<2 x i1> %a) {
100; CHECK-LABEL: @sgt_f(
101; CHECK-NEXT:    ret <2 x i1> zeroinitializer
102;
103  %r = icmp sgt <2 x i1> %a, <i1 false, i1 false>
104  ret <2 x i1> %r
105}
106
107define <2 x i1> @slt_t(<2 x i1> %a) {
108; CHECK-LABEL: @slt_t(
109; CHECK-NEXT:    ret <2 x i1> zeroinitializer
110;
111  %r = icmp slt <2 x i1> %a, <i1 true, i1 true>
112  ret <2 x i1> %r
113}
114
115define <2 x i1> @slt_f(<2 x i1> %a) {
116; CHECK-LABEL: @slt_f(
117; CHECK-NEXT:    ret <2 x i1> %a
118;
119  %r = icmp slt <2 x i1> %a, <i1 false, i1 false>
120  ret <2 x i1> %r
121}
122
123define <2 x i1> @uge_t(<2 x i1> %a) {
124; CHECK-LABEL: @uge_t(
125; CHECK-NEXT:    ret <2 x i1> %a
126;
127  %r = icmp uge <2 x i1> %a, <i1 true, i1 true>
128  ret <2 x i1> %r
129}
130
131define <2 x i1> @uge_f(<2 x i1> %a) {
132; CHECK-LABEL: @uge_f(
133; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
134;
135  %r = icmp uge <2 x i1> %a, <i1 false, i1 false>
136  ret <2 x i1> %r
137}
138
139define <2 x i1> @ule_t(<2 x i1> %a) {
140; CHECK-LABEL: @ule_t(
141; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
142;
143  %r = icmp ule <2 x i1> %a, <i1 true, i1 true>
144  ret <2 x i1> %r
145}
146
147define <2 x i1> @ule_f(<2 x i1> %a) {
148; CHECK-LABEL: @ule_f(
149; CHECK-NEXT:    [[R:%.*]] = icmp ule <2 x i1> %a, zeroinitializer
150; CHECK-NEXT:    ret <2 x i1> [[R]]
151;
152  %r = icmp ule <2 x i1> %a, <i1 false, i1 false>
153  ret <2 x i1> %r
154}
155
156define <2 x i1> @sge_t(<2 x i1> %a) {
157; CHECK-LABEL: @sge_t(
158; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
159;
160  %r = icmp sge <2 x i1> %a, <i1 true, i1 true>
161  ret <2 x i1> %r
162}
163
164define <2 x i1> @sge_t_undef_elt(<2 x i1> %a) {
165; CHECK-LABEL: @sge_t_undef_elt(
166; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
167;
168  %r = icmp sge <2 x i1> %a, <i1 true, i1 undef>
169  ret <2 x i1> %r
170}
171
172define <2 x i1> @sge_f(<2 x i1> %a) {
173; CHECK-LABEL: @sge_f(
174; CHECK-NEXT:    [[R:%.*]] = icmp sge <2 x i1> %a, zeroinitializer
175; CHECK-NEXT:    ret <2 x i1> [[R]]
176;
177  %r = icmp sge <2 x i1> %a, <i1 false, i1 false>
178  ret <2 x i1> %r
179}
180
181define <2 x i1> @sle_t(<2 x i1> %a) {
182; CHECK-LABEL: @sle_t(
183; CHECK-NEXT:    ret <2 x i1> %a
184;
185  %r = icmp sle <2 x i1> %a, <i1 true, i1 true>
186  ret <2 x i1> %r
187}
188
189define <2 x i1> @sle_f(<2 x i1> %a) {
190; CHECK-LABEL: @sle_f(
191; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
192;
193  %r = icmp sle <2 x i1> %a, <i1 false, i1 false>
194  ret <2 x i1> %r
195}
196
197