[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / CodeGenPrepare / AArch64 / large-offset-gep.ll
blob080b3dd75ee9a9da7e899a84e07cb69a3d056b1a
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 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
23 ; CHECK-NEXT:    ret
24 entry:
25   %struct = load ptr, ptr %s
26   br label %while_cond
28 while_cond:
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
35 while_body:
36   %i = add i32 %phi, 1
37   store i32 %i, ptr %gep0
38   store i32 %phi, ptr %gep1
39   br label %while_cond
41 while_end:
42   ret void
45 define void @test2(ptr %struct, i32 %n) {
46 ; CHECK-LABEL: test2:
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
63 ; CHECK-NEXT:    ret
64 entry:
65   %cmp = icmp eq ptr %struct, null
66   br i1 %cmp, label %while_end, label %while_cond
68 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
75 while_body:
76   %i = add i32 %phi, 1
77   store i32 %i, ptr %gep0
78   store i32 %phi, ptr %gep1
79   br label %while_cond
81 while_end:
82   ret void
85 define void @test3(ptr %s1, ptr %s2, i1 %cond, i32 %n) {
86 ; CHECK-LABEL: test3:
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
105 ; CHECK-NEXT:    ret
106 entry:
107   br i1 %cond, label %if_true, label %if_end
109 if_true:
110   br label %if_end
112 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
117 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
124 while_body:
125   %i = add i32 %phi, 1
126   store i32 %i, ptr %gep0
127   store i32 %phi, ptr %gep1
128   br label %while_cond
130 while_end:
131   ret void
134 declare ptr @foo()
135 declare void @foo2()
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:
158 ; CHECK-NEXT:    bl foo
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
180 ; CHECK-NEXT:    ret
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
188 entry:
189   br label %while_cond
191 while_cond:
192   %phi = phi i32 [ 0, %entry ], [ %i, %while_body ]
193   %struct = invoke ptr @foo() to label %while_cond_x unwind label %cleanup
195 while_cond_x:
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
202 while_body:
203   %i = add i32 %phi, 1
204   store i32 %i, ptr %gep0
205   store i32 %phi, ptr %gep1
206   br label %while_cond
208 while_end:
209   ret void
211 cleanup:
212   %x10 = landingpad { ptr, i32 }
213           cleanup
214   call void @foo2()
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
237 ; CHECK-NEXT:    ret
238 entry:
239   %struct = load ptr, ptr %s
240   br label %while_cond
242 while_cond:
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
249 while_body:
250   %i = add i32 %phi, 1
251   store i32 %i, ptr %gep0
252   store i32 %phi, ptr %gep1
253   br label %while_cond
255 while_end:
256   ret void
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
274 ; CHECK-NEXT:    ret
275 ; CHECK-NEXT:  .LBB5_5: // %bb4
276 ; CHECK-NEXT:    mov w8, #1 // =0x1
277 ; CHECK-NEXT:    str x8, [x8]
278 ; CHECK-NEXT:    ret
280   br i1 %c, label %bb6, label %bb5
282 bb1:                                              ; preds = %bb6, %bb1
283   br i1 %c, label %bb1, label %bb5
285 bb2:                                              ; preds = %bb6
286   %i = getelementptr inbounds i8, ptr %i7, i32 40000
287   br i1 %c, label %bb5, label %bb4
289 bb4:                                              ; preds = %bb2
290   store i64 1, ptr %i, align 8
291   br label %bb5
293 bb5:                                              ; preds = %bb4, %bb2, %bb1, %bb
294   ret void
296 bb6:                                              ; preds = %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