@@ -481,3 +481,131 @@ define i32 @select_sgt_negative_one_constant1_constant2(i32 signext %x) {
481481 %cond = select i1 %cmp , i32 7 , i32 -3
482482 ret i32 %cond
483483}
484+
485+ define i32 @select_nonnegative_lui_addi (i32 signext %x ) {
486+ ; RV32I-LABEL: select_nonnegative_lui_addi:
487+ ; RV32I: # %bb.0:
488+ ; RV32I-NEXT: mv a1, a0
489+ ; RV32I-NEXT: lui a0, 4
490+ ; RV32I-NEXT: bgez a1, .LBB21_2
491+ ; RV32I-NEXT: # %bb.1:
492+ ; RV32I-NEXT: li a0, 25
493+ ; RV32I-NEXT: .LBB21_2:
494+ ; RV32I-NEXT: ret
495+ ;
496+ ; RV32IF-LABEL: select_nonnegative_lui_addi:
497+ ; RV32IF: # %bb.0:
498+ ; RV32IF-NEXT: mv a1, a0
499+ ; RV32IF-NEXT: lui a0, 4
500+ ; RV32IF-NEXT: bgez a1, .LBB21_2
501+ ; RV32IF-NEXT: # %bb.1:
502+ ; RV32IF-NEXT: li a0, 25
503+ ; RV32IF-NEXT: .LBB21_2:
504+ ; RV32IF-NEXT: ret
505+ ;
506+ ; RV32ZICOND-LABEL: select_nonnegative_lui_addi:
507+ ; RV32ZICOND: # %bb.0:
508+ ; RV32ZICOND-NEXT: srli a0, a0, 31
509+ ; RV32ZICOND-NEXT: lui a1, 1048572
510+ ; RV32ZICOND-NEXT: addi a1, a1, 25
511+ ; RV32ZICOND-NEXT: czero.eqz a0, a1, a0
512+ ; RV32ZICOND-NEXT: lui a1, 4
513+ ; RV32ZICOND-NEXT: add a0, a0, a1
514+ ; RV32ZICOND-NEXT: ret
515+ ;
516+ ; RV64I-LABEL: select_nonnegative_lui_addi:
517+ ; RV64I: # %bb.0:
518+ ; RV64I-NEXT: mv a1, a0
519+ ; RV64I-NEXT: lui a0, 4
520+ ; RV64I-NEXT: bgez a1, .LBB21_2
521+ ; RV64I-NEXT: # %bb.1:
522+ ; RV64I-NEXT: li a0, 25
523+ ; RV64I-NEXT: .LBB21_2:
524+ ; RV64I-NEXT: ret
525+ ;
526+ ; RV64IFD-LABEL: select_nonnegative_lui_addi:
527+ ; RV64IFD: # %bb.0:
528+ ; RV64IFD-NEXT: mv a1, a0
529+ ; RV64IFD-NEXT: lui a0, 4
530+ ; RV64IFD-NEXT: bgez a1, .LBB21_2
531+ ; RV64IFD-NEXT: # %bb.1:
532+ ; RV64IFD-NEXT: li a0, 25
533+ ; RV64IFD-NEXT: .LBB21_2:
534+ ; RV64IFD-NEXT: ret
535+ ;
536+ ; RV64ZICOND-LABEL: select_nonnegative_lui_addi:
537+ ; RV64ZICOND: # %bb.0:
538+ ; RV64ZICOND-NEXT: srli a0, a0, 63
539+ ; RV64ZICOND-NEXT: lui a1, 1048572
540+ ; RV64ZICOND-NEXT: addi a1, a1, 25
541+ ; RV64ZICOND-NEXT: czero.eqz a0, a1, a0
542+ ; RV64ZICOND-NEXT: lui a1, 4
543+ ; RV64ZICOND-NEXT: add a0, a0, a1
544+ ; RV64ZICOND-NEXT: ret
545+ %cmp = icmp sgt i32 %x , -1
546+ %cond = select i1 %cmp , i32 16384 , i32 25
547+ ret i32 %cond
548+ }
549+
550+ define i32 @select_nonnegative_lui_addi_swapped (i32 signext %x ) {
551+ ; RV32I-LABEL: select_nonnegative_lui_addi_swapped:
552+ ; RV32I: # %bb.0:
553+ ; RV32I-NEXT: bgez a0, .LBB22_2
554+ ; RV32I-NEXT: # %bb.1:
555+ ; RV32I-NEXT: lui a0, 4
556+ ; RV32I-NEXT: ret
557+ ; RV32I-NEXT: .LBB22_2:
558+ ; RV32I-NEXT: li a0, 25
559+ ; RV32I-NEXT: ret
560+ ;
561+ ; RV32IF-LABEL: select_nonnegative_lui_addi_swapped:
562+ ; RV32IF: # %bb.0:
563+ ; RV32IF-NEXT: bgez a0, .LBB22_2
564+ ; RV32IF-NEXT: # %bb.1:
565+ ; RV32IF-NEXT: lui a0, 4
566+ ; RV32IF-NEXT: ret
567+ ; RV32IF-NEXT: .LBB22_2:
568+ ; RV32IF-NEXT: li a0, 25
569+ ; RV32IF-NEXT: ret
570+ ;
571+ ; RV32ZICOND-LABEL: select_nonnegative_lui_addi_swapped:
572+ ; RV32ZICOND: # %bb.0:
573+ ; RV32ZICOND-NEXT: srli a0, a0, 31
574+ ; RV32ZICOND-NEXT: lui a1, 4
575+ ; RV32ZICOND-NEXT: addi a1, a1, -25
576+ ; RV32ZICOND-NEXT: czero.eqz a0, a1, a0
577+ ; RV32ZICOND-NEXT: addi a0, a0, 25
578+ ; RV32ZICOND-NEXT: ret
579+ ;
580+ ; RV64I-LABEL: select_nonnegative_lui_addi_swapped:
581+ ; RV64I: # %bb.0:
582+ ; RV64I-NEXT: bgez a0, .LBB22_2
583+ ; RV64I-NEXT: # %bb.1:
584+ ; RV64I-NEXT: lui a0, 4
585+ ; RV64I-NEXT: ret
586+ ; RV64I-NEXT: .LBB22_2:
587+ ; RV64I-NEXT: li a0, 25
588+ ; RV64I-NEXT: ret
589+ ;
590+ ; RV64IFD-LABEL: select_nonnegative_lui_addi_swapped:
591+ ; RV64IFD: # %bb.0:
592+ ; RV64IFD-NEXT: bgez a0, .LBB22_2
593+ ; RV64IFD-NEXT: # %bb.1:
594+ ; RV64IFD-NEXT: lui a0, 4
595+ ; RV64IFD-NEXT: ret
596+ ; RV64IFD-NEXT: .LBB22_2:
597+ ; RV64IFD-NEXT: li a0, 25
598+ ; RV64IFD-NEXT: ret
599+ ;
600+ ; RV64ZICOND-LABEL: select_nonnegative_lui_addi_swapped:
601+ ; RV64ZICOND: # %bb.0:
602+ ; RV64ZICOND-NEXT: srli a0, a0, 63
603+ ; RV64ZICOND-NEXT: lui a1, 4
604+ ; RV64ZICOND-NEXT: addi a1, a1, -25
605+ ; RV64ZICOND-NEXT: czero.eqz a0, a1, a0
606+ ; RV64ZICOND-NEXT: addi a0, a0, 25
607+ ; RV64ZICOND-NEXT: ret
608+ %cmp = icmp sgt i32 %x , -1
609+ %cond = select i1 %cmp , i32 25 , i32 16384
610+ ret i32 %cond
611+ }
0 commit comments