@@ -144,6 +144,40 @@ define i1 @and_orn_cmp_1_logical(i32 %a, i32 %b, i1 %y) {
144
144
ret i1 %and
145
145
}
146
146
147
+ define i1 @and_orn_cmp_1_partial_logical (i32 %a , i32 %b , i1 %y ) {
148
+ ; CHECK-LABEL: @and_orn_cmp_1_partial_logical(
149
+ ; CHECK-NEXT: [[X:%.*]] = icmp sgt i32 [[A:%.*]], [[B:%.*]]
150
+ ; CHECK-NEXT: [[X_INV:%.*]] = icmp sle i32 [[A]], [[B]]
151
+ ; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_INV]], [[Y:%.*]]
152
+ ; CHECK-NEXT: [[AND:%.*]] = select i1 [[X]], i1 [[OR]], i1 false
153
+ ; CHECK-NEXT: ret i1 [[AND]]
154
+ ;
155
+ %x = icmp sgt i32 %a , %b
156
+ %x_inv = icmp sle i32 %a , %b
157
+ %or = or i1 %x_inv , %y
158
+ %and = select i1 %x , i1 %or , i1 false
159
+ ret i1 %and
160
+ }
161
+
162
+ define i1 @and_orn_cmp_1_partial_logical_commute (i32 %a , i32 %b ) {
163
+ ; CHECK-LABEL: @and_orn_cmp_1_partial_logical_commute(
164
+ ; CHECK-NEXT: [[Y:%.*]] = call i1 @gen1()
165
+ ; CHECK-NEXT: [[X:%.*]] = icmp sgt i32 [[A:%.*]], [[B:%.*]]
166
+ ; CHECK-NEXT: [[X_INV:%.*]] = icmp sle i32 [[A]], [[B]]
167
+ ; CHECK-NEXT: [[OR:%.*]] = or i1 [[Y]], [[X_INV]]
168
+ ; CHECK-NEXT: [[AND:%.*]] = select i1 [[X]], i1 [[OR]], i1 false
169
+ ; CHECK-NEXT: ret i1 [[AND]]
170
+ ;
171
+ %y = call i1 @gen1 () ; thwart complexity-based canonicalization
172
+ %x = icmp sgt i32 %a , %b
173
+ %x_inv = icmp sle i32 %a , %b
174
+ %or = or i1 %y , %x_inv
175
+ %and = select i1 %x , i1 %or , i1 false
176
+ ret i1 %and
177
+ }
178
+
179
+ ; TODO: This does not require poison-safe (select) logical-and.
180
+
147
181
define i1 @andn_or_cmp_2_logical (i16 %a , i16 %b , i1 %y ) {
148
182
; CHECK-LABEL: @andn_or_cmp_2_logical(
149
183
; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
@@ -157,6 +191,47 @@ define i1 @andn_or_cmp_2_logical(i16 %a, i16 %b, i1 %y) {
157
191
ret i1 %and
158
192
}
159
193
194
+ define i1 @andn_or_cmp_2_partial_logical (i16 %a , i16 %b , i1 %y ) {
195
+ ; CHECK-LABEL: @andn_or_cmp_2_partial_logical(
196
+ ; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
197
+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_INV]], [[Y:%.*]]
198
+ ; CHECK-NEXT: ret i1 [[AND]]
199
+ ;
200
+ %x = icmp sge i16 %a , %b
201
+ %x_inv = icmp slt i16 %a , %b
202
+ %or = or i1 %x , %y
203
+ %and = select i1 %or , i1 %x_inv , i1 false
204
+ ret i1 %and
205
+ }
206
+
207
+ define i1 @andn_or_cmp_2_partial_logical_commute (i16 %a , i16 %b ) {
208
+ ; CHECK-LABEL: @andn_or_cmp_2_partial_logical_commute(
209
+ ; CHECK-NEXT: [[Y:%.*]] = call i1 @gen1()
210
+ ; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
211
+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[Y]], [[X_INV]]
212
+ ; CHECK-NEXT: ret i1 [[AND]]
213
+ ;
214
+ %y = call i1 @gen1 () ; thwart complexity-based canonicalization
215
+ %x = icmp sge i16 %a , %b
216
+ %x_inv = icmp slt i16 %a , %b
217
+ %or = or i1 %y , %x
218
+ %and = select i1 %or , i1 %x_inv , i1 false
219
+ ret i1 %and
220
+ }
221
+
222
+ define <2 x i1 > @not_logical_or2 (i1 %b , <2 x i32 > %a ) {
223
+ ; CHECK-LABEL: @not_logical_or2(
224
+ ; CHECK-NEXT: [[COND:%.*]] = icmp ult <2 x i32> [[A:%.*]], <i32 3, i32 3>
225
+ ; CHECK-NEXT: [[AND:%.*]] = select i1 [[B:%.*]], <2 x i1> [[COND]], <2 x i1> zeroinitializer
226
+ ; CHECK-NEXT: ret <2 x i1> [[AND]]
227
+ ;
228
+ %cond = icmp ult <2 x i32 > %a , <i32 3 , i32 3 >
229
+ %implied = icmp slt <2 x i32 > %a , <i32 -1 , i32 -1 >
230
+ %or = select i1 %b , <2 x i1 > <i1 true , i1 true >, <2 x i1 > %implied
231
+ %and = select <2 x i1 > %or , <2 x i1 > %cond , <2 x i1 > zeroinitializer
232
+ ret <2 x i1 > %and
233
+ }
234
+
160
235
define i1 @bools_logical_commute0 (i1 %a , i1 %b , i1 %c ) {
161
236
; CHECK-LABEL: @bools_logical_commute0(
162
237
; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[B:%.*]], i1 [[A:%.*]]
@@ -589,6 +664,23 @@ define i1 @orn_and_cmp_1_logical(i37 %a, i37 %b, i1 %y) {
589
664
ret i1 %or
590
665
}
591
666
667
+ define i1 @orn_and_cmp_1_partial_logical (i37 %a , i37 %b , i1 %y ) {
668
+ ; CHECK-LABEL: @orn_and_cmp_1_partial_logical(
669
+ ; CHECK-NEXT: [[X:%.*]] = icmp sgt i37 [[A:%.*]], [[B:%.*]]
670
+ ; CHECK-NEXT: [[X_INV:%.*]] = icmp sle i37 [[A]], [[B]]
671
+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[X]], [[Y:%.*]]
672
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[X_INV]], i1 true, i1 [[AND]]
673
+ ; CHECK-NEXT: ret i1 [[OR]]
674
+ ;
675
+ %x = icmp sgt i37 %a , %b
676
+ %x_inv = icmp sle i37 %a , %b
677
+ %and = and i1 %y , %x
678
+ %or = select i1 %x_inv , i1 true , i1 %and
679
+ ret i1 %or
680
+ }
681
+
682
+ ; TODO: This does not require poison-safe (select) logical-or.
683
+
592
684
define i1 @orn_and_cmp_2_logical (i16 %a , i16 %b , i1 %y ) {
593
685
; CHECK-LABEL: @orn_and_cmp_2_logical(
594
686
; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
@@ -601,3 +693,16 @@ define i1 @orn_and_cmp_2_logical(i16 %a, i16 %b, i1 %y) {
601
693
%or = select i1 %and , i1 true , i1 %x_inv
602
694
ret i1 %or
603
695
}
696
+
697
+ define i1 @orn_and_cmp_2_partial_logical (i16 %a , i16 %b , i1 %y ) {
698
+ ; CHECK-LABEL: @orn_and_cmp_2_partial_logical(
699
+ ; CHECK-NEXT: [[X_INV:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]]
700
+ ; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_INV]], [[Y:%.*]]
701
+ ; CHECK-NEXT: ret i1 [[OR]]
702
+ ;
703
+ %x = icmp sge i16 %a , %b
704
+ %x_inv = icmp slt i16 %a , %b
705
+ %and = and i1 %y , %x
706
+ %or = select i1 %and , i1 true , i1 %x_inv
707
+ ret i1 %or
708
+ }
0 commit comments