@@ -438,3 +438,255 @@ define i1 @andn_snez_i64(i64 %a, i64 %b) nounwind {
438438 %cmpeq = icmp ne i64 %and , %b
439439 ret i1 %cmpeq
440440}
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