@@ -106,11 +106,11 @@ define <3 x i4> @partial_undef_vec() {
106106; Move the freeze forward to prevent poison from spreading.
107107
108108define i32 @early_freeze_test1 (i32 %x , i32 %y ) {
109- ; CHECK-LABEL: define i32 @early_freeze_test1(
110- ; CHECK-SAME: i32 [[X :%.*]], i32 [[Y :%.*]]) {
111- ; CHECK-NEXT: [[V1 :%.*]] = add i32 [[X]], [[Y ]]
112- ; CHECK-NEXT: [[V1_FR :%.*]] = freeze i32 [[V1 ]]
113- ; CHECK-NEXT: [[V2:%.*]] = shl i32 [[V1_FR ]], 1
109+ ; CHECK-LABEL: @early_freeze_test1(
110+ ; CHECK-NEXT: [[X_FR :%.*]] = freeze i32 [[X :%.*]]
111+ ; CHECK-NEXT: [[Y_FR :%.*]] = freeze i32 [[Y:%.* ]]
112+ ; CHECK-NEXT: [[V1 :%.*]] = add i32 [[X_FR]], [[Y_FR ]]
113+ ; CHECK-NEXT: [[V2:%.*]] = shl i32 [[V1 ]], 1
114114; CHECK-NEXT: [[V3:%.*]] = and i32 [[V2]], 2
115115; CHECK-NEXT: ret i32 [[V3]]
116116;
@@ -153,9 +153,8 @@ define i32 @early_freeze_test3(i32 %v1) {
153153}
154154
155155define i32 @early_freeze_test4 (i32 %v1 ) {
156- ; CHECK-LABEL: define i32 @early_freeze_test4(
157- ; CHECK-SAME: i32 [[V1:%.*]]) {
158- ; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
156+ ; CHECK-LABEL: @early_freeze_test4(
157+ ; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1:%.*]]
159158; CHECK-NEXT: [[V2:%.*]] = mul i32 [[V1_FR]], [[V1_FR]]
160159; CHECK-NEXT: ret i32 [[V2]]
161160;
@@ -938,21 +937,20 @@ exit: ; preds = %loop
938937}
939938
940939; The recurrence for the GEP offset can't produce poison so the freeze should
941- ; be pushed through to the ptr, but this is not currently supported .
940+ ; be pushed through to the ptr.
942941define void @fold_phi_gep_phi_offset (ptr %init , ptr %end , i64 noundef %n ) {
943- ; CHECK-LABEL: define void @fold_phi_gep_phi_offset(
944- ; CHECK-SAME: ptr [[INIT:%.*]], ptr [[END:%.*]], i64 noundef [[N:%.*]]) {
945- ; CHECK-NEXT: [[ENTRY: .*]]:
946- ; CHECK-NEXT: br label % [[LOOP:.*]]
947- ; CHECK: [[LOOP]] :
948- ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT ]], % [[ENTRY]] ], [ [[I_NEXT_FR :%.*]], % [[LOOP]] ]
949- ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N]], % [[ENTRY]] ], [ [[OFF_NEXT:%.*]], % [[LOOP]] ]
942+ ; CHECK-LABEL: @fold_phi_gep_phi_offset(
943+ ; CHECK-NEXT: entry:
944+ ; CHECK-NEXT: [[TMP0:% .*]] = freeze ptr [[INIT:%.*]]
945+ ; CHECK-NEXT: br label [[LOOP:% .*]]
946+ ; CHECK: loop :
947+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0 ]], [[ENTRY:%.* ]] ], [ [[I_NEXT :%.*]], [[LOOP]] ]
948+ ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N:%.* ]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
950949; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
951- ; CHECK-NEXT: [[I_NEXT:%.*]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
952- ; CHECK-NEXT: [[I_NEXT_FR]] = freeze ptr [[I_NEXT]]
953- ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END]]
954- ; CHECK-NEXT: br i1 [[COND]], label %[[LOOP]], label %[[EXIT:.*]]
955- ; CHECK: [[EXIT]]:
950+ ; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
951+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END:%.*]]
952+ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
953+ ; CHECK: exit:
956954; CHECK-NEXT: ret void
957955;
958956entry:
@@ -971,22 +969,21 @@ exit: ; preds = %loop
971969 ret void
972970}
973971
974- ; Offset is still guaranteed not to be poison, so the freeze could be moved
975- ; here if we strip inbounds from the GEP, but this is not currently supported .
972+ ; Offset is still guaranteed not to be poison, so the freeze can be moved
973+ ; here if we strip inbounds from the GEP.
976974define void @fold_phi_gep_inbounds_phi_offset (ptr %init , ptr %end , i64 noundef %n ) {
977- ; CHECK-LABEL: define void @fold_phi_gep_inbounds_phi_offset(
978- ; CHECK-SAME: ptr [[INIT:%.*]], ptr [[END:%.*]], i64 noundef [[N:%.*]]) {
979- ; CHECK-NEXT: [[ENTRY: .*]]:
980- ; CHECK-NEXT: br label % [[LOOP:.*]]
981- ; CHECK: [[LOOP]] :
982- ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT ]], % [[ENTRY]] ], [ [[I_NEXT_FR :%.*]], % [[LOOP]] ]
983- ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N]], % [[ENTRY]] ], [ [[OFF_NEXT:%.*]], % [[LOOP]] ]
975+ ; CHECK-LABEL: @fold_phi_gep_inbounds_phi_offset(
976+ ; CHECK-NEXT: entry:
977+ ; CHECK-NEXT: [[TMP0:% .*]] = freeze ptr [[INIT:%.*]]
978+ ; CHECK-NEXT: br label [[LOOP:% .*]]
979+ ; CHECK: loop :
980+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0 ]], [[ENTRY:%.* ]] ], [ [[I_NEXT :%.*]], [[LOOP]] ]
981+ ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N:%.* ]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
984982; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
985- ; CHECK-NEXT: [[I_NEXT:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 [[OFF_NEXT]]
986- ; CHECK-NEXT: [[I_NEXT_FR]] = freeze ptr [[I_NEXT]]
987- ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END]]
988- ; CHECK-NEXT: br i1 [[COND]], label %[[LOOP]], label %[[EXIT:.*]]
989- ; CHECK: [[EXIT]]:
983+ ; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
984+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END:%.*]]
985+ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
986+ ; CHECK: exit:
990987; CHECK-NEXT: ret void
991988;
992989entry:
@@ -1005,21 +1002,21 @@ exit: ; preds = %loop
10051002 ret void
10061003}
10071004
1008- ; GEP can produce poison, check freeze isn't moved.
1009- define void @cant_fold_phi_gep_phi_offset (ptr %init , ptr %end , i64 %n ) {
1010- ; CHECK-LABEL: define void @cant_fold_phi_gep_phi_offset(
1011- ; CHECK-SAME: ptr [[INIT:%.*]], ptr [[END:%.*]], i64 [[N:%.*]]) {
1012- ; CHECK-NEXT: [[ENTRY:.*]]:
1013- ; CHECK-NEXT: br label %[[LOOP:.*]]
1014- ; CHECK: [[LOOP]]:
1015- ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[INIT]], %[[ENTRY]] ], [ [[I_NEXT_FR:%.*]], %[[LOOP]] ]
1016- ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[N]], %[[ENTRY]] ], [ [[OFF_NEXT:%.*]], %[[LOOP]] ]
1005+ ; Same as previous, but also requires freezing %n.
1006+ define void @fold_phi_gep_phi_offset_multiple (ptr %init , ptr %end , i64 %n ) {
1007+ ; CHECK-LABEL: @fold_phi_gep_phi_offset_multiple(
1008+ ; CHECK-NEXT: entry:
1009+ ; CHECK-NEXT: [[TMP0:%.*]] = freeze ptr [[INIT:%.*]]
1010+ ; CHECK-NEXT: [[TMP1:%.*]] = freeze i64 [[N:%.*]]
1011+ ; CHECK-NEXT: br label [[LOOP:%.*]]
1012+ ; CHECK: loop:
1013+ ; CHECK-NEXT: [[I:%.*]] = phi ptr [ [[TMP0]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]
1014+ ; CHECK-NEXT: [[OFF:%.*]] = phi i64 [ [[TMP1]], [[ENTRY]] ], [ [[OFF_NEXT:%.*]], [[LOOP]] ]
10171015; CHECK-NEXT: [[OFF_NEXT]] = shl i64 [[OFF]], 3
1018- ; CHECK-NEXT: [[I_NEXT:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 [[OFF_NEXT]]
1019- ; CHECK-NEXT: [[I_NEXT_FR]] = freeze ptr [[I_NEXT]]
1020- ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END]]
1021- ; CHECK-NEXT: br i1 [[COND]], label %[[LOOP]], label %[[EXIT:.*]]
1022- ; CHECK: [[EXIT]]:
1016+ ; CHECK-NEXT: [[I_NEXT]] = getelementptr i8, ptr [[I]], i64 [[OFF_NEXT]]
1017+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[I_NEXT]], [[END:%.*]]
1018+ ; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
1019+ ; CHECK: exit:
10231020; CHECK-NEXT: ret void
10241021;
10251022entry:
0 commit comments