diff options
author | Alon Zakai <azakai@google.com> | 2022-05-12 11:15:04 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-12 11:15:04 -0700 |
commit | 2da18b9016454c86258f7f94cf8536d3309c1ffc (patch) | |
tree | dc2c2e5764733a594fe70ec494e6e38b72b4d268 /test | |
parent | c458c47557981ad7839954d29e8951c3f02b91ef (diff) | |
download | binaryen-2da18b9016454c86258f7f94cf8536d3309c1ffc.tar.gz binaryen-2da18b9016454c86258f7f94cf8536d3309c1ffc.tar.bz2 binaryen-2da18b9016454c86258f7f94cf8536d3309c1ffc.zip |
Costs: Increase cost of casts (#4661)
Casts involve branches in the VM, so adding a cast in return for removing a branch
(like If=>Select) is not beneficial. We don't want to ever do any more casts than we
already are.
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/remove-unused-brs-gc.wast | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/test/lit/passes/remove-unused-brs-gc.wast b/test/lit/passes/remove-unused-brs-gc.wast index 458958d62..33aa08af5 100644 --- a/test/lit/passes/remove-unused-brs-gc.wast +++ b/test/lit/passes/remove-unused-brs-gc.wast @@ -215,4 +215,113 @@ (unreachable) ) ) + + ;; CHECK: (func $casts-are-costly (param $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (ref.test_static $struct + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result anyref) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: (ref.cast_static $struct + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (if (result anyref) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (block $block (result anyref) + ;; CHECK-NEXT: (block $something (result anyref) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (br_on_cast_static $something $struct + ;; CHECK-NEXT: (ref.null $struct) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select (result anyref) + ;; CHECK-NEXT: (block $block3 (result anyref) + ;; CHECK-NEXT: (block $nothing + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (br_on_null $nothing + ;; CHECK-NEXT: (ref.null $struct) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $casts-are-costly (param $x i32) + ;; We never turn an if into a select if an arm has a cast of any kind, as + ;; those things involve branches internally, so we'd be adding more than we + ;; save. + (drop + (if (result i32) + (local.get $x) + (ref.test_static $struct + (ref.null any) + ) + (i32.const 0) + ) + ) + (drop + (if (result anyref) + (local.get $x) + (ref.null any) + (ref.cast_static $struct + (ref.null any) + ) + ) + ) + (drop + (if (result anyref) + (local.get $x) + (block (result anyref) + (block $something (result anyref) + (drop + (br_on_cast_static $something $struct + (ref.null $struct) + ) + ) + (ref.null any) + ) + ) + (ref.null any) + ) + ) + ;; However, null checks are fairly fast, and we will emit a select here. + (drop + (if (result anyref) + (local.get $x) + (block (result anyref) + (block $nothing + (drop + (br_on_null $nothing + (ref.null $struct) + ) + ) + ) + (ref.null any) + ) + (ref.null any) + ) + ) + ) ) |