@@ -100,9 +100,10 @@ define <3 x i4> @partial_undef_vec() {
100100
101101define i32 @early_freeze_test1 (i32 %x , i32 %y ) {
102102; CHECK-LABEL: @early_freeze_test1(
103- ; CHECK-NEXT: [[V1:%.*]] = add i32 [[X:%.*]], [[Y:%.*]]
104- ; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
105- ; CHECK-NEXT: [[V2:%.*]] = shl i32 [[V1_FR]], 1
103+ ; CHECK-NEXT: [[X_FR:%.*]] = freeze i32 [[X:%.*]]
104+ ; CHECK-NEXT: [[Y_FR:%.*]] = freeze i32 [[Y:%.*]]
105+ ; CHECK-NEXT: [[V1:%.*]] = add i32 [[X_FR]], [[Y_FR]]
106+ ; CHECK-NEXT: [[V2:%.*]] = shl i32 [[V1]], 1
106107; CHECK-NEXT: [[V3:%.*]] = and i32 [[V2]], 2
107108; CHECK-NEXT: ret i32 [[V3]]
108109;
@@ -144,9 +145,9 @@ define i32 @early_freeze_test3(i32 %v1) {
144145
145146define i32 @early_freeze_test4 (i32 %v1 ) {
146147; CHECK-LABEL: @early_freeze_test4(
147- ; CHECK-NEXT: [[V2_FR :%.*]] = freeze i32 [[V2 :%.*]]
148- ; CHECK-NEXT: [[V3 :%.*]] = mul i32 [[V2_FR ]], [[V2_FR ]]
149- ; CHECK-NEXT: ret i32 [[V3 ]]
148+ ; CHECK-NEXT: [[V1_FR :%.*]] = freeze i32 [[V1 :%.*]]
149+ ; CHECK-NEXT: [[V2 :%.*]] = mul i32 [[V1_FR ]], [[V1_FR ]]
150+ ; CHECK-NEXT: ret i32 [[V2 ]]
150151;
151152 %v2 = mul i32 %v1 , %v1
152153 %v2.fr = freeze i32 %v2
@@ -889,18 +890,18 @@ exit: ; preds = %loop
889890}
890891
891892; 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 .
893+ ; be pushed through to the ptr.
893894define void @fold_phi_gep_phi_offset (ptr %init , ptr %end , i64 noundef %n ) {
894895; CHECK-LABEL: @fold_phi_gep_phi_offset(
895896; CHECK-NEXT: entry:
897+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze ptr [[INIT:%.*]]
896898; CHECK-NEXT: br label [[LOOP:%.*]]
897899; CHECK: loop:
898- ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT:%.* ]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR :%.*]], [[LOOP]] ]
900+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0 ]], [[ENTRY:%.*]] ], [ [[I_NEXT :%.*]], [[LOOP]] ]
899901; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N:%.*]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
900902; 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]]
903- ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END:%.*]]
903+ ; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
904+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END:%.*]]
904905; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
905906; CHECK: exit:
906907; CHECK-NEXT: ret void
@@ -921,19 +922,19 @@ exit: ; preds = %loop
921922 ret void
922923}
923924
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 .
925+ ; Offset is still guaranteed not to be poison, so the freeze can be moved
926+ ; here if we strip inbounds from the GEP.
926927define void @fold_phi_gep_inbounds_phi_offset (ptr %init , ptr %end , i64 noundef %n ) {
927928; CHECK-LABEL: @fold_phi_gep_inbounds_phi_offset(
928929; CHECK-NEXT: entry:
930+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze ptr [[INIT:%.*]]
929931; CHECK-NEXT: br label [[LOOP:%.*]]
930932; CHECK: loop:
931- ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT:%.* ]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR :%.*]], [[LOOP]] ]
933+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0 ]], [[ENTRY:%.*]] ], [ [[I_NEXT :%.*]], [[LOOP]] ]
932934; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N:%.*]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
933935; 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]]
936- ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END:%.*]]
936+ ; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
937+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END:%.*]]
937938; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
938939; CHECK: exit:
939940; CHECK-NEXT: ret void
@@ -954,18 +955,19 @@ exit: ; preds = %loop
954955 ret void
955956}
956957
957- ; GEP can produce poison, check freeze isn't moved .
958- define void @cant_fold_phi_gep_phi_offset (ptr %init , ptr %end , i64 %n ) {
959- ; CHECK-LABEL: @cant_fold_phi_gep_phi_offset (
958+ ; Same as previous, but also requires freezing %n .
959+ define void @fold_phi_gep_phi_offset_multiple (ptr %init , ptr %end , i64 %n ) {
960+ ; CHECK-LABEL: @fold_phi_gep_phi_offset_multiple (
960961; CHECK-NEXT: entry:
962+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze ptr [[INIT:%.*]]
963+ ; CHECK-NEXT: [[TMP1:%.*]] = freeze i64 [[N:%.*]]
961964; CHECK-NEXT: br label [[LOOP:%.*]]
962965; CHECK: loop:
963- ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT:%.* ]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR :%.*]], [[LOOP]] ]
964- ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N:%.* ]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
966+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0 ]], [[ENTRY:%.*]] ], [ [[I_NEXT :%.*]], [[LOOP]] ]
967+ ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[TMP1 ]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
965968; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
966- ; CHECK-NEXT: [[I_NEXT:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 [[OFF_NEXT]]
967- ; CHECK-NEXT: [[I_NEXT_FR]] = freeze ptr [[I_NEXT]]
968- ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END:%.*]]
969+ ; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
970+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END:%.*]]
969971; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
970972; CHECK: exit:
971973; CHECK-NEXT: ret void
0 commit comments