xref: /llvm-project/llvm/test/CodeGen/Hexagon/loop_correctness.ll (revision 2208c97c1bec2512d4e47b6223db6d95a7037956)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=hexagon -O3 -hexagon-instsimplify=0 < %s | FileCheck %s
3
4define void @f0(ptr nocapture %a0, i32 %a1, i32 %a2) #0 {
5; CHECK-LABEL: f0:
6; CHECK:       // %bb.0: // %b0
7; CHECK-NEXT:    {
8; CHECK-NEXT:     loop0(.LBB0_1,#3)
9; CHECK-NEXT:    }
10; CHECK-NEXT:    .p2align 4
11; CHECK-NEXT:  .LBB0_1: // Block address taken
12; CHECK-NEXT:    // %b2
13; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
14; CHECK-NEXT:    {
15; CHECK-NEXT:     nop
16; CHECK-NEXT:     nop
17; CHECK-NEXT:    } :endloop0
18; CHECK-NEXT:  // %bb.2: // %b3
19; CHECK-NEXT:    {
20; CHECK-NEXT:     jumpr r31
21; CHECK-NEXT:    }
22b0:
23  br label %b1
24
25b1:                                               ; preds = %b0
26  br label %b2
27
28b2:                                               ; preds = %b2, %b1
29  %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ]
30  %v1 = add nsw i32 %v0, 1
31  %v2 = icmp slt i32 %v1, 3
32  br i1 %v2, label %b2, label %b3
33
34b3:                                               ; preds = %b2
35  ret void
36}
37
38define void @f1(ptr nocapture %a0, i32 %a1, i32 %a2) #0 {
39; CHECK-LABEL: f1:
40; CHECK:       // %bb.0: // %b0
41; CHECK-NEXT:    {
42; CHECK-NEXT:     loop0(.LBB1_1,#2)
43; CHECK-NEXT:    }
44; CHECK-NEXT:    .p2align 4
45; CHECK-NEXT:  .LBB1_1: // Block address taken
46; CHECK-NEXT:    // %b2
47; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
48; CHECK-NEXT:    {
49; CHECK-NEXT:     nop
50; CHECK-NEXT:     nop
51; CHECK-NEXT:    } :endloop0
52; CHECK-NEXT:  // %bb.2: // %b3
53; CHECK-NEXT:    {
54; CHECK-NEXT:     jumpr r31
55; CHECK-NEXT:    }
56b0:
57  br label %b1
58
59b1:                                               ; preds = %b0
60  br label %b2
61
62b2:                                               ; preds = %b2, %b1
63  %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ]
64  %v1 = add nsw i32 %v0, 2
65  %v2 = icmp slt i32 %v1, 3
66  br i1 %v2, label %b2, label %b3
67
68b3:                                               ; preds = %b2
69  ret void
70}
71
72define void @f2(ptr nocapture %a0, i32 %a1, i32 %a2) #0 {
73; CHECK-LABEL: f2:
74; CHECK:       // %bb.0: // %b0
75; CHECK-NEXT:    {
76; CHECK-NEXT:     loop0(.LBB2_1,#1)
77; CHECK-NEXT:    }
78; CHECK-NEXT:    .p2align 4
79; CHECK-NEXT:  .LBB2_1: // Block address taken
80; CHECK-NEXT:    // %b2
81; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
82; CHECK-NEXT:    {
83; CHECK-NEXT:     nop
84; CHECK-NEXT:     nop
85; CHECK-NEXT:    } :endloop0
86; CHECK-NEXT:  // %bb.2: // %b3
87; CHECK-NEXT:    {
88; CHECK-NEXT:     jumpr r31
89; CHECK-NEXT:    }
90b0:
91  br label %b1
92
93b1:                                               ; preds = %b0
94  br label %b2
95
96b2:                                               ; preds = %b2, %b1
97  %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ]
98  %v1 = add nsw i32 %v0, 3
99  %v2 = icmp slt i32 %v1, 3
100  br i1 %v2, label %b2, label %b3
101
102b3:                                               ; preds = %b2
103  ret void
104}
105
106define void @f3(ptr nocapture %a0, i32 %a1, i32 %a2) #0 {
107; CHECK-LABEL: f3:
108; CHECK:       // %bb.0: // %b0
109; CHECK-NEXT:    {
110; CHECK-NEXT:     loop0(.LBB3_1,#4)
111; CHECK-NEXT:    }
112; CHECK-NEXT:    .p2align 4
113; CHECK-NEXT:  .LBB3_1: // Block address taken
114; CHECK-NEXT:    // %b2
115; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
116; CHECK-NEXT:    {
117; CHECK-NEXT:     nop
118; CHECK-NEXT:     nop
119; CHECK-NEXT:    } :endloop0
120; CHECK-NEXT:  // %bb.2: // %b3
121; CHECK-NEXT:    {
122; CHECK-NEXT:     jumpr r31
123; CHECK-NEXT:    }
124b0:
125  br label %b1
126
127b1:                                               ; preds = %b0
128  br label %b2
129
130b2:                                               ; preds = %b2, %b1
131  %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ]
132  %v1 = add nsw i32 %v0, 1
133  %v2 = icmp sle i32 %v1, 3
134  br i1 %v2, label %b2, label %b3
135
136b3:                                               ; preds = %b2
137  ret void
138}
139
140define void @f4(ptr nocapture %a0, i32 %a1, i32 %a2) #0 {
141; CHECK-LABEL: f4:
142; CHECK:       // %bb.0: // %b0
143; CHECK-NEXT:    {
144; CHECK-NEXT:     loop0(.LBB4_1,#2)
145; CHECK-NEXT:    }
146; CHECK-NEXT:    .p2align 4
147; CHECK-NEXT:  .LBB4_1: // Block address taken
148; CHECK-NEXT:    // %b2
149; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
150; CHECK-NEXT:    {
151; CHECK-NEXT:     nop
152; CHECK-NEXT:     nop
153; CHECK-NEXT:    } :endloop0
154; CHECK-NEXT:  // %bb.2: // %b3
155; CHECK-NEXT:    {
156; CHECK-NEXT:     jumpr r31
157; CHECK-NEXT:    }
158b0:
159  br label %b1
160
161b1:                                               ; preds = %b0
162  br label %b2
163
164b2:                                               ; preds = %b2, %b1
165  %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ]
166  %v1 = add nsw i32 %v0, 2
167  %v2 = icmp sle i32 %v1, 3
168  br i1 %v2, label %b2, label %b3
169
170b3:                                               ; preds = %b2
171  ret void
172}
173
174define void @f5(ptr nocapture %a0, i32 %a1, i32 %a2) #0 {
175; CHECK-LABEL: f5:
176; CHECK:       // %bb.0: // %b0
177; CHECK-NEXT:    {
178; CHECK-NEXT:     loop0(.LBB5_1,#2)
179; CHECK-NEXT:    }
180; CHECK-NEXT:    .p2align 4
181; CHECK-NEXT:  .LBB5_1: // Block address taken
182; CHECK-NEXT:    // %b2
183; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
184; CHECK-NEXT:    {
185; CHECK-NEXT:     nop
186; CHECK-NEXT:     nop
187; CHECK-NEXT:    } :endloop0
188; CHECK-NEXT:  // %bb.2: // %b3
189; CHECK-NEXT:    {
190; CHECK-NEXT:     jumpr r31
191; CHECK-NEXT:    }
192b0:
193  br label %b1
194
195b1:                                               ; preds = %b0
196  br label %b2
197
198b2:                                               ; preds = %b2, %b1
199  %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ]
200  %v1 = add nsw i32 %v0, 3
201  %v2 = icmp sle i32 %v1, 3
202  br i1 %v2, label %b2, label %b3
203
204b3:                                               ; preds = %b2
205  ret void
206}
207
208attributes #0 = { nounwind }
209