work
diff --git a/test/lit/passes/once-reduction.wast b/test/lit/passes/once-reduction.wast index 9dfd2e1..4e7ebc4 100644 --- a/test/lit/passes/once-reduction.wast +++ b/test/lit/passes/once-reduction.wast
@@ -1584,3 +1584,66 @@ (call $do-once) ) ) + +;; As above, but now $do-once has some internal structure. +(module + + ;; CHECK: (type $0 (func)) + + ;; CHECK: (type $1 (func (result i32))) + + ;; CHECK: (import "a" "b" (func $import (type $1) (result i32))) + (import "a" "b" (func $import (result i32))) + + ;; CHECK: (global $once (mut i32) (i32.const 0)) + (global $once (mut i32) (i32.const 0)) + + ;; CHECK: (func $once (type $0) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (global.get $once) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (global.set $once + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $once + (if + (global.get $once) + (return) + ) + (global.set $once (i32.const 1)) + ) + + ;; CHECK: (func $do-once (type $0) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (call $import) + ;; CHECK-NEXT: (block + ;; CHECK-NEXT: (call $once) + ;; CHECK-NEXT: (return) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $once) + ;; CHECK-NEXT: ) + (func $do-once + ;; $once is called in all places we exit from the function, so when we + ;; exit we know it has been called, and we can optimize in $caller. + (if + (call $import) + (block + (call $once) + (return) + ) + ) + (call $once) + ) + + ;; CHECK: (func $caller (type $0) + ;; CHECK-NEXT: (call $do-once) + ;; CHECK-NEXT: (call $once) + ;; CHECK-NEXT: ) + (func $caller + (call $do-once) + (call $once) ;; XXX debug + ) +)