1*142ba7d7SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*142ba7d7SNikita Popov; RUN: opt -S -loop-rotate < %s | FileCheck %s
3*142ba7d7SNikita Popov
4*142ba7d7SNikita Popovdefine i64 @switch_multi_entry_known_entry() {
5*142ba7d7SNikita Popov; CHECK-LABEL: @switch_multi_entry_known_entry(
6*142ba7d7SNikita Popov; CHECK-NEXT:  start:
7*142ba7d7SNikita Popov; CHECK-NEXT:    br label [[HEADER:%.*]]
8*142ba7d7SNikita Popov; CHECK:       header:
9*142ba7d7SNikita Popov; CHECK-NEXT:    [[STATE:%.*]] = phi i8 [ 2, [[START:%.*]] ], [ [[NEXT_STATE:%.*]], [[LATCH:%.*]] ]
10*142ba7d7SNikita Popov; CHECK-NEXT:    [[COUNT:%.*]] = phi i64 [ 0, [[START]] ], [ [[INC:%.*]], [[LATCH]] ]
11*142ba7d7SNikita Popov; CHECK-NEXT:    switch i8 [[STATE]], label [[EXIT:%.*]] [
12*142ba7d7SNikita Popov; CHECK-NEXT:    i8 0, label [[LATCH]]
13*142ba7d7SNikita Popov; CHECK-NEXT:    i8 2, label [[LATCH]]
14*142ba7d7SNikita Popov; CHECK-NEXT:    ]
15*142ba7d7SNikita Popov; CHECK:       latch:
16*142ba7d7SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[COUNT]], 999
17*142ba7d7SNikita Popov; CHECK-NEXT:    [[NEXT_STATE]] = zext i1 [[CMP]] to i8
18*142ba7d7SNikita Popov; CHECK-NEXT:    [[INC]] = add i64 [[COUNT]], 1
19*142ba7d7SNikita Popov; CHECK-NEXT:    br label [[HEADER]]
20*142ba7d7SNikita Popov; CHECK:       exit:
21*142ba7d7SNikita Popov; CHECK-NEXT:    [[COUNT_LCSSA:%.*]] = phi i64 [ [[COUNT]], [[HEADER]] ]
22*142ba7d7SNikita Popov; CHECK-NEXT:    ret i64 [[COUNT_LCSSA]]
23*142ba7d7SNikita Popov;
24*142ba7d7SNikita Popovstart:
25*142ba7d7SNikita Popov  br label %header
26*142ba7d7SNikita Popov
27*142ba7d7SNikita Popovheader:                                           ; preds = %latch, %start
28*142ba7d7SNikita Popov  %state = phi i8 [ 2, %start ], [ %next_state, %latch ]
29*142ba7d7SNikita Popov  %count = phi i64 [ 0, %start ], [ %inc, %latch ]
30*142ba7d7SNikita Popov  switch i8 %state, label %exit [
31*142ba7d7SNikita Popov  i8 0, label %latch
32*142ba7d7SNikita Popov  i8 2, label %latch
33*142ba7d7SNikita Popov  ]
34*142ba7d7SNikita Popov
35*142ba7d7SNikita Popovlatch:                                            ; preds = %header, %header
36*142ba7d7SNikita Popov  %cmp = icmp eq i64 %count, 999
37*142ba7d7SNikita Popov  %next_state = zext i1 %cmp to i8
38*142ba7d7SNikita Popov  %inc = add i64 %count, 1
39*142ba7d7SNikita Popov  br label %header
40*142ba7d7SNikita Popov
41*142ba7d7SNikita Popovexit:                                             ; preds = %header
42*142ba7d7SNikita Popov  ret i64 %count
43*142ba7d7SNikita Popov}
44*142ba7d7SNikita Popov
45*142ba7d7SNikita Popovdefine i64 @switch_multi_entry_unknown_entry(i8 %start_state) {
46*142ba7d7SNikita Popov; CHECK-LABEL: @switch_multi_entry_unknown_entry(
47*142ba7d7SNikita Popov; CHECK-NEXT:  start:
48*142ba7d7SNikita Popov; CHECK-NEXT:    br label [[HEADER:%.*]]
49*142ba7d7SNikita Popov; CHECK:       header:
50*142ba7d7SNikita Popov; CHECK-NEXT:    [[STATE:%.*]] = phi i8 [ [[START_STATE:%.*]], [[START:%.*]] ], [ [[NEXT_STATE:%.*]], [[LATCH:%.*]] ]
51*142ba7d7SNikita Popov; CHECK-NEXT:    [[COUNT:%.*]] = phi i64 [ 0, [[START]] ], [ [[INC:%.*]], [[LATCH]] ]
52*142ba7d7SNikita Popov; CHECK-NEXT:    switch i8 [[STATE]], label [[EXIT:%.*]] [
53*142ba7d7SNikita Popov; CHECK-NEXT:    i8 0, label [[LATCH]]
54*142ba7d7SNikita Popov; CHECK-NEXT:    i8 2, label [[LATCH]]
55*142ba7d7SNikita Popov; CHECK-NEXT:    ]
56*142ba7d7SNikita Popov; CHECK:       latch:
57*142ba7d7SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[COUNT]], 999
58*142ba7d7SNikita Popov; CHECK-NEXT:    [[NEXT_STATE]] = zext i1 [[CMP]] to i8
59*142ba7d7SNikita Popov; CHECK-NEXT:    [[INC]] = add i64 [[COUNT]], 1
60*142ba7d7SNikita Popov; CHECK-NEXT:    br label [[HEADER]]
61*142ba7d7SNikita Popov; CHECK:       exit:
62*142ba7d7SNikita Popov; CHECK-NEXT:    [[COUNT_LCSSA:%.*]] = phi i64 [ [[COUNT]], [[HEADER]] ]
63*142ba7d7SNikita Popov; CHECK-NEXT:    ret i64 [[COUNT_LCSSA]]
64*142ba7d7SNikita Popov;
65*142ba7d7SNikita Popovstart:
66*142ba7d7SNikita Popov  br label %header
67*142ba7d7SNikita Popov
68*142ba7d7SNikita Popovheader:                                           ; preds = %latch, %start
69*142ba7d7SNikita Popov  %state = phi i8 [ %start_state, %start ], [ %next_state, %latch ]
70*142ba7d7SNikita Popov  %count = phi i64 [ 0, %start ], [ %inc, %latch ]
71*142ba7d7SNikita Popov  switch i8 %state, label %exit [
72*142ba7d7SNikita Popov  i8 0, label %latch
73*142ba7d7SNikita Popov  i8 2, label %latch
74*142ba7d7SNikita Popov  ]
75*142ba7d7SNikita Popov
76*142ba7d7SNikita Popovlatch:                                            ; preds = %header, %header
77*142ba7d7SNikita Popov  %cmp = icmp eq i64 %count, 999
78*142ba7d7SNikita Popov  %next_state = zext i1 %cmp to i8
79*142ba7d7SNikita Popov  %inc = add i64 %count, 1
80*142ba7d7SNikita Popov  br label %header
81*142ba7d7SNikita Popov
82*142ba7d7SNikita Popovexit:                                             ; preds = %header
83*142ba7d7SNikita Popov  ret i64 %count
84*142ba7d7SNikita Popov}
85*142ba7d7SNikita Popov
86*142ba7d7SNikita Popovdefine i64 @switch_multi_exit_known_entry() {
87*142ba7d7SNikita Popov; CHECK-LABEL: @switch_multi_exit_known_entry(
88*142ba7d7SNikita Popov; CHECK-NEXT:  start:
89*142ba7d7SNikita Popov; CHECK-NEXT:    br label [[HEADER:%.*]]
90*142ba7d7SNikita Popov; CHECK:       header:
91*142ba7d7SNikita Popov; CHECK-NEXT:    [[STATE:%.*]] = phi i8 [ 0, [[START:%.*]] ], [ [[NEXT_STATE:%.*]], [[LATCH:%.*]] ]
92*142ba7d7SNikita Popov; CHECK-NEXT:    [[COUNT:%.*]] = phi i64 [ 0, [[START]] ], [ [[INC:%.*]], [[LATCH]] ]
93*142ba7d7SNikita Popov; CHECK-NEXT:    switch i8 [[STATE]], label [[LATCH]] [
94*142ba7d7SNikita Popov; CHECK-NEXT:    i8 1, label [[EXIT:%.*]]
95*142ba7d7SNikita Popov; CHECK-NEXT:    i8 2, label [[EXIT]]
96*142ba7d7SNikita Popov; CHECK-NEXT:    ]
97*142ba7d7SNikita Popov; CHECK:       latch:
98*142ba7d7SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[COUNT]], 999
99*142ba7d7SNikita Popov; CHECK-NEXT:    [[NEXT_STATE]] = zext i1 [[CMP]] to i8
100*142ba7d7SNikita Popov; CHECK-NEXT:    [[INC]] = add i64 [[COUNT]], 1
101*142ba7d7SNikita Popov; CHECK-NEXT:    br label [[HEADER]]
102*142ba7d7SNikita Popov; CHECK:       exit:
103*142ba7d7SNikita Popov; CHECK-NEXT:    [[COUNT_LCSSA:%.*]] = phi i64 [ [[COUNT]], [[HEADER]] ], [ [[COUNT]], [[HEADER]] ]
104*142ba7d7SNikita Popov; CHECK-NEXT:    ret i64 [[COUNT_LCSSA]]
105*142ba7d7SNikita Popov;
106*142ba7d7SNikita Popovstart:
107*142ba7d7SNikita Popov  br label %header
108*142ba7d7SNikita Popov
109*142ba7d7SNikita Popovheader:                                           ; preds = %latch, %start
110*142ba7d7SNikita Popov  %state = phi i8 [ 0, %start ], [ %next_state, %latch ]
111*142ba7d7SNikita Popov  %count = phi i64 [ 0, %start ], [ %inc, %latch ]
112*142ba7d7SNikita Popov  switch i8 %state, label %latch [
113*142ba7d7SNikita Popov  i8 1, label %exit
114*142ba7d7SNikita Popov  i8 2, label %exit
115*142ba7d7SNikita Popov  ]
116*142ba7d7SNikita Popov
117*142ba7d7SNikita Popovlatch:                                            ; preds = %header, %header
118*142ba7d7SNikita Popov  %cmp = icmp eq i64 %count, 999
119*142ba7d7SNikita Popov  %next_state = zext i1 %cmp to i8
120*142ba7d7SNikita Popov  %inc = add i64 %count, 1
121*142ba7d7SNikita Popov  br label %header
122*142ba7d7SNikita Popov
123*142ba7d7SNikita Popovexit:                                             ; preds = %header
124*142ba7d7SNikita Popov  ret i64 %count
125*142ba7d7SNikita Popov}
126*142ba7d7SNikita Popov
127*142ba7d7SNikita Popovdefine i64 @switch_multi_exit_unknown_entry(i8 %start_state) {
128*142ba7d7SNikita Popov; CHECK-LABEL: @switch_multi_exit_unknown_entry(
129*142ba7d7SNikita Popov; CHECK-NEXT:  start:
130*142ba7d7SNikita Popov; CHECK-NEXT:    br label [[HEADER:%.*]]
131*142ba7d7SNikita Popov; CHECK:       header:
132*142ba7d7SNikita Popov; CHECK-NEXT:    [[STATE:%.*]] = phi i8 [ [[START_STATE:%.*]], [[START:%.*]] ], [ [[NEXT_STATE:%.*]], [[LATCH:%.*]] ]
133*142ba7d7SNikita Popov; CHECK-NEXT:    [[COUNT:%.*]] = phi i64 [ 0, [[START]] ], [ [[INC:%.*]], [[LATCH]] ]
134*142ba7d7SNikita Popov; CHECK-NEXT:    switch i8 [[STATE]], label [[LATCH]] [
135*142ba7d7SNikita Popov; CHECK-NEXT:    i8 1, label [[EXIT:%.*]]
136*142ba7d7SNikita Popov; CHECK-NEXT:    i8 2, label [[EXIT]]
137*142ba7d7SNikita Popov; CHECK-NEXT:    ]
138*142ba7d7SNikita Popov; CHECK:       latch:
139*142ba7d7SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[COUNT]], 999
140*142ba7d7SNikita Popov; CHECK-NEXT:    [[NEXT_STATE]] = zext i1 [[CMP]] to i8
141*142ba7d7SNikita Popov; CHECK-NEXT:    [[INC]] = add i64 [[COUNT]], 1
142*142ba7d7SNikita Popov; CHECK-NEXT:    br label [[HEADER]]
143*142ba7d7SNikita Popov; CHECK:       exit:
144*142ba7d7SNikita Popov; CHECK-NEXT:    [[COUNT_LCSSA:%.*]] = phi i64 [ [[COUNT]], [[HEADER]] ], [ [[COUNT]], [[HEADER]] ]
145*142ba7d7SNikita Popov; CHECK-NEXT:    ret i64 [[COUNT_LCSSA]]
146*142ba7d7SNikita Popov;
147*142ba7d7SNikita Popovstart:
148*142ba7d7SNikita Popov  br label %header
149*142ba7d7SNikita Popov
150*142ba7d7SNikita Popovheader:                                           ; preds = %latch, %start
151*142ba7d7SNikita Popov  %state = phi i8 [ %start_state, %start ], [ %next_state, %latch ]
152*142ba7d7SNikita Popov  %count = phi i64 [ 0, %start ], [ %inc, %latch ]
153*142ba7d7SNikita Popov  switch i8 %state, label %latch [
154*142ba7d7SNikita Popov  i8 1, label %exit
155*142ba7d7SNikita Popov  i8 2, label %exit
156*142ba7d7SNikita Popov  ]
157*142ba7d7SNikita Popov
158*142ba7d7SNikita Popovlatch:                                            ; preds = %header, %header
159*142ba7d7SNikita Popov  %cmp = icmp eq i64 %count, 999
160*142ba7d7SNikita Popov  %next_state = zext i1 %cmp to i8
161*142ba7d7SNikita Popov  %inc = add i64 %count, 1
162*142ba7d7SNikita Popov  br label %header
163*142ba7d7SNikita Popov
164*142ba7d7SNikita Popovexit:                                             ; preds = %header
165*142ba7d7SNikita Popov  ret i64 %count
166*142ba7d7SNikita Popov}
167