blob: 2a530bf17f6f97a3beb865c4e6cba6dd4075131d [file] [log] [blame]
Wouter van Oortmerssena7be3752018-08-13 23:12:49 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s
Derek Schuff0d41b7b2016-11-07 22:00:48 +00002
3target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
Sam Clegga5908002018-05-10 17:49:11 +00004target triple = "wasm32-unknown-unknown"
Derek Schuff0d41b7b2016-11-07 22:00:48 +00005
6declare void @somefunc(i32*)
7
8; CHECK-LABEL: underalign:
Nicholas Wilsone408a892018-08-03 14:33:37 +00009; CHECK: get_global $push[[L1:.+]]=, __stack_pointer@GLOBAL{{$}}
Derek Schuff0d41b7b2016-11-07 22:00:48 +000010; CHECK-NEXT: i32.const $push[[L2:.+]]=, 16
11; CHECK-NEXT: i32.sub $push[[L10:.+]]=, $pop[[L1]], $pop[[L2]]
Dan Gohman82607f52017-02-24 23:46:05 +000012; CHECK-NEXT: tee_local $push{{.+}}=, [[SP:.+]], $pop[[L10]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000013
Dan Gohman82607f52017-02-24 23:46:05 +000014; CHECK: get_local $push[[L3:.+]]=, [[SP]]{{$}}
15; CHECK: i32.add $push[[underaligned:.+]]=, $pop[[L3]], $pop{{.+}}
Derek Schuff0d41b7b2016-11-07 22:00:48 +000016; CHECK-NEXT: call somefunc@FUNCTION, $pop[[underaligned]]
17
Dan Gohman82607f52017-02-24 23:46:05 +000018; CHECK: get_local $push[[M4:.+]]=, [[SP]]{{$}}
19; CHECK: i32.add $push[[L5:.+]]=, $pop[[M4]], $pop{{.+}}
Nicholas Wilsone408a892018-08-03 14:33:37 +000020; CHECK-NEXT: set_global __stack_pointer@GLOBAL, $pop[[L5]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000021define void @underalign() {
22entry:
23 %underaligned = alloca i32, align 8
24 call void @somefunc(i32* %underaligned)
25 ret void
26}
27
28; CHECK-LABEL: overalign:
Nicholas Wilsone408a892018-08-03 14:33:37 +000029; CHECK: get_global $push[[L10:.+]]=, __stack_pointer@GLOBAL{{$}}
Dan Gohman82607f52017-02-24 23:46:05 +000030; CHECK-NEXT: tee_local $push[[L9:.+]]=, [[BP:.+]], $pop[[L10]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000031; CHECK-NEXT: i32.const $push[[L2:.+]]=, 32
32; CHECK-NEXT: i32.sub $push[[L8:.+]]=, $pop[[L9]], $pop[[L2]]
33; CHECK-NEXT: i32.const $push[[L3:.+]]=, -32
34; CHECK-NEXT: i32.and $push[[L7:.+]]=, $pop[[L8]], $pop[[L3]]
Dan Gohman82607f52017-02-24 23:46:05 +000035; CHECK-NEXT: tee_local $push{{.+}}=, [[SP:.+]], $pop[[L7]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000036
Dan Gohman82607f52017-02-24 23:46:05 +000037; CHECK: get_local $push[[M5:.+]]=, [[SP]]{{$}}
38; CHECK: call somefunc@FUNCTION, $pop[[M5]]{{$}}
Derek Schuff0d41b7b2016-11-07 22:00:48 +000039
Dan Gohman82607f52017-02-24 23:46:05 +000040; CHECK: get_local $push[[M6:.+]]=, [[BP]]{{$}}
Nicholas Wilsone408a892018-08-03 14:33:37 +000041; CHECK-NEXT: set_global __stack_pointer@GLOBAL, $pop[[M6]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000042define void @overalign() {
43entry:
44 %overaligned = alloca i32, align 32
45 call void @somefunc(i32* %overaligned)
46 ret void
47}
48
49; CHECK-LABEL: over_and_normal_align:
Nicholas Wilsone408a892018-08-03 14:33:37 +000050; CHECK: get_global $push[[L14:.+]]=, __stack_pointer@GLOBAL{{$}}
Dan Gohman82607f52017-02-24 23:46:05 +000051; CHECK-NEXT: tee_local $push[[L13:.+]]=, [[BP:.+]], $pop[[L14]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000052; CHECK: i32.sub $push[[L12:.+]]=, $pop[[L13]], $pop{{.+}}
53; CHECK: i32.and $push[[L11:.+]]=, $pop[[L12]], $pop{{.+}}
Dan Gohman82607f52017-02-24 23:46:05 +000054; CHECK-NEXT: tee_local $push{{.+}}=, [[SP:.+]], $pop[[L11]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000055
Dan Gohman82607f52017-02-24 23:46:05 +000056; CHECK: get_local $push[[M6:.+]]=, [[SP]]{{$}}
57; CHECK: i32.add $push[[L6:.+]]=, $pop[[M6]], $pop{{.+}}
Derek Schuff0d41b7b2016-11-07 22:00:48 +000058; CHECK-NEXT: call somefunc@FUNCTION, $pop[[L6]]
Dan Gohman82607f52017-02-24 23:46:05 +000059; CHECK: get_local $push[[M7:.+]]=, [[SP]]{{$}}
60; CHECK: i32.add $push[[L8:.+]]=, $pop[[M7]], $pop{{.+}}
Derek Schuff0d41b7b2016-11-07 22:00:48 +000061; CHECK-NEXT: call somefunc@FUNCTION, $pop[[L8]]
62
Dan Gohman82607f52017-02-24 23:46:05 +000063; CHECK: get_local $push[[L6:.+]]=, [[BP]]{{$}}
Nicholas Wilsone408a892018-08-03 14:33:37 +000064; CHECK-NEXT: set_global __stack_pointer@GLOBAL, $pop[[L6]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000065define void @over_and_normal_align() {
66entry:
67 %over = alloca i32, align 32
68 %normal = alloca i32
69 call void @somefunc(i32* %over)
70 call void @somefunc(i32* %normal)
71 ret void
72}
73
74; CHECK-LABEL: dynamic_overalign:
Nicholas Wilsone408a892018-08-03 14:33:37 +000075; CHECK: get_global $push[[L18:.+]]=, __stack_pointer@GLOBAL{{$}}
Dan Gohman82607f52017-02-24 23:46:05 +000076; CHECK-NEXT: tee_local $push[[L17:.+]]=, [[SP:.+]], $pop[[L18]]
77; CHECK-NEXT: set_local [[BP:.+]], $pop[[L17]]
78; CHECK: tee_local $push{{.+}}=, [[SP_2:.+]], $pop{{.+}}
Derek Schuff0d41b7b2016-11-07 22:00:48 +000079
Dan Gohman82607f52017-02-24 23:46:05 +000080; CHECK: get_local $push[[M8:.+]]=, [[SP_2]]{{$}}
81; CHECK: call somefunc@FUNCTION, $pop[[M8]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000082
Dan Gohman82607f52017-02-24 23:46:05 +000083; CHECK: get_local $push[[M9:.+]]=, [[BP]]{{$}}
Nicholas Wilsone408a892018-08-03 14:33:37 +000084; CHECK-NEXT: set_global __stack_pointer@GLOBAL, $pop[[M9]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000085define void @dynamic_overalign(i32 %num) {
86entry:
87 %dynamic = alloca i32, i32 %num, align 32
88 call void @somefunc(i32* %dynamic)
89 ret void
90}
91
92; CHECK-LABEL: overalign_and_dynamic:
Nicholas Wilsone408a892018-08-03 14:33:37 +000093; CHECK: get_global $push[[L21:.+]]=, __stack_pointer@GLOBAL{{$}}
Dan Gohman82607f52017-02-24 23:46:05 +000094; CHECK-NEXT: tee_local $push[[L20:.+]]=, [[BP:.+]], $pop[[L21]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +000095; CHECK: i32.sub $push[[L19:.+]]=, $pop[[L20]], $pop{{.+}}
96; CHECK: i32.and $push[[L18:.+]]=, $pop[[L19]], $pop{{.+}}
Dan Gohman82607f52017-02-24 23:46:05 +000097; CHECK: tee_local $push{{.+}}=, [[FP:.+]], $pop[[L18]]
98; CHECK: get_local $push[[M10:.+]]=, [[FP]]{{$}}
99; CHECK: i32.sub $push[[L16:.+]]=, $pop[[M10]], $pop{{.+}}
100; CHECK-NEXT: tee_local $push{{.+}}=, [[SP:.+]], $pop[[L16]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000101
Dan Gohman82607f52017-02-24 23:46:05 +0000102; CHECK: get_local $push[[over:.+]]=, [[FP]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000103; CHECK-NEXT: call somefunc@FUNCTION, $pop[[over]]
Dan Gohman82607f52017-02-24 23:46:05 +0000104; CHECK: get_local $push[[another:.+]]=, [[SP]]
105; CHECK-NEXT: call somefunc@FUNCTION, $pop[[another]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000106
Dan Gohman82607f52017-02-24 23:46:05 +0000107; CHECK: get_local $push[[M11:.+]]=, [[BP]]{{$}}
Nicholas Wilsone408a892018-08-03 14:33:37 +0000108; CHECK-NEXT: set_global __stack_pointer@GLOBAL, $pop[[M11]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000109define void @overalign_and_dynamic(i32 %num) {
110entry:
111 %over = alloca i32, align 32
112 %dynamic = alloca i32, i32 %num
113 call void @somefunc(i32* %over)
114 call void @somefunc(i32* %dynamic)
115 ret void
116}
117
118; CHECK-LABEL: overalign_static_and_dynamic:
Nicholas Wilsone408a892018-08-03 14:33:37 +0000119; CHECK: get_global $push[[L26:.+]]=, __stack_pointer@GLOBAL{{$}}
Dan Gohman82607f52017-02-24 23:46:05 +0000120; CHECK-NEXT: tee_local $push[[L25:.+]]=, [[BP:.+]], $pop[[L26]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000121; CHECK: i32.sub $push[[L24:.+]]=, $pop[[L25]], $pop{{.+}}
122; CHECK: i32.and $push[[L23:.+]]=, $pop[[L24]], $pop{{.+}}
Dan Gohman82607f52017-02-24 23:46:05 +0000123; CHECK: tee_local $push{{.+}}=, [[FP:.+]], $pop[[L23]]
124; CHECK: get_local $push[[M12:.+]]=, [[FP]]{{$}}
125; CHECK: i32.sub $push[[L21:.+]]=, $pop[[M12]], $pop{{.+}}
126; CHECK-NEXT: tee_local $push{{.+}}=, [[SP:.+]], $pop[[L21]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000127
Dan Gohman82607f52017-02-24 23:46:05 +0000128; CHECK: get_local $push[[L19:.+]]=, [[FP]]
129; CHECK: tee_local $push[[L18:.+]]=, [[FP_2:.+]], $pop[[L19]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000130; CHECK: i32.add $push[[over:.+]]=, $pop[[L18]], $pop{{.+}}
131; CHECK-NEXT: call somefunc@FUNCTION, $pop[[over]]
Dan Gohman82607f52017-02-24 23:46:05 +0000132; CHECK: get_local $push[[M12:.+]]=, [[SP]]
133; CHECK: call somefunc@FUNCTION, $pop[[M12]]
134; CHECK: get_local $push[[M13:.+]]=, [[FP_2]]
135; CHECK: i32.add $push[[static:.+]]=, $pop[[M13]], $pop{{.+}}
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000136; CHECK-NEXT: call somefunc@FUNCTION, $pop[[static]]
137
Dan Gohman82607f52017-02-24 23:46:05 +0000138; CHECK: get_local $push[[M14:.+]]=, [[BP]]{{$}}
Nicholas Wilsone408a892018-08-03 14:33:37 +0000139; CHECK-NEXT: set_global __stack_pointer@GLOBAL, $pop[[M14]]
Derek Schuff0d41b7b2016-11-07 22:00:48 +0000140define void @overalign_static_and_dynamic(i32 %num) {
141entry:
142 %over = alloca i32, align 32
143 %dynamic = alloca i32, i32 %num
144 %static = alloca i32
145 call void @somefunc(i32* %over)
146 call void @somefunc(i32* %dynamic)
147 call void @somefunc(i32* %static)
148 ret void
149}