@@ -436,6 +436,107 @@ define <3 x i2> @scmp_unary_shuffle_ops(<3 x i8> %x, <3 x i8> %y) {
436436 ret <3 x i2 > %r
437437}
438438
439+ define i32 @scmp_ashr (i32 %a ) {
440+ ; CHECK-LABEL: define i32 @scmp_ashr(
441+ ; CHECK-SAME: i32 [[A:%.*]]) {
442+ ; CHECK-NEXT: [[A_LOBIT:%.*]] = ashr i32 [[A]], 31
443+ ; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt i32 [[A]], 1
444+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP_INV]], i32 [[A_LOBIT]], i32 1
445+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
446+ ;
447+ %a.lobit = ashr i32 %a , 31
448+ %cmp.inv = icmp slt i32 %a , 1
449+ %retval.0 = select i1 %cmp.inv , i32 %a.lobit , i32 1
450+ ret i32 %retval.0
451+ }
452+
453+ define i32 @scmp_sgt_slt (i32 %a ) {
454+ ; CHECK-LABEL: define i32 @scmp_sgt_slt(
455+ ; CHECK-SAME: i32 [[A:%.*]]) {
456+ ; CHECK-NEXT: [[A_LOBIT:%.*]] = ashr i32 [[A]], 31
457+ ; CHECK-NEXT: [[CMP_INV:%.*]] = icmp slt i32 [[A]], 1
458+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP_INV]], i32 [[A_LOBIT]], i32 1
459+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
460+ ;
461+ %cmp = icmp sgt i32 %a , 0
462+ %cmp1 = icmp slt i32 %a , 0
463+ %. = select i1 %cmp1 , i32 -1 , i32 0
464+ %retval.0 = select i1 %cmp , i32 1 , i32 %.
465+ ret i32 %retval.0
466+ }
467+
468+ define i32 @scmp_zero_slt (i32 %a ) {
469+ ; CHECK-LABEL: define i32 @scmp_zero_slt(
470+ ; CHECK-SAME: i32 [[A:%.*]]) {
471+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A]], 0
472+ ; CHECK-NEXT: [[CMP1_INV:%.*]] = icmp slt i32 [[A]], 1
473+ ; CHECK-NEXT: [[DOT:%.*]] = select i1 [[CMP1_INV]], i32 -1, i32 1
474+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i32 0, i32 [[DOT]]
475+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
476+ ;
477+ %cmp = icmp eq i32 %a , 0
478+ %cmp1.inv = icmp slt i32 %a , 1
479+ %. = select i1 %cmp1.inv , i32 -1 , i32 1
480+ %retval.0 = select i1 %cmp , i32 0 , i32 %.
481+ ret i32 %retval.0
482+ }
483+
484+ define i32 @scmp_zero_sgt (i32 %a ) {
485+ ; CHECK-LABEL: define i32 @scmp_zero_sgt(
486+ ; CHECK-SAME: i32 [[A:%.*]]) {
487+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A]], 0
488+ ; CHECK-NEXT: [[CMP1_INV:%.*]] = icmp sgt i32 [[A]], -1
489+ ; CHECK-NEXT: [[DOT:%.*]] = select i1 [[CMP1_INV]], i32 1, i32 -1
490+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], i32 0, i32 [[DOT]]
491+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
492+ ;
493+ %cmp = icmp eq i32 %a , 0
494+ %cmp1.inv = icmp sgt i32 %a , -1
495+ %. = select i1 %cmp1.inv , i32 1 , i32 -1
496+ %retval.0 = select i1 %cmp , i32 0 , i32 %.
497+ ret i32 %retval.0
498+ }
499+
500+
501+ define i32 @scmp_sgt_slt_ab (i32 %a , i32 %b ) {
502+ ; CHECK-LABEL: define i32 @scmp_sgt_slt_ab(
503+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
504+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[A]], i32 [[B]])
505+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
506+ ;
507+ %cmp = icmp sgt i32 %a , %b
508+ %cmp1 = icmp slt i32 %a , %b
509+ %. = select i1 %cmp1 , i32 -1 , i32 0
510+ %retval.0 = select i1 %cmp , i32 1 , i32 %.
511+ ret i32 %retval.0
512+ }
513+
514+ define i32 @scmp_zero_slt_ab (i32 %a , i32 %b ) {
515+ ; CHECK-LABEL: define i32 @scmp_zero_slt_ab(
516+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
517+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[A]], i32 [[B]])
518+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
519+ ;
520+ %cmp = icmp eq i32 %a , %b
521+ %cmp1.inv = icmp slt i32 %a , %b
522+ %. = select i1 %cmp1.inv , i32 -1 , i32 1
523+ %retval.0 = select i1 %cmp , i32 0 , i32 %.
524+ ret i32 %retval.0
525+ }
526+
527+ define i32 @scmp_zero_sgt_ab (i32 %a , i32 %b ) {
528+ ; CHECK-LABEL: define i32 @scmp_zero_sgt_ab(
529+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
530+ ; CHECK-NEXT: [[RETVAL_0:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[A]], i32 [[B]])
531+ ; CHECK-NEXT: ret i32 [[RETVAL_0]]
532+ ;
533+ %cmp = icmp eq i32 %a , %b
534+ %cmp1.inv = icmp sgt i32 %a , %b
535+ %. = select i1 %cmp1.inv , i32 1 , i32 -1
536+ %retval.0 = select i1 %cmp , i32 0 , i32 %.
537+ ret i32 %retval.0
538+ }
539+
439540; Negative test: true value of outer select is not zero
440541define i8 @scmp_from_select_eq_and_gt_neg1 (i32 %x , i32 %y ) {
441542; CHECK-LABEL: define i8 @scmp_from_select_eq_and_gt_neg1(
0 commit comments