1*b9a539c0SWouter van Oortmerssen; RUN: llc < %s --mtriple=wasm32-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck -DPTR=32 %s
2*b9a539c0SWouter van Oortmerssen; RUN: llc < %s --mtriple=wasm64-unknown-unknown -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck -DPTR=64 %s
30d41b7b3SDerek Schuff
40d41b7b3SDerek Schuffdeclare void @somefunc(i32*)
50d41b7b3SDerek Schuff
60d41b7b3SDerek Schuff; CHECK-LABEL: underalign:
7275d15ecSSam Clegg; CHECK:      global.get $push[[L1:.+]]=, __stack_pointer{{$}}
8*b9a539c0SWouter van Oortmerssen; CHECK-NEXT: i[[PTR]].const $push[[L2:.+]]=, 16
9*b9a539c0SWouter van Oortmerssen; CHECK-NEXT: i[[PTR]].sub $push[[L10:.+]]=, $pop[[L1]], $pop[[L2]]
106a87ddacSThomas Lively; CHECK-NEXT: local.tee $push{{.+}}=, [[SP:.+]], $pop[[L10]]
110d41b7b3SDerek Schuff
126a87ddacSThomas Lively; CHECK:      local.get $push[[L3:.+]]=, [[SP]]{{$}}
13*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].add $push[[underaligned:.+]]=, $pop[[L3]], $pop{{.+}}
14275d15ecSSam Clegg; CHECK-NEXT: call somefunc, $pop[[underaligned]]
150d41b7b3SDerek Schuff
166a87ddacSThomas Lively; CHECK:      local.get $push[[M4:.+]]=, [[SP]]{{$}}
17*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].add $push[[L5:.+]]=, $pop[[M4]], $pop{{.+}}
18275d15ecSSam Clegg; CHECK-NEXT: global.set __stack_pointer, $pop[[L5]]
190d41b7b3SDerek Schuffdefine void @underalign() {
200d41b7b3SDerek Schuffentry:
210d41b7b3SDerek Schuff  %underaligned = alloca i32, align 8
220d41b7b3SDerek Schuff  call void @somefunc(i32* %underaligned)
230d41b7b3SDerek Schuff  ret void
240d41b7b3SDerek Schuff}
250d41b7b3SDerek Schuff
260d41b7b3SDerek Schuff; CHECK-LABEL: overalign:
27275d15ecSSam Clegg; CHECK:      global.get $push[[L10:.+]]=, __stack_pointer{{$}}
286a87ddacSThomas Lively; CHECK-NEXT: local.tee $push[[L9:.+]]=, [[BP:.+]], $pop[[L10]]
29*b9a539c0SWouter van Oortmerssen; CHECK-NEXT: i[[PTR]].const $push[[L2:.+]]=, 32
30*b9a539c0SWouter van Oortmerssen; CHECK-NEXT: i[[PTR]].sub $push[[L8:.+]]=, $pop[[L9]], $pop[[L2]]
31*b9a539c0SWouter van Oortmerssen; CHECK-NEXT: i[[PTR]].const $push[[L3:.+]]=, -32
32*b9a539c0SWouter van Oortmerssen; CHECK-NEXT: i[[PTR]].and $push[[L7:.+]]=, $pop[[L8]], $pop[[L3]]
336a87ddacSThomas Lively; CHECK-NEXT: local.tee $push{{.+}}=, [[SP:.+]], $pop[[L7]]
340d41b7b3SDerek Schuff
356a87ddacSThomas Lively; CHECK:      local.get $push[[M5:.+]]=, [[SP]]{{$}}
36275d15ecSSam Clegg; CHECK:      call somefunc, $pop[[M5]]{{$}}
370d41b7b3SDerek Schuff
386a87ddacSThomas Lively; CHECK:      local.get $push[[M6:.+]]=, [[BP]]{{$}}
39275d15ecSSam Clegg; CHECK-NEXT: global.set __stack_pointer, $pop[[M6]]
400d41b7b3SDerek Schuffdefine void @overalign() {
410d41b7b3SDerek Schuffentry:
420d41b7b3SDerek Schuff  %overaligned = alloca i32, align 32
430d41b7b3SDerek Schuff  call void @somefunc(i32* %overaligned)
440d41b7b3SDerek Schuff  ret void
450d41b7b3SDerek Schuff}
460d41b7b3SDerek Schuff
470d41b7b3SDerek Schuff; CHECK-LABEL: over_and_normal_align:
48275d15ecSSam Clegg; CHECK:      global.get $push[[L14:.+]]=, __stack_pointer{{$}}
496a87ddacSThomas Lively; CHECK-NEXT: local.tee $push[[L13:.+]]=, [[BP:.+]], $pop[[L14]]
50*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].sub $push[[L12:.+]]=, $pop[[L13]], $pop{{.+}}
51*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].and $push[[L11:.+]]=, $pop[[L12]], $pop{{.+}}
526a87ddacSThomas Lively; CHECK-NEXT: local.tee $push{{.+}}=, [[SP:.+]], $pop[[L11]]
530d41b7b3SDerek Schuff
546a87ddacSThomas Lively; CHECK:      local.get  $push[[M6:.+]]=, [[SP]]{{$}}
55*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].add $push[[L6:.+]]=, $pop[[M6]], $pop{{.+}}
56275d15ecSSam Clegg; CHECK-NEXT: call somefunc, $pop[[L6]]
576a87ddacSThomas Lively; CHECK:      local.get $push[[M7:.+]]=, [[SP]]{{$}}
58*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].add $push[[L8:.+]]=, $pop[[M7]], $pop{{.+}}
59275d15ecSSam Clegg; CHECK-NEXT: call somefunc, $pop[[L8]]
600d41b7b3SDerek Schuff
616a87ddacSThomas Lively; CHECK:      local.get $push[[L6:.+]]=, [[BP]]{{$}}
62275d15ecSSam Clegg; CHECK-NEXT: global.set __stack_pointer, $pop[[L6]]
630d41b7b3SDerek Schuffdefine void @over_and_normal_align() {
640d41b7b3SDerek Schuffentry:
650d41b7b3SDerek Schuff  %over = alloca i32, align 32
660d41b7b3SDerek Schuff  %normal = alloca i32
670d41b7b3SDerek Schuff  call void @somefunc(i32* %over)
680d41b7b3SDerek Schuff  call void @somefunc(i32* %normal)
690d41b7b3SDerek Schuff  ret void
700d41b7b3SDerek Schuff}
710d41b7b3SDerek Schuff
720d41b7b3SDerek Schuff; CHECK-LABEL: dynamic_overalign:
73275d15ecSSam Clegg; CHECK:      global.get $push[[L18:.+]]=, __stack_pointer{{$}}
746a87ddacSThomas Lively; CHECK-NEXT: local.tee $push[[L17:.+]]=, [[SP:.+]], $pop[[L18]]
756a87ddacSThomas Lively; CHECK-NEXT: local.set [[BP:.+]], $pop[[L17]]
766a87ddacSThomas Lively; CHECK:      local.tee $push{{.+}}=, [[SP_2:.+]], $pop{{.+}}
770d41b7b3SDerek Schuff
786a87ddacSThomas Lively; CHECK:      local.get $push[[M8:.+]]=, [[SP_2]]{{$}}
79275d15ecSSam Clegg; CHECK:      call somefunc, $pop[[M8]]
800d41b7b3SDerek Schuff
816a87ddacSThomas Lively; CHECK:      local.get $push[[M9:.+]]=, [[BP]]{{$}}
82275d15ecSSam Clegg; CHECK-NEXT: global.set __stack_pointer, $pop[[M9]]
830d41b7b3SDerek Schuffdefine void @dynamic_overalign(i32 %num) {
840d41b7b3SDerek Schuffentry:
850d41b7b3SDerek Schuff  %dynamic = alloca i32, i32 %num, align 32
860d41b7b3SDerek Schuff  call void @somefunc(i32* %dynamic)
870d41b7b3SDerek Schuff  ret void
880d41b7b3SDerek Schuff}
890d41b7b3SDerek Schuff
900d41b7b3SDerek Schuff; CHECK-LABEL: overalign_and_dynamic:
91275d15ecSSam Clegg; CHECK:      global.get $push[[L21:.+]]=, __stack_pointer{{$}}
926a87ddacSThomas Lively; CHECK-NEXT: local.tee $push[[L20:.+]]=, [[BP:.+]], $pop[[L21]]
93*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].sub $push[[L19:.+]]=, $pop[[L20]], $pop{{.+}}
94*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].and $push[[L18:.+]]=, $pop[[L19]], $pop{{.+}}
956a87ddacSThomas Lively; CHECK:      local.tee $push{{.+}}=, [[FP:.+]], $pop[[L18]]
966a87ddacSThomas Lively; CHECK:      local.get $push[[M10:.+]]=, [[FP]]{{$}}
97*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].sub $push[[L16:.+]]=, $pop[[M10]], $pop{{.+}}
986a87ddacSThomas Lively; CHECK-NEXT: local.tee $push{{.+}}=, [[SP:.+]], $pop[[L16]]
990d41b7b3SDerek Schuff
1006a87ddacSThomas Lively; CHECK:      local.get $push[[over:.+]]=, [[FP]]
101275d15ecSSam Clegg; CHECK-NEXT: call somefunc, $pop[[over]]
1026a87ddacSThomas Lively; CHECK:      local.get $push[[another:.+]]=, [[SP]]
103275d15ecSSam Clegg; CHECK-NEXT: call somefunc, $pop[[another]]
1040d41b7b3SDerek Schuff
1056a87ddacSThomas Lively; CHECK:      local.get  $push[[M11:.+]]=, [[BP]]{{$}}
106275d15ecSSam Clegg; CHECK-NEXT: global.set __stack_pointer, $pop[[M11]]
1070d41b7b3SDerek Schuffdefine void @overalign_and_dynamic(i32 %num) {
1080d41b7b3SDerek Schuffentry:
1090d41b7b3SDerek Schuff  %over = alloca i32, align 32
1100d41b7b3SDerek Schuff  %dynamic = alloca i32, i32 %num
1110d41b7b3SDerek Schuff  call void @somefunc(i32* %over)
1120d41b7b3SDerek Schuff  call void @somefunc(i32* %dynamic)
1130d41b7b3SDerek Schuff  ret void
1140d41b7b3SDerek Schuff}
1150d41b7b3SDerek Schuff
1160d41b7b3SDerek Schuff; CHECK-LABEL: overalign_static_and_dynamic:
117275d15ecSSam Clegg; CHECK:      global.get $push[[L26:.+]]=, __stack_pointer{{$}}
1186a87ddacSThomas Lively; CHECK-NEXT: local.tee $push[[L25:.+]]=, [[BP:.+]], $pop[[L26]]
119*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].sub $push[[L24:.+]]=, $pop[[L25]], $pop{{.+}}
120*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].and $push[[L23:.+]]=, $pop[[L24]], $pop{{.+}}
1216a87ddacSThomas Lively; CHECK:      local.tee $push{{.+}}=, [[FP:.+]], $pop[[L23]]
1226a87ddacSThomas Lively; CHECK:      local.get $push[[M12:.+]]=, [[FP]]{{$}}
123*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].sub $push[[L21:.+]]=, $pop[[M12]], $pop{{.+}}
1246a87ddacSThomas Lively; CHECK-NEXT: local.tee $push{{.+}}=, [[SP:.+]], $pop[[L21]]
1250d41b7b3SDerek Schuff
1266a87ddacSThomas Lively; CHECK:      local.get $push[[L19:.+]]=, [[FP]]
1276a87ddacSThomas Lively; CHECK:      local.tee $push[[L18:.+]]=, [[FP_2:.+]], $pop[[L19]]
128*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].add $push[[over:.+]]=, $pop[[L18]], $pop{{.+}}
129275d15ecSSam Clegg; CHECK-NEXT: call somefunc, $pop[[over]]
1306a87ddacSThomas Lively; CHECK:      local.get $push[[M12:.+]]=, [[SP]]
131275d15ecSSam Clegg; CHECK:      call somefunc, $pop[[M12]]
1326a87ddacSThomas Lively; CHECK:      local.get $push[[M13:.+]]=, [[FP_2]]
133*b9a539c0SWouter van Oortmerssen; CHECK:      i[[PTR]].add $push[[static:.+]]=, $pop[[M13]], $pop{{.+}}
134275d15ecSSam Clegg; CHECK-NEXT: call somefunc, $pop[[static]]
1350d41b7b3SDerek Schuff
1366a87ddacSThomas Lively; CHECK:      local.get  $push[[M14:.+]]=, [[BP]]{{$}}
137275d15ecSSam Clegg; CHECK-NEXT: global.set __stack_pointer, $pop[[M14]]
1380d41b7b3SDerek Schuffdefine void @overalign_static_and_dynamic(i32 %num) {
1390d41b7b3SDerek Schuffentry:
1400d41b7b3SDerek Schuff  %over = alloca i32, align 32
1410d41b7b3SDerek Schuff  %dynamic = alloca i32, i32 %num
1420d41b7b3SDerek Schuff  %static = alloca i32
1430d41b7b3SDerek Schuff  call void @somefunc(i32* %over)
1440d41b7b3SDerek Schuff  call void @somefunc(i32* %dynamic)
1450d41b7b3SDerek Schuff  call void @somefunc(i32* %static)
1460d41b7b3SDerek Schuff  ret void
1470d41b7b3SDerek Schuff}
148