1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs -o - %s | FileCheck %s
4 %struct_type = type { [10000 x i32], i32, i32 }
6 define void @test1(ptr %s, i32 %n) {
8 ; CHECK: // %bb.0: // %entry
9 ; CHECK-NEXT: ldr x9, [x0]
10 ; CHECK-NEXT: mov w10, #40000 // =0x9c40
11 ; CHECK-NEXT: mov w8, wzr
12 ; CHECK-NEXT: add x9, x9, x10
13 ; CHECK-NEXT: cmp w8, w1
14 ; CHECK-NEXT: b.ge .LBB0_2
15 ; CHECK-NEXT: .LBB0_1: // %while_body
16 ; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
17 ; CHECK-NEXT: str w8, [x9, #4]
18 ; CHECK-NEXT: add w8, w8, #1
19 ; CHECK-NEXT: str w8, [x9]
20 ; CHECK-NEXT: cmp w8, w1
21 ; CHECK-NEXT: b.lt .LBB0_1
22 ; CHECK-NEXT: .LBB0_2: // %while_end
25 %struct = load ptr, ptr %s
29 %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
30 %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
31 %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
32 %cmp = icmp slt i32 %phi, %n
33 br i1 %cmp, label %while_body, label %while_end
37 store i32 %i, ptr %gep0
38 store i32 %phi, ptr %gep1
45 define void @test2(ptr %struct, i32 %n) {
47 ; CHECK: // %bb.0: // %entry
48 ; CHECK-NEXT: cbz x0, .LBB1_3
49 ; CHECK-NEXT: // %bb.1: // %while_cond.preheader
50 ; CHECK-NEXT: mov w8, #40000 // =0x9c40
51 ; CHECK-NEXT: mov w9, wzr
52 ; CHECK-NEXT: add x8, x0, x8
53 ; CHECK-NEXT: cmp w9, w1
54 ; CHECK-NEXT: b.ge .LBB1_3
55 ; CHECK-NEXT: .LBB1_2: // %while_body
56 ; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
57 ; CHECK-NEXT: str w9, [x8, #4]
58 ; CHECK-NEXT: add w9, w9, #1
59 ; CHECK-NEXT: str w9, [x8]
60 ; CHECK-NEXT: cmp w9, w1
61 ; CHECK-NEXT: b.lt .LBB1_2
62 ; CHECK-NEXT: .LBB1_3: // %while_end
65 %cmp = icmp eq ptr %struct, null
66 br i1 %cmp, label %while_end, label %while_cond
69 %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
70 %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
71 %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
72 %cmp1 = icmp slt i32 %phi, %n
73 br i1 %cmp1, label %while_body, label %while_end
77 store i32 %i, ptr %gep0
78 store i32 %phi, ptr %gep1
85 define void @test3(ptr %s1, ptr %s2, i1 %cond, i32 %n) {
87 ; CHECK: // %bb.0: // %entry
88 ; CHECK-NEXT: tst w2, #0x1
89 ; CHECK-NEXT: csel x8, x1, x0, ne
90 ; CHECK-NEXT: cbz x8, .LBB2_3
91 ; CHECK-NEXT: // %bb.1: // %while_cond.preheader
92 ; CHECK-NEXT: mov w10, #40000 // =0x9c40
93 ; CHECK-NEXT: mov w9, wzr
94 ; CHECK-NEXT: add x8, x8, x10
95 ; CHECK-NEXT: cmp w9, w3
96 ; CHECK-NEXT: b.ge .LBB2_3
97 ; CHECK-NEXT: .LBB2_2: // %while_body
98 ; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
99 ; CHECK-NEXT: str w9, [x8, #4]
100 ; CHECK-NEXT: add w9, w9, #1
101 ; CHECK-NEXT: str w9, [x8]
102 ; CHECK-NEXT: cmp w9, w3
103 ; CHECK-NEXT: b.lt .LBB2_2
104 ; CHECK-NEXT: .LBB2_3: // %while_end
107 br i1 %cond, label %if_true, label %if_end
113 %struct = phi ptr [ %s1, %entry ], [ %s2, %if_true ]
114 %cmp = icmp eq ptr %struct, null
115 br i1 %cmp, label %while_end, label %while_cond
118 %phi = phi i32 [ 0, %if_end ], [ %i, %while_body ]
119 %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
120 %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
121 %cmp1 = icmp slt i32 %phi, %n
122 br i1 %cmp1, label %while_body, label %while_end
126 store i32 %i, ptr %gep0
127 store i32 %phi, ptr %gep1
137 define void @test4(i32 %n) uwtable personality ptr @__FrameHandler {
138 ; CHECK-LABEL: test4:
139 ; CHECK: .Lfunc_begin0:
140 ; CHECK-NEXT: .cfi_startproc
141 ; CHECK-NEXT: .cfi_personality 156, DW.ref.__FrameHandler
142 ; CHECK-NEXT: .cfi_lsda 28, .Lexception0
143 ; CHECK-NEXT: // %bb.0: // %entry
144 ; CHECK-NEXT: stp x30, x21, [sp, #-32]! // 16-byte Folded Spill
145 ; CHECK-NEXT: .cfi_def_cfa_offset 32
146 ; CHECK-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill
147 ; CHECK-NEXT: .cfi_offset w19, -8
148 ; CHECK-NEXT: .cfi_offset w20, -16
149 ; CHECK-NEXT: .cfi_offset w21, -24
150 ; CHECK-NEXT: .cfi_offset w30, -32
151 ; CHECK-NEXT: .cfi_remember_state
152 ; CHECK-NEXT: mov w19, w0
153 ; CHECK-NEXT: mov w21, wzr
154 ; CHECK-NEXT: mov w20, #40000 // =0x9c40
155 ; CHECK-NEXT: .LBB3_1: // %while_cond
156 ; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
157 ; CHECK-NEXT: .Ltmp0:
159 ; CHECK-NEXT: .Ltmp1:
160 ; CHECK-NEXT: // %bb.2: // %while_cond_x.split
161 ; CHECK-NEXT: // in Loop: Header=BB3_1 Depth=1
162 ; CHECK-NEXT: add x8, x0, x20
163 ; CHECK-NEXT: cmp w21, w19
164 ; CHECK-NEXT: str wzr, [x8]
165 ; CHECK-NEXT: b.ge .LBB3_4
166 ; CHECK-NEXT: // %bb.3: // %while_body
167 ; CHECK-NEXT: // in Loop: Header=BB3_1 Depth=1
168 ; CHECK-NEXT: str w21, [x8, #4]
169 ; CHECK-NEXT: add w21, w21, #1
170 ; CHECK-NEXT: str w21, [x8]
171 ; CHECK-NEXT: b .LBB3_1
172 ; CHECK-NEXT: .LBB3_4: // %while_end
173 ; CHECK-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload
174 ; CHECK-NEXT: ldp x30, x21, [sp], #32 // 16-byte Folded Reload
175 ; CHECK-NEXT: .cfi_def_cfa_offset 0
176 ; CHECK-NEXT: .cfi_restore w19
177 ; CHECK-NEXT: .cfi_restore w20
178 ; CHECK-NEXT: .cfi_restore w21
179 ; CHECK-NEXT: .cfi_restore w30
181 ; CHECK-NEXT: .LBB3_5: // %cleanup
182 ; CHECK-NEXT: .cfi_restore_state
183 ; CHECK-NEXT: .Ltmp2:
184 ; CHECK-NEXT: mov x19, x0
185 ; CHECK-NEXT: bl foo2
186 ; CHECK-NEXT: mov x0, x19
187 ; CHECK-NEXT: bl _Unwind_Resume
192 %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
193 %struct = invoke ptr @foo() to label %while_cond_x unwind label %cleanup
196 %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
197 %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
198 store i32 0, ptr %gep0
199 %cmp = icmp slt i32 %phi, %n
200 br i1 %cmp, label %while_body, label %while_end
204 store i32 %i, ptr %gep0
205 store i32 %phi, ptr %gep1
212 %x10 = landingpad { ptr, i32 }
215 resume { ptr, i32 } %x10
218 declare i32 @__FrameHandler(...)
220 define void @test5(ptr %s, i32 %n) {
221 ; CHECK-LABEL: test5:
222 ; CHECK: // %bb.0: // %entry
223 ; CHECK-NEXT: ldr x8, [x0]
224 ; CHECK-NEXT: mov w9, wzr
225 ; CHECK-NEXT: add x8, x8, #19, lsl #12 // =77824
226 ; CHECK-NEXT: add x8, x8, #2176
227 ; CHECK-NEXT: cmp w9, w1
228 ; CHECK-NEXT: b.ge .LBB4_2
229 ; CHECK-NEXT: .LBB4_1: // %while_body
230 ; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
231 ; CHECK-NEXT: str w9, [x8, #4]
232 ; CHECK-NEXT: add w9, w9, #1
233 ; CHECK-NEXT: str w9, [x8]
234 ; CHECK-NEXT: cmp w9, w1
235 ; CHECK-NEXT: b.lt .LBB4_1
236 ; CHECK-NEXT: .LBB4_2: // %while_end
239 %struct = load ptr, ptr %s
243 %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
244 %gep0 = getelementptr [65536 x i32], ptr %struct, i64 0, i32 20000
245 %gep1 = getelementptr [65536 x i32], ptr %struct, i64 0, i32 20001
246 %cmp = icmp slt i32 %phi, %n
247 br i1 %cmp, label %while_body, label %while_end
251 store i32 %i, ptr %gep0
252 store i32 %phi, ptr %gep1
259 declare ptr @llvm.strip.invariant.group.p0(ptr)
261 define void @test_invariant_group(i32 %arg, i1 %c) {
262 ; CHECK-LABEL: test_invariant_group:
263 ; CHECK: // %bb.0: // %bb
264 ; CHECK-NEXT: tbz w1, #0, .LBB5_4
265 ; CHECK-NEXT: // %bb.1: // %bb6
266 ; CHECK-NEXT: cbz w0, .LBB5_3
267 ; CHECK-NEXT: .LBB5_2: // %bb1
268 ; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
269 ; CHECK-NEXT: tbnz w1, #0, .LBB5_2
270 ; CHECK-NEXT: b .LBB5_4
271 ; CHECK-NEXT: .LBB5_3: // %bb2
272 ; CHECK-NEXT: tbz w1, #0, .LBB5_5
273 ; CHECK-NEXT: .LBB5_4: // %bb5
275 ; CHECK-NEXT: .LBB5_5: // %bb4
276 ; CHECK-NEXT: mov w8, #1 // =0x1
277 ; CHECK-NEXT: str x8, [x8]
280 br i1 %c, label %bb6, label %bb5
282 bb1: ; preds = %bb6, %bb1
283 br i1 %c, label %bb1, label %bb5
286 %i = getelementptr inbounds i8, ptr %i7, i32 40000
287 br i1 %c, label %bb5, label %bb4
290 store i64 1, ptr %i, align 8
293 bb5: ; preds = %bb4, %bb2, %bb1, %bb
297 %i7 = call ptr @llvm.strip.invariant.group.p0(ptr nonnull undef)
298 %i8 = icmp eq i32 %arg, 0
299 br i1 %i8, label %bb2, label %bb1