@@ -106,11 +106,11 @@ define <3 x i4> @partial_undef_vec() {
106
106
; Move the freeze forward to prevent poison from spreading.
107
107
108
108
define 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
114
114
; CHECK-NEXT: [[V3:%.*]] = and i32 [[V2]], 2
115
115
; CHECK-NEXT: ret i32 [[V3]]
116
116
;
@@ -153,9 +153,8 @@ define i32 @early_freeze_test3(i32 %v1) {
153
153
}
154
154
155
155
define 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:%.*]]
159
158
; CHECK-NEXT: [[V2:%.*]] = mul i32 [[V1_FR]], [[V1_FR]]
160
159
; CHECK-NEXT: ret i32 [[V2]]
161
160
;
@@ -938,21 +937,20 @@ exit: ; preds = %loop
938
937
}
939
938
940
939
; 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.
942
941
define 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]] ]
950
949
; 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:
956
954
; CHECK-NEXT: ret void
957
955
;
958
956
entry:
@@ -971,22 +969,21 @@ exit: ; preds = %loop
971
969
ret void
972
970
}
973
971
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.
976
974
define 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]] ]
984
982
; 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:
990
987
; CHECK-NEXT: ret void
991
988
;
992
989
entry:
@@ -1005,21 +1002,21 @@ exit: ; preds = %loop
1005
1002
ret void
1006
1003
}
1007
1004
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]] ]
1017
1015
; 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:
1023
1020
; CHECK-NEXT: ret void
1024
1021
;
1025
1022
entry:
0 commit comments