Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / CodeGenPrepare / AArch64 / large-offset-gep.ll
blob097575ca86bccb16f86123016b4cc05d69b9b1d3
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) {
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
23 entry:
24   %struct = load ptr, ptr %s
25   br label %while_cond
27 while_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
34 while_body:
35   %i = add i32 %phi, 1
36   store i32 %i, ptr %gep0
37   store i32 %phi, ptr %gep1
38   br label %while_cond
40 while_end:
41   ret void
44 define 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
62 entry:
63   %cmp = icmp eq ptr %struct, null
64   br i1 %cmp, label %while_end, label %while_cond
66 while_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
73 while_body:
74   %i = add i32 %phi, 1
75   store i32 %i, ptr %gep0
76   store i32 %phi, ptr %gep1
77   br label %while_cond
79 while_end:
80   ret void
83 define 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
103 entry:
104   br i1 %cond, label %if_true, label %if_end
106 if_true:
107   br label %if_end
109 if_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
114 while_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
121 while_body:
122   %i = add i32 %phi, 1
123   store i32 %i, ptr %gep0
124   store i32 %phi, ptr %gep1
125   br label %while_cond
127 while_end:
128   ret void
131 declare ptr @foo()
132 declare void @foo2()
134 define 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
182 entry:
183   br label %while_cond
185 while_cond:
186   %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
187   %struct = invoke ptr @foo() to label %while_cond_x unwind label %cleanup
189 while_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
196 while_body:
197   %i = add i32 %phi, 1
198   store i32 %i, ptr %gep0
199   store i32 %phi, ptr %gep1
200   br label %while_cond
202 while_end:
203   ret void
205 cleanup:
206   %x10 = landingpad { ptr, i32 }
207           cleanup
208   call void @foo2()
209   resume { ptr, i32 } %x10
212 declare i32 @__FrameHandler(...)
214 define 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
231 entry:
232   %struct = load ptr, ptr %s
233   br label %while_cond
235 while_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
242 while_body:
243   %i = add i32 %phi, 1
244   store i32 %i, ptr %gep0
245   store i32 %phi, ptr %gep1
246   br label %while_cond
248 while_end:
249   ret void
252 declare ptr @llvm.strip.invariant.group.p0(ptr)
254 define 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
273   br i1 %c, label %bb6, label %bb5
275 bb1:                                              ; preds = %bb6, %bb1
276   br i1 %c, label %bb1, label %bb5
278 bb2:                                              ; preds = %bb6
279   %i = getelementptr inbounds i8, ptr %i7, i32 40000
280   br i1 %c, label %bb5, label %bb4
282 bb4:                                              ; preds = %bb2
283   store i64 1, ptr %i, align 8
284   br label %bb5
286 bb5:                                              ; preds = %bb4, %bb2, %bb1, %bb
287   ret void
289 bb6:                                              ; 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