blob: dec202ea6af9a35f2769a101e00efb601fd97270 [file] [log] [blame]
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -07001; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck -DPTR=32 %s
2; RUN: llc < %s --mtriple=wasm64-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck -DPTR=64 %s
Derek Schuff9769deb2015-12-11 23:49:46 +00003
Derek Schuff4b3bb212016-02-23 18:13:07 +00004declare void @ext_func(i64* %ptr)
5declare void @ext_func_i32(i32* %ptr)
6
Derek Schuff9769deb2015-12-11 23:49:46 +00007; CHECK-LABEL: alloca32:
Derek Schuff45cd5a72015-12-16 20:43:06 +00008; Check that there is an extra local for the stack pointer.
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -07009; CHECK: .local i[[PTR]]{{$}}
Derek Schuff4b3bb212016-02-23 18:13:07 +000010define void @alloca32() noredzone {
Sam Clegg275d15e2019-02-23 00:07:39 +000011 ; CHECK-NEXT: global.get $push[[L2:.+]]=, __stack_pointer{{$}}
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070012 ; CHECK-NEXT: i[[PTR]].const $push[[L3:.+]]=, 16
13 ; CHECK-NEXT: i[[PTR]].sub $push[[L9:.+]]=, $pop[[L2]], $pop[[L3]]
Thomas Lively6a87dda2019-01-08 06:25:55 +000014 ; CHECK-NEXT: local.tee $push[[L8:.+]]=, [[SP:.+]], $pop[[L9]]{{$}}
Sam Clegg275d15e2019-02-23 00:07:39 +000015 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L8]]{{$}}
Derek Schuff9769deb2015-12-11 23:49:46 +000016 %retval = alloca i32
Thomas Lively6a87dda2019-01-08 06:25:55 +000017 ; CHECK: local.get $push[[L4:.+]]=, [[SP]]{{$}}
Derek Schuffdc5f6aa2016-02-20 21:46:50 +000018 ; CHECK: i32.const $push[[L0:.+]]=, 0
Dan Gohman7d7409e2017-02-28 23:37:04 +000019 ; CHECK: i32.store 12($pop[[L4]]), $pop[[L0]]
Derek Schuff9769deb2015-12-11 23:49:46 +000020 store i32 0, i32* %retval
Thomas Lively6a87dda2019-01-08 06:25:55 +000021 ; CHECK: local.get $push[[L6:.+]]=, [[SP]]{{$}}
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070022 ; CHECK-NEXT: i[[PTR]].const $push[[L5:.+]]=, 16
23 ; CHECK-NEXT: i[[PTR]].add $push[[L7:.+]]=, $pop[[L6]], $pop[[L5]]
Sam Clegg275d15e2019-02-23 00:07:39 +000024 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L7]]
Derek Schuff9769deb2015-12-11 23:49:46 +000025 ret void
26}
27
28; CHECK-LABEL: alloca3264:
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070029; CHECK: .local i[[PTR]]{{$}}
Derek Schuff9769deb2015-12-11 23:49:46 +000030define void @alloca3264() {
Sam Clegg275d15e2019-02-23 00:07:39 +000031 ; CHECK: global.get $push[[L3:.+]]=, __stack_pointer{{$}}
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070032 ; CHECK-NEXT: i[[PTR]].const $push[[L4:.+]]=, 16
33 ; CHECK-NEXT: i[[PTR]].sub $push[[L6:.+]]=, $pop[[L3]], $pop[[L4]]
Thomas Lively6a87dda2019-01-08 06:25:55 +000034 ; CHECK-NEXT: local.tee $push[[L5:.+]]=, [[SP:.+]], $pop[[L6]]
Derek Schuff9769deb2015-12-11 23:49:46 +000035 %r1 = alloca i32
36 %r2 = alloca double
Chandler Carruth3a996812017-07-18 08:20:50 +000037 store i32 0, i32* %r1
Chandler Carruth3a996812017-07-18 08:20:50 +000038 store double 0.0, double* %r2
Chandler Carruthbb835582017-07-19 04:15:30 +000039 ; CHECK-NEXT: i64.const $push[[L1:.+]]=, 0
40 ; CHECK-NEXT: i64.store 0($pop[[L5]]), $pop[[L1]]
Thomas Lively6a87dda2019-01-08 06:25:55 +000041 ; CHECK-NEXT: local.get $push[[L2:.+]]=, [[SP]]{{$}}
Chandler Carruthbb835582017-07-19 04:15:30 +000042 ; CHECK-NEXT: i32.const $push[[L0:.+]]=, 0
43 ; CHECK-NEXT: i32.store 12($pop[[L2]]), $pop[[L0]]
Derek Schuff4b3bb212016-02-23 18:13:07 +000044 ; CHECK-NEXT: return
Derek Schuff9769deb2015-12-11 23:49:46 +000045 ret void
46}
47
Derek Schuff45cd5a72015-12-16 20:43:06 +000048; CHECK-LABEL: allocarray:
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070049; CHECK: .local i[[PTR]]{{$}}
Derek Schuff9769deb2015-12-11 23:49:46 +000050define void @allocarray() {
Sam Clegg275d15e2019-02-23 00:07:39 +000051 ; CHECK-NEXT: global.get $push[[L4:.+]]=, __stack_pointer{{$}}
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070052 ; CHECK-NEXT: i[[PTR]].const $push[[L5:.+]]=, 144{{$}}
53 ; CHECK-NEXT: i[[PTR]].sub $push[[L12:.+]]=, $pop[[L4]], $pop[[L5]]
Thomas Lively6a87dda2019-01-08 06:25:55 +000054 ; CHECK-NEXT: local.tee $push[[L11:.+]]=, 0, $pop[[L12]]
Sam Clegg275d15e2019-02-23 00:07:39 +000055 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L11]]
Derek Schuff4b3bb212016-02-23 18:13:07 +000056 %r = alloca [33 x i32]
Dan Gohman7e649172016-01-20 04:21:16 +000057
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070058 ; CHECK: i[[PTR]].const $push{{.+}}=, 24
59 ; CHECK-NEXT: i[[PTR]].add $push[[L3:.+]]=, $pop{{.+}}, $pop{{.+}}
Dan Gohman0cfb5f82016-05-10 04:24:02 +000060 ; CHECK-NEXT: i32.const $push[[L1:.+]]=, 1{{$}}
Dan Gohman7f1bdb22016-10-06 22:08:28 +000061 ; CHECK-NEXT: i32.store 0($pop[[L3]]), $pop[[L1]]{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +000062 ; CHECK-NEXT: local.get $push[[L4:.+]]=, 0{{$}}
Dan Gohmanc9623db2016-08-18 17:51:27 +000063 ; CHECK-NEXT: i32.const $push[[L10:.+]]=, 1{{$}}
Dan Gohman7d7409e2017-02-28 23:37:04 +000064 ; CHECK-NEXT: i32.store 12($pop[[L4]]), $pop[[L10]]{{$}}
Derek Schuff4b3bb212016-02-23 18:13:07 +000065 %p = getelementptr [33 x i32], [33 x i32]* %r, i32 0, i32 0
Derek Schuff9769deb2015-12-11 23:49:46 +000066 store i32 1, i32* %p
Derek Schuff4b3bb212016-02-23 18:13:07 +000067 %p2 = getelementptr [33 x i32], [33 x i32]* %r, i32 0, i32 3
Derek Schuff9769deb2015-12-11 23:49:46 +000068 store i32 1, i32* %p2
Dan Gohman7e649172016-01-20 04:21:16 +000069
Thomas Lively6a87dda2019-01-08 06:25:55 +000070 ; CHECK-NEXT: local.get $push[[L2:.+]]=, [[SP]]{{$}}
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070071 ; CHECK-NEXT: i[[PTR]].const $push[[L7:.+]]=, 144
72 ; CHECK-NEXT: i[[PTR]].add $push[[L8:.+]]=, $pop[[L2]], $pop[[L7]]
Sam Clegg275d15e2019-02-23 00:07:39 +000073 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L8]]
Derek Schuff9769deb2015-12-11 23:49:46 +000074 ret void
75}
76
Derek Schuff90d9e8d2016-01-26 22:47:43 +000077; CHECK-LABEL: non_mem_use
Derek Schuffc97ba932016-01-30 21:43:08 +000078define void @non_mem_use(i8** %addr) {
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070079 ; CHECK: i[[PTR]].const $push[[L2:.+]]=, 48
80 ; CHECK-NEXT: i[[PTR]].sub $push[[L12:.+]]=, {{.+}}, $pop[[L2]]
Thomas Lively6a87dda2019-01-08 06:25:55 +000081 ; CHECK-NEXT: local.tee $push[[L11:.+]]=, [[SP:.+]], $pop[[L12]]
Sam Clegg275d15e2019-02-23 00:07:39 +000082 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L11]]
Derek Schuffc97ba932016-01-30 21:43:08 +000083 %buf = alloca [27 x i8], align 16
Derek Schuff90d9e8d2016-01-26 22:47:43 +000084 %r = alloca i64
85 %r2 = alloca i64
86 ; %r is at SP+8
Thomas Lively6a87dda2019-01-08 06:25:55 +000087 ; CHECK: local.get $push[[L3:.+]]=, [[SP]]
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070088 ; CHECK: i[[PTR]].const $push[[OFF:.+]]=, 8
89 ; CHECK-NEXT: i[[PTR]].add $push[[ARG1:.+]]=, $pop[[L3]], $pop[[OFF]]
Sam Clegg275d15e2019-02-23 00:07:39 +000090 ; CHECK-NEXT: call ext_func, $pop[[ARG1]]
Derek Schuff90d9e8d2016-01-26 22:47:43 +000091 call void @ext_func(i64* %r)
92 ; %r2 is at SP+0, no add needed
Thomas Lively6a87dda2019-01-08 06:25:55 +000093 ; CHECK: local.get $push[[L4:.+]]=, [[SP]]
Sam Clegg275d15e2019-02-23 00:07:39 +000094 ; CHECK-NEXT: call ext_func, $pop[[L4]]
Derek Schuff90d9e8d2016-01-26 22:47:43 +000095 call void @ext_func(i64* %r2)
Derek Schuffc97ba932016-01-30 21:43:08 +000096 ; Use as a value, but in a store
97 ; %buf is at SP+16
Thomas Lively6a87dda2019-01-08 06:25:55 +000098 ; CHECK: local.get $push[[L5:.+]]=, [[SP]]
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -070099 ; CHECK: i[[PTR]].const $push[[OFF:.+]]=, 16
100 ; CHECK-NEXT: i[[PTR]].add $push[[VAL:.+]]=, $pop[[L5]], $pop[[OFF]]
101 ; CHECK-NEXT: i[[PTR]].store 0($pop{{.+}}), $pop[[VAL]]
Derek Schuffc97ba932016-01-30 21:43:08 +0000102 %gep = getelementptr inbounds [27 x i8], [27 x i8]* %buf, i32 0, i32 0
103 store i8* %gep, i8** %addr
Derek Schuff90d9e8d2016-01-26 22:47:43 +0000104 ret void
105}
106
Dan Gohman7e649172016-01-20 04:21:16 +0000107; CHECK-LABEL: allocarray_inbounds:
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700108; CHECK: .local i[[PTR]]{{$}}
Derek Schuff9bfea272016-01-07 18:55:52 +0000109define void @allocarray_inbounds() {
Sam Clegg275d15e2019-02-23 00:07:39 +0000110 ; CHECK: global.get $push[[L3:.+]]=, __stack_pointer{{$}}
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700111 ; CHECK-NEXT: i[[PTR]].const $push[[L4:.+]]=, 32{{$}}
112 ; CHECK-NEXT: i[[PTR]].sub $push[[L11:.+]]=, $pop[[L3]], $pop[[L4]]
Thomas Lively6a87dda2019-01-08 06:25:55 +0000113 ; CHECK-NEXT: local.tee $push[[L10:.+]]=, [[SP:.+]], $pop[[L11]]
Sam Clegg275d15e2019-02-23 00:07:39 +0000114 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L10]]{{$}}
Derek Schuff9bfea272016-01-07 18:55:52 +0000115 %r = alloca [5 x i32]
116 ; CHECK: i32.const $push[[L3:.+]]=, 1
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000117 ; CHECK-DAG: i32.store 24(${{.+}}), $pop[[L3]]
Derek Schuff9bfea272016-01-07 18:55:52 +0000118 %p = getelementptr inbounds [5 x i32], [5 x i32]* %r, i32 0, i32 0
119 store i32 1, i32* %p
120 ; This store should have both the GEP and the FI folded into it.
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000121 ; CHECK-DAG: i32.store 12(${{.+}}), $pop
Dan Gohmanbb372242016-01-26 03:39:31 +0000122 %p2 = getelementptr inbounds [5 x i32], [5 x i32]* %r, i32 0, i32 3
Derek Schuff9bfea272016-01-07 18:55:52 +0000123 store i32 1, i32* %p2
Derek Schuff4b3bb212016-02-23 18:13:07 +0000124 call void @ext_func(i64* null);
Dan Gohmand530f682016-05-24 23:47:41 +0000125 ; CHECK: call ext_func
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700126 ; CHECK: i[[PTR]].const $push[[L5:.+]]=, 32{{$}}
127 ; CHECK-NEXT: i[[PTR]].add $push[[L7:.+]]=, ${{.+}}, $pop[[L5]]
Sam Clegg275d15e2019-02-23 00:07:39 +0000128 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L7]]
Derek Schuff9bfea272016-01-07 18:55:52 +0000129 ret void
130}
131
Dan Gohman7e649172016-01-20 04:21:16 +0000132; CHECK-LABEL: dynamic_alloca:
Derek Schuff8bb5f292015-12-16 23:21:30 +0000133define void @dynamic_alloca(i32 %alloc) {
Sam Clegg275d15e2019-02-23 00:07:39 +0000134 ; CHECK: global.get $push[[L13:.+]]=, __stack_pointer{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000135 ; CHECK-NEXT: local.tee $push[[L12:.+]]=, [[SP:.+]], $pop[[L13]]{{$}}
Derek Schuff27e3b8a2016-02-22 21:57:17 +0000136 ; Target independent codegen bumps the stack pointer.
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700137 ; CHECK: i[[PTR]].sub
Derek Schuff27e3b8a2016-02-22 21:57:17 +0000138 ; Check that SP is written back to memory after decrement
Sam Clegg275d15e2019-02-23 00:07:39 +0000139 ; CHECK: global.set __stack_pointer,
Derek Schuff6ea637a2016-01-29 18:37:49 +0000140 %r = alloca i32, i32 %alloc
141 ; Target-independent codegen also calculates the store addr
Sam Clegg275d15e2019-02-23 00:07:39 +0000142 ; CHECK: call ext_func_i32
Derek Schuff4b3bb212016-02-23 18:13:07 +0000143 call void @ext_func_i32(i32* %r)
Sam Clegg275d15e2019-02-23 00:07:39 +0000144 ; CHECK: global.set __stack_pointer, $pop{{.+}}
Derek Schuff6ea637a2016-01-29 18:37:49 +0000145 ret void
146}
147
Derek Schuff4b3bb212016-02-23 18:13:07 +0000148; CHECK-LABEL: dynamic_alloca_redzone:
149define void @dynamic_alloca_redzone(i32 %alloc) {
Sam Clegg275d15e2019-02-23 00:07:39 +0000150 ; CHECK: global.get $push[[L13:.+]]=, __stack_pointer{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000151 ; CHECK-NEXT: local.tee $push[[L12:.+]]=, [[SP:.+]], $pop[[L13]]{{$}}
Derek Schuff4b3bb212016-02-23 18:13:07 +0000152 ; Target independent codegen bumps the stack pointer
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700153 ; CHECK: i[[PTR]].sub
Derek Schuff4b3bb212016-02-23 18:13:07 +0000154 %r = alloca i32, i32 %alloc
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700155 ; CHECK-NEXT: local.tee $push[[L8:.+]]=, [[SP2:.+]], $pop
156 ; CHECK: local.get $push[[L7:.+]]=, [[SP2]]{{$}}
157 ; CHECK-NEXT: i32.const $push[[L6:.+]]=, 0{{$}}
158 ; CHECK-NEXT: i32.store 0($pop[[L7]]), $pop[[L6]]{{$}}
Derek Schuff4b3bb212016-02-23 18:13:07 +0000159 store i32 0, i32* %r
160 ; CHECK-NEXT: return
161 ret void
162}
163
Derek Schuff6ea637a2016-01-29 18:37:49 +0000164; CHECK-LABEL: dynamic_static_alloca:
Derek Schuff4b3bb212016-02-23 18:13:07 +0000165define void @dynamic_static_alloca(i32 %alloc) noredzone {
Derek Schuff27e3b8a2016-02-22 21:57:17 +0000166 ; Decrement SP in the prolog by the static amount and writeback to memory.
Sam Clegg275d15e2019-02-23 00:07:39 +0000167 ; CHECK: global.get $push[[L11:.+]]=, __stack_pointer{{$}}
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700168 ; CHECK-NEXT: i[[PTR]].const $push[[L12:.+]]=, 16
169 ; CHECK-NEXT: i[[PTR]].sub $push[[L23:.+]]=, $pop[[L11]], $pop[[L12]]
Thomas Lively6a87dda2019-01-08 06:25:55 +0000170 ; CHECK-NEXT: local.tee $push[[L22:.+]]=, [[SP:.+]], $pop[[L23]]
Sam Clegg275d15e2019-02-23 00:07:39 +0000171 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L22]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000172
173 ; Alloc and write to a static alloca
Thomas Lively6a87dda2019-01-08 06:25:55 +0000174 ; CHECK: local.get $push[[L21:.+]]=, [[SP:.+]]
175 ; CHECK-NEXT: local.tee $push[[pushedFP:.+]]=, [[FP:.+]], $pop[[L21]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000176 ; CHECK-NEXT: i32.const $push[[L0:.+]]=, 101
Dan Gohman7f1bdb22016-10-06 22:08:28 +0000177 ; CHECK-NEXT: i32.store [[static_offset:.+]]($pop[[pushedFP]]), $pop[[L0]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000178 %static = alloca i32
179 store volatile i32 101, i32* %static
180
Derek Schuff27e3b8a2016-02-22 21:57:17 +0000181 ; Decrement SP in the body by the dynamic amount.
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700182 ; CHECK: i[[PTR]].sub
Thomas Lively6a87dda2019-01-08 06:25:55 +0000183 ; CHECK: local.tee $push[[L16:.+]]=, [[dynamic_local:.+]], $pop{{.+}}
184 ; CHECK: local.tee $push[[L15:.+]]=, [[other:.+]], $pop[[L16]]{{$}}
Sam Clegg275d15e2019-02-23 00:07:39 +0000185 ; CHECK: global.set __stack_pointer, $pop[[L15]]{{$}}
Derek Schuff92d300e2016-09-26 21:18:03 +0000186 %dynamic = alloca i32, i32 %alloc
187
188 ; Ensure we don't modify the frame pointer after assigning it.
189 ; CHECK-NOT: $[[FP]]=
190
191 ; Ensure the static address doesn't change after modifying the stack pointer.
Thomas Lively6a87dda2019-01-08 06:25:55 +0000192 ; CHECK: local.get $push[[L17:.+]]=, [[FP]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000193 ; CHECK: i32.const $push[[L7:.+]]=, 102
Dan Gohman7d7409e2017-02-28 23:37:04 +0000194 ; CHECK-NEXT: i32.store [[static_offset]]($pop[[L17]]), $pop[[L7]]
Thomas Lively6a87dda2019-01-08 06:25:55 +0000195 ; CHECK-NEXT: local.get $push[[L9:.+]]=, [[dynamic_local]]{{$}}
Derek Schuff92d300e2016-09-26 21:18:03 +0000196 ; CHECK-NEXT: i32.const $push[[L8:.+]]=, 103
Dan Gohman7d7409e2017-02-28 23:37:04 +0000197 ; CHECK-NEXT: i32.store 0($pop[[L9]]), $pop[[L8]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000198 store volatile i32 102, i32* %static
199 store volatile i32 103, i32* %dynamic
200
201 ; Decrement SP in the body by the dynamic amount.
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700202 ; CHECK: i[[PTR]].sub
Thomas Lively6a87dda2019-01-08 06:25:55 +0000203 ; CHECK: local.tee $push{{.+}}=, [[dynamic2_local:.+]], $pop{{.+}}
Derek Schuff92d300e2016-09-26 21:18:03 +0000204 %dynamic.2 = alloca i32, i32 %alloc
205
206 ; CHECK-NOT: $[[FP]]=
207
208 ; Ensure neither the static nor dynamic address changes after the second
209 ; modification of the stack pointer.
Thomas Lively6a87dda2019-01-08 06:25:55 +0000210 ; CHECK: local.get $push[[L22:.+]]=, [[FP]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000211 ; CHECK: i32.const $push[[L9:.+]]=, 104
Dan Gohman7d7409e2017-02-28 23:37:04 +0000212 ; CHECK-NEXT: i32.store [[static_offset]]($pop[[L22]]), $pop[[L9]]
Thomas Lively6a87dda2019-01-08 06:25:55 +0000213 ; CHECK-NEXT: local.get $push[[L23:.+]]=, [[dynamic_local]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000214 ; CHECK-NEXT: i32.const $push[[L10:.+]]=, 105
Dan Gohman7d7409e2017-02-28 23:37:04 +0000215 ; CHECK-NEXT: i32.store 0($pop[[L23]]), $pop[[L10]]
Thomas Lively6a87dda2019-01-08 06:25:55 +0000216 ; CHECK-NEXT: local.get $push[[L23:.+]]=, [[dynamic2_local]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000217 ; CHECK-NEXT: i32.const $push[[L11:.+]]=, 106
Dan Gohman7d7409e2017-02-28 23:37:04 +0000218 ; CHECK-NEXT: i32.store 0($pop[[L23]]), $pop[[L11]]
Derek Schuff92d300e2016-09-26 21:18:03 +0000219 store volatile i32 104, i32* %static
220 store volatile i32 105, i32* %dynamic
221 store volatile i32 106, i32* %dynamic.2
222
Derek Schuff27e3b8a2016-02-22 21:57:17 +0000223 ; Writeback to memory.
Thomas Lively6a87dda2019-01-08 06:25:55 +0000224 ; CHECK: local.get $push[[L24:.+]]=, [[FP]]{{$}}
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700225 ; CHECK: i[[PTR]].const $push[[L18:.+]]=, 16
226 ; CHECK-NEXT: i[[PTR]].add $push[[L19:.+]]=, $pop[[L24]], $pop[[L18]]
Sam Clegg275d15e2019-02-23 00:07:39 +0000227 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L19]]
Derek Schuff8bb5f292015-12-16 23:21:30 +0000228 ret void
229}
Derek Schuffc97ba932016-01-30 21:43:08 +0000230
Derek Schuffe9e68912016-09-30 18:02:54 +0000231declare i8* @llvm.stacksave()
232declare void @llvm.stackrestore(i8*)
233
234; CHECK-LABEL: llvm_stack_builtins:
235define void @llvm_stack_builtins(i32 %alloc) noredzone {
Sam Clegg275d15e2019-02-23 00:07:39 +0000236 ; CHECK: global.get $push[[L11:.+]]=, __stack_pointer{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000237 ; CHECK-NEXT: local.tee $push[[L10:.+]]=, {{.+}}, $pop[[L11]]
238 ; CHECK-NEXT: local.set [[STACK:.+]], $pop[[L10]]
Derek Schuffe9e68912016-09-30 18:02:54 +0000239 %stack = call i8* @llvm.stacksave()
240
241 ; Ensure we don't reassign the stacksave local
Thomas Lively6a87dda2019-01-08 06:25:55 +0000242 ; CHECK-NOT: local.set [[STACK]],
Derek Schuffe9e68912016-09-30 18:02:54 +0000243 %dynamic = alloca i32, i32 %alloc
244
Thomas Lively6a87dda2019-01-08 06:25:55 +0000245 ; CHECK: local.get $push[[L12:.+]]=, [[STACK]]
Sam Clegg275d15e2019-02-23 00:07:39 +0000246 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L12]]
Derek Schuffe9e68912016-09-30 18:02:54 +0000247 call void @llvm.stackrestore(i8* %stack)
248
249 ret void
250}
251
252; Not actually using the alloca'd variables exposed an issue with register
253; stackification, where copying the stack pointer into the frame pointer was
254; moved after the stack pointer was updated for the dynamic alloca.
255; CHECK-LABEL: dynamic_alloca_nouse:
256define void @dynamic_alloca_nouse(i32 %alloc) noredzone {
Sam Clegg275d15e2019-02-23 00:07:39 +0000257 ; CHECK: global.get $push[[L11:.+]]=, __stack_pointer{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000258 ; CHECK-NEXT: local.tee $push[[L10:.+]]=, {{.+}}, $pop[[L11]]
259 ; CHECK-NEXT: local.set [[FP:.+]], $pop[[L10]]
Derek Schuffe9e68912016-09-30 18:02:54 +0000260 %dynamic = alloca i32, i32 %alloc
261
Thomas Lively6a87dda2019-01-08 06:25:55 +0000262 ; CHECK-NOT: local.set [[FP]],
Derek Schuffe9e68912016-09-30 18:02:54 +0000263
Thomas Lively6a87dda2019-01-08 06:25:55 +0000264 ; CHECK: local.get $push[[L12:.+]]=, [[FP]]
Sam Clegg275d15e2019-02-23 00:07:39 +0000265 ; CHECK-NEXT: global.set __stack_pointer, $pop[[L12]]
Derek Schuffe9e68912016-09-30 18:02:54 +0000266 ret void
267}
268
Derek Schuffaadc89c2016-02-16 18:18:36 +0000269; The use of the alloca in a phi causes a CopyToReg DAG node to be generated,
270; which has to have special handling because CopyToReg can't have a FI operand
271; CHECK-LABEL: copytoreg_fi:
272define void @copytoreg_fi(i1 %cond, i32* %b) {
273entry:
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700274 ; CHECK: i[[PTR]].const $push[[L1:.+]]=, 16
275 ; CHECK-NEXT: i[[PTR]].sub $push[[L3:.+]]=, {{.+}}, $pop[[L1]]
Derek Schuffaadc89c2016-02-16 18:18:36 +0000276 %addr = alloca i32
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700277 ; CHECK: i[[PTR]].const $push[[OFF:.+]]=, 12
278 ; CHECK-NEXT: i[[PTR]].add $push[[ADDR:.+]]=, $pop[[L3]], $pop[[OFF]]
Thomas Lively6a87dda2019-01-08 06:25:55 +0000279 ; CHECK-NEXT: local.set [[COPY:.+]], $pop[[ADDR]]
Derek Schuffaadc89c2016-02-16 18:18:36 +0000280 br label %body
281body:
282 %a = phi i32* [%addr, %entry], [%b, %body]
283 store i32 1, i32* %a
Thomas Lively6a87dda2019-01-08 06:25:55 +0000284 ; CHECK: local.get $push[[L12:.+]]=, [[COPY]]
Dan Gohman7d7409e2017-02-28 23:37:04 +0000285 ; CHECK: i32.store 0($pop[[L12]]),
Derek Schuffaadc89c2016-02-16 18:18:36 +0000286 br i1 %cond, label %body, label %exit
287exit:
288 ret void
289}
290
Dan Gohman94c65662016-02-16 23:48:04 +0000291declare void @use_i8_star(i8*)
292declare i8* @llvm.frameaddress(i32)
293
294; Test __builtin_frame_address(0).
Dan Gohman94c65662016-02-16 23:48:04 +0000295; CHECK-LABEL: frameaddress_0:
Sam Clegg275d15e2019-02-23 00:07:39 +0000296; CHECK: global.get $push[[L3:.+]]=, __stack_pointer{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000297; CHECK-NEXT: local.tee $push[[L2:.+]]=, [[FP:.+]], $pop[[L3]]{{$}}
Sam Clegg275d15e2019-02-23 00:07:39 +0000298; CHECK-NEXT: call use_i8_star, $pop[[L2]]
Thomas Lively6a87dda2019-01-08 06:25:55 +0000299; CHECK-NEXT: local.get $push[[L5:.+]]=, [[FP]]
Sam Clegg275d15e2019-02-23 00:07:39 +0000300; CHECK-NEXT: global.set __stack_pointer, $pop[[L5]]
Dan Gohman94c65662016-02-16 23:48:04 +0000301define void @frameaddress_0() {
302 %t = call i8* @llvm.frameaddress(i32 0)
303 call void @use_i8_star(i8* %t)
304 ret void
305}
306
307; Test __builtin_frame_address(1).
308
309; CHECK-LABEL: frameaddress_1:
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700310; CHECK: i[[PTR]].const $push0=, 0{{$}}
Sam Clegg275d15e2019-02-23 00:07:39 +0000311; CHECK-NEXT: call use_i8_star, $pop0{{$}}
Dan Gohman94c65662016-02-16 23:48:04 +0000312; CHECK-NEXT: return{{$}}
313define void @frameaddress_1() {
314 %t = call i8* @llvm.frameaddress(i32 1)
315 call void @use_i8_star(i8* %t)
316 ret void
317}
318
Dan Gohman02c08712016-02-20 23:09:44 +0000319; Test a stack address passed to an inline asm.
320; CHECK-LABEL: inline_asm:
Sam Clegg275d15e2019-02-23 00:07:39 +0000321; CHECK: global.get {{.+}}, __stack_pointer{{$}}
Dan Gohman02c08712016-02-20 23:09:44 +0000322; CHECK: #APP
323; CHECK-NEXT: # %{{[0-9]+}}{{$}}
324; CHECK-NEXT: #NO_APP
325define void @inline_asm() {
326 %tmp = alloca i8
327 call void asm sideeffect "# %0", "r"(i8* %tmp)
328 ret void
329}
330
Wouter van Oortmerssenb9a539c2020-06-15 15:31:10 -0700331; CHECK: .globaltype __stack_pointer, i[[PTR]]{{$}}
Wouter van Oortmerssen3231e512018-11-02 00:45:00 +0000332
Derek Schuffc97ba932016-01-30 21:43:08 +0000333; TODO: test over-aligned alloca