| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -fix-irreducible --verify-loop-info -S | FileCheck %s |
| ; RUN: opt < %s -passes='fix-irreducible,verify<loops>' -S | FileCheck %s |
| ; RUN: opt < %s -passes='verify<loops>,fix-irreducible,verify<loops>' -S | FileCheck %s |
| |
| define void @nested_irr_top_level(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5) { |
| ; CHECK-LABEL: @nested_irr_top_level( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true |
| ; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD1:%.*]] |
| ; CHECK: B1: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[IRR_GUARD1]], label [[A3:%.*]] |
| ; CHECK: B2: |
| ; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[B1:%.*]], label [[A3]] |
| ; CHECK: A3: |
| ; CHECK-NEXT: br i1 [[PRED4:%.*]], label [[IRR_GUARD]], label [[EXIT:%.*]] |
| ; CHECK: A2: |
| ; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[A1:%.*]], label [[EXIT]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3]] ], [ [[PRED0_INV]], [[ENTRY:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[B1]] ], [ [[PRED1_INV]], [[A1]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]] |
| ; |
| entry: |
| br i1 %Pred0, label %A1, label %A2 |
| |
| A1: |
| br i1 %Pred1, label %B1, label %B2 |
| |
| B1: |
| br i1 %Pred2, label %B2, label %A3 |
| |
| B2: |
| br i1 %Pred3, label %B1, label %A3 |
| |
| A3: |
| br i1 %Pred4, label %A2, label %exit |
| |
| A2: |
| br i1 %Pred5, label %A1, label %exit |
| |
| exit: |
| ret void |
| } |
| |
| define void @nested_irr_top_level_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5) { |
| ; CHECK-LABEL: @nested_irr_top_level_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[ENTRY_TARGET_A1:%.*]] [label %entry.target.A2] |
| ; CHECK: A1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[A1_TARGET_B1:%.*]] [label %A1.target.B2] |
| ; CHECK: B1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[B1_TARGET_B2:%.*]] [label %A3] |
| ; CHECK: B2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]]) |
| ; CHECK-NEXT: to label [[B1:%.*]] [label %A3] |
| ; CHECK: A3: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]]) |
| ; CHECK-NEXT: to label [[A3_TARGET_A2:%.*]] [label %exit] |
| ; CHECK: A2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]]) |
| ; CHECK-NEXT: to label [[A1:%.*]] [label %exit] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: A3.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: entry.target.A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: entry.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3_TARGET_A2]] ], [ false, [[ENTRY_TARGET_A1]] ], [ true, [[ENTRY_TARGET_A2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; CHECK: B1.target.B2: |
| ; CHECK-NEXT: br label [[IRR_GUARD1:%.*]] |
| ; CHECK: A1.target.B1: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: A1.target.B2: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[B1_TARGET_B2]] ], [ false, [[A1_TARGET_B1]] ], [ true, [[A1_TARGET_B2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]] |
| ; |
| entry: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %A1 [label %A2] |
| |
| A1: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %B1 [label %B2] |
| |
| B1: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %B2 [label %A3] |
| |
| B2: |
| callbr void asm "", "r,!i"(i1 %Pred3) to label %B1 [label %A3] |
| |
| A3: |
| callbr void asm "", "r,!i"(i1 %Pred4) to label %A2 [label %exit] |
| |
| A2: |
| callbr void asm "", "r,!i"(i1 %Pred5) to label %A1 [label %exit] |
| |
| exit: |
| ret void |
| } |
| |
| define void @nested_irr_in_loop(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6) { |
| ; CHECK-LABEL: @nested_irr_in_loop( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true |
| ; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true |
| ; CHECK-NEXT: br label [[H1:%.*]] |
| ; CHECK: H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD1:%.*]] |
| ; CHECK: B1: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[IRR_GUARD1]], label [[A3:%.*]] |
| ; CHECK: B2: |
| ; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[B1:%.*]], label [[A3]] |
| ; CHECK: A3: |
| ; CHECK-NEXT: br i1 [[PRED4:%.*]], label [[IRR_GUARD]], label [[L1:%.*]] |
| ; CHECK: A2: |
| ; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[A1:%.*]], label [[L1]] |
| ; CHECK: L1: |
| ; CHECK-NEXT: br i1 [[PRED6:%.*]], label [[EXIT:%.*]], label [[H1]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3]] ], [ [[PRED0_INV]], [[H1]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[B1]] ], [ [[PRED1_INV]], [[A1]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]] |
| ; |
| entry: |
| br label %H1 |
| |
| H1: |
| br i1 %Pred0, label %A1, label %A2 |
| |
| A1: |
| br i1 %Pred1, label %B1, label %B2 |
| |
| B1: |
| br i1 %Pred2, label %B2, label %A3 |
| |
| B2: |
| br i1 %Pred3, label %B1, label %A3 |
| |
| A3: |
| br i1 %Pred4, label %A2, label %L1 |
| |
| A2: |
| br i1 %Pred5, label %A1, label %L1 |
| |
| L1: |
| br i1 %Pred6, label %exit, label %H1 |
| |
| exit: |
| ret void |
| } |
| |
| define void @nested_irr_in_loop_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6) { |
| ; CHECK-LABEL: @nested_irr_in_loop_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br label [[H1:%.*]] |
| ; CHECK: H1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[H1_TARGET_A1:%.*]] [label %H1.target.A2] |
| ; CHECK: A1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[A1_TARGET_B1:%.*]] [label %A1.target.B2] |
| ; CHECK: B1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[B1_TARGET_B2:%.*]] [label %A3] |
| ; CHECK: B2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]]) |
| ; CHECK-NEXT: to label [[B1:%.*]] [label %A3] |
| ; CHECK: A3: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]]) |
| ; CHECK-NEXT: to label [[A3_TARGET_A2:%.*]] [label %L1] |
| ; CHECK: A2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]]) |
| ; CHECK-NEXT: to label [[A1:%.*]] [label %L1] |
| ; CHECK: L1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED6:%.*]]) |
| ; CHECK-NEXT: to label [[EXIT:%.*]] [label %H1] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: A3.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: H1.target.A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: H1.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3_TARGET_A2]] ], [ false, [[H1_TARGET_A1]] ], [ true, [[H1_TARGET_A2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; CHECK: B1.target.B2: |
| ; CHECK-NEXT: br label [[IRR_GUARD1:%.*]] |
| ; CHECK: A1.target.B1: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: A1.target.B2: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[B1_TARGET_B2]] ], [ false, [[A1_TARGET_B1]] ], [ true, [[A1_TARGET_B2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]] |
| ; |
| entry: |
| br label %H1 |
| |
| H1: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %A1 [label %A2] |
| |
| A1: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %B1 [label %B2] |
| |
| B1: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %B2 [label %A3] |
| |
| B2: |
| callbr void asm "", "r,!i"(i1 %Pred3) to label %B1 [label %A3] |
| |
| A3: |
| callbr void asm "", "r,!i"(i1 %Pred4) to label %A2 [label %L1] |
| |
| A2: |
| callbr void asm "", "r,!i"(i1 %Pred5) to label %A1 [label %L1] |
| |
| L1: |
| callbr void asm "", "r,!i"(i1 %Pred6) to label %exit [label %H1] |
| |
| exit: |
| ret void |
| } |
| |
| define void @loop_in_irr(i1 %Pred0, i1 %Pred1, i1 %Pred2) { |
| ; CHECK-LABEL: @loop_in_irr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: A1: |
| ; CHECK-NEXT: br label [[H1:%.*]] |
| ; CHECK: H1: |
| ; CHECK-NEXT: br label [[L1:%.*]] |
| ; CHECK: L1: |
| ; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[H1]], label [[A3:%.*]] |
| ; CHECK: A3: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[IRR_GUARD]], label [[EXIT:%.*]] |
| ; CHECK: A2: |
| ; CHECK-NEXT: br label [[A1:%.*]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3]] ], [ [[PRED0_INV]], [[ENTRY:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; |
| entry: |
| br i1 %Pred0, label %A1, label %A2 |
| |
| A1: |
| br label %H1 |
| |
| H1: |
| br label %L1 |
| |
| L1: |
| br i1 %Pred1, label %H1, label %A3 |
| |
| A3: |
| br i1 %Pred2, label %A2, label %exit |
| |
| A2: |
| br label %A1 |
| |
| exit: |
| ret void |
| } |
| |
| define void @loop_in_irr_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2) { |
| ; CHECK-LABEL: @loop_in_irr_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[ENTRY_TARGET_A1:%.*]] [label %entry.target.A2] |
| ; CHECK: A1: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[H1:%.*]] [] |
| ; CHECK: H1: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[L1:%.*]] [] |
| ; CHECK: L1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[H1]] [label %A3] |
| ; CHECK: A3: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[A3_TARGET_A2:%.*]] [label %exit] |
| ; CHECK: A2: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[A1:%.*]] [] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: A3.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: entry.target.A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: entry.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3_TARGET_A2]] ], [ false, [[ENTRY_TARGET_A1]] ], [ true, [[ENTRY_TARGET_A2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; |
| entry: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %A1 [label %A2] |
| |
| A1: |
| callbr void asm "", ""() to label %H1 [] |
| |
| H1: |
| callbr void asm "", ""() to label %L1 [] |
| |
| L1: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %H1 [label %A3] |
| |
| A3: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %A2 [label %exit] |
| |
| A2: |
| callbr void asm "", ""() to label %A1 [] |
| |
| exit: |
| ret void |
| } |
| |
| define void @loop_in_irr_shared_entry(i1 %Pred0, i1 %Pred1, i1 %Pred2) { |
| ; CHECK-LABEL: @loop_in_irr_shared_entry( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: H1: |
| ; CHECK-NEXT: br label [[L1:%.*]] |
| ; CHECK: L1: |
| ; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[H1:%.*]], label [[A3:%.*]] |
| ; CHECK: A3: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[IRR_GUARD]], label [[EXIT:%.*]] |
| ; CHECK: A2: |
| ; CHECK-NEXT: br label [[H1]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3]] ], [ [[PRED0_INV]], [[ENTRY:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[H1]] |
| ; |
| entry: |
| br i1 %Pred0, label %H1, label %A2 |
| |
| H1: |
| br label %L1 |
| |
| L1: |
| br i1 %Pred1, label %H1, label %A3 |
| |
| A3: |
| br i1 %Pred2, label %A2, label %exit |
| |
| A2: |
| br label %H1 |
| |
| exit: |
| ret void |
| } |
| |
| define void @loop_in_irr_shared_entry_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2) { |
| ; CHECK-LABEL: @loop_in_irr_shared_entry_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[ENTRY_TARGET_H1:%.*]] [label %entry.target.A2] |
| ; CHECK: H1: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[L1:%.*]] [] |
| ; CHECK: L1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[H1:%.*]] [label %A3] |
| ; CHECK: A3: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[A3_TARGET_A2:%.*]] [label %exit] |
| ; CHECK: A2: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[H1]] [] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: A3.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: entry.target.H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: entry.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3_TARGET_A2]] ], [ false, [[ENTRY_TARGET_H1]] ], [ true, [[ENTRY_TARGET_A2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[H1]] |
| ; |
| entry: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %H1 [label %A2] |
| |
| H1: |
| callbr void asm "", ""() to label %L1 [] |
| |
| L1: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %H1 [label %A3] |
| |
| A3: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %A2 [label %exit] |
| |
| A2: |
| callbr void asm "", ""() to label %H1 [] |
| |
| exit: |
| ret void |
| } |
| |
| define void @loop_in_irr_shared_header(i1 %Pred0, i1 %Pred1, i1 %Pred2) { |
| ; CHECK-LABEL: @loop_in_irr_shared_header( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: H1: |
| ; CHECK-NEXT: br label [[L1:%.*]] |
| ; CHECK: L1: |
| ; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[IRR_GUARD]], label [[A3:%.*]] |
| ; CHECK: A3: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[A2:%.*]], label [[EXIT:%.*]] |
| ; CHECK: A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_H1:%.*]] = phi i1 [ true, [[A2]] ], [ true, [[L1]] ], [ [[PRED0_INV]], [[ENTRY:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_H1]], label [[H1:%.*]], label [[A2]] |
| ; |
| entry: |
| br i1 %Pred0, label %A2, label %H1 |
| |
| H1: |
| br label %L1 |
| |
| L1: |
| br i1 %Pred1, label %H1, label %A3 |
| |
| A3: |
| br i1 %Pred2, label %A2, label %exit |
| |
| A2: |
| br label %H1 |
| |
| exit: |
| ret void |
| } |
| |
| define void @loop_in_irr_shared_header_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2) { |
| ; CHECK-LABEL: @loop_in_irr_shared_header_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[ENTRY_TARGET_A2:%.*]] [label %entry.target.H1] |
| ; CHECK: H1: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[L1:%.*]] [] |
| ; CHECK: L1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[L1_TARGET_H1:%.*]] [label %A3] |
| ; CHECK: A3: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[A2:%.*]] [label %exit] |
| ; CHECK: A2: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[A2_TARGET_H1:%.*]] [] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: A2.target.H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: L1.target.H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: entry.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: entry.target.H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_H1:%.*]] = phi i1 [ true, [[A2_TARGET_H1]] ], [ true, [[L1_TARGET_H1]] ], [ false, [[ENTRY_TARGET_A2]] ], [ true, [[ENTRY_TARGET_H1:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_H1]], label [[H1:%.*]], label [[A2]] |
| ; |
| entry: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %A2 [label %H1] |
| |
| H1: |
| callbr void asm "", ""() to label %L1 [] |
| |
| L1: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %H1 [label %A3] |
| |
| A3: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %A2 [label %exit] |
| |
| A2: |
| callbr void asm "", ""() to label %H1 [] |
| |
| exit: |
| ret void |
| } |
| |
| define void @loop_irr_loop_shared_header(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3) { |
| ; CHECK-LABEL: @loop_irr_loop_shared_header( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true |
| ; CHECK-NEXT: br label [[H2:%.*]] |
| ; CHECK: H2: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: H1: |
| ; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[A3:%.*]], label [[IRR_GUARD]] |
| ; CHECK: A3: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[A2:%.*]], label [[L2:%.*]] |
| ; CHECK: A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: L2: |
| ; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[H2]], label [[EXIT:%.*]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_H1:%.*]] = phi i1 [ true, [[A2]] ], [ true, [[H1:%.*]] ], [ [[PRED0_INV]], [[H2]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_H1]], label [[H1]], label [[A2]] |
| ; |
| entry: |
| br label %H2 |
| |
| H2: |
| br i1 %Pred0, label %A2, label %H1 |
| |
| H1: |
| br i1 %Pred1, label %A3, label %H1 |
| |
| A3: |
| br i1 %Pred2, label %A2, label %L2 |
| |
| A2: |
| br label %H1 |
| |
| L2: |
| br i1 %Pred3, label %H2, label %exit |
| |
| exit: |
| ret void |
| } |
| |
| define void @loop_irr_loop_shared_header_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3) { |
| ; CHECK-LABEL: @loop_irr_loop_shared_header_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[H2:%.*]] [] |
| ; CHECK: H2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[H2_TARGET_A2:%.*]] [label %H2.target.H1] |
| ; CHECK: H1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[A3:%.*]] [label %H1.target.H1] |
| ; CHECK: A3: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[A2:%.*]] [label %L2] |
| ; CHECK: A2: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[A2_TARGET_H1:%.*]] [] |
| ; CHECK: L2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]]) |
| ; CHECK-NEXT: to label [[H2]] [label %exit] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: A2.target.H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: H1.target.H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: H2.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: H2.target.H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_H1:%.*]] = phi i1 [ true, [[A2_TARGET_H1]] ], [ true, [[H1_TARGET_H1:%.*]] ], [ false, [[H2_TARGET_A2]] ], [ true, [[H2_TARGET_H1:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_H1]], label [[H1:%.*]], label [[A2]] |
| ; |
| entry: |
| callbr void asm "", ""() to label %H2 [] |
| |
| H2: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %A2 [label %H1] |
| |
| H1: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %A3 [label %H1] |
| |
| A3: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %A2 [label %L2] |
| |
| A2: |
| callbr void asm "", ""() to label %H1 [] |
| |
| L2: |
| callbr void asm "", "r,!i"(i1 %Pred3) to label %H2 [label %exit] |
| |
| exit: |
| ret void |
| } |
| |
| define void @siblings_top_level(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6) { |
| ; CHECK-LABEL: @siblings_top_level( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[PRED4_INV:%.*]] = xor i1 [[PRED4:%.*]], true |
| ; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true |
| ; CHECK-NEXT: br i1 [[PRED0:%.*]], label [[H1:%.*]], label [[FORK1:%.*]] |
| ; CHECK: H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: A2: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[A1:%.*]], label [[L1:%.*]] |
| ; CHECK: L1: |
| ; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[H1]], label [[EXIT:%.*]] |
| ; CHECK: fork1: |
| ; CHECK-NEXT: br label [[IRR_GUARD1:%.*]] |
| ; CHECK: B1: |
| ; CHECK-NEXT: br label [[H2:%.*]] |
| ; CHECK: H2: |
| ; CHECK-NEXT: br label [[L2:%.*]] |
| ; CHECK: L2: |
| ; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[H2]], label [[IRR_GUARD1]] |
| ; CHECK: B2: |
| ; CHECK-NEXT: br i1 [[PRED6:%.*]], label [[B1:%.*]], label [[EXIT]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A1]] ], [ [[PRED1_INV]], [[H1]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[L2]] ], [ [[PRED4_INV]], [[FORK1]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]] |
| ; |
| entry: |
| br i1 %Pred0, label %H1, label %fork1 |
| |
| H1: |
| br i1 %Pred1, label %A1, label %A2 |
| |
| A1: |
| br label %A2 |
| |
| A2: |
| br i1 %Pred2, label %A1, label %L1 |
| |
| L1: |
| br i1 %Pred3, label %H1, label %exit |
| |
| fork1: |
| br i1 %Pred4, label %B1, label %B2 |
| |
| B1: |
| br label %H2 |
| |
| H2: |
| br label %L2 |
| |
| L2: |
| br i1 %Pred5, label %H2, label %B2 |
| |
| B2: |
| br i1 %Pred6, label %B1, label %exit |
| |
| exit: |
| ret void |
| } |
| |
| define void @siblings_top_level_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6) { |
| ; CHECK-LABEL: @siblings_top_level_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[H1:%.*]] [label %fork1] |
| ; CHECK: H1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[H1_TARGET_A1:%.*]] [label %H1.target.A2] |
| ; CHECK: A1: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[A1_TARGET_A2:%.*]] [] |
| ; CHECK: A2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[A1:%.*]] [label %L1] |
| ; CHECK: L1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]]) |
| ; CHECK-NEXT: to label [[H1]] [label %exit] |
| ; CHECK: fork1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]]) |
| ; CHECK-NEXT: to label [[FORK1_TARGET_B1:%.*]] [label %fork1.target.B2] |
| ; CHECK: B1: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[H2:%.*]] [] |
| ; CHECK: H2: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[L2:%.*]] [] |
| ; CHECK: L2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]]) |
| ; CHECK-NEXT: to label [[H2]] [label %L2.target.B2] |
| ; CHECK: B2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED6:%.*]]) |
| ; CHECK-NEXT: to label [[B1:%.*]] [label %exit] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: A1.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: H1.target.A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: H1.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A1_TARGET_A2]] ], [ false, [[H1_TARGET_A1]] ], [ true, [[H1_TARGET_A2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; CHECK: L2.target.B2: |
| ; CHECK-NEXT: br label [[IRR_GUARD1:%.*]] |
| ; CHECK: fork1.target.B1: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: fork1.target.B2: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[L2_TARGET_B2:%.*]] ], [ false, [[FORK1_TARGET_B1]] ], [ true, [[FORK1_TARGET_B2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]] |
| ; |
| entry: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %H1 [label %fork1] |
| |
| H1: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %A1 [label %A2] |
| |
| A1: |
| callbr void asm "", ""() to label %A2 [] |
| |
| A2: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %A1 [label %L1] |
| |
| L1: |
| callbr void asm "", "r,!i"(i1 %Pred3) to label %H1 [label %exit] |
| |
| fork1: |
| callbr void asm "", "r,!i"(i1 %Pred4) to label %B1 [label %B2] |
| |
| B1: |
| callbr void asm "", ""() to label %H2 [] |
| |
| H2: |
| callbr void asm "", ""() to label %L2 [] |
| |
| L2: |
| callbr void asm "", "r,!i"(i1 %Pred5) to label %H2 [label %B2] |
| |
| B2: |
| callbr void asm "", "r,!i"(i1 %Pred6) to label %B1 [label %exit] |
| |
| exit: |
| ret void |
| } |
| |
| define void @siblings_in_loop(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7) { |
| ; CHECK-LABEL: @siblings_in_loop( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[PRED4_INV:%.*]] = xor i1 [[PRED4:%.*]], true |
| ; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true |
| ; CHECK-NEXT: br label [[H0:%.*]] |
| ; CHECK: H0: |
| ; CHECK-NEXT: br i1 [[PRED0:%.*]], label [[H1:%.*]], label [[FORK1:%.*]] |
| ; CHECK: H1: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: A2: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[A1:%.*]], label [[L1:%.*]] |
| ; CHECK: L1: |
| ; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[H1]], label [[L0:%.*]] |
| ; CHECK: fork1: |
| ; CHECK-NEXT: br label [[IRR_GUARD1:%.*]] |
| ; CHECK: B1: |
| ; CHECK-NEXT: br label [[H2:%.*]] |
| ; CHECK: H2: |
| ; CHECK-NEXT: br label [[L2:%.*]] |
| ; CHECK: L2: |
| ; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[H2]], label [[IRR_GUARD1]] |
| ; CHECK: B2: |
| ; CHECK-NEXT: br i1 [[PRED6:%.*]], label [[B1:%.*]], label [[L0]] |
| ; CHECK: L0: |
| ; CHECK-NEXT: br i1 [[PRED7:%.*]], label [[EXIT:%.*]], label [[H0]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A1]] ], [ [[PRED1_INV]], [[H1]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[L2]] ], [ [[PRED4_INV]], [[FORK1]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]] |
| ; |
| entry: |
| br label %H0 |
| |
| H0: |
| br i1 %Pred0, label %H1, label %fork1 |
| |
| H1: |
| br i1 %Pred1, label %A1, label %A2 |
| |
| A1: |
| br label %A2 |
| |
| A2: |
| br i1 %Pred2, label %A1, label %L1 |
| |
| L1: |
| br i1 %Pred3, label %H1, label %L0 |
| |
| fork1: |
| br i1 %Pred4, label %B1, label %B2 |
| |
| B1: |
| br label %H2 |
| |
| H2: |
| br label %L2 |
| |
| L2: |
| br i1 %Pred5, label %H2, label %B2 |
| |
| B2: |
| br i1 %Pred6, label %B1, label %L0 |
| |
| L0: |
| br i1 %Pred7, label %exit, label %H0 |
| |
| exit: |
| ret void |
| } |
| |
| define void @siblings_in_loop_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7) { |
| ; CHECK-LABEL: @siblings_in_loop_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[H0:%.*]] [] |
| ; CHECK: H0: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[H1:%.*]] [label %fork1] |
| ; CHECK: H1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[H1_TARGET_A1:%.*]] [label %H1.target.A2] |
| ; CHECK: A1: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[A1_TARGET_A2:%.*]] [] |
| ; CHECK: A2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[A1:%.*]] [label %L1] |
| ; CHECK: L1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]]) |
| ; CHECK-NEXT: to label [[H1]] [label %L0] |
| ; CHECK: fork1: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]]) |
| ; CHECK-NEXT: to label [[FORK1_TARGET_B1:%.*]] [label %fork1.target.B2] |
| ; CHECK: B1: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[H2:%.*]] [] |
| ; CHECK: H2: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[L2:%.*]] [] |
| ; CHECK: L2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]]) |
| ; CHECK-NEXT: to label [[H2]] [label %L2.target.B2] |
| ; CHECK: B2: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED6:%.*]]) |
| ; CHECK-NEXT: to label [[B1:%.*]] [label %L0] |
| ; CHECK: L0: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED7:%.*]]) |
| ; CHECK-NEXT: to label [[EXIT:%.*]] [label %H0] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: A1.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: H1.target.A1: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: H1.target.A2: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A1_TARGET_A2]] ], [ false, [[H1_TARGET_A1]] ], [ true, [[H1_TARGET_A2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]] |
| ; CHECK: L2.target.B2: |
| ; CHECK-NEXT: br label [[IRR_GUARD1:%.*]] |
| ; CHECK: fork1.target.B1: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: fork1.target.B2: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[L2_TARGET_B2:%.*]] ], [ false, [[FORK1_TARGET_B1]] ], [ true, [[FORK1_TARGET_B2:%.*]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]] |
| ; |
| entry: |
| callbr void asm "", ""() to label %H0 [] |
| |
| H0: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %H1 [label %fork1] |
| |
| H1: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %A1 [label %A2] |
| |
| A1: |
| callbr void asm "", ""() to label %A2 [] |
| |
| A2: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %A1 [label %L1] |
| |
| L1: |
| callbr void asm "", "r,!i"(i1 %Pred3) to label %H1 [label %L0] |
| |
| fork1: |
| callbr void asm "", "r,!i"(i1 %Pred4) to label %B1 [label %B2] |
| |
| B1: |
| callbr void asm "", ""() to label %H2 [] |
| |
| H2: |
| callbr void asm "", ""() to label %L2 [] |
| |
| L2: |
| callbr void asm "", "r,!i"(i1 %Pred5) to label %H2 [label %B2] |
| |
| B2: |
| callbr void asm "", "r,!i"(i1 %Pred6) to label %B1 [label %L0] |
| |
| L0: |
| callbr void asm "", "r,!i"(i1 %Pred7) to label %exit [label %H0] |
| |
| exit: |
| ret void |
| } |
| |
| define void @irr_in_irr_shared_entry(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7, i1 %Pred8, i1 %Pred9, i1 %Pred10, i1 %Pred11, i1 %Pred12, i1 %Pred13) { |
| ; CHECK-LABEL: @irr_in_irr_shared_entry( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: br i1 [[PRED0:%.*]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] |
| ; CHECK: if.end: |
| ; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[IF_THEN7:%.*]], label [[IF_ELSE:%.*]] |
| ; CHECK: if.then7: |
| ; CHECK-NEXT: br label [[IF_END16:%.*]] |
| ; CHECK: if.else: |
| ; CHECK-NEXT: br label [[IF_END16]] |
| ; CHECK: if.end16: |
| ; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[WHILE_COND_PREHEADER:%.*]], label [[IF_THEN39:%.*]] |
| ; CHECK: while.cond.preheader: |
| ; CHECK-NEXT: br label [[WHILE_COND:%.*]] |
| ; CHECK: while.cond: |
| ; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[IRR_GUARD:%.*]], label [[LOR_RHS:%.*]] |
| ; CHECK: cond.true49: |
| ; CHECK-NEXT: br i1 [[PRED4:%.*]], label [[IF_THEN69:%.*]], label [[IRR_GUARD1:%.*]] |
| ; CHECK: while.body63: |
| ; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[EXIT:%.*]], label [[WHILE_COND47:%.*]] |
| ; CHECK: while.cond47: |
| ; CHECK-NEXT: br i1 [[PRED6:%.*]], label [[COND_TRUE49:%.*]], label [[IRR_GUARD]] |
| ; CHECK: cond.end61: |
| ; CHECK-NEXT: br i1 [[PRED7:%.*]], label [[IRR_GUARD1]], label [[WHILE_COND]] |
| ; CHECK: if.then69: |
| ; CHECK-NEXT: br i1 [[PRED8:%.*]], label [[EXIT]], label [[WHILE_COND]] |
| ; CHECK: lor.rhs: |
| ; CHECK-NEXT: br i1 [[PRED9:%.*]], label [[IRR_GUARD]], label [[WHILE_END76:%.*]] |
| ; CHECK: while.end76: |
| ; CHECK-NEXT: br label [[EXIT]] |
| ; CHECK: if.then39: |
| ; CHECK-NEXT: br i1 [[PRED10:%.*]], label [[EXIT]], label [[IF_END_I145:%.*]] |
| ; CHECK: if.end.i145: |
| ; CHECK-NEXT: br i1 [[PRED11:%.*]], label [[EXIT]], label [[IF_END8_I149:%.*]] |
| ; CHECK: if.end8.i149: |
| ; CHECK-NEXT: br label [[EXIT]] |
| ; CHECK: if.then: |
| ; CHECK-NEXT: br i1 [[PRED12:%.*]], label [[EXIT]], label [[IF_END_I:%.*]] |
| ; CHECK: if.end.i: |
| ; CHECK-NEXT: br i1 [[PRED13:%.*]], label [[EXIT]], label [[IF_END8_I:%.*]] |
| ; CHECK: if.end8.i: |
| ; CHECK-NEXT: br label [[EXIT]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_COND_END61:%.*]] = phi i1 [ true, [[WHILE_COND47]] ], [ true, [[LOR_RHS]] ], [ false, [[WHILE_COND]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_COND_END61]], label [[COND_END61:%.*]], label [[IRR_GUARD1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_WHILE_BODY63:%.*]] = phi i1 [ true, [[COND_TRUE49]] ], [ true, [[COND_END61]] ], [ false, [[IRR_GUARD]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_WHILE_BODY63]], label [[WHILE_BODY63:%.*]], label [[COND_TRUE49]] |
| ; |
| entry: |
| br i1 %Pred0, label %if.end, label %if.then |
| |
| if.end: |
| br i1 %Pred1, label %if.then7, label %if.else |
| |
| if.then7: |
| br label %if.end16 |
| |
| if.else: |
| br label %if.end16 |
| |
| if.end16: |
| br i1 %Pred2, label %while.cond.preheader, label %if.then39 |
| |
| while.cond.preheader: |
| br label %while.cond |
| |
| while.cond: |
| br i1 %Pred3, label %cond.true49, label %lor.rhs |
| |
| cond.true49: |
| br i1 %Pred4, label %if.then69, label %while.body63 |
| |
| while.body63: |
| br i1 %Pred5, label %exit, label %while.cond47 |
| |
| while.cond47: |
| br i1 %Pred6, label %cond.true49, label %cond.end61 |
| |
| cond.end61: |
| br i1 %Pred7, label %while.body63, label %while.cond |
| |
| if.then69: |
| br i1 %Pred8, label %exit, label %while.cond |
| |
| lor.rhs: |
| br i1 %Pred9, label %cond.end61, label %while.end76 |
| |
| while.end76: |
| br label %exit |
| |
| if.then39: |
| br i1 %Pred10, label %exit, label %if.end.i145 |
| |
| if.end.i145: |
| br i1 %Pred11, label %exit, label %if.end8.i149 |
| |
| if.end8.i149: |
| br label %exit |
| |
| if.then: |
| br i1 %Pred12, label %exit, label %if.end.i |
| |
| if.end.i: |
| br i1 %Pred13, label %exit, label %if.end8.i |
| |
| if.end8.i: |
| br label %exit |
| |
| exit: |
| ret void |
| } |
| |
| define void @irr_in_irr_shared_entry_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7, i1 %Pred8, i1 %Pred9, i1 %Pred10, i1 %Pred11, i1 %Pred12, i1 %Pred13) { |
| ; CHECK-LABEL: @irr_in_irr_shared_entry_callbr( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]]) |
| ; CHECK-NEXT: to label [[IF_END:%.*]] [label %if.then] |
| ; CHECK: if.end: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]]) |
| ; CHECK-NEXT: to label [[IF_THEN7:%.*]] [label %if.else] |
| ; CHECK: if.then7: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[IF_END16:%.*]] [] |
| ; CHECK: if.else: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[IF_END16]] [] |
| ; CHECK: if.end16: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]]) |
| ; CHECK-NEXT: to label [[WHILE_COND_PREHEADER:%.*]] [label %if.then39] |
| ; CHECK: while.cond.preheader: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[WHILE_COND:%.*]] [] |
| ; CHECK: while.cond: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]]) |
| ; CHECK-NEXT: to label [[WHILE_COND_TARGET_COND_TRUE49:%.*]] [label %lor.rhs] |
| ; CHECK: cond.true49: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]]) |
| ; CHECK-NEXT: to label [[IF_THEN69:%.*]] [label %cond.true49.target.while.body63] |
| ; CHECK: while.body63: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]]) |
| ; CHECK-NEXT: to label [[EXIT:%.*]] [label %while.cond47] |
| ; CHECK: while.cond47: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED6:%.*]]) |
| ; CHECK-NEXT: to label [[COND_TRUE49:%.*]] [label %while.cond47.target.cond.end61] |
| ; CHECK: cond.end61: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED7:%.*]]) |
| ; CHECK-NEXT: to label [[COND_END61_TARGET_WHILE_BODY63:%.*]] [label %while.cond] |
| ; CHECK: if.then69: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED8:%.*]]) |
| ; CHECK-NEXT: to label [[EXIT]] [label %while.cond] |
| ; CHECK: lor.rhs: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED9:%.*]]) |
| ; CHECK-NEXT: to label [[LOR_RHS_TARGET_COND_END61:%.*]] [label %while.end76] |
| ; CHECK: while.end76: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[EXIT]] [] |
| ; CHECK: if.then39: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED10:%.*]]) |
| ; CHECK-NEXT: to label [[EXIT]] [label %if.end.i145] |
| ; CHECK: if.end.i145: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED11:%.*]]) |
| ; CHECK-NEXT: to label [[EXIT]] [label %if.end8.i149] |
| ; CHECK: if.end8.i149: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[EXIT]] [] |
| ; CHECK: if.then: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED12:%.*]]) |
| ; CHECK-NEXT: to label [[EXIT]] [label %if.end.i] |
| ; CHECK: if.end.i: |
| ; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED13:%.*]]) |
| ; CHECK-NEXT: to label [[EXIT]] [label %if.end8.i] |
| ; CHECK: if.end8.i: |
| ; CHECK-NEXT: callbr void asm "", ""() |
| ; CHECK-NEXT: to label [[EXIT]] [] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; CHECK: while.cond47.target.cond.end61: |
| ; CHECK-NEXT: br label [[IRR_GUARD:%.*]] |
| ; CHECK: lor.rhs.target.cond.end61: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: while.cond.target.cond.true49: |
| ; CHECK-NEXT: br label [[IRR_GUARD]] |
| ; CHECK: irr.guard: |
| ; CHECK-NEXT: [[GUARD_COND_END61:%.*]] = phi i1 [ true, [[WHILE_COND47_TARGET_COND_END61:%.*]] ], [ true, [[LOR_RHS_TARGET_COND_END61]] ], [ false, [[WHILE_COND_TARGET_COND_TRUE49]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_COND_END61]], label [[COND_END61:%.*]], label [[IRR_GUARD1:%.*]] |
| ; CHECK: cond.true49.target.while.body63: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: cond.end61.target.while.body63: |
| ; CHECK-NEXT: br label [[IRR_GUARD1]] |
| ; CHECK: irr.guard1: |
| ; CHECK-NEXT: [[GUARD_WHILE_BODY63:%.*]] = phi i1 [ true, [[COND_TRUE49_TARGET_WHILE_BODY63:%.*]] ], [ true, [[COND_END61_TARGET_WHILE_BODY63]] ], [ false, [[IRR_GUARD]] ] |
| ; CHECK-NEXT: br i1 [[GUARD_WHILE_BODY63]], label [[WHILE_BODY63:%.*]], label [[COND_TRUE49]] |
| ; |
| entry: |
| callbr void asm "", "r,!i"(i1 %Pred0) to label %if.end [label %if.then] |
| |
| if.end: |
| callbr void asm "", "r,!i"(i1 %Pred1) to label %if.then7 [label %if.else] |
| |
| if.then7: |
| callbr void asm "", ""() to label %if.end16 [] |
| |
| if.else: |
| callbr void asm "", ""() to label %if.end16 [] |
| |
| if.end16: |
| callbr void asm "", "r,!i"(i1 %Pred2) to label %while.cond.preheader [label %if.then39] |
| |
| while.cond.preheader: |
| callbr void asm "", ""() to label %while.cond [] |
| |
| while.cond: |
| callbr void asm "", "r,!i"(i1 %Pred3) to label %cond.true49 [label %lor.rhs] |
| |
| cond.true49: |
| callbr void asm "", "r,!i"(i1 %Pred4) to label %if.then69 [label %while.body63] |
| |
| while.body63: |
| callbr void asm "", "r,!i"(i1 %Pred5) to label %exit [label %while.cond47] |
| |
| while.cond47: |
| callbr void asm "", "r,!i"(i1 %Pred6) to label %cond.true49 [label %cond.end61] |
| |
| cond.end61: |
| callbr void asm "", "r,!i"(i1 %Pred7) to label %while.body63 [label %while.cond] |
| |
| if.then69: |
| callbr void asm "", "r,!i"(i1 %Pred8) to label %exit [label %while.cond] |
| |
| lor.rhs: |
| callbr void asm "", "r,!i"(i1 %Pred9) to label %cond.end61 [label %while.end76] |
| |
| while.end76: |
| callbr void asm "", ""() to label %exit [] |
| |
| if.then39: |
| callbr void asm "", "r,!i"(i1 %Pred10) to label %exit [label %if.end.i145] |
| |
| if.end.i145: |
| callbr void asm "", "r,!i"(i1 %Pred11) to label %exit [label %if.end8.i149] |
| |
| if.end8.i149: |
| callbr void asm "", ""() to label %exit [] |
| |
| if.then: |
| callbr void asm "", "r,!i"(i1 %Pred12) to label %exit [label %if.end.i] |
| |
| if.end.i: |
| callbr void asm "", "r,!i"(i1 %Pred13) to label %exit [label %if.end8.i] |
| |
| if.end8.i: |
| callbr void asm "", ""() to label %exit [] |
| |
| exit: |
| ret void |
| } |