@@ -740,8 +740,8 @@ exit: ; preds = %loop
740
740
ret void
741
741
}
742
742
743
- define void @fold_phi_neg_flags (i32 %init , i32 %n ) {
744
- ; CHECK-LABEL: @fold_phi_neg_flags (
743
+ define void @fold_phi_drop_flags (i32 %init , i32 %n ) {
744
+ ; CHECK-LABEL: @fold_phi_drop_flags (
745
745
; CHECK-NEXT: entry:
746
746
; CHECK-NEXT: br label [[LOOP:%.*]]
747
747
; CHECK: loop:
@@ -917,6 +917,80 @@ exit:
917
917
ret void
918
918
}
919
919
920
+ define void @fold_phi_invoke_start_value (i32 %n ) personality i8* undef {
921
+ ; CHECK-LABEL: @fold_phi_invoke_start_value(
922
+ ; CHECK-NEXT: entry:
923
+ ; CHECK-NEXT: [[INIT:%.*]] = invoke i32 @get_i32()
924
+ ; CHECK-NEXT: to label [[LOOP:%.*]] unwind label [[UNWIND:%.*]]
925
+ ; CHECK: loop:
926
+ ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[INIT]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
927
+ ; CHECK-NEXT: [[I_FR:%.*]] = freeze i32 [[I]]
928
+ ; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i32 [[I_FR]], 1
929
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]
930
+ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
931
+ ; CHECK: unwind:
932
+ ; CHECK-NEXT: [[TMP0:%.*]] = landingpad i8
933
+ ; CHECK-NEXT: cleanup
934
+ ; CHECK-NEXT: unreachable
935
+ ; CHECK: exit:
936
+ ; CHECK-NEXT: ret void
937
+ ;
938
+ entry:
939
+ %init = invoke i32 @get_i32 ()
940
+ to label %loop unwind label %unwind
941
+
942
+ loop:
943
+ %i = phi i32 [ %init , %entry ], [ %i.next , %loop ]
944
+ %i.fr = freeze i32 %i
945
+ %i.next = add nsw nuw i32 %i.fr , 1
946
+ %cond = icmp eq i32 %i.next , %n
947
+ br i1 %cond , label %loop , label %exit
948
+
949
+ unwind:
950
+ landingpad i8 cleanup
951
+ unreachable
952
+
953
+ exit:
954
+ ret void
955
+ }
956
+
957
+ define void @fold_phi_invoke_noundef_start_value (i32 %n ) personality i8* undef {
958
+ ; CHECK-LABEL: @fold_phi_invoke_noundef_start_value(
959
+ ; CHECK-NEXT: entry:
960
+ ; CHECK-NEXT: [[INIT:%.*]] = invoke noundef i32 @get_i32()
961
+ ; CHECK-NEXT: to label [[LOOP:%.*]] unwind label [[UNWIND:%.*]]
962
+ ; CHECK: loop:
963
+ ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[INIT]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
964
+ ; CHECK-NEXT: [[I_FR:%.*]] = freeze i32 [[I]]
965
+ ; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i32 [[I_FR]], 1
966
+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]
967
+ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
968
+ ; CHECK: unwind:
969
+ ; CHECK-NEXT: [[TMP0:%.*]] = landingpad i8
970
+ ; CHECK-NEXT: cleanup
971
+ ; CHECK-NEXT: unreachable
972
+ ; CHECK: exit:
973
+ ; CHECK-NEXT: ret void
974
+ ;
975
+ entry:
976
+ %init = invoke noundef i32 @get_i32 ()
977
+ to label %loop unwind label %unwind
978
+
979
+ loop:
980
+ %i = phi i32 [ %init , %entry ], [ %i.next , %loop ]
981
+ %i.fr = freeze i32 %i
982
+ %i.next = add nsw nuw i32 %i.fr , 1
983
+ %cond = icmp eq i32 %i.next , %n
984
+ br i1 %cond , label %loop , label %exit
985
+
986
+ unwind:
987
+ landingpad i8 cleanup
988
+ unreachable
989
+
990
+ exit:
991
+ ret void
992
+ }
993
+
920
994
define i8* @freeze_load_noundef (i8** %ptr ) {
921
995
; CHECK-LABEL: @freeze_load_noundef(
922
996
; CHECK-NEXT: [[P:%.*]] = load i8*, i8** [[PTR:%.*]], align 8, !noundef !0
0 commit comments