• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -relocation-model=pic | FileCheck %s -check-prefixes=CHECK,PIC
2
3
4; Test folding constant offsets and symbols into load and store addresses under
5; a variety of circumstances.
6
7target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
8target triple = "wasm32-unknown-emscripten"
9
10@g = external global [0 x i32], align 4
11
12; CHECK-LABEL: load_test0:
13; CHECK-NEXT: .functype load_test0 () -> (i32){{$}}
14; PIC-NEXT:   global.get $push0=, g@GOT{{$}}
15; PIC-NEXT:   i32.load  $push1=, 40($pop0){{$}}
16; CHECK-NEXT: return    $pop1{{$}}
17define i32 @load_test0() {
18  %t = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4
19  ret i32 %t
20}
21
22; CHECK-LABEL: load_test0_noinbounds:
23; CHECK-NEXT: .functype load_test0_noinbounds () -> (i32){{$}}
24; PIC-NEXT:   global.get $push0=, g@GOT{{$}}
25; PIC-NEXT:   i32.load  $push1=, 40($pop0){{$}}
26; CHECK-NEXT: return    $pop1{{$}}
27define i32 @load_test0_noinbounds() {
28  %t = load i32, i32* getelementptr ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4
29  ret i32 %t
30}
31
32; TODO: load_test1 - load_test8 are disabled because folding GA+reg is disabled
33; (there are cases where the value in the reg can be negative).
34; Likewise for stores.
35
36; CHECK-LABEL: load_test1:
37; CHECK-NEXT: .functype load_test1 (i32) -> (i32){{$}}
38; CHECK-NEX T: i32.const $push0=, 2{{$}}
39; CHECK-NEX T: i32.shl   $push1=, $0, $pop0{{$}}
40; CHECK-NEX T: i32.load  $push2=, g+40($pop1){{$}}
41; CHECK-NEX T: return    $pop2{{$}}
42define i32 @load_test1(i32 %n) {
43  %add = add nsw i32 %n, 10
44  %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
45  %t = load i32, i32* %arrayidx, align 4
46  ret i32 %t
47}
48
49; CHECK-LABEL: load_test2:
50; CHECK-NEXT: .functype load_test2 (i32) -> (i32){{$}}
51; CHECK-NEX T:  i32.const $push0=, 2{{$}}
52; CHECK-NEX T: i32.shl   $push1=, $0, $pop0{{$}}
53; CHECK-NEX T: i32.load  $push2=, g+40($pop1){{$}}
54; CHECK-NEX T: return    $pop2{{$}}
55define i32 @load_test2(i32 %n) {
56  %add = add nsw i32 10, %n
57  %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
58  %t = load i32, i32* %arrayidx, align 4
59  ret i32 %t
60}
61
62; CHECK-LABEL: load_test3:
63; CHECK-NEXT: .functype load_test3 (i32) -> (i32){{$}}
64; CHECK-NEX T: i32.const $push0=, 2{{$}}
65; CHECK-NEX T: i32.shl   $push1=, $0, $pop0{{$}}
66; CHECK-NEX T: i32.load  $push2=, g+40($pop1){{$}}
67; CHECK-NEX T: return    $pop2{{$}}
68define i32 @load_test3(i32 %n) {
69  %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n
70  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
71  %t = load i32, i32* %add.ptr1, align 4
72  ret i32 %t
73}
74
75; CHECK-LABEL: load_test4:
76; CHECK-NEXT: .functype load_test4 (i32) -> (i32){{$}}
77; CHECK-NEX T: i32.const $push0=, 2{{$}}
78; CHECK-NEX T: i32.shl   $push1=, $0, $pop0{{$}}
79; CHECK-NEX T: i32.load  $push2=, g+40($pop1){{$}}
80; CHECK-NEX T: return    $pop2{{$}}
81define i32 @load_test4(i32 %n) {
82  %add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n
83  %t = load i32, i32* %add.ptr, align 4
84  ret i32 %t
85}
86
87; CHECK-LABEL: load_test5:
88; CHECK-NEXT: .functype load_test5 (i32) -> (i32){{$}}
89; CHECK-NEX T: i32.const $push0=, 2{{$}}
90; CHECK-NEX T: i32.shl   $push1=, $0, $pop0{{$}}
91; CHECK-NEX T: i32.load  $push2=, g+40($pop1){{$}}
92; CHECK-NEX T: return    $pop2{{$}}
93define i32 @load_test5(i32 %n) {
94  %add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n
95  %t = load i32, i32* %add.ptr, align 4
96  ret i32 %t
97}
98
99; CHECK-LABEL: load_test6:
100; CHECK-NEXT: .functype load_test6 (i32) -> (i32){{$}}
101; CHECK-NEX T:  i32.const $push0=, 2{{$}}
102; CHECK-NEX T: i32.shl   $push1=, $0, $pop0{{$}}
103; CHECK-NEX T: i32.load  $push2=, g+40($pop1){{$}}
104; CHECK-NEX T: return    $pop2{{$}}
105define i32 @load_test6(i32 %n) {
106  %add = add nsw i32 %n, 10
107  %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
108  %t = load i32, i32* %add.ptr, align 4
109  ret i32 %t
110}
111
112; CHECK-LABEL: load_test7:
113; CHECK-NEXT: .functype load_test7 (i32) -> (i32){{$}}
114; CHECK-NEX T: i32.const $push0=, 2{{$}}
115; CHECK-NEX T: i32.shl   $push1=, $0, $pop0{{$}}
116; CHECK-NEX T: i32.load  $push2=, g+40($pop1){{$}}
117; CHECK-NEX T: return    $pop2{{$}}
118define i32 @load_test7(i32 %n) {
119  %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n
120  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
121  %t = load i32, i32* %add.ptr1, align 4
122  ret i32 %t
123}
124
125; CHECK-LABEL: load_test8:
126; CHECK-NEXT: .functype load_test8 (i32) -> (i32){{$}}
127; CHECK-NEX T: i32.const $push0=, 2{{$}}
128; CHECK-NEX T: i32.shl   $push1=, $0, $pop0{{$}}
129; CHECK-NEX T: i32.load  $push2=, g+40($pop1){{$}}
130; CHECK-NEX T: return    $pop2{{$}}
131define i32 @load_test8(i32 %n) {
132  %add = add nsw i32 10, %n
133  %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
134  %t = load i32, i32* %add.ptr, align 4
135  ret i32 %t
136}
137
138; CHECK-LABEL: load_test9:
139; CHECK-NEXT:  .functype load_test9 () -> (i32){{$}}
140
141; PIC-NEXT: global.get $push1=, g@GOT{{$}}
142; PIC-NEXT: i32.const  $push0=, -40{{$}}
143; PIC-NEXT: i32.add    $push2=, $pop1, $pop0{{$}}
144; PIC-NEXT: i32.load   $push3=, 0($pop2)
145; PIC-NEXT: return     $pop3{{$}}
146define i32 @load_test9() {
147  %t = load i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 1073741814), align 4
148  ret i32 %t
149}
150
151; CHECK-LABEL: load_test10:
152; CHECK-NEXT: .functype load_test10 (i32) -> (i32){{$}}
153
154; PIC-NEXT:   i32.const $push0=, 2{{$}}
155; PIC-NEXT:   i32.shl   $push1=, $0, $pop0{{$}}
156; PIC-NEXT:   global.get $push2=, g@GOT{{$}}
157; PIC-NEXT:   i32.add   $push3=, $pop1, $pop2{{$}}
158; PIC-NEXT:   i32.const $push4=, -40{{$}}
159; PIC-NEXT:   i32.add   $push5=, $pop3, $pop4{{$}}
160; PIC-NEXT:   i32.load  $push6=, 0($pop5){{$}}
161; PIC-NEXT:   return    $pop6{{$}}
162define i32 @load_test10(i32 %n) {
163  %add = add nsw i32 %n, -10
164  %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
165  %t = load i32, i32* %arrayidx, align 4
166  ret i32 %t
167}
168
169; CHECK-LABEL: load_test11:
170; CHECK-NEXT: .functype load_test11 (i32) -> (i32){{$}}
171; CHECK-NEXT: i32.load  $push0=, 40($0){{$}}
172; CHECK-NEXT: return    $pop0{{$}}
173define i32 @load_test11(i32* %p) {
174  %arrayidx = getelementptr inbounds i32, i32* %p, i32 10
175  %t = load i32, i32* %arrayidx, align 4
176  ret i32 %t
177}
178
179; CHECK-LABEL: load_test11_noinbounds:
180; CHECK-NEXT: .functype load_test11_noinbounds (i32) -> (i32){{$}}
181; CHECK-NEXT: i32.const $push0=, 40{{$}}
182; CHECK-NEXT: i32.add   $push1=, $0, $pop0{{$}}
183; CHECK-NEXT: i32.load  $push2=, 0($pop1){{$}}
184; CHECK-NEXT: return    $pop2{{$}}
185define i32 @load_test11_noinbounds(i32* %p) {
186  %arrayidx = getelementptr i32, i32* %p, i32 10
187  %t = load i32, i32* %arrayidx, align 4
188  ret i32 %t
189}
190
191; CHECK-LABEL: load_test12:
192; CHECK-NEXT: .functype load_test12 (i32, i32) -> (i32){{$}}
193; CHECK-NEXT: i32.const $push0=, 2{{$}}
194; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
195; CHECK-NEXT: i32.add   $push2=, $pop1, $0{{$}}
196; CHECK-NEXT: i32.const $push3=, 40{{$}}
197; CHECK-NEXT: i32.add   $push4=, $pop2, $pop3{{$}}
198; CHECK-NEXT: i32.load  $push5=, 0($pop4){{$}}
199; CHECK-NEXT: return    $pop5{{$}}
200define i32 @load_test12(i32* %p, i32 %n) {
201  %add = add nsw i32 %n, 10
202  %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
203  %t = load i32, i32* %arrayidx, align 4
204  ret i32 %t
205}
206
207; CHECK-LABEL: load_test13:
208; CHECK-NEXT: .functype load_test13 (i32, i32) -> (i32){{$}}
209; CHECK-NEXT: i32.const $push0=, 2{{$}}
210; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
211; CHECK-NEXT: i32.add   $push2=, $pop1, $0{{$}}
212; CHECK-NEXT: i32.const $push3=, 40{{$}}
213; CHECK-NEXT: i32.add   $push4=, $pop2, $pop3{{$}}
214; CHECK-NEXT: i32.load  $push5=, 0($pop4){{$}}
215; CHECK-NEXT: return    $pop5{{$}}
216define i32 @load_test13(i32* %p, i32 %n) {
217  %add = add nsw i32 10, %n
218  %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
219  %t = load i32, i32* %arrayidx, align 4
220  ret i32 %t
221}
222
223; CHECK-LABEL: load_test14:
224; CHECK-NEXT: .functype load_test14 (i32, i32) -> (i32){{$}}
225; CHECK-NEXT: i32.const $push0=, 2{{$}}
226; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
227; CHECK-NEXT: i32.add   $push2=, $0, $pop1{{$}}
228; CHECK-NEXT: i32.load  $push3=, 40($pop2){{$}}
229; CHECK-NEXT: return    $pop3{{$}}
230define i32 @load_test14(i32* %p, i32 %n) {
231  %add.ptr = getelementptr inbounds i32, i32* %p, i32 %n
232  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
233  %t = load i32, i32* %add.ptr1, align 4
234  ret i32 %t
235}
236
237; CHECK-LABEL: load_test15:
238; CHECK-NEXT: .functype load_test15 (i32, i32) -> (i32){{$}}
239; CHECK-NEXT: i32.const $push0=, 2{{$}}
240; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
241; CHECK-NEXT: i32.add   $push2=, $0, $pop1{{$}}
242; CHECK-NEXT: i32.const $push3=, 40{{$}}
243; CHECK-NEXT: i32.add   $push4=, $pop2, $pop3{{$}}
244; CHECK-NEXT: i32.load  $push5=, 0($pop4){{$}}
245; CHECK-NEXT: return    $pop5{{$}}
246define i32 @load_test15(i32* %p, i32 %n) {
247  %add.ptr = getelementptr inbounds i32, i32* %p, i32 10
248  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n
249  %t = load i32, i32* %add.ptr1, align 4
250  ret i32 %t
251}
252
253; CHECK-LABEL: load_test16:
254; CHECK-NEXT: .functype load_test16 (i32, i32) -> (i32){{$}}
255; CHECK-NEXT: i32.const $push0=, 2{{$}}
256; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
257; CHECK-NEXT: i32.add   $push2=, $0, $pop1{{$}}
258; CHECK-NEXT: i32.const $push3=, 40{{$}}
259; CHECK-NEXT: i32.add   $push4=, $pop2, $pop3{{$}}
260; CHECK-NEXT: i32.load  $push5=, 0($pop4){{$}}
261; CHECK-NEXT: return    $pop5{{$}}
262define i32 @load_test16(i32* %p, i32 %n) {
263  %add.ptr = getelementptr inbounds i32, i32* %p, i32 10
264  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n
265  %t = load i32, i32* %add.ptr1, align 4
266  ret i32 %t
267}
268
269; CHECK-LABEL: load_test17:
270; CHECK-NEXT: .functype load_test17 (i32, i32) -> (i32){{$}}
271; CHECK-NEXT: i32.const $push0=, 2{{$}}
272; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
273; CHECK-NEXT: i32.add   $push2=, $pop1, $0{{$}}
274; CHECK-NEXT: i32.const $push3=, 40{{$}}
275; CHECK-NEXT: i32.add   $push4=, $pop2, $pop3{{$}}
276; CHECK-NEXT: i32.load  $push5=, 0($pop4){{$}}
277; CHECK-NEXT: return    $pop5{{$}}
278define i32 @load_test17(i32* %p, i32 %n) {
279  %add = add nsw i32 %n, 10
280  %add.ptr = getelementptr inbounds i32, i32* %p, i32 %add
281  %t = load i32, i32* %add.ptr, align 4
282  ret i32 %t
283}
284
285; CHECK-LABEL: load_test18:
286; CHECK-NEXT: .functype load_test18 (i32, i32) -> (i32){{$}}
287; CHECK-NEXT: i32.const $push0=, 2{{$}}
288; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
289; CHECK-NEXT: i32.add   $push2=, $0, $pop1{{$}}
290; CHECK-NEXT: i32.load  $push3=, 40($pop2){{$}}
291; CHECK-NEXT: return    $pop3{{$}}
292define i32 @load_test18(i32* %p, i32 %n) {
293  %add.ptr = getelementptr inbounds i32, i32* %p, i32 %n
294  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
295  %t = load i32, i32* %add.ptr1, align 4
296  ret i32 %t
297}
298
299; CHECK-LABEL: load_test19:
300; CHECK-NEXT: .functype load_test19 (i32, i32) -> (i32){{$}}
301; CHECK-NEXT: i32.const $push0=, 2{{$}}
302; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
303; CHECK-NEXT: i32.add   $push2=, $pop1, $0{{$}}
304; CHECK-NEXT: i32.const $push3=, 40{{$}}
305; CHECK-NEXT: i32.add   $push4=, $pop2, $pop3{{$}}
306; CHECK-NEXT: i32.load  $push5=, 0($pop4){{$}}
307; CHECK-NEXT: return    $pop5{{$}}
308define i32 @load_test19(i32* %p, i32 %n) {
309  %add = add nsw i32 10, %n
310  %add.ptr = getelementptr inbounds i32, i32* %p, i32 %add
311  %t = load i32, i32* %add.ptr, align 4
312  ret i32 %t
313}
314
315; CHECK-LABEL: load_test20:
316; CHECK-NEXT: .functype load_test20 (i32) -> (i32){{$}}
317; CHECK-NEXT: i32.const $push0=, -40{{$}}
318; CHECK-NEXT: i32.add   $push1=, $0, $pop0{{$}}
319; CHECK-NEXT: i32.load  $push2=, 0($pop1){{$}}
320; CHECK-NEXT: return    $pop2{{$}}
321define i32 @load_test20(i32* %p) {
322  %arrayidx = getelementptr inbounds i32, i32* %p, i32 -10
323  %t = load i32, i32* %arrayidx, align 4
324  ret i32 %t
325}
326
327; CHECK-LABEL: load_test21:
328; CHECK-NEXT: .functype load_test21 (i32, i32) -> (i32){{$}}
329; CHECK-NEXT: i32.const $push0=, 2{{$}}
330; CHECK-NEXT: i32.shl   $push1=, $1, $pop0{{$}}
331; CHECK-NEXT: i32.add   $push2=, $pop1, $0{{$}}
332; CHECK-NEXT: i32.const $push3=, -40{{$}}
333; CHECK-NEXT: i32.add   $push4=, $pop2, $pop3{{$}}
334; CHECK-NEXT: i32.load  $push5=, 0($pop4){{$}}
335; CHECK-NEXT: return    $pop5{{$}}
336define i32 @load_test21(i32* %p, i32 %n) {
337  %add = add nsw i32 %n, -10
338  %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
339  %t = load i32, i32* %arrayidx, align 4
340  ret i32 %t
341}
342
343; CHECK-LABEL: store_test0:
344; CHECK-NEXT: .functype store_test0 (i32) -> (){{$}}
345; PIC-NEXT:     global.get $push0=, g@GOT{{$}}
346; PIC-NEXT:     i32.store 40($pop0), $0
347; CHECK-NEXT:   return{{$}}
348define void @store_test0(i32 %i) {
349  store i32 %i, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4
350  ret void
351}
352
353; CHECK-LABEL: store_test0_noinbounds:
354; CHECK-NEXT: .functype store_test0_noinbounds (i32) -> (){{$}}
355; PIC-NEXT:     global.get $push0=, g@GOT{{$}}
356; PIC-NEXT:     i32.store 40($pop0), $0{{$}}
357; CHECK-NEXT:  return{{$}}
358define void @store_test0_noinbounds(i32 %i) {
359  store i32 %i, i32* getelementptr ([0 x i32], [0 x i32]* @g, i32 0, i32 10), align 4
360  ret void
361}
362
363; CHECK-LABEL: store_test1:
364; CHECK-NEXT: .functype store_test1 (i32, i32) -> (){{$}}
365; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
366; CHECK-NEX T: return{{$}}
367define void @store_test1(i32 %n, i32 %i) {
368  %add = add nsw i32 %n, 10
369  %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
370  store i32 %i, i32* %arrayidx, align 4
371  ret void
372}
373
374; CHECK-LABEL: store_test2:
375; CHECK-NEXT: .functype store_test2 (i32, i32) -> (){{$}}
376; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
377; CHECK-NEX T: return{{$}}
378define void @store_test2(i32 %n, i32 %i) {
379  %add = add nsw i32 10, %n
380  %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
381  store i32 %i, i32* %arrayidx, align 4
382  ret void
383}
384
385; CHECK-LABEL: store_test3:
386; CHECK-NEXT: .functype store_test3 (i32, i32) -> (){{$}}
387; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
388; CHECK-NEX T: return{{$}}
389define void @store_test3(i32 %n, i32 %i) {
390  %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n
391  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
392  store i32 %i, i32* %add.ptr1, align 4
393  ret void
394}
395
396; CHECK-LABEL: store_test4:
397; CHECK-NEXT: .functype store_test4 (i32, i32) -> (){{$}}
398; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
399; CHECK-NEX T: return{{$}}
400define void @store_test4(i32 %n, i32 %i) {
401  %add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n
402  store i32 %i, i32* %add.ptr, align 4
403  ret void
404}
405
406; CHECK-LABEL: store_test5:
407; CHECK-NEXT: .functype store_test5 (i32, i32) -> (){{$}}
408; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
409; CHECK-NEX T: return{{$}}
410define void @store_test5(i32 %n, i32 %i) {
411  %add.ptr = getelementptr inbounds i32, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 10), i32 %n
412  store i32 %i, i32* %add.ptr, align 4
413  ret void
414}
415
416; CHECK-LABEL: store_test6:
417; CHECK-NEXT: .functype store_test6 (i32, i32) -> (){{$}}
418; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
419; CHECK-NEX T: return{{$}}
420define void @store_test6(i32 %n, i32 %i) {
421  %add = add nsw i32 %n, 10
422  %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
423  store i32 %i, i32* %add.ptr, align 4
424  ret void
425}
426
427; CHECK-LABEL: store_test7:
428; CHECK-NEXT: .functype store_test7 (i32, i32) -> (){{$}}
429; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
430; CHECK-NEX T: return{{$}}
431define void @store_test7(i32 %n, i32 %i) {
432  %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %n
433  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
434  store i32 %i, i32* %add.ptr1, align 4
435  ret void
436}
437
438; CHECK-LABEL: store_test8:
439; CHECK-NEXT: .functype store_test8 (i32, i32) -> (){{$}}
440; CHECK-NEX T: i32.store g+40($pop1), $1{{$}}
441; CHECK-NEX T: return{{$}}
442define void @store_test8(i32 %n, i32 %i) {
443  %add = add nsw i32 10, %n
444  %add.ptr = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
445  store i32 %i, i32* %add.ptr, align 4
446  ret void
447}
448
449; CHECK-LABEL: store_test9:
450; CHECK-NEXT: .functype store_test9 (i32) -> (){{$}}
451; PIC-NEXT:      global.get $push1=, g@GOT{{$}}
452; PIC-NEXT:      i32.const  $push0=, -40{{$}}
453; PIC-NEXT:      i32.add    $push2=, $pop1, $pop0{{$}}
454; PIC-NEXT:      i32.store  0($pop2), $0
455; CHECK-NEXT:  return{{$}}
456define void @store_test9(i32 %i) {
457  store i32 %i, i32* getelementptr inbounds ([0 x i32], [0 x i32]* @g, i32 0, i32 1073741814), align 4
458  ret void
459}
460
461; CHECK-LABEL: store_test10:
462; CHECK-NEXT: .functype store_test10 (i32, i32) -> (){{$}}
463; PIC-NEXT: i32.const  $push0=, 2{{$}}
464; PIC-NEXT: i32.shl    $push1=, $0, $pop0{{$}}
465; PIC-NEXT: global.get $push2=, g@GOT{{$}}
466; PIC-NEXT: i32.add    $push3=, $pop1, $pop2{{$}}
467; PIC-NEXT: i32.const  $push4=, -40{{$}}
468; PIC-NEXT: i32.add    $push5=, $pop3, $pop4{{$}}
469; PIC-NEXT: i32.store  0($pop5), $1{{$}}
470; CHECK-NEXT:  return{{$}}
471define void @store_test10(i32 %n, i32 %i) {
472  %add = add nsw i32 %n, -10
473  %arrayidx = getelementptr inbounds [0 x i32], [0 x i32]* @g, i32 0, i32 %add
474  store i32 %i, i32* %arrayidx, align 4
475  ret void
476}
477
478; CHECK-LABEL: store_test11:
479; CHECK-NEXT: .functype store_test11 (i32, i32) -> (){{$}}
480; CHECK-NEXT:  i32.store 40($0), $1{{$}}
481; CHECK-NEXT:  return{{$}}
482define void @store_test11(i32* %p, i32 %i) {
483  %arrayidx = getelementptr inbounds i32, i32* %p, i32 10
484  store i32 %i, i32* %arrayidx, align 4
485  ret void
486}
487
488; CHECK-LABEL: store_test11_noinbounds:
489; CHECK-NEXT: .functype store_test11_noinbounds (i32, i32) -> (){{$}}
490; CHECK-NEXT:  i32.const $push0=, 40{{$}}
491; CHECK-NEXT:  i32.add   $push1=, $0, $pop0{{$}}
492; CHECK-NEXT:  i32.store 0($pop1), $1{{$}}
493; CHECK-NEXT:  return{{$}}
494define void @store_test11_noinbounds(i32* %p, i32 %i) {
495  %arrayidx = getelementptr i32, i32* %p, i32 10
496  store i32 %i, i32* %arrayidx, align 4
497  ret void
498}
499
500; CHECK-LABEL: store_test12:
501; CHECK-NEXT: .functype store_test12 (i32, i32, i32) -> (){{$}}
502define void @store_test12(i32* %p, i32 %n, i32 %i) {
503  %add = add nsw i32 %n, 10
504  %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
505  store i32 %i, i32* %arrayidx, align 4
506  ret void
507}
508
509; CHECK-LABEL: store_test13:
510; CHECK-NEXT: .functype store_test13 (i32, i32, i32) -> (){{$}}
511define void @store_test13(i32* %p, i32 %n, i32 %i) {
512  %add = add nsw i32 10, %n
513  %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
514  store i32 %i, i32* %arrayidx, align 4
515  ret void
516}
517
518; CHECK-LABEL: store_test14:
519; CHECK-NEXT: .functype store_test14 (i32, i32, i32) -> (){{$}}
520define void @store_test14(i32* %p, i32 %n, i32 %i) {
521  %add.ptr = getelementptr inbounds i32, i32* %p, i32 %n
522  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
523  store i32 %i, i32* %add.ptr1, align 4
524  ret void
525}
526
527; CHECK-LABEL: store_test15:
528; CHECK-NEXT: .functype store_test15 (i32, i32, i32) -> (){{$}}
529define void @store_test15(i32* %p, i32 %n, i32 %i) {
530  %add.ptr = getelementptr inbounds i32, i32* %p, i32 10
531  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n
532  store i32 %i, i32* %add.ptr1, align 4
533  ret void
534}
535
536; CHECK-LABEL: store_test16:
537; CHECK-NEXT: .functype store_test16 (i32, i32, i32) -> (){{$}}
538define void @store_test16(i32* %p, i32 %n, i32 %i) {
539  %add.ptr = getelementptr inbounds i32, i32* %p, i32 10
540  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 %n
541  store i32 %i, i32* %add.ptr1, align 4
542  ret void
543}
544
545; CHECK-LABEL: store_test17:
546; CHECK-NEXT: .functype store_test17 (i32, i32, i32) -> (){{$}}
547define void @store_test17(i32* %p, i32 %n, i32 %i) {
548  %add = add nsw i32 %n, 10
549  %add.ptr = getelementptr inbounds i32, i32* %p, i32 %add
550  store i32 %i, i32* %add.ptr, align 4
551  ret void
552}
553
554; CHECK-LABEL: store_test18:
555; CHECK-NEXT: .functype store_test18 (i32, i32, i32) -> (){{$}}
556define void @store_test18(i32* %p, i32 %n, i32 %i) {
557  %add.ptr = getelementptr inbounds i32, i32* %p, i32 %n
558  %add.ptr1 = getelementptr inbounds i32, i32* %add.ptr, i32 10
559  store i32 %i, i32* %add.ptr1, align 4
560  ret void
561}
562
563; CHECK-LABEL: store_test19:
564; CHECK-NEXT: .functype store_test19 (i32, i32, i32) -> (){{$}}
565define void @store_test19(i32* %p, i32 %n, i32 %i) {
566  %add = add nsw i32 10, %n
567  %add.ptr = getelementptr inbounds i32, i32* %p, i32 %add
568  store i32 %i, i32* %add.ptr, align 4
569  ret void
570}
571
572; CHECK-LABEL: store_test20:
573; CHECK-NEXT: .functype store_test20 (i32, i32) -> (){{$}}
574define void @store_test20(i32* %p, i32 %i) {
575  %arrayidx = getelementptr inbounds i32, i32* %p, i32 -10
576  store i32 %i, i32* %arrayidx, align 4
577  ret void
578}
579
580; CHECK-LABEL: store_test21:
581; CHECK-NEXT: .functype store_test21 (i32, i32, i32) -> (){{$}}
582define void @store_test21(i32* %p, i32 %n, i32 %i) {
583  %add = add nsw i32 %n, -10
584  %arrayidx = getelementptr inbounds i32, i32* %p, i32 %add
585  store i32 %i, i32* %arrayidx, align 4
586  ret void
587}
588