@@ -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