diff options
-rw-r--r-- | test/lit/passes/outlining.wast | 146 |
1 files changed, 119 insertions, 27 deletions
diff --git a/test/lit/passes/outlining.wast b/test/lit/passes/outlining.wast index d1bb6584e..5ffc7f671 100644 --- a/test/lit/passes/outlining.wast +++ b/test/lit/passes/outlining.wast @@ -1,9 +1,7 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. -;; RUN: foreach %s %t wasm-opt --outlining -S -o - | filecheck %s +;; RUN: foreach %s %t wasm-opt --outlining -S -all -o - | filecheck %s -;; TODO: Add a test that creates an outlined function with one return value -;; TODO: Add a test that creates an outlined function that returns multiple values ;; TODO: Add a test that fails to outline a single control flow that repeats @@ -12,7 +10,7 @@ ;; CHECK: (type $1 (func (param i32))) - ;; CHECK: (func $outline$ (param $0 i32) + ;; CHECK: (func $outline$ (type $1) (param $0 i32) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) @@ -24,7 +22,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK: (func $a (result i32) + ;; CHECK: (func $a (type $0) (result i32) ;; CHECK-NEXT: (call $outline$ ;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) @@ -46,7 +44,7 @@ (i32.const 4) ) ) - ;; CHECK: (func $b (result i32) + ;; CHECK: (func $b (type $0) (result i32) ;; CHECK-NEXT: (call $outline$ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -74,7 +72,7 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (func $outline$ + ;; CHECK: (func $outline$ (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -83,7 +81,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK: (func $a + ;; CHECK: (func $a (type $0) ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: ) (func $a @@ -94,7 +92,7 @@ (i32.const 2) ) ) - ;; CHECK: (func $b + ;; CHECK: (func $b (type $0) ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: ) (func $b @@ -112,7 +110,7 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (func $outline$ + ;; CHECK: (func $outline$ (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -127,7 +125,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK: (func $a + ;; CHECK: (func $a (type $0) ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 6) @@ -150,7 +148,7 @@ (i32.const 6) ) ) - ;; CHECK: (func $b + ;; CHECK: (func $b (type $0) ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 7) @@ -180,7 +178,7 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (func $outline$ + ;; CHECK: (func $outline$ (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (i32.const 0) @@ -189,7 +187,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK: (func $outline$_4 + ;; CHECK: (func $outline$_4 (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.sub ;; CHECK-NEXT: (i32.const 3) @@ -198,7 +196,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK: (func $a + ;; CHECK: (func $a (type $0) ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: (call $outline$_4) ;; CHECK-NEXT: ) @@ -216,7 +214,7 @@ ) ) ) - ;; CHECK: (func $b + ;; CHECK: (func $b (type $0) ;; CHECK-NEXT: (call $outline$_4) ;; CHECK-NEXT: ) (func $b @@ -227,7 +225,7 @@ ) ) ) - ;; CHECK: (func $c + ;; CHECK: (func $c (type $0) ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: ) (func $c @@ -246,13 +244,13 @@ ;; CHECK: (type $1 (func)) - ;; CHECK: (func $outline$ + ;; CHECK: (func $outline$ (type $1) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 10) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - ;; CHECK: (func $a (param $0 i32) + ;; CHECK: (func $a (type $0) (param $0 i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.eqz ;; CHECK-NEXT: (local.get $0) @@ -270,7 +268,7 @@ ) ) ) - ;; CHECK: (func $b (param $0 i32) + ;; CHECK: (func $b (type $0) (param $0 i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.eqz ;; CHECK-NEXT: (local.get $0) @@ -294,7 +292,7 @@ (module ;; CHECK: (type $0 (func (param i32))) - ;; CHECK: (func $a (param $0 i32) + ;; CHECK: (func $a (type $0) (param $0 i32) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) @@ -310,7 +308,7 @@ ) ) ) - ;; CHECK: (func $b (param $0 i32) + ;; CHECK: (func $b (type $0) (param $0 i32) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) @@ -332,7 +330,7 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (func $a + ;; CHECK: (func $a (type $0) ;; CHECK-NEXT: (local $i i32) ;; CHECK-NEXT: (local.set $i ;; CHECK-NEXT: (i32.const 7) @@ -344,7 +342,7 @@ (i32.const 7) ) ) - ;; CHECK: (func $b + ;; CHECK: (func $b (type $0) ;; CHECK-NEXT: (local $i i32) ;; CHECK-NEXT: (local.set $i ;; CHECK-NEXT: (i32.const 7) @@ -362,7 +360,7 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (func $a + ;; CHECK: (func $a (type $0) ;; CHECK-NEXT: (block $label1 ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 4) @@ -392,7 +390,7 @@ (module ;; CHECK: (type $0 (func (result i32))) - ;; CHECK: (func $a (result i32) + ;; CHECK: (func $a (type $0) (result i32) ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) @@ -402,7 +400,7 @@ (i32.const 2) ) ) - ;; CHECK: (func $b (result i32) + ;; CHECK: (func $b (type $0) (result i32) ;; CHECK-NEXT: (return ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) @@ -413,3 +411,97 @@ ) ) ) + +;; Test that an outlined function is created with one return value. +(module + ;; CHECK: (type $0 (func (result i32))) + + ;; CHECK: (func $outline$ (type $0) (result i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + + ;; CHECK: (func $a (type $0) (result i32) + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: ) + (func $a (result i32) + (drop + (i32.const 0) + ) + (i32.const 1) + ) + ;; CHECK: (func $b (type $0) (result i32) + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: ) + (func $b (result i32) + (drop + (i32.const 0) + ) + (i32.const 1) + ) +) + +;; Test that an outlined function is created with multiple return values. +(module + ;; CHECK: (type $0 (func (result i32 i32))) + + ;; CHECK: (type $1 (func)) + + ;; CHECK: (func $outline$ (type $0) (result i32 i32) + ;; CHECK-NEXT: (tuple.make + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + + ;; CHECK: (func $a (type $1) + ;; CHECK-NEXT: (local $scratch (i32 i32)) + ;; CHECK-NEXT: (local $scratch_1 (i32 i32)) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $scratch + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.extract 0 + ;; CHECK-NEXT: (local.get $scratch) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.extract 1 + ;; CHECK-NEXT: (local.get $scratch) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.mul + ;; CHECK-NEXT: (block (result i32) + ;; CHECK-NEXT: (local.set $scratch_1 + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.extract 0 + ;; CHECK-NEXT: (local.get $scratch_1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (tuple.extract 1 + ;; CHECK-NEXT: (local.get $scratch_1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a + (drop + (i32.add + (i32.const 0) + (i32.const 1) + ) + ) + (drop + (i32.mul + (i32.const 0) + (i32.const 1) + ) + ) + ) +) |