@@ -889,17 +889,17 @@ exit: ; preds = %loop
889889}
890890
891891; The recurrence for the GEP offset can't produce poison so the freeze should
892- ; be pushed through to the ptr, but this is not currently supported .
892+ ; be pushed through to the ptr.
893893define void @fold_phi_gep_phi_offset (ptr %init , ptr %end , i64 noundef %n ) {
894894; CHECK-LABEL: @fold_phi_gep_phi_offset(
895895; CHECK-NEXT: entry:
896+ ; CHECK-NEXT: [[INIT:%.*]] = freeze ptr [[INIT1:%.*]]
896897; CHECK-NEXT: br label [[LOOP:%.*]]
897898; CHECK: loop:
898- ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT:%.* ]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR:%.*]], [[LOOP]] ]
899+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR:%.*]], [[LOOP]] ]
899900; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N:%.*]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
900901; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
901- ; CHECK-NEXT: [[I_NEXT:%.*]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
902- ; CHECK-NEXT: [[I_NEXT_FR]] = freeze ptr [[I_NEXT]]
902+ ; CHECK-NEXT: [[I_NEXT_FR]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
903903; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END:%.*]]
904904; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
905905; CHECK: exit:
@@ -921,18 +921,18 @@ exit: ; preds = %loop
921921 ret void
922922}
923923
924- ; Offset is still guaranteed not to be poison, so the freeze could be moved
925- ; here if we strip inbounds from the GEP, but this is not currently supported .
924+ ; Offset is still guaranteed not to be poison, so the freeze can be moved
925+ ; here if we strip inbounds from the GEP.
926926define void @fold_phi_gep_inbounds_phi_offset (ptr %init , ptr %end , i64 noundef %n ) {
927927; CHECK-LABEL: @fold_phi_gep_inbounds_phi_offset(
928928; CHECK-NEXT: entry:
929+ ; CHECK-NEXT: [[INIT:%.*]] = freeze ptr [[INIT1:%.*]]
929930; CHECK-NEXT: br label [[LOOP:%.*]]
930931; CHECK: loop:
931- ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT:%.* ]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR:%.*]], [[LOOP]] ]
932+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR:%.*]], [[LOOP]] ]
932933; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N:%.*]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
933934; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
934- ; CHECK-NEXT: [[I_NEXT:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 [[OFF_NEXT]]
935- ; CHECK-NEXT: [[I_NEXT_FR]] = freeze ptr [[I_NEXT]]
935+ ; CHECK-NEXT: [[I_NEXT_FR]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
936936; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END:%.*]]
937937; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
938938; CHECK: exit:
@@ -994,7 +994,7 @@ define void @fold_phi_multiple_insts(i32 %init, i32 %n) {
994994; CHECK: loop:
995995; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[INIT_FR]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
996996; CHECK-NEXT: [[I_SQ:%.*]] = mul i32 [[I]], [[I]]
997- ; CHECK-NEXT: [[I_NEXT]] = add i32 [[I_SQ]], 1
997+ ; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i32 [[I_SQ]], 1
998998; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]
999999; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
10001000; CHECK: exit:
@@ -1127,7 +1127,7 @@ define void @fold_phi_invoke_noundef_start_value(i32 %n) personality ptr undef {
11271127; CHECK-NEXT: to label [[LOOP:%.*]] unwind label [[UNWIND:%.*]]
11281128; CHECK: loop:
11291129; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[INIT]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
1130- ; CHECK-NEXT: [[I_NEXT]] = add i32 [[I]], 1
1130+ ; CHECK-NEXT: [[I_NEXT]] = add nuw nsw i32 [[I]], 1
11311131; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]
11321132; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
11331133; CHECK: unwind:
0 commit comments