@@ -827,3 +827,89 @@ loop.latch:
827
827
exit:
828
828
ret i32 10
829
829
}
830
+
831
+ define i32 @no_partial_unswitch_true_successor_exit (i32* %ptr , i32 %N ) {
832
+ ; CHECK-LABEL: @no_partial_unswitch_true_successor_exit
833
+ ; CHECK-LABEL: entry:
834
+ ; CHECK-NEXT: [[LV:%[0-9]+]] = load i32, i32* %ptr, align 4
835
+ ; CHECK-NEXT: [[C:%[0-9]+]] = icmp eq i32 [[LV]], 100
836
+ ; CHECK-NEXT: br i1 [[C]],
837
+ ;
838
+ entry:
839
+ br label %loop.header
840
+
841
+ loop.header:
842
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
843
+ %lv = load i32 , i32* %ptr
844
+ %sc = icmp eq i32 %lv , 100
845
+ br i1 %sc , label %exit , label %clobber
846
+
847
+ clobber:
848
+ call void @clobber ()
849
+ br label %loop.latch
850
+
851
+ loop.latch:
852
+ %c = icmp ult i32 %iv , %N
853
+ %iv.next = add i32 %iv , 1
854
+ br i1 %c , label %loop.header , label %exit
855
+
856
+ exit:
857
+ ret i32 10
858
+ }
859
+
860
+ define i32 @no_partial_unswitch_true_same_successor (i32* %ptr , i32 %N ) {
861
+ ; CHECK-LABEL: @no_partial_unswitch_true_same_successor
862
+ ; CHECK-LABEL: entry:
863
+ ; CHECK-NEXT: [[LV:%[0-9]+]] = load i32, i32* %ptr, align 4
864
+ ; CHECK-NEXT: [[C:%[0-9]+]] = icmp eq i32 [[LV]], 100
865
+ ; CHECK-NEXT: br i1 [[C]],
866
+ ;
867
+ entry:
868
+ br label %loop.header
869
+
870
+ loop.header:
871
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
872
+ %lv = load i32 , i32* %ptr
873
+ %sc = icmp eq i32 %lv , 100
874
+ br i1 %sc , label %noclobber , label %noclobber
875
+
876
+ noclobber:
877
+ br label %loop.latch
878
+
879
+ loop.latch:
880
+ %c = icmp ult i32 %iv , %N
881
+ %iv.next = add i32 %iv , 1
882
+ br i1 %c , label %loop.header , label %exit
883
+
884
+ exit:
885
+ ret i32 10
886
+ }
887
+
888
+ define i32 @partial_unswitch_true_to_latch (i32* %ptr , i32 %N ) {
889
+ ; CHECK-LABEL: @partial_unswitch_true_to_latch
890
+ ; CHECK-LABEL: entry:
891
+ ; CHECK-NEXT: [[LV:%[0-9]+]] = load i32, i32* %ptr, align 4
892
+ ; CHECK-NEXT: [[C:%[0-9]+]] = icmp eq i32 [[LV]], 100
893
+ ; CHECK-NEXT: br i1 [[C]],
894
+ ;
895
+ entry:
896
+ br label %loop.header
897
+
898
+ loop.header:
899
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
900
+ %lv = load i32 , i32* %ptr
901
+ %sc = icmp eq i32 %lv , 100
902
+ br i1 %sc , label %loop.latch , label %clobber
903
+
904
+ clobber:
905
+ call void @clobber ()
906
+ br label %loop.latch
907
+
908
+ loop.latch:
909
+ %c = icmp ult i32 %iv , %N
910
+ %iv.next = add i32 %iv , 1
911
+ br i1 %c , label %loop.header , label %exit
912
+
913
+ exit:
914
+ ret i32 10
915
+ }
0 commit comments