diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/outlining.wast | 186 |
1 files changed, 185 insertions, 1 deletions
diff --git a/test/lit/passes/outlining.wast b/test/lit/passes/outlining.wast index ad712b31a..98cb5a316 100644 --- a/test/lit/passes/outlining.wast +++ b/test/lit/passes/outlining.wast @@ -238,7 +238,59 @@ ) ) -;; Tests that outlining works correctly with If control flow +;; Tests that outlining works correctly with if-condition +(module + ;; CHECK: (type $0 (func)) + + ;; CHECK: (type $1 (func (result i32))) + + ;; CHECK: (global $global$1 (mut i32) (i32.const 100)) + (global $global$1 (mut i32) (i32.const 100)) + ;; CHECK: (func $outline$ (type $1) (result i32) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (global.get $global$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + + ;; CHECK: (func $a (type $0) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: (global.set $global$1 + ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a + (if + (i32.eqz + (global.get $global$1) + ) + (global.set $global$1 + (i32.const 15) + ) + ) + ) + ;; CHECK: (func $b (type $0) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: (global.set $global$1 + ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b + (if + (i32.eqz + (global.get $global$1) + ) + (global.set $global$1 + (i32.const 20) + ) + ) + ) +) + +;; Outline if-true. (module ;; CHECK: (type $0 (func (param i32))) @@ -288,6 +340,138 @@ ) ) +;; Outline if-false. +(module + ;; CHECK: (type $0 (func)) + + ;; CHECK: (global $global$1 (mut i32) (i32.const 100)) + (global $global$1 (mut i32) (i32.const 100)) + ;; CHECK: (func $outline$ (type $0) + ;; CHECK-NEXT: (global.set $global$1 + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + + ;; CHECK: (func $a (type $0) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (global.get $global$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $global$1 + ;; CHECK-NEXT: (i32.const 15) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $a + (if + (i32.eqz + (global.get $global$1) + ) + (global.set $global$1 + (i32.const 15) + ) + (block + (global.set $global$1 + (i32.const 100) + ) + ) + ) + ) + ;; CHECK: (func $b (type $0) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.ctz + ;; CHECK-NEXT: (global.get $global$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $global$1 + ;; CHECK-NEXT: (i32.const 30) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $b + (if + (i32.ctz + (global.get $global$1) + ) + (global.set $global$1 + (i32.const 30) + ) + (block + (global.set $global$1 + (i32.const 100) + ) + ) + ) + ) +) + +;; Outline if control flow, with matching if-condition, if-true, if-false +;; TODO: Ideally outlining would keep the if-true and if-false inline in +;; $outline$, instead of moving them to another outlined function ($outline$_3 +;; & $outline$_4) because of the unique symbol between the if-condition and +;; if-true and the unique symbol between if-true and if-false. +(module + ;; CHECK: (type $0 (func)) + + ;; CHECK: (global $global$1 (mut i32) (i32.const 100)) + (global $global$1 (mut i32) (i32.const 100)) + ;; CHECK: (func $outline$ (type $0) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (global.get $global$1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $outline$_3) + ;; CHECK-NEXT: (call $outline$_4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + + ;; CHECK: (func $outline$_3 (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + + ;; CHECK: (func $outline$_4 (type $0) + ;; CHECK-NEXT: (global.set $global$1 + ;; CHECK-NEXT: (i32.const 20) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + + ;; CHECK: (func $a (type $0) + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: ) + (func $a + (if + (i32.eqz + (global.get $global$1) + ) + (drop + (i32.const 10) + ) + (global.set $global$1 + (i32.const 20) + ) + ) + ) + ;; CHECK: (func $b (type $0) + ;; CHECK-NEXT: (call $outline$) + ;; CHECK-NEXT: ) + (func $b + (if + (i32.eqz + (global.get $global$1) + ) + (drop + (i32.const 10) + ) + (global.set $global$1 + (i32.const 20) + ) + ) + ) +) + ;; Tests that local.get instructions are correctly filtered from being outlined. (module ;; CHECK: (type $0 (func (param i32))) |