173
|
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
2 ; RUN: opt < %s -unify-loop-exits -S | FileCheck %s
|
|
3
|
|
4 define 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 ;
|
|
28 entry:
|
|
29 br i1 %PredEntry, label %A, label %G
|
|
30
|
|
31 A:
|
|
32 br label %B
|
|
33
|
|
34 B:
|
|
35 br i1 %PredB, label %C, label %E
|
|
36
|
|
37 C:
|
|
38 br i1 %PredC, label %D, label %F
|
|
39
|
|
40 D:
|
|
41 br i1 %PredD, label %A, label %F
|
|
42
|
|
43 E:
|
|
44 br label %exit
|
|
45
|
|
46 F:
|
|
47 br label %exit
|
|
48
|
|
49 G:
|
|
50 br label %F
|
|
51
|
|
52 exit:
|
|
53 ret void
|
|
54 }
|
|
55
|
|
56 define 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 ;
|
|
83 entry:
|
|
84 br label %A
|
|
85
|
|
86 A:
|
|
87 br i1 %PredA, label %B, label %X
|
|
88
|
|
89 B:
|
|
90 br i1 %PredB, label %C, label %Y
|
|
91
|
|
92 C:
|
|
93 br i1 %PredC, label %D, label %Z
|
|
94
|
|
95 D:
|
|
96 br label %A
|
|
97
|
|
98 X:
|
|
99 br label %exit
|
|
100
|
|
101 Y:
|
|
102 br label %exit
|
|
103
|
|
104 Z:
|
|
105 br label %exit
|
|
106
|
|
107 exit:
|
|
108 ret void
|
|
109 }
|