xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/AArch64/large-offset-gep.ll (revision d6f4d5209ffcdc6d8e33a14fe8df70283b768f45)
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
3
4%struct_type = type { [10000 x i32], i32, i32 }
5
6define void @test1(ptr %s, i32 %n) {
7; CHECK-LABEL: test1:
8; CHECK:       // %bb.0: // %entry
9; CHECK-NEXT:    ldr x8, [x0]
10; CHECK-NEXT:    mov w9, wzr
11; CHECK-NEXT:    add x8, x8, #9, lsl #12 // =36864
12; CHECK-NEXT:    cmp w9, w1
13; CHECK-NEXT:    b.ge .LBB0_2
14; CHECK-NEXT:  .LBB0_1: // %while_body
15; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
16; CHECK-NEXT:    str w9, [x8, #3140]
17; CHECK-NEXT:    add w9, w9, #1
18; CHECK-NEXT:    str w9, [x8, #3136]
19; CHECK-NEXT:    cmp w9, w1
20; CHECK-NEXT:    b.lt .LBB0_1
21; CHECK-NEXT:  .LBB0_2: // %while_end
22; CHECK-NEXT:    ret
23entry:
24  %struct = load ptr, ptr %s
25  br label %while_cond
26
27while_cond:
28  %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
29  %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
30  %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
31  %cmp = icmp slt i32 %phi, %n
32  br i1 %cmp, label %while_body, label %while_end
33
34while_body:
35  %i = add i32 %phi, 1
36  store i32 %i, ptr %gep0
37  store i32 %phi, ptr %gep1
38  br label %while_cond
39
40while_end:
41  ret void
42}
43
44define void @test2(ptr %struct, i32 %n) {
45; CHECK-LABEL: test2:
46; CHECK:       // %bb.0: // %entry
47; CHECK-NEXT:    cbz x0, .LBB1_3
48; CHECK-NEXT:  // %bb.1: // %while_cond.preheader
49; CHECK-NEXT:    mov w9, wzr
50; CHECK-NEXT:    add x8, x0, #9, lsl #12 // =36864
51; CHECK-NEXT:    cmp w9, w1
52; CHECK-NEXT:    b.ge .LBB1_3
53; CHECK-NEXT:  .LBB1_2: // %while_body
54; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
55; CHECK-NEXT:    str w9, [x8, #3140]
56; CHECK-NEXT:    add w9, w9, #1
57; CHECK-NEXT:    str w9, [x8, #3136]
58; CHECK-NEXT:    cmp w9, w1
59; CHECK-NEXT:    b.lt .LBB1_2
60; CHECK-NEXT:  .LBB1_3: // %while_end
61; CHECK-NEXT:    ret
62entry:
63  %cmp = icmp eq ptr %struct, null
64  br i1 %cmp, label %while_end, label %while_cond
65
66while_cond:
67  %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
68  %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
69  %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
70  %cmp1 = icmp slt i32 %phi, %n
71  br i1 %cmp1, label %while_body, label %while_end
72
73while_body:
74  %i = add i32 %phi, 1
75  store i32 %i, ptr %gep0
76  store i32 %phi, ptr %gep1
77  br label %while_cond
78
79while_end:
80  ret void
81}
82
83define void @test3(ptr %s1, ptr %s2, i1 %cond, i32 %n) {
84; CHECK-LABEL: test3:
85; CHECK:       // %bb.0: // %entry
86; CHECK-NEXT:    tst w2, #0x1
87; CHECK-NEXT:    csel x8, x1, x0, ne
88; CHECK-NEXT:    cbz x8, .LBB2_3
89; CHECK-NEXT:  // %bb.1: // %while_cond.preheader
90; CHECK-NEXT:    mov w9, wzr
91; CHECK-NEXT:    add x8, x8, #9, lsl #12 // =36864
92; CHECK-NEXT:    cmp w9, w3
93; CHECK-NEXT:    b.ge .LBB2_3
94; CHECK-NEXT:  .LBB2_2: // %while_body
95; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
96; CHECK-NEXT:    str w9, [x8, #3140]
97; CHECK-NEXT:    add w9, w9, #1
98; CHECK-NEXT:    str w9, [x8, #3136]
99; CHECK-NEXT:    cmp w9, w3
100; CHECK-NEXT:    b.lt .LBB2_2
101; CHECK-NEXT:  .LBB2_3: // %while_end
102; CHECK-NEXT:    ret
103entry:
104  br i1 %cond, label %if_true, label %if_end
105
106if_true:
107  br label %if_end
108
109if_end:
110  %struct = phi ptr [ %s1, %entry ], [ %s2, %if_true ]
111  %cmp = icmp eq ptr %struct, null
112  br i1 %cmp, label %while_end, label %while_cond
113
114while_cond:
115  %phi = phi i32 [ 0, %if_end ], [ %i, %while_body ]
116  %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
117  %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
118  %cmp1 = icmp slt i32 %phi, %n
119  br i1 %cmp1, label %while_body, label %while_end
120
121while_body:
122  %i = add i32 %phi, 1
123  store i32 %i, ptr %gep0
124  store i32 %phi, ptr %gep1
125  br label %while_cond
126
127while_end:
128  ret void
129}
130
131declare ptr @foo()
132declare void @foo2()
133
134define void @test4(i32 %n) uwtable personality ptr @__FrameHandler {
135; CHECK-LABEL: test4:
136; CHECK:       .Lfunc_begin0:
137; CHECK-NEXT:    .cfi_startproc
138; CHECK-NEXT:    .cfi_personality 156, DW.ref.__FrameHandler
139; CHECK-NEXT:    .cfi_lsda 28, .Lexception0
140; CHECK-NEXT:  // %bb.0: // %entry
141; CHECK-NEXT:    str x30, [sp, #-32]! // 8-byte Folded Spill
142; CHECK-NEXT:    .cfi_def_cfa_offset 32
143; CHECK-NEXT:    stp x20, x19, [sp, #16] // 16-byte Folded Spill
144; CHECK-NEXT:    .cfi_offset w19, -8
145; CHECK-NEXT:    .cfi_offset w20, -16
146; CHECK-NEXT:    .cfi_offset w30, -32
147; CHECK-NEXT:    .cfi_remember_state
148; CHECK-NEXT:    mov w19, w0
149; CHECK-NEXT:    mov w20, wzr
150; CHECK-NEXT:  .LBB3_1: // %while_cond
151; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
152; CHECK-NEXT:  .Ltmp0:
153; CHECK-NEXT:    bl foo
154; CHECK-NEXT:  .Ltmp1:
155; CHECK-NEXT:  // %bb.2: // %while_cond_x.split
156; CHECK-NEXT:    // in Loop: Header=BB3_1 Depth=1
157; CHECK-NEXT:    add x8, x0, #9, lsl #12 // =36864
158; CHECK-NEXT:    cmp w20, w19
159; CHECK-NEXT:    str wzr, [x8, #3136]
160; CHECK-NEXT:    b.ge .LBB3_4
161; CHECK-NEXT:  // %bb.3: // %while_body
162; CHECK-NEXT:    // in Loop: Header=BB3_1 Depth=1
163; CHECK-NEXT:    str w20, [x8, #3140]
164; CHECK-NEXT:    add w20, w20, #1
165; CHECK-NEXT:    str w20, [x8, #3136]
166; CHECK-NEXT:    b .LBB3_1
167; CHECK-NEXT:  .LBB3_4: // %while_end
168; CHECK-NEXT:    ldp x20, x19, [sp, #16] // 16-byte Folded Reload
169; CHECK-NEXT:    ldr x30, [sp], #32 // 8-byte Folded Reload
170; CHECK-NEXT:    .cfi_def_cfa_offset 0
171; CHECK-NEXT:    .cfi_restore w19
172; CHECK-NEXT:    .cfi_restore w20
173; CHECK-NEXT:    .cfi_restore w30
174; CHECK-NEXT:    ret
175; CHECK-NEXT:  .LBB3_5: // %cleanup
176; CHECK-NEXT:    .cfi_restore_state
177; CHECK-NEXT:  .Ltmp2:
178; CHECK-NEXT:    mov x19, x0
179; CHECK-NEXT:    bl foo2
180; CHECK-NEXT:    mov x0, x19
181; CHECK-NEXT:    bl _Unwind_Resume
182entry:
183  br label %while_cond
184
185while_cond:
186  %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
187  %struct = invoke ptr @foo() to label %while_cond_x unwind label %cleanup
188
189while_cond_x:
190  %gep0 = getelementptr %struct_type, ptr %struct, i64 0, i32 1
191  %gep1 = getelementptr %struct_type, ptr %struct, i64 0, i32 2
192  store i32 0, ptr %gep0
193  %cmp = icmp slt i32 %phi, %n
194  br i1 %cmp, label %while_body, label %while_end
195
196while_body:
197  %i = add i32 %phi, 1
198  store i32 %i, ptr %gep0
199  store i32 %phi, ptr %gep1
200  br label %while_cond
201
202while_end:
203  ret void
204
205cleanup:
206  %x10 = landingpad { ptr, i32 }
207          cleanup
208  call void @foo2()
209  resume { ptr, i32 } %x10
210}
211
212declare i32 @__FrameHandler(...)
213
214define void @test5(ptr %s, i32 %n) {
215; CHECK-LABEL: test5:
216; CHECK:       // %bb.0: // %entry
217; CHECK-NEXT:    ldr x8, [x0]
218; CHECK-NEXT:    mov w9, wzr
219; CHECK-NEXT:    add x8, x8, #19, lsl #12 // =77824
220; CHECK-NEXT:    cmp w9, w1
221; CHECK-NEXT:    b.ge .LBB4_2
222; CHECK-NEXT:  .LBB4_1: // %while_body
223; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
224; CHECK-NEXT:    str w9, [x8, #2180]
225; CHECK-NEXT:    add w9, w9, #1
226; CHECK-NEXT:    str w9, [x8, #2176]
227; CHECK-NEXT:    cmp w9, w1
228; CHECK-NEXT:    b.lt .LBB4_1
229; CHECK-NEXT:  .LBB4_2: // %while_end
230; CHECK-NEXT:    ret
231entry:
232  %struct = load ptr, ptr %s
233  br label %while_cond
234
235while_cond:
236  %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
237  %gep0 = getelementptr [65536 x i32], ptr %struct, i64 0, i32 20000
238  %gep1 = getelementptr [65536 x i32], ptr %struct, i64 0, i32 20001
239  %cmp = icmp slt i32 %phi, %n
240  br i1 %cmp, label %while_body, label %while_end
241
242while_body:
243  %i = add i32 %phi, 1
244  store i32 %i, ptr %gep0
245  store i32 %phi, ptr %gep1
246  br label %while_cond
247
248while_end:
249  ret void
250}
251
252declare ptr @llvm.strip.invariant.group.p0(ptr)
253
254define void @test_invariant_group(i32 %arg, i1 %c) {
255; CHECK-LABEL: test_invariant_group:
256; CHECK:       // %bb.0: // %bb
257; CHECK-NEXT:    tbz w1, #0, .LBB5_4
258; CHECK-NEXT:  // %bb.1: // %bb6
259; CHECK-NEXT:    cbz w0, .LBB5_3
260; CHECK-NEXT:  .LBB5_2: // %bb1
261; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
262; CHECK-NEXT:    tbnz w1, #0, .LBB5_2
263; CHECK-NEXT:    b .LBB5_4
264; CHECK-NEXT:  .LBB5_3: // %bb2
265; CHECK-NEXT:    tbz w1, #0, .LBB5_5
266; CHECK-NEXT:  .LBB5_4: // %bb5
267; CHECK-NEXT:    ret
268; CHECK-NEXT:  .LBB5_5: // %bb4
269; CHECK-NEXT:    mov w8, #1 // =0x1
270; CHECK-NEXT:    str x8, [x8]
271; CHECK-NEXT:    ret
272bb:
273  br i1 %c, label %bb6, label %bb5
274
275bb1:                                              ; preds = %bb6, %bb1
276  br i1 %c, label %bb1, label %bb5
277
278bb2:                                              ; preds = %bb6
279  %i = getelementptr inbounds i8, ptr %i7, i32 40000
280  br i1 %c, label %bb5, label %bb4
281
282bb4:                                              ; preds = %bb2
283  store i64 1, ptr %i, align 8
284  br label %bb5
285
286bb5:                                              ; preds = %bb4, %bb2, %bb1, %bb
287  ret void
288
289bb6:                                              ; preds = %bb
290  %i7 = call ptr @llvm.strip.invariant.group.p0(ptr nonnull undef)
291  %i8 = icmp eq i32 %arg, 0
292  br i1 %i8, label %bb2, label %bb1
293}
294