Skip to content

Commit 06f659c

Browse files
authored
I64ToI32Lowering: don't use alignment 1 everywhere (#2070)
If an i64 load/store that is being broken up has higher alignment, use that.
1 parent fa4e1e5 commit 06f659c

6 files changed

Lines changed: 298 additions & 10 deletions

File tree

src/passes/I64ToI32Lowering.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> {
366366
builder->makeLoad(4,
367367
curr->signed_,
368368
curr->offset + 4,
369-
1,
369+
std::min(uint32_t(curr->align), uint32_t(4)),
370370
builder->makeGetLocal(ptrTemp, i32),
371371
i32));
372372
} else if (curr->signed_) {
@@ -409,7 +409,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> {
409409
Store* storeHigh =
410410
builder->makeStore(4,
411411
curr->offset + 4,
412-
1,
412+
std::min(uint32_t(curr->align), uint32_t(4)),
413413
builder->makeGetLocal(ptrTemp, i32),
414414
builder->makeGetLocal(highBits, i32),
415415
i32);

test/passes/flatten_i64-to-i32-lowering.txt

Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
(module
22
(type $FUNCSIG$j (func (result i32)))
3+
(type $1 (func))
34
(import "env" "func" (func $import (result i32)))
5+
(memory $0 1 1)
46
(global $i64toi32_i32$HIGH_BITS (mut i32) (i32.const 0))
57
(func $defined (; 1 ;) (type $FUNCSIG$j) (result i32)
68
(local $0 i32)
@@ -141,6 +143,279 @@
141143
)
142144
(unreachable)
143145
)
146+
(func $mem (; 5 ;) (type $1)
147+
(local $0 i32)
148+
(local $0$hi i32)
149+
(local $1 i32)
150+
(local $1$hi i32)
151+
(local $2 i32)
152+
(local $2$hi i32)
153+
(local $3 i32)
154+
(local $3$hi i32)
155+
(local $4 i32)
156+
(local $4$hi i32)
157+
(local $i64toi32_i32$0 i32)
158+
(local $i64toi32_i32$1 i32)
159+
(local $i64toi32_i32$2 i32)
160+
(block
161+
(block
162+
(local.set $0
163+
(block (result i32)
164+
(local.set $i64toi32_i32$2
165+
(i32.const 0)
166+
)
167+
(local.set $i64toi32_i32$0
168+
(i32.load
169+
(local.get $i64toi32_i32$2)
170+
)
171+
)
172+
(local.set $i64toi32_i32$1
173+
(i32.load offset=4
174+
(local.get $i64toi32_i32$2)
175+
)
176+
)
177+
(local.get $i64toi32_i32$0)
178+
)
179+
)
180+
(local.set $0$hi
181+
(local.get $i64toi32_i32$1)
182+
)
183+
)
184+
(drop
185+
(block (result i32)
186+
(local.set $i64toi32_i32$1
187+
(local.get $0$hi)
188+
)
189+
(local.get $0)
190+
)
191+
)
192+
(nop)
193+
(block
194+
(local.set $1
195+
(block (result i32)
196+
(local.set $i64toi32_i32$2
197+
(i32.const 0)
198+
)
199+
(local.set $i64toi32_i32$1
200+
(i32.load
201+
(local.get $i64toi32_i32$2)
202+
)
203+
)
204+
(local.set $i64toi32_i32$0
205+
(i32.load offset=4
206+
(local.get $i64toi32_i32$2)
207+
)
208+
)
209+
(local.get $i64toi32_i32$1)
210+
)
211+
)
212+
(local.set $1$hi
213+
(local.get $i64toi32_i32$0)
214+
)
215+
)
216+
(drop
217+
(block (result i32)
218+
(local.set $i64toi32_i32$0
219+
(local.get $1$hi)
220+
)
221+
(local.get $1)
222+
)
223+
)
224+
(nop)
225+
(block
226+
(local.set $2
227+
(block (result i32)
228+
(local.set $i64toi32_i32$2
229+
(i32.const 0)
230+
)
231+
(local.set $i64toi32_i32$0
232+
(i32.load align=2
233+
(local.get $i64toi32_i32$2)
234+
)
235+
)
236+
(local.set $i64toi32_i32$1
237+
(i32.load offset=4 align=2
238+
(local.get $i64toi32_i32$2)
239+
)
240+
)
241+
(local.get $i64toi32_i32$0)
242+
)
243+
)
244+
(local.set $2$hi
245+
(local.get $i64toi32_i32$1)
246+
)
247+
)
248+
(drop
249+
(block (result i32)
250+
(local.set $i64toi32_i32$1
251+
(local.get $2$hi)
252+
)
253+
(local.get $2)
254+
)
255+
)
256+
(nop)
257+
(block
258+
(local.set $3
259+
(block (result i32)
260+
(local.set $i64toi32_i32$2
261+
(i32.const 0)
262+
)
263+
(local.set $i64toi32_i32$1
264+
(i32.load align=1
265+
(local.get $i64toi32_i32$2)
266+
)
267+
)
268+
(local.set $i64toi32_i32$0
269+
(i32.load offset=4 align=1
270+
(local.get $i64toi32_i32$2)
271+
)
272+
)
273+
(local.get $i64toi32_i32$1)
274+
)
275+
)
276+
(local.set $3$hi
277+
(local.get $i64toi32_i32$0)
278+
)
279+
)
280+
(drop
281+
(block (result i32)
282+
(local.set $i64toi32_i32$0
283+
(local.get $3$hi)
284+
)
285+
(local.get $3)
286+
)
287+
)
288+
(nop)
289+
(block
290+
(local.set $4
291+
(block (result i32)
292+
(local.set $i64toi32_i32$2
293+
(i32.const 0)
294+
)
295+
(local.set $i64toi32_i32$0
296+
(i32.load
297+
(local.get $i64toi32_i32$2)
298+
)
299+
)
300+
(local.set $i64toi32_i32$1
301+
(i32.load offset=4
302+
(local.get $i64toi32_i32$2)
303+
)
304+
)
305+
(local.get $i64toi32_i32$0)
306+
)
307+
)
308+
(local.set $4$hi
309+
(local.get $i64toi32_i32$1)
310+
)
311+
)
312+
(drop
313+
(block (result i32)
314+
(local.set $i64toi32_i32$1
315+
(local.get $4$hi)
316+
)
317+
(local.get $4)
318+
)
319+
)
320+
(nop)
321+
(block
322+
(local.set $i64toi32_i32$0
323+
(i32.const 0)
324+
)
325+
(i32.store
326+
(local.get $i64toi32_i32$0)
327+
(block (result i32)
328+
(local.set $i64toi32_i32$1
329+
(i32.const 0)
330+
)
331+
(i32.const 1)
332+
)
333+
)
334+
(i32.store offset=4
335+
(local.get $i64toi32_i32$0)
336+
(local.get $i64toi32_i32$1)
337+
)
338+
)
339+
(nop)
340+
(block
341+
(local.set $i64toi32_i32$0
342+
(i32.const 0)
343+
)
344+
(i32.store
345+
(local.get $i64toi32_i32$0)
346+
(block (result i32)
347+
(local.set $i64toi32_i32$1
348+
(i32.const 0)
349+
)
350+
(i32.const 2)
351+
)
352+
)
353+
(i32.store offset=4
354+
(local.get $i64toi32_i32$0)
355+
(local.get $i64toi32_i32$1)
356+
)
357+
)
358+
(nop)
359+
(block
360+
(local.set $i64toi32_i32$0
361+
(i32.const 0)
362+
)
363+
(i32.store align=2
364+
(local.get $i64toi32_i32$0)
365+
(block (result i32)
366+
(local.set $i64toi32_i32$1
367+
(i32.const 0)
368+
)
369+
(i32.const 3)
370+
)
371+
)
372+
(i32.store offset=4 align=2
373+
(local.get $i64toi32_i32$0)
374+
(local.get $i64toi32_i32$1)
375+
)
376+
)
377+
(nop)
378+
(block
379+
(local.set $i64toi32_i32$0
380+
(i32.const 0)
381+
)
382+
(i32.store align=1
383+
(local.get $i64toi32_i32$0)
384+
(block (result i32)
385+
(local.set $i64toi32_i32$1
386+
(i32.const 0)
387+
)
388+
(i32.const 4)
389+
)
390+
)
391+
(i32.store offset=4 align=1
392+
(local.get $i64toi32_i32$0)
393+
(local.get $i64toi32_i32$1)
394+
)
395+
)
396+
(nop)
397+
(block
398+
(local.set $i64toi32_i32$0
399+
(i32.const 0)
400+
)
401+
(i32.store
402+
(local.get $i64toi32_i32$0)
403+
(block (result i32)
404+
(local.set $i64toi32_i32$1
405+
(i32.const 0)
406+
)
407+
(i32.const 5)
408+
)
409+
)
410+
(i32.store offset=4
411+
(local.get $i64toi32_i32$0)
412+
(local.get $i64toi32_i32$1)
413+
)
414+
)
415+
(nop)
416+
)
417+
(nop)
418+
)
144419
)
145420
(module
146421
(type $0 (func (param i32 i32)))

test/passes/flatten_i64-to-i32-lowering.wast

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
(module
2+
(memory 1 1)
23
(import "env" "func" (func $import (result i64)))
34
(func $defined (result i64)
45
(i64.add (i64.const 1) (i64.const 2))
@@ -24,6 +25,18 @@
2425
(unreachable)
2526
)
2627
)
28+
(func $mem
29+
(drop (i64.load align=8 (i32.const 0)))
30+
(drop (i64.load align=4 (i32.const 0)))
31+
(drop (i64.load align=2 (i32.const 0)))
32+
(drop (i64.load align=1 (i32.const 0)))
33+
(drop (i64.load (i32.const 0)))
34+
(i64.store align=8 (i32.const 0) (i64.const 1))
35+
(i64.store align=4 (i32.const 0) (i64.const 2))
36+
(i64.store align=2 (i32.const 0) (i64.const 3))
37+
(i64.store align=1 (i32.const 0) (i64.const 4))
38+
(i64.store (i32.const 0) (i64.const 5))
39+
)
2740
)
2841
(module
2942
(global $f (mut i64) (i64.const 0x12345678ABCDEFAF))

test/wasm2js/endianness.2asm.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,12 @@ function asmFunc(global, env, buffer) {
196196
function $13(value, value$hi) {
197197
value = value | 0;
198198
value$hi = value$hi | 0;
199-
var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0;
199+
var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$1 = 0;
200200
i64toi32_i32$0 = value$hi;
201201
i64_store_little(0, value, i64toi32_i32$0);
202202
i64toi32_i32$2 = 0;
203203
i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2];
204-
i64toi32_i32$1 = (wasm2js_i32$0 = i64toi32_i32$2, HEAPU8[wasm2js_i32$0 + 4 | 0] | HEAPU8[wasm2js_i32$0 + 5 | 0] << 8 | HEAPU8[wasm2js_i32$0 + 6 | 0] << 16 | HEAPU8[wasm2js_i32$0 + 7 | 0] << 24);
204+
i64toi32_i32$1 = HEAP32[i64toi32_i32$2 + 4 >> 2];
205205
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
206206
return i64toi32_i32$0 | 0;
207207
}
@@ -260,11 +260,11 @@ function asmFunc(global, env, buffer) {
260260
function $20(value, value$hi) {
261261
value = value | 0;
262262
value$hi = value$hi | 0;
263-
var i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0;
263+
var i64toi32_i32$1 = 0, i64toi32_i32$0 = 0;
264264
i64toi32_i32$0 = value$hi;
265265
i64toi32_i32$1 = 0;
266266
HEAP32[i64toi32_i32$1 >> 2] = value;
267-
(wasm2js_i32$0 = i64toi32_i32$1, wasm2js_i32$1 = i64toi32_i32$0), ((HEAP8[wasm2js_i32$0 + 4 | 0] = wasm2js_i32$1 & 255, HEAP8[wasm2js_i32$0 + 5 | 0] = wasm2js_i32$1 >>> 8 & 255), HEAP8[wasm2js_i32$0 + 6 | 0] = wasm2js_i32$1 >>> 16 & 255), HEAP8[wasm2js_i32$0 + 7 | 0] = wasm2js_i32$1 >>> 24 & 255;
267+
HEAP32[i64toi32_i32$1 + 4 >> 2] = i64toi32_i32$0;
268268
i64toi32_i32$0 = i64_load_little(0);
269269
i64toi32_i32$1 = i64toi32_i32$HIGH_BITS;
270270
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;

test/wasm2js/left-to-right.2asm.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -942,15 +942,15 @@ function asmFunc(global, env, buffer) {
942942
}
943943

944944
function $87() {
945-
var i64toi32_i32$0 = 0, $0 = 0, i64toi32_i32$1 = 0, $1 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0;
945+
var i64toi32_i32$0 = 0, $0 = 0, i64toi32_i32$1 = 0, $1 = 0;
946946
reset();
947947
$0 = i32_left();
948948
i64toi32_i32$0 = i64_right();
949949
i64toi32_i32$1 = i64toi32_i32$HIGH_BITS;
950950
$1 = i64toi32_i32$0;
951951
i64toi32_i32$0 = $0;
952952
HEAP32[i64toi32_i32$0 >> 2] = $1;
953-
(wasm2js_i32$0 = i64toi32_i32$0, wasm2js_i32$1 = i64toi32_i32$1), ((HEAP8[wasm2js_i32$0 + 4 | 0] = wasm2js_i32$1 & 255, HEAP8[wasm2js_i32$0 + 5 | 0] = wasm2js_i32$1 >>> 8 & 255), HEAP8[wasm2js_i32$0 + 6 | 0] = wasm2js_i32$1 >>> 16 & 255), HEAP8[wasm2js_i32$0 + 7 | 0] = wasm2js_i32$1 >>> 24 & 255;
953+
HEAP32[i64toi32_i32$0 + 4 >> 2] = i64toi32_i32$1;
954954
return get() | 0;
955955
}
956956

test/wasm2js/traps.2asm.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,10 +2077,10 @@ function asmFunc(global, env, buffer) {
20772077

20782078
function $1(i) {
20792079
i = i | 0;
2080-
var i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, wasm2js_i32$0 = 0;
2080+
var i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0;
20812081
i64toi32_i32$2 = i;
20822082
i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2];
2083-
i64toi32_i32$1 = (wasm2js_i32$0 = i64toi32_i32$2, HEAPU8[wasm2js_i32$0 + 4 | 0] | HEAPU8[wasm2js_i32$0 + 5 | 0] << 8 | HEAPU8[wasm2js_i32$0 + 6 | 0] << 16 | HEAPU8[wasm2js_i32$0 + 7 | 0] << 24);
2083+
i64toi32_i32$1 = HEAP32[i64toi32_i32$2 + 4 >> 2];
20842084
i64toi32_i32$HIGH_BITS = i64toi32_i32$1;
20852085
return i64toi32_i32$0 | 0;
20862086
}

0 commit comments

Comments
 (0)