@@ -222,6 +222,23 @@ define i8 @ucmp_from_select_lt(i32 %x, i32 %y) {
222
222
ret i8 %r
223
223
}
224
224
225
+ ; Fold (x u< y) ? -1 : zext(x u> y) into ucmp(x, y)
226
+ define i8 @ucmp_from_select_lt_and_gt (i32 %x , i32 %y ) {
227
+ ; CHECK-LABEL: define i8 @ucmp_from_select_lt_and_gt(
228
+ ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
229
+ ; CHECK-NEXT: [[GT_BOOL:%.*]] = icmp ugt i32 [[X]], [[Y]]
230
+ ; CHECK-NEXT: [[GT:%.*]] = zext i1 [[GT_BOOL]] to i8
231
+ ; CHECK-NEXT: [[LT:%.*]] = icmp ult i32 [[X]], [[Y]]
232
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[LT]], i8 -1, i8 [[GT]]
233
+ ; CHECK-NEXT: ret i8 [[R]]
234
+ ;
235
+ %gt_bool = icmp ugt i32 %x , %y
236
+ %gt = zext i1 %gt_bool to i8
237
+ %lt = icmp ult i32 %x , %y
238
+ %r = select i1 %lt , i8 -1 , i8 %gt
239
+ ret i8 %r
240
+ }
241
+
225
242
; Vector version
226
243
define <4 x i8 > @ucmp_from_select_vec_lt (<4 x i32 > %x , <4 x i32 > %y ) {
227
244
; CHECK-LABEL: define <4 x i8> @ucmp_from_select_vec_lt(
@@ -513,3 +530,20 @@ define i8 @ucmp_from_select_ge_neg4(i32 %x, i32 %y) {
513
530
%r = select i1 %ge , i8 %ne , i8 3
514
531
ret i8 %r
515
532
}
533
+
534
+ ; Fold (x > y) ? 1 : sext(x < y)
535
+ define i8 @ucmp_from_select_gt_and_lt (i32 %x , i32 %y ) {
536
+ ; CHECK-LABEL: define i8 @ucmp_from_select_gt_and_lt(
537
+ ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
538
+ ; CHECK-NEXT: [[LT_BOOL:%.*]] = icmp ult i32 [[X]], [[Y]]
539
+ ; CHECK-NEXT: [[LT:%.*]] = sext i1 [[LT_BOOL]] to i8
540
+ ; CHECK-NEXT: [[GT:%.*]] = icmp ugt i32 [[X]], [[Y]]
541
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[GT]], i8 1, i8 [[LT]]
542
+ ; CHECK-NEXT: ret i8 [[R]]
543
+ ;
544
+ %lt_bool = icmp ult i32 %x , %y
545
+ %lt = sext i1 %lt_bool to i8
546
+ %gt = icmp ugt i32 %x , %y
547
+ %r = select i1 %gt , i8 1 , i8 %lt
548
+ ret i8 %r
549
+ }
0 commit comments