@@ -342,6 +342,56 @@ exit:
342342 ret i1 %cmp
343343}
344344
345+ define i1 @phi_max_recursion_limit (i1 %cond , i32 %switch.cond ) {
346+ ; CHECK-LABEL: @phi_max_recursion_limit(
347+ ; CHECK-NEXT: entry:
348+ ; CHECK-NEXT: br label [[BB0:%.*]]
349+ ; CHECK: bb0:
350+ ; CHECK-NEXT: [[PHIA_0:%.*]] = phi i32 [ [[PHIA_1:%.*]], [[BB1:%.*]] ], [ 0, [[ENTRY:%.*]] ]
351+ ; CHECK-NEXT: [[PHIB_0:%.*]] = phi i32 [ [[PHIB_1:%.*]], [[BB1]] ], [ 0, [[ENTRY]] ]
352+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[SWITCH_BLOCK:%.*]], label [[EXIT:%.*]]
353+ ; CHECK: switch.block:
354+ ; CHECK-NEXT: switch i32 [[SWITCH_COND:%.*]], label [[BB1]] [
355+ ; CHECK-NEXT: i32 0, label [[EPILOGUE:%.*]]
356+ ; CHECK-NEXT: i32 1, label [[EPILOGUE]]
357+ ; CHECK-NEXT: ]
358+ ; CHECK: bb1:
359+ ; CHECK-NEXT: [[PHIA_1]] = phi i32 [ [[PHIA_0]], [[SWITCH_BLOCK]] ], [ 0, [[EPILOGUE]] ]
360+ ; CHECK-NEXT: [[PHIB_1]] = phi i32 [ [[PHIB_0]], [[SWITCH_BLOCK]] ], [ 0, [[EPILOGUE]] ]
361+ ; CHECK-NEXT: br label [[BB0]]
362+ ; CHECK: epilogue:
363+ ; CHECK-NEXT: br label [[BB1]]
364+ ; CHECK: exit:
365+ ; CHECK-NEXT: [[RET:%.*]] = icmp eq i32 [[PHIA_0]], [[PHIB_0]]
366+ ; CHECK-NEXT: ret i1 [[RET]]
367+ ;
368+ entry:
369+ br label %bb0
370+
371+ bb0:
372+ %phiA.0 = phi i32 [ %phiA.1 , %bb1 ], [ 0 , %entry ]
373+ %phiB.0 = phi i32 [ %phiB.1 , %bb1 ], [ 0 , %entry ]
374+ br i1 %cond , label %switch.block , label %exit
375+
376+ switch .block:
377+ switch i32 %switch.cond , label %bb1 [
378+ i32 0 , label %epilogue
379+ i32 1 , label %epilogue
380+ ]
381+
382+ bb1:
383+ %phiA.1 = phi i32 [ %phiA.0 , %switch.block ], [ 0 , %epilogue ]
384+ %phiB.1 = phi i32 [ %phiB.0 , %switch.block ], [ 0 , %epilogue ]
385+ br label %bb0
386+
387+ epilogue:
388+ br label %bb1
389+
390+ exit:
391+ %ret = icmp eq i32 %phiA.0 , %phiB.0
392+ ret i1 %ret
393+ }
394+
345395define i1 @known_non_equal_phis_fail (i8 %p , ptr %pq , i8 %n , i8 %r ) {
346396; CHECK-LABEL: @known_non_equal_phis_fail(
347397; CHECK-NEXT: entry:
0 commit comments