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