Skip to content

Commit 6ada38b

Browse files
committed
[RISCV][test] Add tests for sinking NOT to be fold into ANDN/ORN/XNOR/VANDN
1 parent 05dbabe commit 6ada38b

File tree

3 files changed

+871
-6
lines changed

3 files changed

+871
-6
lines changed

llvm/test/CodeGen/RISCV/rv32zbb-zbkb.ll

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)