@@ -438,3 +438,255 @@ define i1 @andn_snez_i64(i64 %a, i64 %b) nounwind {
438
438
%cmpeq = icmp ne i64 %and , %b
439
439
ret i1 %cmpeq
440
440
}
441
+
442
+ define i32 @and_hoisted_not_i32 (i32 %x , i32 %m , i1 zeroext %cond ) {
443
+ ; CHECK-LABEL: and_hoisted_not_i32:
444
+ ; CHECK: # %bb.0:
445
+ ; CHECK-NEXT: beqz a2, .LBB24_2
446
+ ; CHECK-NEXT: # %bb.1: # %mask
447
+ ; CHECK-NEXT: not a1, a1
448
+ ; CHECK-NEXT: and a0, a1, a0
449
+ ; CHECK-NEXT: .LBB24_2: # %identity
450
+ ; CHECK-NEXT: ret
451
+ %a = xor i32 %m , -1
452
+ br i1 %cond , label %mask , label %identity
453
+
454
+ mask:
455
+ %masked = and i32 %a , %x
456
+ ret i32 %masked
457
+
458
+ identity:
459
+ ret i32 %x
460
+ }
461
+
462
+ define i32 @and_hoisted_not_i32_swapped (i32 %x , i32 %m , i1 zeroext %cond ) {
463
+ ; CHECK-LABEL: and_hoisted_not_i32_swapped:
464
+ ; CHECK: # %bb.0:
465
+ ; CHECK-NEXT: beqz a2, .LBB25_2
466
+ ; CHECK-NEXT: # %bb.1: # %mask
467
+ ; CHECK-NEXT: not a1, a1
468
+ ; CHECK-NEXT: and a0, a0, a1
469
+ ; CHECK-NEXT: .LBB25_2: # %identity
470
+ ; CHECK-NEXT: ret
471
+ %a = xor i32 %m , -1
472
+ br i1 %cond , label %mask , label %identity
473
+
474
+ mask:
475
+ %masked = and i32 %x , %a
476
+ ret i32 %masked
477
+
478
+ identity:
479
+ ret i32 %x
480
+ }
481
+
482
+ define i64 @and_hoisted_not_i64 (i64 %x , i64 %m , i1 zeroext %cond ) {
483
+ ; CHECK-LABEL: and_hoisted_not_i64:
484
+ ; CHECK: # %bb.0:
485
+ ; CHECK-NEXT: beqz a4, .LBB26_2
486
+ ; CHECK-NEXT: # %bb.1: # %mask
487
+ ; CHECK-NEXT: not a3, a3
488
+ ; CHECK-NEXT: not a2, a2
489
+ ; CHECK-NEXT: and a0, a2, a0
490
+ ; CHECK-NEXT: and a1, a3, a1
491
+ ; CHECK-NEXT: .LBB26_2: # %identity
492
+ ; CHECK-NEXT: ret
493
+ %a = xor i64 %m , -1
494
+ br i1 %cond , label %mask , label %identity
495
+
496
+ mask:
497
+ %masked = and i64 %a , %x
498
+ ret i64 %masked
499
+
500
+ identity:
501
+ ret i64 %x
502
+ }
503
+
504
+ define i64 @and_hoisted_not_i64_swapped (i64 %x , i64 %m , i1 zeroext %cond ) {
505
+ ; CHECK-LABEL: and_hoisted_not_i64_swapped:
506
+ ; CHECK: # %bb.0:
507
+ ; CHECK-NEXT: beqz a4, .LBB27_2
508
+ ; CHECK-NEXT: # %bb.1: # %mask
509
+ ; CHECK-NEXT: not a3, a3
510
+ ; CHECK-NEXT: not a2, a2
511
+ ; CHECK-NEXT: and a0, a0, a2
512
+ ; CHECK-NEXT: and a1, a1, a3
513
+ ; CHECK-NEXT: .LBB27_2: # %identity
514
+ ; CHECK-NEXT: ret
515
+ %a = xor i64 %m , -1
516
+ br i1 %cond , label %mask , label %identity
517
+
518
+ mask:
519
+ %masked = and i64 %x , %a
520
+ ret i64 %masked
521
+
522
+ identity:
523
+ ret i64 %x
524
+ }
525
+
526
+ define i32 @or_hoisted_not_i32 (i32 %x , i32 %m , i1 zeroext %cond ) {
527
+ ; CHECK-LABEL: or_hoisted_not_i32:
528
+ ; CHECK: # %bb.0:
529
+ ; CHECK-NEXT: beqz a2, .LBB28_2
530
+ ; CHECK-NEXT: # %bb.1: # %mask
531
+ ; CHECK-NEXT: not a1, a1
532
+ ; CHECK-NEXT: or a0, a1, a0
533
+ ; CHECK-NEXT: .LBB28_2: # %identity
534
+ ; CHECK-NEXT: ret
535
+ %a = xor i32 %m , -1
536
+ br i1 %cond , label %mask , label %identity
537
+
538
+ mask:
539
+ %masked = or i32 %a , %x
540
+ ret i32 %masked
541
+
542
+ identity:
543
+ ret i32 %x
544
+ }
545
+
546
+ define i32 @or_hoisted_not_i32_swapped (i32 %x , i32 %m , i1 zeroext %cond ) {
547
+ ; CHECK-LABEL: or_hoisted_not_i32_swapped:
548
+ ; CHECK: # %bb.0:
549
+ ; CHECK-NEXT: beqz a2, .LBB29_2
550
+ ; CHECK-NEXT: # %bb.1: # %mask
551
+ ; CHECK-NEXT: not a1, a1
552
+ ; CHECK-NEXT: or a0, a0, a1
553
+ ; CHECK-NEXT: .LBB29_2: # %identity
554
+ ; CHECK-NEXT: ret
555
+ %a = xor i32 %m , -1
556
+ br i1 %cond , label %mask , label %identity
557
+
558
+ mask:
559
+ %masked = or i32 %x , %a
560
+ ret i32 %masked
561
+
562
+ identity:
563
+ ret i32 %x
564
+ }
565
+
566
+ define i64 @or_hoisted_not_i64 (i64 %x , i64 %m , i1 zeroext %cond ) {
567
+ ; CHECK-LABEL: or_hoisted_not_i64:
568
+ ; CHECK: # %bb.0:
569
+ ; CHECK-NEXT: beqz a4, .LBB30_2
570
+ ; CHECK-NEXT: # %bb.1: # %mask
571
+ ; CHECK-NEXT: not a3, a3
572
+ ; CHECK-NEXT: not a2, a2
573
+ ; CHECK-NEXT: or a0, a2, a0
574
+ ; CHECK-NEXT: or a1, a3, a1
575
+ ; CHECK-NEXT: .LBB30_2: # %identity
576
+ ; CHECK-NEXT: ret
577
+ %a = xor i64 %m , -1
578
+ br i1 %cond , label %mask , label %identity
579
+
580
+ mask:
581
+ %masked = or i64 %a , %x
582
+ ret i64 %masked
583
+
584
+ identity:
585
+ ret i64 %x
586
+ }
587
+
588
+ define i64 @or_hoisted_not_i64_swapped (i64 %x , i64 %m , i1 zeroext %cond ) {
589
+ ; CHECK-LABEL: or_hoisted_not_i64_swapped:
590
+ ; CHECK: # %bb.0:
591
+ ; CHECK-NEXT: beqz a4, .LBB31_2
592
+ ; CHECK-NEXT: # %bb.1: # %mask
593
+ ; CHECK-NEXT: not a3, a3
594
+ ; CHECK-NEXT: not a2, a2
595
+ ; CHECK-NEXT: or a0, a0, a2
596
+ ; CHECK-NEXT: or a1, a1, a3
597
+ ; CHECK-NEXT: .LBB31_2: # %identity
598
+ ; CHECK-NEXT: ret
599
+ %a = xor i64 %m , -1
600
+ br i1 %cond , label %mask , label %identity
601
+
602
+ mask:
603
+ %masked = or i64 %x , %a
604
+ ret i64 %masked
605
+
606
+ identity:
607
+ ret i64 %x
608
+ }
609
+
610
+ define i32 @xor_hoisted_not_i32 (i32 %x , i32 %m , i1 zeroext %cond ) {
611
+ ; CHECK-LABEL: xor_hoisted_not_i32:
612
+ ; CHECK: # %bb.0:
613
+ ; CHECK-NEXT: beqz a2, .LBB32_2
614
+ ; CHECK-NEXT: # %bb.1: # %mask
615
+ ; CHECK-NEXT: not a1, a1
616
+ ; CHECK-NEXT: xor a0, a1, a0
617
+ ; CHECK-NEXT: .LBB32_2: # %identity
618
+ ; CHECK-NEXT: ret
619
+ %a = xor i32 %m , -1
620
+ br i1 %cond , label %mask , label %identity
621
+
622
+ mask:
623
+ %masked = xor i32 %a , %x
624
+ ret i32 %masked
625
+
626
+ identity:
627
+ ret i32 %x
628
+ }
629
+
630
+ define i32 @xor_hoisted_not_i32_swapped (i32 %x , i32 %m , i1 zeroext %cond ) {
631
+ ; CHECK-LABEL: xor_hoisted_not_i32_swapped:
632
+ ; CHECK: # %bb.0:
633
+ ; CHECK-NEXT: beqz a2, .LBB33_2
634
+ ; CHECK-NEXT: # %bb.1: # %mask
635
+ ; CHECK-NEXT: not a1, a1
636
+ ; CHECK-NEXT: xor a0, a0, a1
637
+ ; CHECK-NEXT: .LBB33_2: # %identity
638
+ ; CHECK-NEXT: ret
639
+ %a = xor i32 %m , -1
640
+ br i1 %cond , label %mask , label %identity
641
+
642
+ mask:
643
+ %masked = xor i32 %x , %a
644
+ ret i32 %masked
645
+
646
+ identity:
647
+ ret i32 %x
648
+ }
649
+
650
+ define i64 @xor_hoisted_not_i64 (i64 %x , i64 %m , i1 zeroext %cond ) {
651
+ ; CHECK-LABEL: xor_hoisted_not_i64:
652
+ ; CHECK: # %bb.0:
653
+ ; CHECK-NEXT: beqz a4, .LBB34_2
654
+ ; CHECK-NEXT: # %bb.1: # %mask
655
+ ; CHECK-NEXT: not a3, a3
656
+ ; CHECK-NEXT: not a2, a2
657
+ ; CHECK-NEXT: xor a0, a2, a0
658
+ ; CHECK-NEXT: xor a1, a3, a1
659
+ ; CHECK-NEXT: .LBB34_2: # %identity
660
+ ; CHECK-NEXT: ret
661
+ %a = xor i64 %m , -1
662
+ br i1 %cond , label %mask , label %identity
663
+
664
+ mask:
665
+ %masked = xor i64 %a , %x
666
+ ret i64 %masked
667
+
668
+ identity:
669
+ ret i64 %x
670
+ }
671
+
672
+ define i64 @xor_hoisted_not_i64_swapped (i64 %x , i64 %m , i1 zeroext %cond ) {
673
+ ; CHECK-LABEL: xor_hoisted_not_i64_swapped:
674
+ ; CHECK: # %bb.0:
675
+ ; CHECK-NEXT: beqz a4, .LBB35_2
676
+ ; CHECK-NEXT: # %bb.1: # %mask
677
+ ; CHECK-NEXT: not a3, a3
678
+ ; CHECK-NEXT: not a2, a2
679
+ ; CHECK-NEXT: xor a0, a0, a2
680
+ ; CHECK-NEXT: xor a1, a1, a3
681
+ ; CHECK-NEXT: .LBB35_2: # %identity
682
+ ; CHECK-NEXT: ret
683
+ %a = xor i64 %m , -1
684
+ br i1 %cond , label %mask , label %identity
685
+
686
+ mask:
687
+ %masked = xor i64 %x , %a
688
+ ret i64 %masked
689
+
690
+ identity:
691
+ ret i64 %x
692
+ }
0 commit comments