xref: /llvm-project/llvm/test/CodeGen/WebAssembly/address-offsets.ll (revision 78f88082de3627ea04501c83a08f52cf1e60b4f7)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -relocation-model=pic | FileCheck %s
3
4; Test folding constant offsets and symbols into load and store addresses under
5; a variety of circumstances.
6
7target triple = "wasm32-unknown-emscripten"
8
9@g = external global [0 x i32], align 4
10
11define i32 @load_test0() {
12; CHECK-LABEL: load_test0:
13; CHECK:         .functype load_test0 () -> (i32)
14; CHECK-NEXT:  # %bb.0:
15; CHECK-NEXT:    global.get $push0=, g@GOT
16; CHECK-NEXT:    i32.load $push1=, 40($pop0)
17; CHECK-NEXT:    return $pop1
18  %t = load i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), align 4
19  ret i32 %t
20}
21
22define i32 @load_test0_noinbounds() {
23; CHECK-LABEL: load_test0_noinbounds:
24; CHECK:         .functype load_test0_noinbounds () -> (i32)
25; CHECK-NEXT:  # %bb.0:
26; CHECK-NEXT:    global.get $push1=, g@GOT
27; CHECK-NEXT:    i32.const $push0=, 40
28; CHECK-NEXT:    i32.add $push2=, $pop1, $pop0
29; CHECK-NEXT:    i32.load $push3=, 0($pop2)
30; CHECK-NEXT:    return $pop3
31  %t = load i32, ptr getelementptr ([0 x i32], ptr @g, i32 0, i32 10), align 4
32  ret i32 %t
33}
34
35; TODO: load_test1 - load_test8 are disabled because folding GA+reg is disabled
36; (there are cases where the value in the reg can be negative).
37; Likewise for stores.
38
39define i32 @load_test1(i32 %n) {
40; CHECK-LABEL: load_test1:
41; CHECK:         .functype load_test1 (i32) -> (i32)
42; CHECK-NEXT:  # %bb.0:
43; CHECK-NEXT:    i32.const $push0=, 2
44; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
45; CHECK-NEXT:    global.get $push2=, g@GOT
46; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
47; CHECK-NEXT:    i32.const $push4=, 40
48; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
49; CHECK-NEXT:    i32.load $push6=, 0($pop5)
50; CHECK-NEXT:    return $pop6
51  %add = add nsw i32 %n, 10
52  %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
53  %t = load i32, ptr %arrayidx, align 4
54  ret i32 %t
55}
56
57define i32 @load_test2(i32 %n) {
58; CHECK-LABEL: load_test2:
59; CHECK:         .functype load_test2 (i32) -> (i32)
60; CHECK-NEXT:  # %bb.0:
61; CHECK-NEXT:    i32.const $push0=, 2
62; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
63; CHECK-NEXT:    global.get $push2=, g@GOT
64; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
65; CHECK-NEXT:    i32.const $push4=, 40
66; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
67; CHECK-NEXT:    i32.load $push6=, 0($pop5)
68; CHECK-NEXT:    return $pop6
69  %add = add nsw i32 10, %n
70  %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
71  %t = load i32, ptr %arrayidx, align 4
72  ret i32 %t
73}
74
75define i32 @load_test3(i32 %n) {
76; CHECK-LABEL: load_test3:
77; CHECK:         .functype load_test3 (i32) -> (i32)
78; CHECK-NEXT:  # %bb.0:
79; CHECK-NEXT:    global.get $push2=, g@GOT
80; CHECK-NEXT:    i32.const $push0=, 2
81; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
82; CHECK-NEXT:    i32.add $push3=, $pop2, $pop1
83; CHECK-NEXT:    i32.load $push4=, 40($pop3)
84; CHECK-NEXT:    return $pop4
85  %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %n
86  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10
87  %t = load i32, ptr %add.ptr1, align 4
88  ret i32 %t
89}
90
91define i32 @load_test4(i32 %n) {
92; CHECK-LABEL: load_test4:
93; CHECK:         .functype load_test4 (i32) -> (i32)
94; CHECK-NEXT:  # %bb.0:
95; CHECK-NEXT:    global.get $push2=, g@GOT
96; CHECK-NEXT:    i32.const $push0=, 2
97; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
98; CHECK-NEXT:    i32.add $push3=, $pop2, $pop1
99; CHECK-NEXT:    i32.const $push4=, 40
100; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
101; CHECK-NEXT:    i32.load $push6=, 0($pop5)
102; CHECK-NEXT:    return $pop6
103  %add.ptr = getelementptr inbounds i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), i32 %n
104  %t = load i32, ptr %add.ptr, align 4
105  ret i32 %t
106}
107
108define i32 @load_test5(i32 %n) {
109; CHECK-LABEL: load_test5:
110; CHECK:         .functype load_test5 (i32) -> (i32)
111; CHECK-NEXT:  # %bb.0:
112; CHECK-NEXT:    global.get $push2=, g@GOT
113; CHECK-NEXT:    i32.const $push0=, 2
114; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
115; CHECK-NEXT:    i32.add $push3=, $pop2, $pop1
116; CHECK-NEXT:    i32.const $push4=, 40
117; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
118; CHECK-NEXT:    i32.load $push6=, 0($pop5)
119; CHECK-NEXT:    return $pop6
120  %add.ptr = getelementptr inbounds i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), i32 %n
121  %t = load i32, ptr %add.ptr, align 4
122  ret i32 %t
123}
124
125define i32 @load_test6(i32 %n) {
126; CHECK-LABEL: load_test6:
127; CHECK:         .functype load_test6 (i32) -> (i32)
128; CHECK-NEXT:  # %bb.0:
129; CHECK-NEXT:    i32.const $push0=, 2
130; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
131; CHECK-NEXT:    global.get $push2=, g@GOT
132; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
133; CHECK-NEXT:    i32.const $push4=, 40
134; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
135; CHECK-NEXT:    i32.load $push6=, 0($pop5)
136; CHECK-NEXT:    return $pop6
137  %add = add nsw i32 %n, 10
138  %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
139  %t = load i32, ptr %add.ptr, align 4
140  ret i32 %t
141}
142
143define i32 @load_test7(i32 %n) {
144; CHECK-LABEL: load_test7:
145; CHECK:         .functype load_test7 (i32) -> (i32)
146; CHECK-NEXT:  # %bb.0:
147; CHECK-NEXT:    global.get $push2=, g@GOT
148; CHECK-NEXT:    i32.const $push0=, 2
149; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
150; CHECK-NEXT:    i32.add $push3=, $pop2, $pop1
151; CHECK-NEXT:    i32.load $push4=, 40($pop3)
152; CHECK-NEXT:    return $pop4
153  %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %n
154  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10
155  %t = load i32, ptr %add.ptr1, align 4
156  ret i32 %t
157}
158
159define i32 @load_test8(i32 %n) {
160; CHECK-LABEL: load_test8:
161; CHECK:         .functype load_test8 (i32) -> (i32)
162; CHECK-NEXT:  # %bb.0:
163; CHECK-NEXT:    i32.const $push0=, 2
164; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
165; CHECK-NEXT:    global.get $push2=, g@GOT
166; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
167; CHECK-NEXT:    i32.const $push4=, 40
168; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
169; CHECK-NEXT:    i32.load $push6=, 0($pop5)
170; CHECK-NEXT:    return $pop6
171  %add = add nsw i32 10, %n
172  %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
173  %t = load i32, ptr %add.ptr, align 4
174  ret i32 %t
175}
176
177define i32 @load_test9() {
178; CHECK-LABEL: load_test9:
179; CHECK:         .functype load_test9 () -> (i32)
180; CHECK-NEXT:  # %bb.0:
181; CHECK-NEXT:    global.get $push1=, g@GOT
182; CHECK-NEXT:    i32.const $push0=, -40
183; CHECK-NEXT:    i32.add $push2=, $pop1, $pop0
184; CHECK-NEXT:    i32.load $push3=, 0($pop2)
185; CHECK-NEXT:    return $pop3
186  %t = load i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 1073741814), align 4
187  ret i32 %t
188}
189
190define i32 @load_test10(i32 %n) {
191; CHECK-LABEL: load_test10:
192; CHECK:         .functype load_test10 (i32) -> (i32)
193; CHECK-NEXT:  # %bb.0:
194; CHECK-NEXT:    i32.const $push0=, 2
195; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
196; CHECK-NEXT:    global.get $push2=, g@GOT
197; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
198; CHECK-NEXT:    i32.const $push4=, -40
199; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
200; CHECK-NEXT:    i32.load $push6=, 0($pop5)
201; CHECK-NEXT:    return $pop6
202  %add = add nsw i32 %n, -10
203  %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
204  %t = load i32, ptr %arrayidx, align 4
205  ret i32 %t
206}
207
208define i32 @load_test11(ptr %p) {
209; CHECK-LABEL: load_test11:
210; CHECK:         .functype load_test11 (i32) -> (i32)
211; CHECK-NEXT:  # %bb.0:
212; CHECK-NEXT:    i32.load $push0=, 40($0)
213; CHECK-NEXT:    return $pop0
214  %arrayidx = getelementptr inbounds i32, ptr %p, i32 10
215  %t = load i32, ptr %arrayidx, align 4
216  ret i32 %t
217}
218
219define i32 @load_test11_noinbounds(ptr %p) {
220; CHECK-LABEL: load_test11_noinbounds:
221; CHECK:         .functype load_test11_noinbounds (i32) -> (i32)
222; CHECK-NEXT:  # %bb.0:
223; CHECK-NEXT:    i32.const $push0=, 40
224; CHECK-NEXT:    i32.add $push1=, $0, $pop0
225; CHECK-NEXT:    i32.load $push2=, 0($pop1)
226; CHECK-NEXT:    return $pop2
227  %arrayidx = getelementptr i32, ptr %p, i32 10
228  %t = load i32, ptr %arrayidx, align 4
229  ret i32 %t
230}
231
232define i32 @load_test12(ptr %p, i32 %n) {
233; CHECK-LABEL: load_test12:
234; CHECK:         .functype load_test12 (i32, i32) -> (i32)
235; CHECK-NEXT:  # %bb.0:
236; CHECK-NEXT:    i32.const $push0=, 2
237; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
238; CHECK-NEXT:    i32.add $push2=, $pop1, $0
239; CHECK-NEXT:    i32.const $push3=, 40
240; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
241; CHECK-NEXT:    i32.load $push5=, 0($pop4)
242; CHECK-NEXT:    return $pop5
243  %add = add nsw i32 %n, 10
244  %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add
245  %t = load i32, ptr %arrayidx, align 4
246  ret i32 %t
247}
248
249define i32 @load_test13(ptr %p, i32 %n) {
250; CHECK-LABEL: load_test13:
251; CHECK:         .functype load_test13 (i32, i32) -> (i32)
252; CHECK-NEXT:  # %bb.0:
253; CHECK-NEXT:    i32.const $push0=, 2
254; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
255; CHECK-NEXT:    i32.add $push2=, $pop1, $0
256; CHECK-NEXT:    i32.const $push3=, 40
257; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
258; CHECK-NEXT:    i32.load $push5=, 0($pop4)
259; CHECK-NEXT:    return $pop5
260  %add = add nsw i32 10, %n
261  %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add
262  %t = load i32, ptr %arrayidx, align 4
263  ret i32 %t
264}
265
266define i32 @load_test14(ptr %p, i32 %n) {
267; CHECK-LABEL: load_test14:
268; CHECK:         .functype load_test14 (i32, i32) -> (i32)
269; CHECK-NEXT:  # %bb.0:
270; CHECK-NEXT:    i32.const $push0=, 2
271; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
272; CHECK-NEXT:    i32.add $push2=, $0, $pop1
273; CHECK-NEXT:    i32.load $push3=, 40($pop2)
274; CHECK-NEXT:    return $pop3
275  %add.ptr = getelementptr inbounds i32, ptr %p, i32 %n
276  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10
277  %t = load i32, ptr %add.ptr1, align 4
278  ret i32 %t
279}
280
281define i32 @load_test15(ptr %p, i32 %n) {
282; CHECK-LABEL: load_test15:
283; CHECK:         .functype load_test15 (i32, i32) -> (i32)
284; CHECK-NEXT:  # %bb.0:
285; CHECK-NEXT:    i32.const $push0=, 2
286; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
287; CHECK-NEXT:    i32.add $push2=, $0, $pop1
288; CHECK-NEXT:    i32.const $push3=, 40
289; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
290; CHECK-NEXT:    i32.load $push5=, 0($pop4)
291; CHECK-NEXT:    return $pop5
292  %add.ptr = getelementptr inbounds i32, ptr %p, i32 10
293  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 %n
294  %t = load i32, ptr %add.ptr1, align 4
295  ret i32 %t
296}
297
298define i32 @load_test16(ptr %p, i32 %n) {
299; CHECK-LABEL: load_test16:
300; CHECK:         .functype load_test16 (i32, i32) -> (i32)
301; CHECK-NEXT:  # %bb.0:
302; CHECK-NEXT:    i32.const $push0=, 2
303; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
304; CHECK-NEXT:    i32.add $push2=, $0, $pop1
305; CHECK-NEXT:    i32.const $push3=, 40
306; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
307; CHECK-NEXT:    i32.load $push5=, 0($pop4)
308; CHECK-NEXT:    return $pop5
309  %add.ptr = getelementptr inbounds i32, ptr %p, i32 10
310  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 %n
311  %t = load i32, ptr %add.ptr1, align 4
312  ret i32 %t
313}
314
315define i32 @load_test17(ptr %p, i32 %n) {
316; CHECK-LABEL: load_test17:
317; CHECK:         .functype load_test17 (i32, i32) -> (i32)
318; CHECK-NEXT:  # %bb.0:
319; CHECK-NEXT:    i32.const $push0=, 2
320; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
321; CHECK-NEXT:    i32.add $push2=, $pop1, $0
322; CHECK-NEXT:    i32.const $push3=, 40
323; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
324; CHECK-NEXT:    i32.load $push5=, 0($pop4)
325; CHECK-NEXT:    return $pop5
326  %add = add nsw i32 %n, 10
327  %add.ptr = getelementptr inbounds i32, ptr %p, i32 %add
328  %t = load i32, ptr %add.ptr, align 4
329  ret i32 %t
330}
331
332define i32 @load_test18(ptr %p, i32 %n) {
333; CHECK-LABEL: load_test18:
334; CHECK:         .functype load_test18 (i32, i32) -> (i32)
335; CHECK-NEXT:  # %bb.0:
336; CHECK-NEXT:    i32.const $push0=, 2
337; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
338; CHECK-NEXT:    i32.add $push2=, $0, $pop1
339; CHECK-NEXT:    i32.load $push3=, 40($pop2)
340; CHECK-NEXT:    return $pop3
341  %add.ptr = getelementptr inbounds i32, ptr %p, i32 %n
342  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10
343  %t = load i32, ptr %add.ptr1, align 4
344  ret i32 %t
345}
346
347define i32 @load_test19(ptr %p, i32 %n) {
348; CHECK-LABEL: load_test19:
349; CHECK:         .functype load_test19 (i32, i32) -> (i32)
350; CHECK-NEXT:  # %bb.0:
351; CHECK-NEXT:    i32.const $push0=, 2
352; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
353; CHECK-NEXT:    i32.add $push2=, $pop1, $0
354; CHECK-NEXT:    i32.const $push3=, 40
355; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
356; CHECK-NEXT:    i32.load $push5=, 0($pop4)
357; CHECK-NEXT:    return $pop5
358  %add = add nsw i32 10, %n
359  %add.ptr = getelementptr inbounds i32, ptr %p, i32 %add
360  %t = load i32, ptr %add.ptr, align 4
361  ret i32 %t
362}
363
364define i32 @load_test20(ptr %p) {
365; CHECK-LABEL: load_test20:
366; CHECK:         .functype load_test20 (i32) -> (i32)
367; CHECK-NEXT:  # %bb.0:
368; CHECK-NEXT:    i32.const $push0=, -40
369; CHECK-NEXT:    i32.add $push1=, $0, $pop0
370; CHECK-NEXT:    i32.load $push2=, 0($pop1)
371; CHECK-NEXT:    return $pop2
372  %arrayidx = getelementptr inbounds i32, ptr %p, i32 -10
373  %t = load i32, ptr %arrayidx, align 4
374  ret i32 %t
375}
376
377define i32 @load_test21(ptr %p, i32 %n) {
378; CHECK-LABEL: load_test21:
379; CHECK:         .functype load_test21 (i32, i32) -> (i32)
380; CHECK-NEXT:  # %bb.0:
381; CHECK-NEXT:    i32.const $push0=, 2
382; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
383; CHECK-NEXT:    i32.add $push2=, $pop1, $0
384; CHECK-NEXT:    i32.const $push3=, -40
385; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
386; CHECK-NEXT:    i32.load $push5=, 0($pop4)
387; CHECK-NEXT:    return $pop5
388  %add = add nsw i32 %n, -10
389  %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add
390  %t = load i32, ptr %arrayidx, align 4
391  ret i32 %t
392}
393
394define void @store_test0(i32 %i) {
395; CHECK-LABEL: store_test0:
396; CHECK:         .functype store_test0 (i32) -> ()
397; CHECK-NEXT:  # %bb.0:
398; CHECK-NEXT:    global.get $push0=, g@GOT
399; CHECK-NEXT:    i32.store 40($pop0), $0
400; CHECK-NEXT:    return
401  store i32 %i, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), align 4
402  ret void
403}
404
405define void @store_test0_noinbounds(i32 %i) {
406; CHECK-LABEL: store_test0_noinbounds:
407; CHECK:         .functype store_test0_noinbounds (i32) -> ()
408; CHECK-NEXT:  # %bb.0:
409; CHECK-NEXT:    global.get $push1=, g@GOT
410; CHECK-NEXT:    i32.const $push0=, 40
411; CHECK-NEXT:    i32.add $push2=, $pop1, $pop0
412; CHECK-NEXT:    i32.store 0($pop2), $0
413; CHECK-NEXT:    return
414  store i32 %i, ptr getelementptr ([0 x i32], ptr @g, i32 0, i32 10), align 4
415  ret void
416}
417
418define void @store_test1(i32 %n, i32 %i) {
419; CHECK-LABEL: store_test1:
420; CHECK:         .functype store_test1 (i32, i32) -> ()
421; CHECK-NEXT:  # %bb.0:
422; CHECK-NEXT:    i32.const $push0=, 2
423; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
424; CHECK-NEXT:    global.get $push2=, g@GOT
425; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
426; CHECK-NEXT:    i32.const $push4=, 40
427; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
428; CHECK-NEXT:    i32.store 0($pop5), $1
429; CHECK-NEXT:    return
430  %add = add nsw i32 %n, 10
431  %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
432  store i32 %i, ptr %arrayidx, align 4
433  ret void
434}
435
436define void @store_test2(i32 %n, i32 %i) {
437; CHECK-LABEL: store_test2:
438; CHECK:         .functype store_test2 (i32, i32) -> ()
439; CHECK-NEXT:  # %bb.0:
440; CHECK-NEXT:    i32.const $push0=, 2
441; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
442; CHECK-NEXT:    global.get $push2=, g@GOT
443; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
444; CHECK-NEXT:    i32.const $push4=, 40
445; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
446; CHECK-NEXT:    i32.store 0($pop5), $1
447; CHECK-NEXT:    return
448  %add = add nsw i32 10, %n
449  %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
450  store i32 %i, ptr %arrayidx, align 4
451  ret void
452}
453
454define void @store_test3(i32 %n, i32 %i) {
455; CHECK-LABEL: store_test3:
456; CHECK:         .functype store_test3 (i32, i32) -> ()
457; CHECK-NEXT:  # %bb.0:
458; CHECK-NEXT:    global.get $push2=, g@GOT
459; CHECK-NEXT:    i32.const $push0=, 2
460; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
461; CHECK-NEXT:    i32.add $push3=, $pop2, $pop1
462; CHECK-NEXT:    i32.store 40($pop3), $1
463; CHECK-NEXT:    return
464  %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %n
465  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10
466  store i32 %i, ptr %add.ptr1, align 4
467  ret void
468}
469
470define void @store_test4(i32 %n, i32 %i) {
471; CHECK-LABEL: store_test4:
472; CHECK:         .functype store_test4 (i32, i32) -> ()
473; CHECK-NEXT:  # %bb.0:
474; CHECK-NEXT:    global.get $push2=, g@GOT
475; CHECK-NEXT:    i32.const $push0=, 2
476; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
477; CHECK-NEXT:    i32.add $push3=, $pop2, $pop1
478; CHECK-NEXT:    i32.const $push4=, 40
479; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
480; CHECK-NEXT:    i32.store 0($pop5), $1
481; CHECK-NEXT:    return
482  %add.ptr = getelementptr inbounds i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), i32 %n
483  store i32 %i, ptr %add.ptr, align 4
484  ret void
485}
486
487define void @store_test5(i32 %n, i32 %i) {
488; CHECK-LABEL: store_test5:
489; CHECK:         .functype store_test5 (i32, i32) -> ()
490; CHECK-NEXT:  # %bb.0:
491; CHECK-NEXT:    global.get $push2=, g@GOT
492; CHECK-NEXT:    i32.const $push0=, 2
493; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
494; CHECK-NEXT:    i32.add $push3=, $pop2, $pop1
495; CHECK-NEXT:    i32.const $push4=, 40
496; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
497; CHECK-NEXT:    i32.store 0($pop5), $1
498; CHECK-NEXT:    return
499  %add.ptr = getelementptr inbounds i32, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 10), i32 %n
500  store i32 %i, ptr %add.ptr, align 4
501  ret void
502}
503
504define void @store_test6(i32 %n, i32 %i) {
505; CHECK-LABEL: store_test6:
506; CHECK:         .functype store_test6 (i32, i32) -> ()
507; CHECK-NEXT:  # %bb.0:
508; CHECK-NEXT:    i32.const $push0=, 2
509; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
510; CHECK-NEXT:    global.get $push2=, g@GOT
511; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
512; CHECK-NEXT:    i32.const $push4=, 40
513; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
514; CHECK-NEXT:    i32.store 0($pop5), $1
515; CHECK-NEXT:    return
516  %add = add nsw i32 %n, 10
517  %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
518  store i32 %i, ptr %add.ptr, align 4
519  ret void
520}
521
522define void @store_test7(i32 %n, i32 %i) {
523; CHECK-LABEL: store_test7:
524; CHECK:         .functype store_test7 (i32, i32) -> ()
525; CHECK-NEXT:  # %bb.0:
526; CHECK-NEXT:    global.get $push2=, g@GOT
527; CHECK-NEXT:    i32.const $push0=, 2
528; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
529; CHECK-NEXT:    i32.add $push3=, $pop2, $pop1
530; CHECK-NEXT:    i32.store 40($pop3), $1
531; CHECK-NEXT:    return
532  %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %n
533  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10
534  store i32 %i, ptr %add.ptr1, align 4
535  ret void
536}
537
538define void @store_test8(i32 %n, i32 %i) {
539; CHECK-LABEL: store_test8:
540; CHECK:         .functype store_test8 (i32, i32) -> ()
541; CHECK-NEXT:  # %bb.0:
542; CHECK-NEXT:    i32.const $push0=, 2
543; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
544; CHECK-NEXT:    global.get $push2=, g@GOT
545; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
546; CHECK-NEXT:    i32.const $push4=, 40
547; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
548; CHECK-NEXT:    i32.store 0($pop5), $1
549; CHECK-NEXT:    return
550  %add = add nsw i32 10, %n
551  %add.ptr = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
552  store i32 %i, ptr %add.ptr, align 4
553  ret void
554}
555
556define void @store_test9(i32 %i) {
557; CHECK-LABEL: store_test9:
558; CHECK:         .functype store_test9 (i32) -> ()
559; CHECK-NEXT:  # %bb.0:
560; CHECK-NEXT:    global.get $push1=, g@GOT
561; CHECK-NEXT:    i32.const $push0=, -40
562; CHECK-NEXT:    i32.add $push2=, $pop1, $pop0
563; CHECK-NEXT:    i32.store 0($pop2), $0
564; CHECK-NEXT:    return
565  store i32 %i, ptr getelementptr inbounds ([0 x i32], ptr @g, i32 0, i32 1073741814), align 4
566  ret void
567}
568
569define void @store_test10(i32 %n, i32 %i) {
570; CHECK-LABEL: store_test10:
571; CHECK:         .functype store_test10 (i32, i32) -> ()
572; CHECK-NEXT:  # %bb.0:
573; CHECK-NEXT:    i32.const $push0=, 2
574; CHECK-NEXT:    i32.shl $push1=, $0, $pop0
575; CHECK-NEXT:    global.get $push2=, g@GOT
576; CHECK-NEXT:    i32.add $push3=, $pop1, $pop2
577; CHECK-NEXT:    i32.const $push4=, -40
578; CHECK-NEXT:    i32.add $push5=, $pop3, $pop4
579; CHECK-NEXT:    i32.store 0($pop5), $1
580; CHECK-NEXT:    return
581  %add = add nsw i32 %n, -10
582  %arrayidx = getelementptr inbounds [0 x i32], ptr @g, i32 0, i32 %add
583  store i32 %i, ptr %arrayidx, align 4
584  ret void
585}
586
587define void @store_test11(ptr %p, i32 %i) {
588; CHECK-LABEL: store_test11:
589; CHECK:         .functype store_test11 (i32, i32) -> ()
590; CHECK-NEXT:  # %bb.0:
591; CHECK-NEXT:    i32.store 40($0), $1
592; CHECK-NEXT:    return
593  %arrayidx = getelementptr inbounds i32, ptr %p, i32 10
594  store i32 %i, ptr %arrayidx, align 4
595  ret void
596}
597
598define void @store_test11_noinbounds(ptr %p, i32 %i) {
599; CHECK-LABEL: store_test11_noinbounds:
600; CHECK:         .functype store_test11_noinbounds (i32, i32) -> ()
601; CHECK-NEXT:  # %bb.0:
602; CHECK-NEXT:    i32.const $push0=, 40
603; CHECK-NEXT:    i32.add $push1=, $0, $pop0
604; CHECK-NEXT:    i32.store 0($pop1), $1
605; CHECK-NEXT:    return
606  %arrayidx = getelementptr i32, ptr %p, i32 10
607  store i32 %i, ptr %arrayidx, align 4
608  ret void
609}
610
611define void @store_test12(ptr %p, i32 %n, i32 %i) {
612; CHECK-LABEL: store_test12:
613; CHECK:         .functype store_test12 (i32, i32, i32) -> ()
614; CHECK-NEXT:  # %bb.0:
615; CHECK-NEXT:    i32.const $push0=, 2
616; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
617; CHECK-NEXT:    i32.add $push2=, $pop1, $0
618; CHECK-NEXT:    i32.const $push3=, 40
619; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
620; CHECK-NEXT:    i32.store 0($pop4), $2
621; CHECK-NEXT:    return
622  %add = add nsw i32 %n, 10
623  %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add
624  store i32 %i, ptr %arrayidx, align 4
625  ret void
626}
627
628define void @store_test13(ptr %p, i32 %n, i32 %i) {
629; CHECK-LABEL: store_test13:
630; CHECK:         .functype store_test13 (i32, i32, i32) -> ()
631; CHECK-NEXT:  # %bb.0:
632; CHECK-NEXT:    i32.const $push0=, 2
633; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
634; CHECK-NEXT:    i32.add $push2=, $pop1, $0
635; CHECK-NEXT:    i32.const $push3=, 40
636; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
637; CHECK-NEXT:    i32.store 0($pop4), $2
638; CHECK-NEXT:    return
639  %add = add nsw i32 10, %n
640  %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add
641  store i32 %i, ptr %arrayidx, align 4
642  ret void
643}
644
645define void @store_test14(ptr %p, i32 %n, i32 %i) {
646; CHECK-LABEL: store_test14:
647; CHECK:         .functype store_test14 (i32, i32, i32) -> ()
648; CHECK-NEXT:  # %bb.0:
649; CHECK-NEXT:    i32.const $push0=, 2
650; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
651; CHECK-NEXT:    i32.add $push2=, $0, $pop1
652; CHECK-NEXT:    i32.store 40($pop2), $2
653; CHECK-NEXT:    return
654  %add.ptr = getelementptr inbounds i32, ptr %p, i32 %n
655  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10
656  store i32 %i, ptr %add.ptr1, align 4
657  ret void
658}
659
660define void @store_test15(ptr %p, i32 %n, i32 %i) {
661; CHECK-LABEL: store_test15:
662; CHECK:         .functype store_test15 (i32, i32, i32) -> ()
663; CHECK-NEXT:  # %bb.0:
664; CHECK-NEXT:    i32.const $push0=, 2
665; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
666; CHECK-NEXT:    i32.add $push2=, $0, $pop1
667; CHECK-NEXT:    i32.const $push3=, 40
668; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
669; CHECK-NEXT:    i32.store 0($pop4), $2
670; CHECK-NEXT:    return
671  %add.ptr = getelementptr inbounds i32, ptr %p, i32 10
672  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 %n
673  store i32 %i, ptr %add.ptr1, align 4
674  ret void
675}
676
677define void @store_test16(ptr %p, i32 %n, i32 %i) {
678; CHECK-LABEL: store_test16:
679; CHECK:         .functype store_test16 (i32, i32, i32) -> ()
680; CHECK-NEXT:  # %bb.0:
681; CHECK-NEXT:    i32.const $push0=, 2
682; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
683; CHECK-NEXT:    i32.add $push2=, $0, $pop1
684; CHECK-NEXT:    i32.const $push3=, 40
685; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
686; CHECK-NEXT:    i32.store 0($pop4), $2
687; CHECK-NEXT:    return
688  %add.ptr = getelementptr inbounds i32, ptr %p, i32 10
689  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 %n
690  store i32 %i, ptr %add.ptr1, align 4
691  ret void
692}
693
694define void @store_test17(ptr %p, i32 %n, i32 %i) {
695; CHECK-LABEL: store_test17:
696; CHECK:         .functype store_test17 (i32, i32, i32) -> ()
697; CHECK-NEXT:  # %bb.0:
698; CHECK-NEXT:    i32.const $push0=, 2
699; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
700; CHECK-NEXT:    i32.add $push2=, $pop1, $0
701; CHECK-NEXT:    i32.const $push3=, 40
702; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
703; CHECK-NEXT:    i32.store 0($pop4), $2
704; CHECK-NEXT:    return
705  %add = add nsw i32 %n, 10
706  %add.ptr = getelementptr inbounds i32, ptr %p, i32 %add
707  store i32 %i, ptr %add.ptr, align 4
708  ret void
709}
710
711define void @store_test18(ptr %p, i32 %n, i32 %i) {
712; CHECK-LABEL: store_test18:
713; CHECK:         .functype store_test18 (i32, i32, i32) -> ()
714; CHECK-NEXT:  # %bb.0:
715; CHECK-NEXT:    i32.const $push0=, 2
716; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
717; CHECK-NEXT:    i32.add $push2=, $0, $pop1
718; CHECK-NEXT:    i32.store 40($pop2), $2
719; CHECK-NEXT:    return
720  %add.ptr = getelementptr inbounds i32, ptr %p, i32 %n
721  %add.ptr1 = getelementptr inbounds i32, ptr %add.ptr, i32 10
722  store i32 %i, ptr %add.ptr1, align 4
723  ret void
724}
725
726define void @store_test19(ptr %p, i32 %n, i32 %i) {
727; CHECK-LABEL: store_test19:
728; CHECK:         .functype store_test19 (i32, i32, i32) -> ()
729; CHECK-NEXT:  # %bb.0:
730; CHECK-NEXT:    i32.const $push0=, 2
731; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
732; CHECK-NEXT:    i32.add $push2=, $pop1, $0
733; CHECK-NEXT:    i32.const $push3=, 40
734; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
735; CHECK-NEXT:    i32.store 0($pop4), $2
736; CHECK-NEXT:    return
737  %add = add nsw i32 10, %n
738  %add.ptr = getelementptr inbounds i32, ptr %p, i32 %add
739  store i32 %i, ptr %add.ptr, align 4
740  ret void
741}
742
743define void @store_test20(ptr %p, i32 %i) {
744; CHECK-LABEL: store_test20:
745; CHECK:         .functype store_test20 (i32, i32) -> ()
746; CHECK-NEXT:  # %bb.0:
747; CHECK-NEXT:    i32.const $push0=, -40
748; CHECK-NEXT:    i32.add $push1=, $0, $pop0
749; CHECK-NEXT:    i32.store 0($pop1), $1
750; CHECK-NEXT:    return
751  %arrayidx = getelementptr inbounds i32, ptr %p, i32 -10
752  store i32 %i, ptr %arrayidx, align 4
753  ret void
754}
755
756define void @store_test21(ptr %p, i32 %n, i32 %i) {
757; CHECK-LABEL: store_test21:
758; CHECK:         .functype store_test21 (i32, i32, i32) -> ()
759; CHECK-NEXT:  # %bb.0:
760; CHECK-NEXT:    i32.const $push0=, 2
761; CHECK-NEXT:    i32.shl $push1=, $1, $pop0
762; CHECK-NEXT:    i32.add $push2=, $pop1, $0
763; CHECK-NEXT:    i32.const $push3=, -40
764; CHECK-NEXT:    i32.add $push4=, $pop2, $pop3
765; CHECK-NEXT:    i32.store 0($pop4), $2
766; CHECK-NEXT:    return
767  %add = add nsw i32 %n, -10
768  %arrayidx = getelementptr inbounds i32, ptr %p, i32 %add
769  store i32 %i, ptr %arrayidx, align 4
770  ret void
771}
772