@@ -147,62 +147,27 @@ final:
147147 ret <4 x i8 > %phi
148148}
149149
150- define i32 @multi_use_one_folds_one_not (i1 %c0 , i1 %c1 ) {
151- ; CHECK-LABEL: define i32 @multi_use_one_folds_one_not(
152- ; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {
153- ; CHECK-NEXT: [[ENTRY:.*:]]
154- ; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]
155- ; CHECK: [[BB_FREEZE]]:
156- ; CHECK-NEXT: br label %[[MID:.*]]
157- ; CHECK: [[BB_OTHER]]:
158- ; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]
159- ; CHECK: [[CA]]:
160- ; CHECK-NEXT: br label %[[MID]]
161- ; CHECK: [[CB]]:
162- ; CHECK-NEXT: br label %[[MID]]
163- ; CHECK: [[MID]]:
164- ; CHECK-NEXT: [[A:%.*]] = phi i32 [ 2, %[[BB_FREEZE]] ], [ 4, %[[CA]] ], [ 3, %[[CB]] ]
165- ; CHECK-NEXT: ret i32 [[A]]
166- ;
167- entry:
168- br i1 %c0 , label %bb_freeze , label %bb_other
169- bb_freeze:
170- %f = freeze i32 undef
171- br label %mid
172- bb_other:
173- br i1 %c1 , label %cA , label %cB
174- cA:
175- br label %mid
176- cB:
177- br label %mid
178- mid:
179- %phi_fold = phi i32 [ %f , %bb_freeze ], [ 1 , %cA ], [ 1 , %cB ]
180- %phi_nofld = phi i32 [ %f , %bb_freeze ], [ 3 , %cA ], [ 2 , %cB ]
181- %a = add i32 %phi_fold , %phi_nofld
182- ret i32 %a
183- }
184-
185150define i32 @multi_use_one_folds_one_not_zero (i1 %c0 , i1 %c1 , i1 %c2 ) {
186151; CHECK-LABEL: define i32 @multi_use_one_folds_one_not_zero(
187152; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]]) {
188153; CHECK-NEXT: [[ENTRY:.*:]]
189- ; CHECK-NEXT: br i1 [[C0]], label %[[BB_OTHER3 :.*]], label %[[CC1 :.*]]
190- ; CHECK: [[BB_OTHER3 ]]:
154+ ; CHECK-NEXT: br i1 [[C0]], label %[[BB_OTHER2 :.*]], label %[[CC :.*]]
155+ ; CHECK: [[BB_OTHER2 ]]:
191156; CHECK-NEXT: br label %[[MID:.*]]
192- ; CHECK: [[CC1 ]]:
157+ ; CHECK: [[CC ]]:
193158; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]
194159; CHECK: [[CA]]:
195160; CHECK-NEXT: br label %[[MID]]
196161; CHECK: [[CB]]:
197162; CHECK-NEXT: br label %[[MID]]
198163; CHECK: [[MID]]:
199- ; CHECK-NEXT: [[PHI_FOLD:%.*]] = phi i32 [ 0, %[[BB_OTHER3 ]] ], [ 1, %[[CA]] ], [ 1, %[[CB]] ]
164+ ; CHECK-NEXT: [[PHI_FOLD:%.*]] = phi i32 [ 0, %[[BB_OTHER2 ]] ], [ 1, %[[CA]] ], [ 1, %[[CB]] ]
200165; CHECK-NEXT: br i1 [[C2]], label %[[BB_FREEZE2:.*]], label %[[CD:.*]]
201166; CHECK: [[BB_FREEZE2]]:
202167; CHECK-NEXT: br label %[[FINAL:.*]]
203- ; CHECK: [[BB_OTHER2 :.*:]]
168+ ; CHECK: [[BB_OTHER3 :.*:]]
204169; CHECK-NEXT: br i1 true, label %[[CA]], label %[[CB]]
205- ; CHECK: [[CC :.*:]]
170+ ; CHECK: [[CC1 :.*:]]
206171; CHECK-NEXT: br label %[[FINAL]]
207172; CHECK: [[CD]]:
208173; CHECK-NEXT: br label %[[FINAL]]
@@ -236,3 +201,73 @@ final:
236201 %a = add i32 %phi_fold , %phi_no_fold
237202 ret i32 %a
238203}
204+
205+ define i32 @phi_freeze_poison (i1 %c0 , i1 %c1 ) {
206+ ; CHECK-LABEL: define i32 @phi_freeze_poison(
207+ ; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {
208+ ; CHECK-NEXT: [[ENTRY:.*:]]
209+ ; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]
210+ ; CHECK: [[BB_FREEZE]]:
211+ ; CHECK-NEXT: br label %[[FINAL:.*]]
212+ ; CHECK: [[BB_OTHER]]:
213+ ; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]
214+ ; CHECK: [[CA]]:
215+ ; CHECK-NEXT: br label %[[FINAL]]
216+ ; CHECK: [[CB]]:
217+ ; CHECK-NEXT: br label %[[FINAL]]
218+ ; CHECK: [[FINAL]]:
219+ ; CHECK-NEXT: ret i32 0
220+ ;
221+ entry:
222+ br i1 %c0 , label %bb_freeze , label %bb_other
223+
224+ bb_freeze:
225+ %f = freeze i32 undef
226+ br label %final
227+
228+ bb_other:
229+ br i1 %c1 , label %cA , label %cB
230+ cA:
231+ br label %final
232+ cB:
233+ br label %final
234+
235+ final:
236+ %phi = phi i32 [ %f , %bb_freeze ], [ poison, %cA ], [ poison, %cB ]
237+ ret i32 %phi
238+ }
239+
240+ define i32 @phi_freeze_undef (i1 %c0 , i1 %c1 ) {
241+ ; CHECK-LABEL: define i32 @phi_freeze_undef(
242+ ; CHECK-SAME: i1 [[C0:%.*]], i1 [[C1:%.*]]) {
243+ ; CHECK-NEXT: [[ENTRY:.*:]]
244+ ; CHECK-NEXT: br i1 [[C0]], label %[[BB_FREEZE:.*]], label %[[BB_OTHER:.*]]
245+ ; CHECK: [[BB_FREEZE]]:
246+ ; CHECK-NEXT: br label %[[FINAL:.*]]
247+ ; CHECK: [[BB_OTHER]]:
248+ ; CHECK-NEXT: br i1 [[C1]], label %[[CA:.*]], label %[[CB:.*]]
249+ ; CHECK: [[CA]]:
250+ ; CHECK-NEXT: br label %[[FINAL]]
251+ ; CHECK: [[CB]]:
252+ ; CHECK-NEXT: br label %[[FINAL]]
253+ ; CHECK: [[FINAL]]:
254+ ; CHECK-NEXT: ret i32 0
255+ ;
256+ entry:
257+ br i1 %c0 , label %bb_freeze , label %bb_other
258+
259+ bb_freeze:
260+ %f = freeze i32 undef
261+ br label %final
262+
263+ bb_other:
264+ br i1 %c1 , label %cA , label %cB
265+ cA:
266+ br label %final
267+ cB:
268+ br label %final
269+
270+ final:
271+ %phi = phi i32 [ %f , %bb_freeze ], [ undef , %cA ], [ undef , %cB ]
272+ ret i32 %phi
273+ }
0 commit comments