Skip to content

Commit 66839d8

Browse files
committed
Add bitwise and or tests
1 parent fd7be0d commit 66839d8

File tree

2 files changed

+272
-0
lines changed

2 files changed

+272
-0
lines changed

llvm/test/Transforms/ConstraintElimination/and.ll

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,3 +603,139 @@ exit:
603603

604604
ret i1 %r.10
605605
}
606+
607+
define void @test_decompose_bitwise_and(i4 %x, i4 %y) {
608+
; CHECK-LABEL: @test_decompose_bitwise_and(
609+
; CHECK-NEXT: entry:
610+
; CHECK-NEXT: [[TMP0:%.*]] = and i4 [[Y:%.*]], [[X:%.*]]
611+
; CHECK-NEXT: [[AND:%.*]] = icmp slt i4 [[TMP0]], 0
612+
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[EXIT:%.*]]
613+
; CHECK: bb1:
614+
; CHECK-NEXT: [[F_1:%.*]] = icmp slt i4 [[X]], 0
615+
; CHECK-NEXT: [[F_2:%.*]] = icmp slt i4 [[Y]], 0
616+
; CHECK-NEXT: call void @use(i1 [[F_1]])
617+
; CHECK-NEXT: call void @use(i1 [[F_2]])
618+
; CHECK-NEXT: ret void
619+
; CHECK: exit:
620+
; CHECK-NEXT: ret void
621+
;
622+
entry:
623+
%1 = and i4 %y, %x
624+
%and = icmp slt i4 %1, 0
625+
br i1 %and, label %bb1, label %exit
626+
627+
bb1:
628+
%f.1 = icmp slt i4 %x, 0
629+
%f.2 = icmp slt i4 %y, 0
630+
call void @use(i1 %f.1)
631+
call void @use(i1 %f.2)
632+
ret void
633+
634+
exit:
635+
ret void
636+
}
637+
638+
define i1 @test_decompose_bitwise_and2(i4 %x, i4 %y) {
639+
; CHECK-LABEL: @test_decompose_bitwise_and2(
640+
; CHECK-NEXT: entry:
641+
; CHECK-NEXT: [[TMP0:%.*]] = and i4 [[X:%.*]], [[Y:%.*]]
642+
; CHECK-NEXT: [[AND_NOT:%.*]] = icmp sgt i4 [[TMP0]], -1
643+
; CHECK-NEXT: br i1 [[AND_NOT]], label [[END:%.*]], label [[THEN:%.*]]
644+
; CHECK: then:
645+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i4 [[X]], 0
646+
; CHECK-NEXT: ret i1 [[CMP]]
647+
; CHECK: end:
648+
; CHECK-NEXT: ret i1 false
649+
;
650+
entry:
651+
%0 = and i4 %x, %y
652+
%and.not = icmp sgt i4 %0, -1
653+
br i1 %and.not, label %end, label %then
654+
655+
then:
656+
%cmp = icmp slt i4 %x, 0
657+
ret i1 %cmp
658+
659+
end:
660+
ret i1 false
661+
}
662+
663+
define void @test_decompose_nested_bitwise_and(i4 %x, i4 %y, i4 %z, i4 %w) {
664+
; CHECK-LABEL: @test_decompose_nested_bitwise_and(
665+
; CHECK-NEXT: entry:
666+
; CHECK-NEXT: [[TMP0:%.*]] = and i4 [[Y:%.*]], [[X:%.*]]
667+
; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[TMP0]], [[Z:%.*]]
668+
; CHECK-NEXT: [[TMP2:%.*]] = and i4 [[TMP1]], [[W:%.*]]
669+
; CHECK-NEXT: [[AND:%.*]] = icmp slt i4 [[TMP2]], 0
670+
; CHECK-NEXT: br i1 [[AND]], label [[BB1:%.*]], label [[EXIT:%.*]]
671+
; CHECK: bb1:
672+
; CHECK-NEXT: [[F_4:%.*]] = icmp slt i4 [[X]], 0
673+
; CHECK-NEXT: [[F_5:%.*]] = icmp slt i4 [[Y]], 0
674+
; CHECK-NEXT: [[F_6:%.*]] = icmp slt i4 [[Z]], 0
675+
; CHECK-NEXT: [[F_7:%.*]] = icmp slt i4 [[W]], 0
676+
; CHECK-NEXT: call void @use(i1 [[F_4]])
677+
; CHECK-NEXT: call void @use(i1 [[F_5]])
678+
; CHECK-NEXT: call void @use(i1 [[F_6]])
679+
; CHECK-NEXT: call void @use(i1 [[F_7]])
680+
; CHECK-NEXT: ret void
681+
; CHECK: exit:
682+
; CHECK-NEXT: ret void
683+
;
684+
entry:
685+
%1 = and i4 %y, %x
686+
%2 = and i4 %1, %z
687+
%3 = and i4 %2, %w
688+
%and = icmp slt i4 %3, 0
689+
br i1 %and, label %bb1, label %exit
690+
691+
bb1:
692+
%f.1 = icmp slt i4 %x, 0
693+
%f.2 = icmp slt i4 %y, 0
694+
%f.3 = icmp slt i4 %z, 0
695+
%f.4 = icmp slt i4 %w, 0
696+
call void @use(i1 %f.1)
697+
call void @use(i1 %f.2)
698+
call void @use(i1 %f.3)
699+
call void @use(i1 %f.4)
700+
ret void
701+
702+
exit:
703+
ret void
704+
}
705+
706+
define void @test_decompose_nested_bitwise_and2(i4 %x, i4 %y, i4 %z) {
707+
; CHECK-LABEL: @test_decompose_nested_bitwise_and2(
708+
; CHECK-NEXT: entry:
709+
; CHECK-NEXT: [[TMP0:%.*]] = and i4 [[X:%.*]], [[Y:%.*]]
710+
; CHECK-NEXT: [[TMP1:%.*]] = and i4 [[TMP0]], [[Z:%.*]]
711+
; CHECK-NEXT: [[AND_2_NOT:%.*]] = icmp sgt i4 [[TMP1]], -1
712+
; CHECK-NEXT: br i1 [[AND_2_NOT]], label [[F:%.*]], label [[T:%.*]]
713+
; CHECK: t:
714+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i4 [[X]], 0
715+
; CHECK-NEXT: call void @use(i1 [[CMP]])
716+
; CHECK-NEXT: [[CMP_2:%.*]] = icmp slt i4 [[Y]], 0
717+
; CHECK-NEXT: call void @use(i1 [[CMP_2]])
718+
; CHECK-NEXT: [[CMP_3:%.*]] = icmp slt i4 [[Z]], 0
719+
; CHECK-NEXT: call void @use(i1 [[CMP_3]])
720+
; CHECK-NEXT: ret void
721+
; CHECK: f:
722+
; CHECK-NEXT: ret void
723+
;
724+
entry:
725+
%0 = and i4 %x, %y
726+
%1 = and i4 %0, %z
727+
%and.2.not = icmp sgt i4 %1, -1
728+
br i1 %and.2.not, label %f, label %t
729+
730+
t:
731+
%cmp = icmp slt i4 %x, 0
732+
call void @use(i1 %cmp)
733+
%cmp.2 = icmp slt i4 %y, 0
734+
call void @use(i1 %cmp.2)
735+
%cmp.3 = icmp slt i4 %z, 0
736+
call void @use(i1 %cmp.3)
737+
ret void
738+
739+
f:
740+
ret void
741+
}

llvm/test/Transforms/ConstraintElimination/or.ll

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,3 +808,139 @@ end: ; preds = %entry
808808

809809
ret void
810810
}
811+
812+
define void @test_decompose_bitwise_or(i4 %x, i4 %y) {
813+
; CHECK-LABEL: @test_decompose_bitwise_or(
814+
; CHECK-NEXT: entry:
815+
; CHECK-NEXT: [[TMP0:%.*]] = or i4 [[Y:%.*]], [[X:%.*]]
816+
; CHECK-NEXT: [[OR:%.*]] = icmp slt i4 [[TMP0]], 0
817+
; CHECK-NEXT: br i1 [[OR]], label [[BB1:%.*]], label [[EXIT:%.*]]
818+
; CHECK: bb1:
819+
; CHECK-NEXT: ret void
820+
; CHECK: exit:
821+
; CHECK-NEXT: [[F_3:%.*]] = icmp sge i4 [[X]], 0
822+
; CHECK-NEXT: [[F_4:%.*]] = icmp sge i4 [[Y]], 0
823+
; CHECK-NEXT: call void @use(i1 [[F_3]])
824+
; CHECK-NEXT: call void @use(i1 [[F_4]])
825+
; CHECK-NEXT: ret void
826+
;
827+
entry:
828+
%0 = or i4 %y, %x
829+
%or = icmp slt i4 %0, 0
830+
br i1 %or, label %bb1, label %exit
831+
832+
bb1:
833+
ret void
834+
835+
exit:
836+
%f.3 = icmp sge i4 %x, 0
837+
%f.4 = icmp sge i4 %y, 0
838+
call void @use(i1 %f.3)
839+
call void @use(i1 %f.4)
840+
ret void
841+
}
842+
843+
define i1 @test_decompose_bitwise_or2(i4 %x, i4 %y) {
844+
; CHECK-LABEL: @test_decompose_bitwise_or2(
845+
; CHECK-NEXT: entry:
846+
; CHECK-NEXT: [[TMP0:%.*]] = or i4 [[X:%.*]], [[Y:%.*]]
847+
; CHECK-NEXT: [[OR_NOT:%.*]] = icmp sgt i4 [[TMP0]], -1
848+
; CHECK-NEXT: br i1 [[OR_NOT]], label [[END:%.*]], label [[THEN:%.*]]
849+
; CHECK: then:
850+
; CHECK-NEXT: ret i1 false
851+
; CHECK: end:
852+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i4 [[X]], -1
853+
; CHECK-NEXT: ret i1 [[CMP]]
854+
;
855+
entry:
856+
%0 = or i4 %x, %y
857+
%or.not = icmp sgt i4 %0, -1
858+
br i1 %or.not, label %end, label %then
859+
860+
then:
861+
ret i1 false
862+
863+
end:
864+
%cmp = icmp sgt i4 %x, -1
865+
ret i1 %cmp
866+
}
867+
868+
define void @test_decompose_nested_bitwise_or(i4 %x, i4 %y, i4 %z, i4 %w) {
869+
; CHECK-LABEL: @test_decompose_nested_bitwise_or(
870+
; CHECK-NEXT: entry:
871+
; CHECK-NEXT: [[TMP0:%.*]] = or i4 [[Y:%.*]], [[X:%.*]]
872+
; CHECK-NEXT: [[TMP1:%.*]] = or i4 [[TMP0]], [[Z:%.*]]
873+
; CHECK-NEXT: [[TMP2:%.*]] = or i4 [[TMP1]], [[W:%.*]]
874+
; CHECK-NEXT: [[OR:%.*]] = icmp slt i4 [[TMP2]], 0
875+
; CHECK-NEXT: br i1 [[OR]], label [[BB1:%.*]], label [[EXIT:%.*]]
876+
; CHECK: bb1:
877+
; CHECK-NEXT: ret void
878+
; CHECK: exit:
879+
; CHECK-NEXT: [[F_4:%.*]] = icmp sge i4 [[X]], 0
880+
; CHECK-NEXT: [[F_5:%.*]] = icmp sge i4 [[Y]], 0
881+
; CHECK-NEXT: [[F_6:%.*]] = icmp sge i4 [[Z]], 0
882+
; CHECK-NEXT: [[F_7:%.*]] = icmp sge i4 [[W]], 0
883+
; CHECK-NEXT: call void @use(i1 [[F_4]])
884+
; CHECK-NEXT: call void @use(i1 [[F_5]])
885+
; CHECK-NEXT: call void @use(i1 [[F_6]])
886+
; CHECK-NEXT: call void @use(i1 [[F_7]])
887+
; CHECK-NEXT: ret void
888+
;
889+
entry:
890+
%1 = or i4 %y, %x
891+
%2 = or i4 %1, %z
892+
%3 = or i4 %2, %w
893+
%or = icmp slt i4 %3, 0
894+
br i1 %or, label %bb1, label %exit
895+
896+
bb1:
897+
ret void
898+
899+
exit:
900+
%f.4 = icmp sge i4 %x, 0
901+
%f.5 = icmp sge i4 %y, 0
902+
%f.6 = icmp sge i4 %z, 0
903+
%f.7 = icmp sge i4 %w, 0
904+
call void @use(i1 %f.4)
905+
call void @use(i1 %f.5)
906+
call void @use(i1 %f.6)
907+
call void @use(i1 %f.7)
908+
ret void
909+
}
910+
911+
define void @test_decompose_nested_bitwise_or2(i4 %x, i4 %y, i4 %z) {
912+
; CHECK-LABEL: @test_decompose_nested_bitwise_or2(
913+
; CHECK-NEXT: entry:
914+
; CHECK-NEXT: [[TMP0:%.*]] = or i4 [[X:%.*]], [[Y:%.*]]
915+
; CHECK-NEXT: [[TMP1:%.*]] = or i4 [[TMP0]], [[Z:%.*]]
916+
; CHECK-NEXT: [[OR_2_NOT:%.*]] = icmp sgt i4 [[TMP1]], -1
917+
; CHECK-NEXT: br i1 [[OR_2_NOT]], label [[F:%.*]], label [[T:%.*]]
918+
; CHECK: t:
919+
; CHECK-NEXT: ret void
920+
; CHECK: f:
921+
; CHECK-NEXT: [[CMP_1:%.*]] = icmp sgt i4 [[X]], -1
922+
; CHECK-NEXT: call void @use(i1 [[CMP_1]])
923+
; CHECK-NEXT: [[CMP_2:%.*]] = icmp sgt i4 [[Y]], -1
924+
; CHECK-NEXT: call void @use(i1 [[CMP_2]])
925+
; CHECK-NEXT: [[CMP_3:%.*]] = icmp sgt i4 [[Z]], -1
926+
; CHECK-NEXT: call void @use(i1 [[CMP_3]])
927+
; CHECK-NEXT: ret void
928+
;
929+
entry:
930+
%0 = or i4 %x, %y
931+
%1 = or i4 %0, %z
932+
%or.2.not = icmp sgt i4 %1, -1
933+
br i1 %or.2.not, label %f, label %t
934+
935+
t: ; preds = %entry
936+
ret void
937+
938+
f: ; preds = %entry
939+
%cmp.1 = icmp sgt i4 %x, -1
940+
call void @use(i1 %cmp.1)
941+
%cmp.2 = icmp sgt i4 %y, -1
942+
call void @use(i1 %cmp.2)
943+
%cmp.3 = icmp sgt i4 %z, -1
944+
call void @use(i1 %cmp.3)
945+
ret void
946+
}

0 commit comments

Comments
 (0)