diff options
Diffstat (limited to 'test/lit/passes/optimize-instructions-gc-iit.wast')
-rw-r--r-- | test/lit/passes/optimize-instructions-gc-iit.wast | 198 |
1 files changed, 36 insertions, 162 deletions
diff --git a/test/lit/passes/optimize-instructions-gc-iit.wast b/test/lit/passes/optimize-instructions-gc-iit.wast index 4117dce19..3f0c926d3 100644 --- a/test/lit/passes/optimize-instructions-gc-iit.wast +++ b/test/lit/passes/optimize-instructions-gc-iit.wast @@ -33,107 +33,65 @@ (func $foo) - ;; CHECK: (func $ref-cast-iit (param $parent (ref $parent)) (param $child (ref $child)) (param $other (ref $other)) (param $parent-rtt (rtt $parent)) (param $child-rtt (rtt $child)) (param $other-rtt (rtt $other)) + ;; CHECK: (func $ref-cast-iit (param $parent (ref $parent)) (param $child (ref $child)) (param $other (ref $other)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result (ref $parent)) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $parent-rtt) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.get $parent) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $parent) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result (ref $child)) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $parent-rtt) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (local.get $child) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $child) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast + ;; CHECK-NEXT: (ref.cast_static $child ;; CHECK-NEXT: (local.get $parent) - ;; CHECK-NEXT: (local.get $child-rtt) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result (ref $other)) + ;; CHECK-NEXT: (block ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.get $child) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (local.get $other-rtt) - ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; NOMNL: (func $ref-cast-iit (type $ref|$parent|_ref|$child|_ref|$other|_rtt_$parent_rtt_$child_rtt_$other_=>_none) (param $parent (ref $parent)) (param $child (ref $child)) (param $other (ref $other)) (param $parent-rtt (rtt $parent)) (param $child-rtt (rtt $child)) (param $other-rtt (rtt $other)) + ;; NOMNL: (func $ref-cast-iit (type $ref|$parent|_ref|$child|_ref|$other|_=>_none) (param $parent (ref $parent)) (param $child (ref $child)) (param $other (ref $other)) ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (block (result (ref $parent)) - ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (local.get $parent-rtt) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: (local.get $parent) - ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (local.get $parent) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (block (result (ref $child)) - ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (local.get $parent-rtt) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: (local.get $child) - ;; NOMNL-NEXT: ) + ;; NOMNL-NEXT: (local.get $child) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (ref.cast + ;; NOMNL-NEXT: (ref.cast_static $child ;; NOMNL-NEXT: (local.get $parent) - ;; NOMNL-NEXT: (local.get $child-rtt) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (block (result (ref $other)) + ;; NOMNL-NEXT: (block ;; NOMNL-NEXT: (drop ;; NOMNL-NEXT: (local.get $child) ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (local.get $other-rtt) - ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: (unreachable) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: ) - ;; NOMNL-TNH: (func $ref-cast-iit (type $ref|$parent|_ref|$child|_ref|$other|_rtt_$parent_rtt_$child_rtt_$other_=>_none) (param $parent (ref $parent)) (param $child (ref $child)) (param $other (ref $other)) (param $parent-rtt (rtt $parent)) (param $child-rtt (rtt $child)) (param $other-rtt (rtt $other)) + ;; NOMNL-TNH: (func $ref-cast-iit (type $ref|$parent|_ref|$child|_ref|$other|_=>_none) (param $parent (ref $parent)) (param $child (ref $child)) (param $other (ref $other)) ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (block (result (ref $parent)) - ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (local.get $parent-rtt) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: (local.get $parent) - ;; NOMNL-TNH-NEXT: ) + ;; NOMNL-TNH-NEXT: (local.get $parent) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (block (result (ref $child)) - ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (local.get $parent-rtt) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: (local.get $child) - ;; NOMNL-TNH-NEXT: ) + ;; NOMNL-TNH-NEXT: (local.get $child) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (ref.cast + ;; NOMNL-TNH-NEXT: (ref.cast_static $child ;; NOMNL-TNH-NEXT: (local.get $parent) - ;; NOMNL-TNH-NEXT: (local.get $child-rtt) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (block (result (ref $other)) + ;; NOMNL-TNH-NEXT: (block ;; NOMNL-TNH-NEXT: (drop ;; NOMNL-TNH-NEXT: (local.get $child) ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (local.get $other-rtt) - ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: (unreachable) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: ) @@ -143,174 +101,91 @@ (param $child (ref $child)) (param $other (ref $other)) - (param $parent-rtt (rtt $parent)) - (param $child-rtt (rtt $child)) - (param $other-rtt (rtt $other)) - - ;; a cast of parent to an rtt of parent: assuming no traps as we do, we can - ;; optimize this as the new type will be valid. + ;; a cast of parent to parent. We can optimize this as the new type will be + ;; valid. (drop - (ref.cast + (ref.cast_static $parent (local.get $parent) - (local.get $parent-rtt) ) ) ;; a cast of child to a supertype: again, we replace with a valid type. (drop - (ref.cast + (ref.cast_static $parent (local.get $child) - (local.get $parent-rtt) ) ) ;; a cast of parent to a subtype: we cannot replace the original heap type ;; $child with one that is not equal or more specific, like $parent, so we ;; cannot optimize here. (drop - (ref.cast + (ref.cast_static $child (local.get $parent) - (local.get $child-rtt) ) ) ;; a cast of child to an unrelated type: it will trap anyhow (drop - (ref.cast + (ref.cast_static $other (local.get $child) - (local.get $other-rtt) ) ) ) - ;; CHECK: (func $ref-cast-iit-bad (param $parent (ref $parent)) (param $parent-rtt (rtt $parent)) - ;; CHECK-NEXT: (local $2 (ref null $parent)) + ;; CHECK: (func $ref-cast-iit-bad (param $parent (ref $parent)) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block (result (ref $parent)) - ;; CHECK-NEXT: (local.set $2 - ;; CHECK-NEXT: (block $block (result (ref $parent)) - ;; CHECK-NEXT: (call $foo) - ;; CHECK-NEXT: (local.get $parent) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (block $block0 (result (rtt $parent)) - ;; CHECK-NEXT: (call $foo) - ;; CHECK-NEXT: (local.get $parent-rtt) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (ref.as_non_null - ;; CHECK-NEXT: (local.get $2) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast + ;; CHECK-NEXT: (block $block (result (ref $parent)) + ;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: (local.get $parent) - ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.cast + ;; CHECK-NEXT: (ref.cast_static $parent ;; CHECK-NEXT: (unreachable) - ;; CHECK-NEXT: (local.get $parent-rtt) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; NOMNL: (func $ref-cast-iit-bad (type $ref|$parent|_rtt_$parent_=>_none) (param $parent (ref $parent)) (param $parent-rtt (rtt $parent)) - ;; NOMNL-NEXT: (local $2 (ref null $parent)) + ;; NOMNL: (func $ref-cast-iit-bad (type $ref|$parent|_=>_none) (param $parent (ref $parent)) ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (block (result (ref $parent)) - ;; NOMNL-NEXT: (local.set $2 - ;; NOMNL-NEXT: (block $block (result (ref $parent)) - ;; NOMNL-NEXT: (call $foo) - ;; NOMNL-NEXT: (local.get $parent) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (block $block0 (result (rtt $parent)) - ;; NOMNL-NEXT: (call $foo) - ;; NOMNL-NEXT: (local.get $parent-rtt) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: (ref.as_non_null - ;; NOMNL-NEXT: (local.get $2) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: ) - ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (ref.cast + ;; NOMNL-NEXT: (block $block (result (ref $parent)) + ;; NOMNL-NEXT: (call $foo) ;; NOMNL-NEXT: (local.get $parent) - ;; NOMNL-NEXT: (unreachable) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: (drop - ;; NOMNL-NEXT: (ref.cast + ;; NOMNL-NEXT: (ref.cast_static $parent ;; NOMNL-NEXT: (unreachable) - ;; NOMNL-NEXT: (local.get $parent-rtt) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: ) ;; NOMNL-NEXT: ) - ;; NOMNL-TNH: (func $ref-cast-iit-bad (type $ref|$parent|_rtt_$parent_=>_none) (param $parent (ref $parent)) (param $parent-rtt (rtt $parent)) - ;; NOMNL-TNH-NEXT: (local $2 (ref null $parent)) + ;; NOMNL-TNH: (func $ref-cast-iit-bad (type $ref|$parent|_=>_none) (param $parent (ref $parent)) ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (block (result (ref $parent)) - ;; NOMNL-TNH-NEXT: (local.set $2 - ;; NOMNL-TNH-NEXT: (block $block (result (ref $parent)) - ;; NOMNL-TNH-NEXT: (call $foo) - ;; NOMNL-TNH-NEXT: (local.get $parent) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (block $block0 (result (rtt $parent)) - ;; NOMNL-TNH-NEXT: (call $foo) - ;; NOMNL-TNH-NEXT: (local.get $parent-rtt) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: (ref.as_non_null - ;; NOMNL-TNH-NEXT: (local.get $2) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: ) - ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (ref.cast + ;; NOMNL-TNH-NEXT: (block $block (result (ref $parent)) + ;; NOMNL-TNH-NEXT: (call $foo) ;; NOMNL-TNH-NEXT: (local.get $parent) - ;; NOMNL-TNH-NEXT: (unreachable) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: (drop - ;; NOMNL-TNH-NEXT: (ref.cast + ;; NOMNL-TNH-NEXT: (ref.cast_static $parent ;; NOMNL-TNH-NEXT: (unreachable) - ;; NOMNL-TNH-NEXT: (local.get $parent-rtt) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: ) ;; NOMNL-TNH-NEXT: ) (func $ref-cast-iit-bad (param $parent (ref $parent)) - (param $parent-rtt (rtt $parent)) ;; optimizing this cast away requires reordering. (drop - (ref.cast + (ref.cast_static $parent (block (result (ref $parent)) (call $foo) (local.get $parent) ) - (block (result (rtt $parent)) - (call $foo) - (local.get $parent-rtt) - ) ) ) ;; ignore unreachability (drop - (ref.cast - (local.get $parent) - (unreachable) - ) - ) - (drop - (ref.cast + (ref.cast_static $parent (unreachable) - (local.get $parent-rtt) ) ) ) @@ -335,9 +210,8 @@ (drop (ref.eq (local.get $x) - (ref.cast + (ref.cast_static $parent (local.get $x) - (rtt.canon $parent) ) ) ) |