1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -unify-loop-exits -enable-new-pm=0 -S | FileCheck %s
3; RUN: opt < %s -passes='lowerswitch,unify-loop-exits' -S | FileCheck %s
4
5define void @loop_1(i1 %PredEntry, i1 %PredB, i1 %PredC, i1 %PredD) {
6; CHECK-LABEL: @loop_1(
7; CHECK-NEXT:  entry:
8; CHECK-NEXT:    br i1 [[PREDENTRY:%.*]], label [[A:%.*]], label [[G:%.*]]
9; CHECK:       A:
10; CHECK-NEXT:    br label [[B:%.*]]
11; CHECK:       B:
12; CHECK-NEXT:    br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD:%.*]]
13; CHECK:       C:
14; CHECK-NEXT:    br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]]
15; CHECK:       D:
16; CHECK-NEXT:    br i1 [[PREDD:%.*]], label [[A]], label [[LOOP_EXIT_GUARD]]
17; CHECK:       E:
18; CHECK-NEXT:    br label [[EXIT:%.*]]
19; CHECK:       F:
20; CHECK-NEXT:    br label [[EXIT]]
21; CHECK:       G:
22; CHECK-NEXT:    br label [[F:%.*]]
23; CHECK:       exit:
24; CHECK-NEXT:    ret void
25; CHECK:       loop.exit.guard:
26; CHECK-NEXT:    [[GUARD_E:%.*]] = phi i1 [ true, [[B]] ], [ false, [[C]] ], [ false, [[D]] ]
27; CHECK-NEXT:    br i1 [[GUARD_E]], label [[E:%.*]], label [[F]]
28;
29entry:
30  br i1 %PredEntry, label %A, label %G
31
32A:
33  br label %B
34
35B:
36  br i1 %PredB, label %C, label %E
37
38C:
39  br i1 %PredC, label %D, label %F
40
41D:
42  br i1 %PredD, label %A, label %F
43
44E:
45  br label %exit
46
47F:
48  br label %exit
49
50G:
51  br label %F
52
53exit:
54  ret void
55}
56
57define void @loop_2(i1 %PredA, i1 %PredB, i1 %PredC) {
58; CHECK-LABEL: @loop_2(
59; CHECK-NEXT:  entry:
60; CHECK-NEXT:    br label [[A:%.*]]
61; CHECK:       A:
62; CHECK-NEXT:    br i1 [[PREDA:%.*]], label [[B:%.*]], label [[LOOP_EXIT_GUARD:%.*]]
63; CHECK:       B:
64; CHECK-NEXT:    br i1 [[PREDB:%.*]], label [[C:%.*]], label [[LOOP_EXIT_GUARD]]
65; CHECK:       C:
66; CHECK-NEXT:    br i1 [[PREDC:%.*]], label [[D:%.*]], label [[LOOP_EXIT_GUARD]]
67; CHECK:       D:
68; CHECK-NEXT:    br label [[A]]
69; CHECK:       X:
70; CHECK-NEXT:    br label [[EXIT:%.*]]
71; CHECK:       Y:
72; CHECK-NEXT:    br label [[EXIT]]
73; CHECK:       Z:
74; CHECK-NEXT:    br label [[EXIT]]
75; CHECK:       exit:
76; CHECK-NEXT:    ret void
77; CHECK:       loop.exit.guard:
78; CHECK-NEXT:    [[GUARD_X:%.*]] = phi i1 [ true, [[A]] ], [ false, [[B]] ], [ false, [[C]] ]
79; CHECK-NEXT:    [[GUARD_Y:%.*]] = phi i1 [ false, [[A]] ], [ true, [[B]] ], [ false, [[C]] ]
80; CHECK-NEXT:    br i1 [[GUARD_X]], label [[X:%.*]], label [[LOOP_EXIT_GUARD1:%.*]]
81; CHECK:       loop.exit.guard1:
82; CHECK-NEXT:    br i1 [[GUARD_Y]], label [[Y:%.*]], label [[Z:%.*]]
83;
84entry:
85  br label %A
86
87A:
88  br i1 %PredA, label %B, label %X
89
90B:
91  br i1 %PredB, label %C, label %Y
92
93C:
94  br i1 %PredC, label %D, label %Z
95
96D:
97  br label %A
98
99X:
100  br label %exit
101
102Y:
103  br label %exit
104
105Z:
106  br label %exit
107
108exit:
109  ret void
110}
111