Skip to content

Commit 5cf3521

Browse files
authored
[OptimizeInstructions] Optimize zero sized bulk memory ops even without "ignoreImplicitTraps" (#4295)
1 parent 29604f1 commit 5cf3521

File tree

2 files changed

+79
-29
lines changed

2 files changed

+79
-29
lines changed

src/passes/OptimizeInstructions.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3406,6 +3406,16 @@ struct OptimizeInstructions
34063406
// memory.copy(dst, src, 0) ==> {drop(dst), drop(src)}
34073407
return builder.makeBlock({builder.makeDrop(memCopy->dest),
34083408
builder.makeDrop(memCopy->source)});
3409+
} else {
3410+
// memory.copy(dst, src, 0) ==> {
3411+
// drop(i32.load8_u(dst)),
3412+
// drop(i32.load8_u(src))
3413+
// }
3414+
return builder.makeBlock(
3415+
{builder.makeDrop(
3416+
builder.makeLoad(1, false, 0, 1, memCopy->dest, Type::i32)),
3417+
builder.makeDrop(builder.makeLoad(
3418+
1, false, 0, 1, memCopy->source, Type::i32))});
34093419
}
34103420
break;
34113421
}
@@ -3468,11 +3478,17 @@ struct OptimizeInstructions
34683478
auto* csize = memFill->size->cast<Const>();
34693479
auto bytes = csize->value.getInteger();
34703480

3471-
if (bytes == 0LL &&
3472-
(options.ignoreImplicitTraps || options.trapsNeverHappen)) {
3473-
// memory.fill(d, v, 0) ==> { drop(d), drop(v) }
3474-
return builder.makeBlock(
3475-
{builder.makeDrop(memFill->dest), builder.makeDrop(memFill->value)});
3481+
if (bytes == 0LL) {
3482+
if (options.ignoreImplicitTraps || options.trapsNeverHappen) {
3483+
// memory.fill(d, v, 0) ==> { drop(d), drop(v) }
3484+
return builder.makeBlock(
3485+
{builder.makeDrop(memFill->dest), builder.makeDrop(memFill->value)});
3486+
} else {
3487+
// memory.fill(d, v, 0) ==> { drop(i32.load8_u(d)), drop(v) }
3488+
return builder.makeBlock({builder.makeDrop(builder.makeLoad(
3489+
1, false, 0, 1, memFill->dest, Type::i32)),
3490+
builder.makeDrop(memFill->value)});
3491+
}
34763492
}
34773493

34783494
const uint32_t offset = 0, align = 1;

test/lit/passes/optimize-instructions-bulk-memory.wast

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,17 @@
1010
;; CHECK-NEXT: (local.get $dst)
1111
;; CHECK-NEXT: (local.get $sz)
1212
;; CHECK-NEXT: )
13-
;; CHECK-NEXT: (memory.copy
14-
;; CHECK-NEXT: (local.get $dst)
15-
;; CHECK-NEXT: (local.get $src)
16-
;; CHECK-NEXT: (i32.const 0)
13+
;; CHECK-NEXT: (block
14+
;; CHECK-NEXT: (drop
15+
;; CHECK-NEXT: (i32.load8_u
16+
;; CHECK-NEXT: (local.get $dst)
17+
;; CHECK-NEXT: )
18+
;; CHECK-NEXT: )
19+
;; CHECK-NEXT: (drop
20+
;; CHECK-NEXT: (i32.load8_u
21+
;; CHECK-NEXT: (local.get $src)
22+
;; CHECK-NEXT: )
23+
;; CHECK-NEXT: )
1724
;; CHECK-NEXT: )
1825
;; CHECK-NEXT: (i32.store8
1926
;; CHECK-NEXT: (local.get $dst)
@@ -84,10 +91,17 @@
8491
;; NOSIMD-NEXT: (local.get $dst)
8592
;; NOSIMD-NEXT: (local.get $sz)
8693
;; NOSIMD-NEXT: )
87-
;; NOSIMD-NEXT: (memory.copy
88-
;; NOSIMD-NEXT: (local.get $dst)
89-
;; NOSIMD-NEXT: (local.get $src)
90-
;; NOSIMD-NEXT: (i32.const 0)
94+
;; NOSIMD-NEXT: (block
95+
;; NOSIMD-NEXT: (drop
96+
;; NOSIMD-NEXT: (i32.load8_u
97+
;; NOSIMD-NEXT: (local.get $dst)
98+
;; NOSIMD-NEXT: )
99+
;; NOSIMD-NEXT: )
100+
;; NOSIMD-NEXT: (drop
101+
;; NOSIMD-NEXT: (i32.load8_u
102+
;; NOSIMD-NEXT: (local.get $src)
103+
;; NOSIMD-NEXT: )
104+
;; NOSIMD-NEXT: )
91105
;; NOSIMD-NEXT: )
92106
;; NOSIMD-NEXT: (i32.store8
93107
;; NOSIMD-NEXT: (local.get $dst)
@@ -234,10 +248,15 @@
234248
)
235249

236250
;; CHECK: (func $optimize-bulk-memory-fill (param $dst i32) (param $val i32) (param $sz i32)
237-
;; CHECK-NEXT: (memory.fill
238-
;; CHECK-NEXT: (local.get $dst)
239-
;; CHECK-NEXT: (i32.const 0)
240-
;; CHECK-NEXT: (i32.const 0)
251+
;; CHECK-NEXT: (block
252+
;; CHECK-NEXT: (drop
253+
;; CHECK-NEXT: (i32.load8_u
254+
;; CHECK-NEXT: (local.get $dst)
255+
;; CHECK-NEXT: )
256+
;; CHECK-NEXT: )
257+
;; CHECK-NEXT: (drop
258+
;; CHECK-NEXT: (i32.const 0)
259+
;; CHECK-NEXT: )
241260
;; CHECK-NEXT: )
242261
;; CHECK-NEXT: (i32.store8
243262
;; CHECK-NEXT: (local.get $dst)
@@ -295,10 +314,15 @@
295314
;; CHECK-NEXT: (local.get $dst)
296315
;; CHECK-NEXT: (v128.const i32x4 0xffffffff 0xffffffff 0xffffffff 0xffffffff)
297316
;; CHECK-NEXT: )
298-
;; CHECK-NEXT: (memory.fill
299-
;; CHECK-NEXT: (local.get $dst)
300-
;; CHECK-NEXT: (local.get $val)
301-
;; CHECK-NEXT: (i32.const 0)
317+
;; CHECK-NEXT: (block
318+
;; CHECK-NEXT: (drop
319+
;; CHECK-NEXT: (i32.load8_u
320+
;; CHECK-NEXT: (local.get $dst)
321+
;; CHECK-NEXT: )
322+
;; CHECK-NEXT: )
323+
;; CHECK-NEXT: (drop
324+
;; CHECK-NEXT: (local.get $val)
325+
;; CHECK-NEXT: )
302326
;; CHECK-NEXT: )
303327
;; CHECK-NEXT: (memory.fill
304328
;; CHECK-NEXT: (local.get $dst)
@@ -335,10 +359,15 @@
335359
;; NOSIMD-NEXT: (local $3 i32)
336360
;; NOSIMD-NEXT: (local $4 i32)
337361
;; NOSIMD-NEXT: (local $5 i32)
338-
;; NOSIMD-NEXT: (memory.fill
339-
;; NOSIMD-NEXT: (local.get $dst)
340-
;; NOSIMD-NEXT: (i32.const 0)
341-
;; NOSIMD-NEXT: (i32.const 0)
362+
;; NOSIMD-NEXT: (block
363+
;; NOSIMD-NEXT: (drop
364+
;; NOSIMD-NEXT: (i32.load8_u
365+
;; NOSIMD-NEXT: (local.get $dst)
366+
;; NOSIMD-NEXT: )
367+
;; NOSIMD-NEXT: )
368+
;; NOSIMD-NEXT: (drop
369+
;; NOSIMD-NEXT: (i32.const 0)
370+
;; NOSIMD-NEXT: )
342371
;; NOSIMD-NEXT: )
343372
;; NOSIMD-NEXT: (i32.store8
344373
;; NOSIMD-NEXT: (local.get $dst)
@@ -420,10 +449,15 @@
420449
;; NOSIMD-NEXT: (i64.const -1)
421450
;; NOSIMD-NEXT: )
422451
;; NOSIMD-NEXT: )
423-
;; NOSIMD-NEXT: (memory.fill
424-
;; NOSIMD-NEXT: (local.get $dst)
425-
;; NOSIMD-NEXT: (local.get $val)
426-
;; NOSIMD-NEXT: (i32.const 0)
452+
;; NOSIMD-NEXT: (block
453+
;; NOSIMD-NEXT: (drop
454+
;; NOSIMD-NEXT: (i32.load8_u
455+
;; NOSIMD-NEXT: (local.get $dst)
456+
;; NOSIMD-NEXT: )
457+
;; NOSIMD-NEXT: )
458+
;; NOSIMD-NEXT: (drop
459+
;; NOSIMD-NEXT: (local.get $val)
460+
;; NOSIMD-NEXT: )
427461
;; NOSIMD-NEXT: )
428462
;; NOSIMD-NEXT: (memory.fill
429463
;; NOSIMD-NEXT: (local.get $dst)

0 commit comments

Comments
 (0)