Skip to content

Commit fa1eb2e

Browse files
author
Zain Jaffal
committed
[ConstraintElimination] Add tests to check for or instruction decomposition if a constant operand is < 2^known_zero_bits of the first operand.
Reviewed By: fhahn Differential Revision: https://reviews.llvm.org/D142545
1 parent 99c7664 commit fa1eb2e

File tree

1 file changed

+361
-0
lines changed
  • llvm/test/Transforms/ConstraintElimination

1 file changed

+361
-0
lines changed

llvm/test/Transforms/ConstraintElimination/or.ll

Lines changed: 361 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,3 +431,364 @@ exit:
431431

432432
ret i1 %res.9
433433
}
434+
435+
define void @test_or_as_add_ult(i8 %init_val, i8 %high) {
436+
; CHECK-LABEL: @test_or_as_add_ult(
437+
; CHECK-NEXT: entry:
438+
; CHECK-NEXT: [[START:%.*]] = shl nuw nsw i8 [[INIT_VAL:%.*]], 2
439+
; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START]], 3
440+
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
441+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
442+
; CHECK: then:
443+
; CHECK-NEXT: [[F_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]
444+
; CHECK-NEXT: call void @use(i1 [[F_0]])
445+
; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
446+
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[I_1]], [[HIGH]]
447+
; CHECK-NEXT: call void @use(i1 [[F_1]])
448+
; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
449+
; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[I_2]], [[HIGH]]
450+
; CHECK-NEXT: call void @use(i1 [[F_2]])
451+
; CHECK-NEXT: ret void
452+
; CHECK: end:
453+
; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]
454+
; CHECK-NEXT: call void @use(i1 true)
455+
; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
456+
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]]
457+
; CHECK-NEXT: call void @use(i1 [[T_1]])
458+
; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
459+
; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]]
460+
; CHECK-NEXT: call void @use(i1 [[T_2]])
461+
; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
462+
; CHECK-NEXT: [[T_3:%.*]] = icmp ult i8 [[START_3]], [[HIGH]]
463+
; CHECK-NEXT: call void @use(i1 [[T_3]])
464+
; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
465+
; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[START_4]], [[HIGH]]
466+
; CHECK-NEXT: call void @use(i1 [[C_4]])
467+
; CHECK-NEXT: ret void
468+
;
469+
entry:
470+
%start = shl nuw nsw i8 %init_val, 2
471+
%start.plus.3 = add nuw i8 %start, 3
472+
%c.1 = icmp uge i8 %start.plus.3, %high
473+
br i1 %c.1, label %then, label %end
474+
475+
then: ; preds = %entry
476+
%f.0 = icmp ult i8 %start, %high
477+
call void @use(i1 %f.0)
478+
%i.1 = or i8 %start, 1
479+
%f.1 = icmp ult i8 %i.1, %high
480+
call void @use(i1 %f.1)
481+
%i.2 = or i8 %start, 2
482+
%f.2 = icmp ult i8 %i.2, %high
483+
call void @use(i1 %f.2)
484+
ret void
485+
486+
end: ; preds = %entry
487+
%t.0 = icmp ult i8 %start, %high
488+
call void @use(i1 %t.0)
489+
%start.1 = or i8 %start, 1
490+
%t.1 = icmp ult i8 %start.1, %high
491+
call void @use(i1 %t.1)
492+
%start.2 = or i8 %start, 2
493+
%t.2 = icmp ult i8 %start.2, %high
494+
call void @use(i1 %t.2)
495+
%start.3 = or i8 %start, 3
496+
%t.3 = icmp ult i8 %start.3, %high
497+
call void @use(i1 %t.3)
498+
%start.4 = or i8 %start, 4
499+
%c.4 = icmp ult i8 %start.4, %high
500+
call void @use(i1 %c.4)
501+
ret void
502+
}
503+
504+
define void @test_or_as_add_ule(i8 %init_val, i8 %high) {
505+
; CHECK-LABEL: @test_or_as_add_ule(
506+
; CHECK-NEXT: entry:
507+
; CHECK-NEXT: [[START:%.*]] = shl nuw nsw i8 [[INIT_VAL:%.*]], 2
508+
; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START]], 3
509+
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
510+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
511+
; CHECK: then:
512+
; CHECK-NEXT: [[F_0:%.*]] = icmp ule i8 [[START]], [[HIGH]]
513+
; CHECK-NEXT: call void @use(i1 [[F_0]])
514+
; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
515+
; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[I_1]], [[HIGH]]
516+
; CHECK-NEXT: call void @use(i1 [[F_1]])
517+
; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
518+
; CHECK-NEXT: [[F_2:%.*]] = icmp ule i8 [[I_2]], [[HIGH]]
519+
; CHECK-NEXT: call void @use(i1 [[F_2]])
520+
; CHECK-NEXT: ret void
521+
; CHECK: end:
522+
; CHECK-NEXT: [[T_0:%.*]] = icmp ule i8 [[START]], [[HIGH]]
523+
; CHECK-NEXT: call void @use(i1 true)
524+
; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
525+
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_1]], [[HIGH]]
526+
; CHECK-NEXT: call void @use(i1 [[T_1]])
527+
; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
528+
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[START_2]], [[HIGH]]
529+
; CHECK-NEXT: call void @use(i1 [[T_2]])
530+
; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
531+
; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_3]], [[HIGH]]
532+
; CHECK-NEXT: call void @use(i1 [[T_3]])
533+
; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
534+
; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_4]], [[HIGH]]
535+
; CHECK-NEXT: call void @use(i1 [[T_4]])
536+
; CHECK-NEXT: [[START_5:%.*]] = or i8 [[START]], 5
537+
; CHECK-NEXT: [[C_5:%.*]] = icmp ule i8 [[START_5]], [[HIGH]]
538+
; CHECK-NEXT: call void @use(i1 [[C_5]])
539+
; CHECK-NEXT: ret void
540+
;
541+
entry:
542+
%start = shl nuw nsw i8 %init_val, 2
543+
%start.plus.3 = add nuw i8 %start, 3
544+
%c.1 = icmp uge i8 %start.plus.3, %high
545+
br i1 %c.1, label %then, label %end
546+
547+
then: ; preds = %entry
548+
%f.0 = icmp ule i8 %start, %high
549+
call void @use(i1 %f.0)
550+
%i.1 = or i8 %start, 1
551+
%f.1 = icmp ule i8 %i.1, %high
552+
call void @use(i1 %f.1)
553+
%i.2 = or i8 %start, 2
554+
%f.2 = icmp ule i8 %i.2, %high
555+
call void @use(i1 %f.2)
556+
ret void
557+
558+
end: ; preds = %entry
559+
%t.0 = icmp ule i8 %start, %high
560+
call void @use(i1 %t.0)
561+
%start.1 = or i8 %start, 1
562+
%t.1 = icmp ule i8 %start.1, %high
563+
call void @use(i1 %t.1)
564+
%start.2 = or i8 %start, 2
565+
%t.2 = icmp ule i8 %start.2, %high
566+
call void @use(i1 %t.2)
567+
%start.3 = or i8 %start, 3
568+
%t.3 = icmp ule i8 %start.3, %high
569+
call void @use(i1 %t.3)
570+
%start.4 = or i8 %start, 4
571+
%t.4 = icmp ule i8 %start.4, %high
572+
call void @use(i1 %t.4)
573+
%start.5 = or i8 %start, 5
574+
%c.5 = icmp ule i8 %start.5, %high
575+
call void @use(i1 %c.5)
576+
577+
ret void
578+
}
579+
580+
define void @test_or_as_add_ugt(i8 %init_val, i8 %high) {
581+
; CHECK-LABEL: @test_or_as_add_ugt(
582+
; CHECK-NEXT: entry:
583+
; CHECK-NEXT: [[START:%.*]] = shl nuw nsw i8 [[INIT_VAL:%.*]], 2
584+
; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START]], 3
585+
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
586+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
587+
; CHECK: then:
588+
; CHECK-NEXT: [[T_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
589+
; CHECK-NEXT: call void @use(i1 [[T_0]])
590+
; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
591+
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[I_1]], [[HIGH]]
592+
; CHECK-NEXT: call void @use(i1 [[T_1]])
593+
; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
594+
; CHECK-NEXT: [[T_2:%.*]] = icmp ugt i8 [[I_2]], [[HIGH]]
595+
; CHECK-NEXT: call void @use(i1 [[T_2]])
596+
; CHECK-NEXT: ret void
597+
; CHECK: end:
598+
; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
599+
; CHECK-NEXT: call void @use(i1 false)
600+
; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
601+
; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i8 [[START_1]], [[HIGH]]
602+
; CHECK-NEXT: call void @use(i1 [[F_1]])
603+
; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
604+
; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i8 [[START_2]], [[HIGH]]
605+
; CHECK-NEXT: call void @use(i1 [[F_2]])
606+
; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
607+
; CHECK-NEXT: [[F_3:%.*]] = icmp ugt i8 [[START_3]], [[HIGH]]
608+
; CHECK-NEXT: call void @use(i1 [[F_3]])
609+
; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
610+
; CHECK-NEXT: [[F_4:%.*]] = icmp ugt i8 [[START_4]], [[HIGH]]
611+
; CHECK-NEXT: call void @use(i1 [[F_4]])
612+
; CHECK-NEXT: [[START_5:%.*]] = or i8 [[START]], 5
613+
; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[START_5]], [[HIGH]]
614+
; CHECK-NEXT: call void @use(i1 [[C_5]])
615+
; CHECK-NEXT: ret void
616+
;
617+
entry:
618+
%start = shl nuw nsw i8 %init_val, 2
619+
%start.plus.3 = add nuw i8 %start, 3
620+
%c.1 = icmp uge i8 %start.plus.3, %high
621+
br i1 %c.1, label %then, label %end
622+
623+
then: ; preds = %entry
624+
%t.0 = icmp ugt i8 %start, %high
625+
call void @use(i1 %t.0)
626+
%i.1 = or i8 %start, 1
627+
%t.1 = icmp ugt i8 %i.1, %high
628+
call void @use(i1 %t.1)
629+
%i.2 = or i8 %start, 2
630+
%t.2 = icmp ugt i8 %i.2, %high
631+
call void @use(i1 %t.2)
632+
ret void
633+
634+
end: ; preds = %entry
635+
%f.0 = icmp ugt i8 %start, %high
636+
call void @use(i1 %f.0)
637+
%start.1 = or i8 %start, 1
638+
%f.1 = icmp ugt i8 %start.1, %high
639+
call void @use(i1 %f.1)
640+
%start.2 = or i8 %start, 2
641+
%f.2 = icmp ugt i8 %start.2, %high
642+
call void @use(i1 %f.2)
643+
%start.3 = or i8 %start, 3
644+
%f.3 = icmp ugt i8 %start.3, %high
645+
call void @use(i1 %f.3)
646+
%start.4 = or i8 %start, 4
647+
%f.4 = icmp ugt i8 %start.4, %high
648+
call void @use(i1 %f.4)
649+
%start.5 = or i8 %start, 5
650+
%c.5 = icmp ugt i8 %start.5, %high
651+
call void @use(i1 %c.5)
652+
ret void
653+
}
654+
655+
define void @test_or_as_add_uge(i8 %init_val, i8 %high) {
656+
; CHECK-LABEL: @test_or_as_add_uge(
657+
; CHECK-NEXT: entry:
658+
; CHECK-NEXT: [[START:%.*]] = shl nuw nsw i8 [[INIT_VAL:%.*]], 2
659+
; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START]], 3
660+
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
661+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
662+
; CHECK: then:
663+
; CHECK-NEXT: [[T_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
664+
; CHECK-NEXT: call void @use(i1 [[T_0]])
665+
; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
666+
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[I_1]], [[HIGH]]
667+
; CHECK-NEXT: call void @use(i1 [[T_1]])
668+
; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
669+
; CHECK-NEXT: [[T_2:%.*]] = icmp uge i8 [[I_2]], [[HIGH]]
670+
; CHECK-NEXT: call void @use(i1 [[T_2]])
671+
; CHECK-NEXT: ret void
672+
; CHECK: end:
673+
; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
674+
; CHECK-NEXT: call void @use(i1 false)
675+
; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
676+
; CHECK-NEXT: [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
677+
; CHECK-NEXT: call void @use(i1 [[F_1]])
678+
; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
679+
; CHECK-NEXT: [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
680+
; CHECK-NEXT: call void @use(i1 [[F_2]])
681+
; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
682+
; CHECK-NEXT: [[F_3:%.*]] = icmp uge i8 [[START_3]], [[HIGH]]
683+
; CHECK-NEXT: call void @use(i1 [[F_3]])
684+
; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
685+
; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]
686+
; CHECK-NEXT: call void @use(i1 [[C_4]])
687+
; CHECK-NEXT: [[START_5:%.*]] = or i8 [[START]], 5
688+
; CHECK-NEXT: [[C_5:%.*]] = icmp uge i8 [[START_5]], [[HIGH]]
689+
; CHECK-NEXT: call void @use(i1 [[C_5]])
690+
; CHECK-NEXT: ret void
691+
;
692+
entry:
693+
%start = shl nuw nsw i8 %init_val, 2
694+
%start.plus.3 = add nuw i8 %start, 3
695+
%c.1 = icmp uge i8 %start.plus.3, %high
696+
br i1 %c.1, label %then, label %end
697+
698+
then: ; preds = %entry
699+
%t.0 = icmp ugt i8 %start, %high
700+
call void @use(i1 %t.0)
701+
%i.1 = or i8 %start, 1
702+
%t.1 = icmp uge i8 %i.1, %high
703+
call void @use(i1 %t.1)
704+
%i.2 = or i8 %start, 2
705+
%t.2 = icmp uge i8 %i.2, %high
706+
call void @use(i1 %t.2)
707+
ret void
708+
709+
end: ; preds = %entry
710+
%f.0 = icmp ugt i8 %start, %high
711+
call void @use(i1 %f.0)
712+
%start.1 = or i8 %start, 1
713+
%f.1 = icmp uge i8 %start.1, %high
714+
call void @use(i1 %f.1)
715+
%start.2 = or i8 %start, 2
716+
%f.2 = icmp uge i8 %start.2, %high
717+
call void @use(i1 %f.2)
718+
%start.3 = or i8 %start, 3
719+
%f.3 = icmp uge i8 %start.3, %high
720+
call void @use(i1 %f.3)
721+
%start.4 = or i8 %start, 4
722+
%c.4 = icmp uge i8 %start.4, %high
723+
call void @use(i1 %c.4)
724+
%start.5 = or i8 %start, 5
725+
%c.5 = icmp uge i8 %start.5, %high
726+
call void @use(i1 %c.5)
727+
ret void
728+
}
729+
730+
define void @test_not_decompose(i8 %start, i8 %high) {
731+
; CHECK-LABEL: @test_not_decompose(
732+
; CHECK-NEXT: entry:
733+
; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START:%.*]], 3
734+
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
735+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
736+
; CHECK: then:
737+
; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
738+
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[I_1]], [[HIGH]]
739+
; CHECK-NEXT: call void @use(i1 [[T_1]])
740+
; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
741+
; CHECK-NEXT: [[T_2:%.*]] = icmp uge i8 [[I_2]], [[HIGH]]
742+
; CHECK-NEXT: call void @use(i1 [[T_2]])
743+
; CHECK-NEXT: ret void
744+
; CHECK: end:
745+
; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
746+
; CHECK-NEXT: [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
747+
; CHECK-NEXT: call void @use(i1 [[F_1]])
748+
; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
749+
; CHECK-NEXT: [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
750+
; CHECK-NEXT: call void @use(i1 [[F_2]])
751+
; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
752+
; CHECK-NEXT: [[F_3:%.*]] = icmp uge i8 [[START_3]], [[HIGH]]
753+
; CHECK-NEXT: call void @use(i1 [[F_3]])
754+
; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
755+
; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]
756+
; CHECK-NEXT: call void @use(i1 [[C_4]])
757+
; CHECK-NEXT: [[START_5:%.*]] = or i8 [[START]], 5
758+
; CHECK-NEXT: [[C_5:%.*]] = icmp uge i8 [[START_5]], [[HIGH]]
759+
; CHECK-NEXT: call void @use(i1 [[C_5]])
760+
; CHECK-NEXT: ret void
761+
;
762+
entry:
763+
%start.plus.3 = add nuw i8 %start, 3
764+
%c.1 = icmp uge i8 %start.plus.3, %high
765+
br i1 %c.1, label %then, label %end
766+
767+
then: ; preds = %entry
768+
%i.1 = or i8 %start, 1
769+
%t.1 = icmp uge i8 %i.1, %high
770+
call void @use(i1 %t.1)
771+
%i.2 = or i8 %start, 2
772+
%t.2 = icmp uge i8 %i.2, %high
773+
call void @use(i1 %t.2)
774+
ret void
775+
776+
end: ; preds = %entry
777+
%start.1 = or i8 %start, 1
778+
%f.1 = icmp uge i8 %start.1, %high
779+
call void @use(i1 %f.1)
780+
%start.2 = or i8 %start, 2
781+
%f.2 = icmp uge i8 %start.2, %high
782+
call void @use(i1 %f.2)
783+
%start.3 = or i8 %start, 3
784+
%f.3 = icmp uge i8 %start.3, %high
785+
call void @use(i1 %f.3)
786+
%start.4 = or i8 %start, 4
787+
%c.4 = icmp uge i8 %start.4, %high
788+
call void @use(i1 %c.4)
789+
%start.5 = or i8 %start, 5
790+
%c.5 = icmp uge i8 %start.5, %high
791+
call void @use(i1 %c.5)
792+
793+
ret void
794+
}

0 commit comments

Comments
 (0)