@@ -434,3 +434,161 @@ define <2 x i8> @udiv_exact_trailing_zeros_nonuniform_vector(<2 x i8> %x) {
434
434
}
435
435
436
436
!0 = !{i32 0 , i32 3 }
437
+
438
+ define i32 @sdiv_one_srem_divisor (i32 %a , i32 %b ) {
439
+ ; CHECK-LABEL: @sdiv_one_srem_divisor(
440
+ ; CHECK-NEXT: [[SREM:%.*]] = srem i32 1, [[B:%.*]]
441
+ ; CHECK-NEXT: [[SDIV:%.*]] = sdiv i32 [[A:%.*]], [[SREM]]
442
+ ; CHECK-NEXT: ret i32 [[SDIV]]
443
+ ;
444
+ %srem = srem i32 1 , %b
445
+ %sdiv = sdiv i32 %a , %srem
446
+ ret i32 %sdiv
447
+ }
448
+
449
+ define i32 @sdiv_one_urem_divisor (i32 %a , i32 %b ) {
450
+ ; CHECK-LABEL: @sdiv_one_urem_divisor(
451
+ ; CHECK-NEXT: [[UREM:%.*]] = urem i32 1, [[B:%.*]]
452
+ ; CHECK-NEXT: [[SDIV:%.*]] = sdiv i32 [[A:%.*]], [[UREM]]
453
+ ; CHECK-NEXT: ret i32 [[SDIV]]
454
+ ;
455
+ %urem = urem i32 1 , %b
456
+ %sdiv = sdiv i32 %a , %urem
457
+ ret i32 %sdiv
458
+ }
459
+
460
+ define i32 @udiv_one_srem_divisor (i32 %a , i32 %b ) {
461
+ ; CHECK-LABEL: @udiv_one_srem_divisor(
462
+ ; CHECK-NEXT: [[SREM:%.*]] = srem i32 1, [[B:%.*]]
463
+ ; CHECK-NEXT: [[UDIV:%.*]] = udiv i32 [[A:%.*]], [[SREM]]
464
+ ; CHECK-NEXT: ret i32 [[UDIV]]
465
+ ;
466
+ %srem = srem i32 1 , %b
467
+ %udiv = udiv i32 %a , %srem
468
+ ret i32 %udiv
469
+ }
470
+
471
+ define i32 @udiv_one_urem_divisor (i32 %a , i32 %b ) {
472
+ ; CHECK-LABEL: @udiv_one_urem_divisor(
473
+ ; CHECK-NEXT: [[UREM:%.*]] = urem i32 1, [[B:%.*]]
474
+ ; CHECK-NEXT: [[UDIV:%.*]] = udiv i32 [[A:%.*]], [[UREM]]
475
+ ; CHECK-NEXT: ret i32 [[UDIV]]
476
+ ;
477
+ %urem = urem i32 1 , %b
478
+ %udiv = udiv i32 %a , %urem
479
+ ret i32 %udiv
480
+ }
481
+
482
+ define i32 @srem_one_srem_divisor (i32 %a , i32 %b ) {
483
+ ; CHECK-LABEL: @srem_one_srem_divisor(
484
+ ; CHECK-NEXT: [[SREM:%.*]] = srem i32 1, [[B:%.*]]
485
+ ; CHECK-NEXT: [[SREM1:%.*]] = srem i32 [[A:%.*]], [[SREM]]
486
+ ; CHECK-NEXT: ret i32 [[SREM1]]
487
+ ;
488
+ %srem = srem i32 1 , %b
489
+ %srem1 = srem i32 %a , %srem
490
+ ret i32 %srem1
491
+ }
492
+
493
+ define i32 @urem_one_srem_divisor (i32 %a , i32 %b ) {
494
+ ; CHECK-LABEL: @urem_one_srem_divisor(
495
+ ; CHECK-NEXT: [[SREM:%.*]] = srem i32 1, [[B:%.*]]
496
+ ; CHECK-NEXT: [[UREM:%.*]] = urem i32 [[A:%.*]], [[SREM]]
497
+ ; CHECK-NEXT: ret i32 [[UREM]]
498
+ ;
499
+ %srem = srem i32 1 , %b
500
+ %urem = urem i32 %a , %srem
501
+ ret i32 %urem
502
+ }
503
+
504
+ define i32 @srem_one_urem_divisor (i32 %a , i32 %b ) {
505
+ ; CHECK-LABEL: @srem_one_urem_divisor(
506
+ ; CHECK-NEXT: [[UREM:%.*]] = urem i32 1, [[B:%.*]]
507
+ ; CHECK-NEXT: [[SREM:%.*]] = srem i32 [[A:%.*]], [[UREM]]
508
+ ; CHECK-NEXT: ret i32 [[SREM]]
509
+ ;
510
+ %urem = urem i32 1 , %b
511
+ %srem = srem i32 %a , %urem
512
+ ret i32 %srem
513
+ }
514
+
515
+ define i32 @urem_one_urem_divisor (i32 %a , i32 %b ) {
516
+ ; CHECK-LABEL: @urem_one_urem_divisor(
517
+ ; CHECK-NEXT: [[UREM:%.*]] = urem i32 1, [[B:%.*]]
518
+ ; CHECK-NEXT: [[UREM1:%.*]] = urem i32 [[A:%.*]], [[UREM]]
519
+ ; CHECK-NEXT: ret i32 [[UREM1]]
520
+ ;
521
+ %urem = urem i32 1 , %b
522
+ %urem1 = urem i32 %a , %urem
523
+ ret i32 %urem1
524
+ }
525
+
526
+ define <2 x i8 > @sdiv_one_vec_srem_divisor (<2 x i8 > %a , <2 x i8 > %b ) {
527
+ ; CHECK-LABEL: @sdiv_one_vec_srem_divisor(
528
+ ; CHECK-NEXT: [[SREM:%.*]] = srem <2 x i8> <i8 1, i8 1>, [[B:%.*]]
529
+ ; CHECK-NEXT: [[SDIV:%.*]] = sdiv <2 x i8> [[A:%.*]], [[SREM]]
530
+ ; CHECK-NEXT: ret <2 x i8> [[SDIV]]
531
+ ;
532
+ %srem = srem <2 x i8 > <i8 1 , i8 1 >, %b
533
+ %sdiv = sdiv <2 x i8 > %a , %srem
534
+ ret <2 x i8 > %sdiv
535
+ }
536
+
537
+ define i32 @sdiv_and_one_divisor (i32 %x , i32 %y ) {
538
+ ; CHECK-LABEL: @sdiv_and_one_divisor(
539
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1
540
+ ; CHECK-NEXT: [[RES:%.*]] = sdiv i32 [[Y:%.*]], [[AND]]
541
+ ; CHECK-NEXT: ret i32 [[RES]]
542
+ ;
543
+ %and = and i32 %x , 1
544
+ %res = sdiv i32 %y , %and
545
+ ret i32 %res
546
+ }
547
+
548
+ define <2 x i8 > @sdiv_and_one_vec_divisor (<2 x i8 > %x , <2 x i8 > %y ) {
549
+ ; CHECK-LABEL: @sdiv_and_one_vec_divisor(
550
+ ; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[X:%.*]], <i8 1, i8 1>
551
+ ; CHECK-NEXT: [[RES:%.*]] = sdiv <2 x i8> [[Y:%.*]], [[AND]]
552
+ ; CHECK-NEXT: ret <2 x i8> [[RES]]
553
+ ;
554
+ %and = and <2 x i8 > %x , <i8 1 , i8 1 >
555
+ %res = sdiv <2 x i8 > %y , %and
556
+ ret <2 x i8 > %res
557
+ }
558
+
559
+ define i32 @sdiv_neg_or_divisor (i32 %x , i32 %y ) {
560
+ ; CHECK-LABEL: @sdiv_neg_or_divisor(
561
+ ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], -2
562
+ ; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[OR]], -1
563
+ ; CHECK-NEXT: [[RES:%.*]] = sdiv i32 [[Y:%.*]], [[NEG]]
564
+ ; CHECK-NEXT: ret i32 [[RES]]
565
+ ;
566
+ %or = or i32 %x , -2
567
+ %neg = xor i32 %or , -1
568
+ %res = sdiv i32 %y , %neg
569
+ ret i32 %res
570
+ }
571
+
572
+ define i32 @sdiv_neg_or_multi_one_bit_divisor (i32 %x , i32 %y ) {
573
+ ; CHECK-LABEL: @sdiv_neg_or_multi_one_bit_divisor(
574
+ ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], -3
575
+ ; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[OR]], -1
576
+ ; CHECK-NEXT: [[RES:%.*]] = sdiv i32 [[Y:%.*]], [[NEG]]
577
+ ; CHECK-NEXT: ret i32 [[RES]]
578
+ ;
579
+ %or = or i32 %x , -3
580
+ %neg = xor i32 %or , -1
581
+ %res = sdiv i32 %y , %neg
582
+ ret i32 %res
583
+ }
584
+
585
+ define <2 x i8 > @sdiv_vec_multi_one_bit_divisor (<2 x i8 > %x , <2 x i8 > %y ) {
586
+ ; CHECK-LABEL: @sdiv_vec_multi_one_bit_divisor(
587
+ ; CHECK-NEXT: [[AND:%.*]] = and <2 x i8> [[X:%.*]], <i8 1, i8 3>
588
+ ; CHECK-NEXT: [[RES:%.*]] = sdiv <2 x i8> [[Y:%.*]], [[AND]]
589
+ ; CHECK-NEXT: ret <2 x i8> [[RES]]
590
+ ;
591
+ %and = and <2 x i8 > %x , <i8 1 , i8 3 >
592
+ %res = sdiv <2 x i8 > %y , %and
593
+ ret <2 x i8 > %res
594
+ }
0 commit comments