Skip to content

Commit c5ab70c

Browse files
authored
[WebAssembly] Add -i128:128 to the datalayout string. (#119204)
Clang [defaults to aligning `__int128_t` to 16 bytes], while LLVM `datalayout` strings [default to aligning `i128` to 8 bytes]. Wasm is currently using the defaults for both, so it's inconsistent. Fix this by adding `-i128:128` to Wasm's `datalayout` string so that it aligns `i128` to 16 bytes too. This is similar to [dbad963](dbad963) for SPARC. This fixes rust-lang/rust#133991; see that issue for further discussion. [defaults to aligning `__int128_t` to 16 bytes]: https://github.com/llvm/llvm-project/blob/f8b4182f076f8fe55f9d5f617b5a25008a77b22f/clang/lib/Basic/TargetInfo.cpp#L77 [default to aligning `i128` to 8 bytes]: https://llvm.org/docs/LangRef.html#langref-datalayout
1 parent c7634c1 commit c5ab70c

File tree

7 files changed

+148
-125
lines changed

7 files changed

+148
-125
lines changed

Diff for: clang/lib/Basic/Targets/WebAssembly.h

+10-8
Original file line numberDiff line numberDiff line change
@@ -183,11 +183,12 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo
183183
const TargetOptions &Opts)
184184
: WebAssemblyTargetInfo(T, Opts) {
185185
if (T.isOSEmscripten())
186-
resetDataLayout("e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-f128:64-n32:64-"
187-
"S128-ni:1:10:20");
188-
else
189186
resetDataLayout(
190-
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20");
187+
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-f128:64-n32:64-"
188+
"S128-ni:1:10:20");
189+
else
190+
resetDataLayout("e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-"
191+
"S128-ni:1:10:20");
191192
}
192193

193194
protected:
@@ -207,11 +208,12 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly64TargetInfo
207208
PtrDiffType = SignedLong;
208209
IntPtrType = SignedLong;
209210
if (T.isOSEmscripten())
210-
resetDataLayout("e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-f128:64-n32:64-"
211-
"S128-ni:1:10:20");
212-
else
213211
resetDataLayout(
214-
"e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20");
212+
"e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-f128:64-n32:64-"
213+
"S128-ni:1:10:20");
214+
else
215+
resetDataLayout("e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-"
216+
"S128-ni:1:10:20");
215217
}
216218

217219
protected:

Diff for: clang/test/CodeGen/target-data.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,11 @@
108108

109109
// RUN: %clang_cc1 -triple wasm32-unknown-unknown -o - -emit-llvm %s | \
110110
// RUN: FileCheck %s -check-prefix=WEBASSEMBLY32
111-
// WEBASSEMBLY32: target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
111+
// WEBASSEMBLY32: target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20"
112112

113113
// RUN: %clang_cc1 -triple wasm64-unknown-unknown -o - -emit-llvm %s | \
114114
// RUN: FileCheck %s -check-prefix=WEBASSEMBLY64
115-
// WEBASSEMBLY64: target datalayout = "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
115+
// WEBASSEMBLY64: target datalayout = "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20"
116116

117117
// RUN: %clang_cc1 -triple lanai-unknown-unknown -o - -emit-llvm %s | \
118118
// RUN: FileCheck %s -check-prefix=LANAI

Diff for: llvm/lib/IR/AutoUpgrade.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -5559,7 +5559,8 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
55595559
return Res;
55605560
}
55615561

5562-
if (T.isSPARC() || (T.isMIPS64() && !DL.contains("m:m")) || T.isPPC64()) {
5562+
if (T.isSPARC() || (T.isMIPS64() && !DL.contains("m:m")) || T.isPPC64() ||
5563+
T.isWasm()) {
55635564
// Mips64 with o32 ABI did not add "-i128:128".
55645565
// Add "-i128:128"
55655566
std::string I64 = "-i64:64";

Diff for: llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,13 @@ WebAssemblyTargetMachine::WebAssemblyTargetMachine(
118118
T,
119119
TT.isArch64Bit()
120120
? (TT.isOSEmscripten() ? "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-"
121-
"f128:64-n32:64-S128-ni:1:10:20"
121+
"i128:128-f128:64-n32:64-S128-ni:1:10:20"
122122
: "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-"
123-
"n32:64-S128-ni:1:10:20")
123+
"i128:128-n32:64-S128-ni:1:10:20")
124124
: (TT.isOSEmscripten() ? "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-"
125-
"f128:64-n32:64-S128-ni:1:10:20"
125+
"i128:128-f128:64-n32:64-S128-ni:1:10:20"
126126
: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-"
127-
"n32:64-S128-ni:1:10:20"),
127+
"i128:128-n32:64-S128-ni:1:10:20"),
128128
TT, CPU, FS, Options, getEffectiveRelocModel(RM, TT),
129129
getEffectiveCodeModel(CM, CodeModel::Large), OL),
130130
TLOF(new WebAssemblyTargetObjectFile()),

Diff for: llvm/test/CodeGen/WebAssembly/data-align.ll

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
; RUN: llc < %s -march=wasm32 | FileCheck %s
2+
; RUN: llc < %s -march=wasm64 | FileCheck %s
3+
4+
; CHECK: .Li8:
5+
; CHECK-DAG: .size .Li8, 1
6+
@i8 = private constant i8 42
7+
8+
; CHECK: .p2align 1
9+
; CHECK-NEXT: .Li16:
10+
; CHECK-DAG: .size .Li16, 2
11+
@i16 = private constant i16 42
12+
13+
; CHECK: .p2align 2
14+
; CHECK-NEXT: .Li32:
15+
; CHECK-DAG: .size .Li32, 4
16+
@i32 = private constant i32 42
17+
18+
; CHECK: .p2align 3
19+
; CHECK-NEXT: .Li64:
20+
; CHECK-DAG: .size .Li64, 8
21+
@i64 = private constant i64 42
22+
23+
; CHECK: .p2align 4
24+
; CHECK-NEXT: .Li128:
25+
; CHECK-DAG: .size .Li128, 16
26+
@i128 = private constant i128 42

Diff for: llvm/test/CodeGen/WebAssembly/multi-return.ll

+92-110
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,16 @@ define i64 @test0() {
1313
; CHECK: .functype test0 () -> (i64)
1414
; CHECK-NEXT: # %bb.0:
1515
; CHECK-NEXT: global.get $push0=, __stack_pointer
16-
; CHECK-NEXT: i32.const $push1=, 80
17-
; CHECK-NEXT: i32.sub $push7=, $pop0, $pop1
18-
; CHECK-NEXT: local.tee $push6=, $1=, $pop7
19-
; CHECK-NEXT: global.set __stack_pointer, $pop6
20-
; CHECK-NEXT: i32.const $push4=, 8
21-
; CHECK-NEXT: i32.add $push5=, $1, $pop4
22-
; CHECK-NEXT: call return_multi_multi, $pop5
23-
; CHECK-NEXT: i64.load $0=, 8($1)
24-
; CHECK-NEXT: i32.const $push2=, 80
16+
; CHECK-NEXT: i32.const $push1=, 96
17+
; CHECK-NEXT: i32.sub $push5=, $pop0, $pop1
18+
; CHECK-NEXT: local.tee $push4=, $1=, $pop5
19+
; CHECK-NEXT: global.set __stack_pointer, $pop4
20+
; CHECK-NEXT: call return_multi_multi, $1
21+
; CHECK-NEXT: i64.load $0=, 0($1)
22+
; CHECK-NEXT: i32.const $push2=, 96
2523
; CHECK-NEXT: i32.add $push3=, $1, $pop2
2624
; CHECK-NEXT: global.set __stack_pointer, $pop3
27-
; CHECK-NEXT: local.copy $push8=, $0
25+
; CHECK-NEXT: local.copy $push6=, $0
2826
; CHECK-NEXT: # fallthrough-return
2927
%t0 = call { i64, i128, i192, i128, i64 } @return_multi_multi()
3028
%t1 = extractvalue { i64, i128, i192, i128, i64 } %t0, 0
@@ -36,18 +34,16 @@ define i128 @test1() {
3634
; CHECK: .functype test1 (i32) -> ()
3735
; CHECK-NEXT: # %bb.0:
3836
; CHECK-NEXT: global.get $push1=, __stack_pointer
39-
; CHECK-NEXT: i32.const $push2=, 80
40-
; CHECK-NEXT: i32.sub $push8=, $pop1, $pop2
41-
; CHECK-NEXT: local.tee $push7=, $2=, $pop8
42-
; CHECK-NEXT: global.set __stack_pointer, $pop7
43-
; CHECK-NEXT: i32.const $push5=, 8
44-
; CHECK-NEXT: i32.add $push6=, $2, $pop5
45-
; CHECK-NEXT: call return_multi_multi, $pop6
46-
; CHECK-NEXT: i64.load $1=, 16($2)
47-
; CHECK-NEXT: i64.load $push0=, 24($2)
48-
; CHECK-NEXT: i64.store 8($0), $pop0
49-
; CHECK-NEXT: i64.store 0($0), $1
50-
; CHECK-NEXT: i32.const $push3=, 80
37+
; CHECK-NEXT: i32.const $push2=, 96
38+
; CHECK-NEXT: i32.sub $push6=, $pop1, $pop2
39+
; CHECK-NEXT: local.tee $push5=, $2=, $pop6
40+
; CHECK-NEXT: global.set __stack_pointer, $pop5
41+
; CHECK-NEXT: call return_multi_multi, $2
42+
; CHECK-NEXT: i64.load $1=, 24($2)
43+
; CHECK-NEXT: i64.load $push0=, 16($2)
44+
; CHECK-NEXT: i64.store 0($0), $pop0
45+
; CHECK-NEXT: i64.store 8($0), $1
46+
; CHECK-NEXT: i32.const $push3=, 96
5147
; CHECK-NEXT: i32.add $push4=, $2, $pop3
5248
; CHECK-NEXT: global.set __stack_pointer, $pop4
5349
; CHECK-NEXT: # fallthrough-return
@@ -61,13 +57,11 @@ define i192 @test2() {
6157
; CHECK: .functype test2 (i32) -> ()
6258
; CHECK-NEXT: # %bb.0:
6359
; CHECK-NEXT: global.get $push3=, __stack_pointer
64-
; CHECK-NEXT: i32.const $push4=, 80
65-
; CHECK-NEXT: i32.sub $push10=, $pop3, $pop4
66-
; CHECK-NEXT: local.tee $push9=, $3=, $pop10
67-
; CHECK-NEXT: global.set __stack_pointer, $pop9
68-
; CHECK-NEXT: i32.const $push7=, 8
69-
; CHECK-NEXT: i32.add $push8=, $3, $pop7
70-
; CHECK-NEXT: call return_multi_multi, $pop8
60+
; CHECK-NEXT: i32.const $push4=, 96
61+
; CHECK-NEXT: i32.sub $push8=, $pop3, $pop4
62+
; CHECK-NEXT: local.tee $push7=, $3=, $pop8
63+
; CHECK-NEXT: global.set __stack_pointer, $pop7
64+
; CHECK-NEXT: call return_multi_multi, $3
7165
; CHECK-NEXT: i64.load $1=, 40($3)
7266
; CHECK-NEXT: i64.load $2=, 32($3)
7367
; CHECK-NEXT: i32.const $push0=, 48
@@ -76,7 +70,7 @@ define i192 @test2() {
7670
; CHECK-NEXT: i64.store 16($0), $pop2
7771
; CHECK-NEXT: i64.store 0($0), $2
7872
; CHECK-NEXT: i64.store 8($0), $1
79-
; CHECK-NEXT: i32.const $push5=, 80
73+
; CHECK-NEXT: i32.const $push5=, 96
8074
; CHECK-NEXT: i32.add $push6=, $3, $pop5
8175
; CHECK-NEXT: global.set __stack_pointer, $pop6
8276
; CHECK-NEXT: # fallthrough-return
@@ -90,18 +84,16 @@ define i128 @test3() {
9084
; CHECK: .functype test3 (i32) -> ()
9185
; CHECK-NEXT: # %bb.0:
9286
; CHECK-NEXT: global.get $push1=, __stack_pointer
93-
; CHECK-NEXT: i32.const $push2=, 80
94-
; CHECK-NEXT: i32.sub $push8=, $pop1, $pop2
95-
; CHECK-NEXT: local.tee $push7=, $2=, $pop8
96-
; CHECK-NEXT: global.set __stack_pointer, $pop7
97-
; CHECK-NEXT: i32.const $push5=, 8
98-
; CHECK-NEXT: i32.add $push6=, $2, $pop5
99-
; CHECK-NEXT: call return_multi_multi, $pop6
100-
; CHECK-NEXT: i64.load $1=, 56($2)
87+
; CHECK-NEXT: i32.const $push2=, 96
88+
; CHECK-NEXT: i32.sub $push6=, $pop1, $pop2
89+
; CHECK-NEXT: local.tee $push5=, $2=, $pop6
90+
; CHECK-NEXT: global.set __stack_pointer, $pop5
91+
; CHECK-NEXT: call return_multi_multi, $2
92+
; CHECK-NEXT: i64.load $1=, 72($2)
10193
; CHECK-NEXT: i64.load $push0=, 64($2)
102-
; CHECK-NEXT: i64.store 8($0), $pop0
103-
; CHECK-NEXT: i64.store 0($0), $1
104-
; CHECK-NEXT: i32.const $push3=, 80
94+
; CHECK-NEXT: i64.store 0($0), $pop0
95+
; CHECK-NEXT: i64.store 8($0), $1
96+
; CHECK-NEXT: i32.const $push3=, 96
10597
; CHECK-NEXT: i32.add $push4=, $2, $pop3
10698
; CHECK-NEXT: global.set __stack_pointer, $pop4
10799
; CHECK-NEXT: # fallthrough-return
@@ -115,18 +107,16 @@ define i64 @test4() {
115107
; CHECK: .functype test4 () -> (i64)
116108
; CHECK-NEXT: # %bb.0:
117109
; CHECK-NEXT: global.get $push0=, __stack_pointer
118-
; CHECK-NEXT: i32.const $push1=, 80
119-
; CHECK-NEXT: i32.sub $push7=, $pop0, $pop1
120-
; CHECK-NEXT: local.tee $push6=, $1=, $pop7
121-
; CHECK-NEXT: global.set __stack_pointer, $pop6
122-
; CHECK-NEXT: i32.const $push4=, 8
123-
; CHECK-NEXT: i32.add $push5=, $1, $pop4
124-
; CHECK-NEXT: call return_multi_multi, $pop5
125-
; CHECK-NEXT: i64.load $0=, 72($1)
126-
; CHECK-NEXT: i32.const $push2=, 80
110+
; CHECK-NEXT: i32.const $push1=, 96
111+
; CHECK-NEXT: i32.sub $push5=, $pop0, $pop1
112+
; CHECK-NEXT: local.tee $push4=, $1=, $pop5
113+
; CHECK-NEXT: global.set __stack_pointer, $pop4
114+
; CHECK-NEXT: call return_multi_multi, $1
115+
; CHECK-NEXT: i64.load $0=, 80($1)
116+
; CHECK-NEXT: i32.const $push2=, 96
127117
; CHECK-NEXT: i32.add $push3=, $1, $pop2
128118
; CHECK-NEXT: global.set __stack_pointer, $pop3
129-
; CHECK-NEXT: local.copy $push8=, $0
119+
; CHECK-NEXT: local.copy $push6=, $0
130120
; CHECK-NEXT: # fallthrough-return
131121
%t0 = call { i64, i128, i192, i128, i64 } @return_multi_multi()
132122
%t1 = extractvalue { i64, i128, i192, i128, i64 } %t0, 4
@@ -140,20 +130,18 @@ define { i64, i128 } @test5() {
140130
; CHECK: .functype test5 (i32) -> ()
141131
; CHECK-NEXT: # %bb.0:
142132
; CHECK-NEXT: global.get $push1=, __stack_pointer
143-
; CHECK-NEXT: i32.const $push2=, 80
144-
; CHECK-NEXT: i32.sub $push8=, $pop1, $pop2
145-
; CHECK-NEXT: local.tee $push7=, $3=, $pop8
146-
; CHECK-NEXT: global.set __stack_pointer, $pop7
147-
; CHECK-NEXT: i32.const $push5=, 8
148-
; CHECK-NEXT: i32.add $push6=, $3, $pop5
149-
; CHECK-NEXT: call return_multi_multi, $pop6
150-
; CHECK-NEXT: i64.load $1=, 8($3)
151-
; CHECK-NEXT: i64.load $2=, 24($3)
152-
; CHECK-NEXT: i64.load $push0=, 16($3)
153-
; CHECK-NEXT: i64.store 8($0), $pop0
133+
; CHECK-NEXT: i32.const $push2=, 96
134+
; CHECK-NEXT: i32.sub $push6=, $pop1, $pop2
135+
; CHECK-NEXT: local.tee $push5=, $3=, $pop6
136+
; CHECK-NEXT: global.set __stack_pointer, $pop5
137+
; CHECK-NEXT: call return_multi_multi, $3
138+
; CHECK-NEXT: i64.load $1=, 24($3)
139+
; CHECK-NEXT: i64.load $2=, 16($3)
140+
; CHECK-NEXT: i64.load $push0=, 0($3)
141+
; CHECK-NEXT: i64.store 0($0), $pop0
154142
; CHECK-NEXT: i64.store 16($0), $2
155-
; CHECK-NEXT: i64.store 0($0), $1
156-
; CHECK-NEXT: i32.const $push3=, 80
143+
; CHECK-NEXT: i64.store 24($0), $1
144+
; CHECK-NEXT: i32.const $push3=, 96
157145
; CHECK-NEXT: i32.add $push4=, $3, $pop3
158146
; CHECK-NEXT: global.set __stack_pointer, $pop4
159147
; CHECK-NEXT: # fallthrough-return
@@ -170,22 +158,20 @@ define { i128, i128 } @test6() {
170158
; CHECK: .functype test6 (i32) -> ()
171159
; CHECK-NEXT: # %bb.0:
172160
; CHECK-NEXT: global.get $push1=, __stack_pointer
173-
; CHECK-NEXT: i32.const $push2=, 80
174-
; CHECK-NEXT: i32.sub $push8=, $pop1, $pop2
175-
; CHECK-NEXT: local.tee $push7=, $4=, $pop8
176-
; CHECK-NEXT: global.set __stack_pointer, $pop7
177-
; CHECK-NEXT: i32.const $push5=, 8
178-
; CHECK-NEXT: i32.add $push6=, $4, $pop5
179-
; CHECK-NEXT: call return_multi_multi, $pop6
161+
; CHECK-NEXT: i32.const $push2=, 96
162+
; CHECK-NEXT: i32.sub $push6=, $pop1, $pop2
163+
; CHECK-NEXT: local.tee $push5=, $4=, $pop6
164+
; CHECK-NEXT: global.set __stack_pointer, $pop5
165+
; CHECK-NEXT: call return_multi_multi, $4
180166
; CHECK-NEXT: i64.load $1=, 24($4)
181167
; CHECK-NEXT: i64.load $2=, 16($4)
182-
; CHECK-NEXT: i64.load $3=, 64($4)
183-
; CHECK-NEXT: i64.load $push0=, 56($4)
168+
; CHECK-NEXT: i64.load $3=, 72($4)
169+
; CHECK-NEXT: i64.load $push0=, 64($4)
184170
; CHECK-NEXT: i64.store 16($0), $pop0
185171
; CHECK-NEXT: i64.store 24($0), $3
186172
; CHECK-NEXT: i64.store 0($0), $2
187173
; CHECK-NEXT: i64.store 8($0), $1
188-
; CHECK-NEXT: i32.const $push3=, 80
174+
; CHECK-NEXT: i32.const $push3=, 96
189175
; CHECK-NEXT: i32.add $push4=, $4, $pop3
190176
; CHECK-NEXT: global.set __stack_pointer, $pop4
191177
; CHECK-NEXT: # fallthrough-return
@@ -202,24 +188,22 @@ define { i64, i192 } @test7() {
202188
; CHECK: .functype test7 (i32) -> ()
203189
; CHECK-NEXT: # %bb.0:
204190
; CHECK-NEXT: global.get $push3=, __stack_pointer
205-
; CHECK-NEXT: i32.const $push4=, 80
206-
; CHECK-NEXT: i32.sub $push10=, $pop3, $pop4
207-
; CHECK-NEXT: local.tee $push9=, $4=, $pop10
208-
; CHECK-NEXT: global.set __stack_pointer, $pop9
209-
; CHECK-NEXT: i32.const $push7=, 8
210-
; CHECK-NEXT: i32.add $push8=, $4, $pop7
211-
; CHECK-NEXT: call return_multi_multi, $pop8
212-
; CHECK-NEXT: i64.load $1=, 8($4)
213-
; CHECK-NEXT: i64.load $2=, 40($4)
214-
; CHECK-NEXT: i64.load $3=, 32($4)
191+
; CHECK-NEXT: i32.const $push4=, 96
192+
; CHECK-NEXT: i32.sub $push8=, $pop3, $pop4
193+
; CHECK-NEXT: local.tee $push7=, $4=, $pop8
194+
; CHECK-NEXT: global.set __stack_pointer, $pop7
195+
; CHECK-NEXT: call return_multi_multi, $4
215196
; CHECK-NEXT: i32.const $push0=, 48
216197
; CHECK-NEXT: i32.add $push1=, $4, $pop0
217-
; CHECK-NEXT: i64.load $push2=, 0($pop1)
218-
; CHECK-NEXT: i64.store 24($0), $pop2
219-
; CHECK-NEXT: i64.store 8($0), $3
220-
; CHECK-NEXT: i64.store 16($0), $2
221-
; CHECK-NEXT: i64.store 0($0), $1
222-
; CHECK-NEXT: i32.const $push5=, 80
198+
; CHECK-NEXT: i64.load $1=, 0($pop1)
199+
; CHECK-NEXT: i64.load $2=, 40($4)
200+
; CHECK-NEXT: i64.load $3=, 32($4)
201+
; CHECK-NEXT: i64.load $push2=, 0($4)
202+
; CHECK-NEXT: i64.store 0($0), $pop2
203+
; CHECK-NEXT: i64.store 32($0), $1
204+
; CHECK-NEXT: i64.store 16($0), $3
205+
; CHECK-NEXT: i64.store 24($0), $2
206+
; CHECK-NEXT: i32.const $push5=, 96
223207
; CHECK-NEXT: i32.add $push6=, $4, $pop5
224208
; CHECK-NEXT: global.set __stack_pointer, $pop6
225209
; CHECK-NEXT: # fallthrough-return
@@ -236,32 +220,30 @@ define { i128, i192, i128, i64 } @test8() {
236220
; CHECK: .functype test8 (i32) -> ()
237221
; CHECK-NEXT: # %bb.0:
238222
; CHECK-NEXT: global.get $push3=, __stack_pointer
239-
; CHECK-NEXT: i32.const $push4=, 80
240-
; CHECK-NEXT: i32.sub $push10=, $pop3, $pop4
241-
; CHECK-NEXT: local.tee $push9=, $8=, $pop10
242-
; CHECK-NEXT: global.set __stack_pointer, $pop9
243-
; CHECK-NEXT: i32.const $push7=, 8
244-
; CHECK-NEXT: i32.add $push8=, $8, $pop7
245-
; CHECK-NEXT: call return_multi_multi, $pop8
223+
; CHECK-NEXT: i32.const $push4=, 96
224+
; CHECK-NEXT: i32.sub $push8=, $pop3, $pop4
225+
; CHECK-NEXT: local.tee $push7=, $8=, $pop8
226+
; CHECK-NEXT: global.set __stack_pointer, $pop7
227+
; CHECK-NEXT: call return_multi_multi, $8
246228
; CHECK-NEXT: i32.const $push0=, 48
247229
; CHECK-NEXT: i32.add $push1=, $8, $pop0
248230
; CHECK-NEXT: i64.load $1=, 0($pop1)
249-
; CHECK-NEXT: i64.load $2=, 8($8)
231+
; CHECK-NEXT: i64.load $2=, 72($8)
250232
; CHECK-NEXT: i64.load $3=, 64($8)
251-
; CHECK-NEXT: i64.load $4=, 56($8)
252-
; CHECK-NEXT: i64.load $5=, 40($8)
253-
; CHECK-NEXT: i64.load $6=, 32($8)
254-
; CHECK-NEXT: i64.load $7=, 24($8)
255-
; CHECK-NEXT: i64.load $push2=, 16($8)
256-
; CHECK-NEXT: i64.store 40($0), $pop2
233+
; CHECK-NEXT: i64.load $4=, 40($8)
234+
; CHECK-NEXT: i64.load $5=, 32($8)
235+
; CHECK-NEXT: i64.load $6=, 24($8)
236+
; CHECK-NEXT: i64.load $7=, 16($8)
237+
; CHECK-NEXT: i64.load $push2=, 0($8)
238+
; CHECK-NEXT: i64.store 64($0), $pop2
257239
; CHECK-NEXT: i64.store 48($0), $7
240+
; CHECK-NEXT: i64.store 56($0), $6
258241
; CHECK-NEXT: i64.store 32($0), $1
259-
; CHECK-NEXT: i64.store 16($0), $6
260-
; CHECK-NEXT: i64.store 24($0), $5
261-
; CHECK-NEXT: i64.store 0($0), $4
262-
; CHECK-NEXT: i64.store 8($0), $3
263-
; CHECK-NEXT: i64.store 56($0), $2
264-
; CHECK-NEXT: i32.const $push5=, 80
242+
; CHECK-NEXT: i64.store 16($0), $5
243+
; CHECK-NEXT: i64.store 24($0), $4
244+
; CHECK-NEXT: i64.store 0($0), $3
245+
; CHECK-NEXT: i64.store 8($0), $2
246+
; CHECK-NEXT: i32.const $push5=, 96
265247
; CHECK-NEXT: i32.add $push6=, $8, $pop5
266248
; CHECK-NEXT: global.set __stack_pointer, $pop6
267249
; CHECK-NEXT: # fallthrough-return

0 commit comments

Comments
 (0)