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