summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/lit/passes/global-effects-O.wast198
1 files changed, 198 insertions, 0 deletions
diff --git a/test/lit/passes/global-effects-O.wast b/test/lit/passes/global-effects-O.wast
new file mode 100644
index 000000000..c24159eac
--- /dev/null
+++ b/test/lit/passes/global-effects-O.wast
@@ -0,0 +1,198 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+
+;; RUN: foreach %s %t wasm-opt -all -S -o - --generate-global-effects | filecheck %s --check-prefix CHECK_0
+;; RUN: foreach %s %t wasm-opt -all -S -o - --generate-global-effects -O1 | filecheck %s --check-prefix CHECK_1
+;; RUN: foreach %s %t wasm-opt -all -S -o - --generate-global-effects -O3 | filecheck %s --check-prefix CHECK_3
+;; RUN: foreach %s %t wasm-opt -all -S -o - --generate-global-effects -Os | filecheck %s --check-prefix CHECK_s
+;; RUN: foreach %s %t wasm-opt -all -S -o - --generate-global-effects -O | filecheck %s --check-prefix CHECK_O
+
+;; Test that global effects benefit -O1 and related modes.
+
+(module
+ ;; CHECK_0: (type $0 (func))
+
+ ;; CHECK_0: (type $1 (func (result i32)))
+
+ ;; CHECK_0: (export "main" (func $main))
+ ;; CHECK_1: (type $0 (func))
+
+ ;; CHECK_1: (type $1 (func (result i32)))
+
+ ;; CHECK_1: (export "main" (func $main))
+ ;; CHECK_3: (type $0 (func))
+
+ ;; CHECK_3: (type $1 (func (result i32)))
+
+ ;; CHECK_3: (export "main" (func $main))
+ ;; CHECK_s: (type $0 (func))
+
+ ;; CHECK_s: (type $1 (func (result i32)))
+
+ ;; CHECK_s: (export "main" (func $main))
+ ;; CHECK_O: (type $0 (func))
+
+ ;; CHECK_O: (type $1 (func (result i32)))
+
+ ;; CHECK_O: (export "main" (func $main))
+ (export "main" (func $main))
+
+ ;; CHECK_0: (export "pointless-work" (func $pointless-work))
+ ;; CHECK_1: (export "pointless-work" (func $pointless-work))
+ ;; CHECK_3: (export "pointless-work" (func $pointless-work))
+ ;; CHECK_s: (export "pointless-work" (func $pointless-work))
+ ;; CHECK_O: (export "pointless-work" (func $pointless-work))
+ (export "pointless-work" (func $pointless-work))
+
+ ;; CHECK_0: (func $main (type $0)
+ ;; CHECK_0-NEXT: (if
+ ;; CHECK_0-NEXT: (call $pointless-work)
+ ;; CHECK_0-NEXT: (then
+ ;; CHECK_0-NEXT: (drop
+ ;; CHECK_0-NEXT: (call $pointless-work)
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_1: (func $main (type $0)
+ ;; CHECK_1-NEXT: (nop)
+ ;; CHECK_1-NEXT: )
+ ;; CHECK_3: (func $main (type $0) (; has Stack IR ;)
+ ;; CHECK_3-NEXT: (nop)
+ ;; CHECK_3-NEXT: )
+ ;; CHECK_s: (func $main (type $0) (; has Stack IR ;)
+ ;; CHECK_s-NEXT: (nop)
+ ;; CHECK_s-NEXT: )
+ ;; CHECK_O: (func $main (type $0) (; has Stack IR ;)
+ ;; CHECK_O-NEXT: (nop)
+ ;; CHECK_O-NEXT: )
+ (func $main
+ ;; This calls a function that does pointless work. After generating global
+ ;; effects we can see that it is pointless and remove this entire if (except
+ ;; for -O0).
+ (if
+ (call $pointless-work)
+ (then
+ (drop
+ (call $pointless-work)
+ )
+ )
+ )
+ )
+
+ ;; CHECK_0: (func $pointless-work (type $1) (result i32)
+ ;; CHECK_0-NEXT: (local $x i32)
+ ;; CHECK_0-NEXT: (loop $loop
+ ;; CHECK_0-NEXT: (local.set $x
+ ;; CHECK_0-NEXT: (i32.add
+ ;; CHECK_0-NEXT: (local.get $x)
+ ;; CHECK_0-NEXT: (i32.const 1)
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: (if
+ ;; CHECK_0-NEXT: (i32.ge_u
+ ;; CHECK_0-NEXT: (local.get $x)
+ ;; CHECK_0-NEXT: (i32.const 12345678)
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: (then
+ ;; CHECK_0-NEXT: (return
+ ;; CHECK_0-NEXT: (local.get $x)
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: (br $loop)
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_0-NEXT: )
+ ;; CHECK_1: (func $pointless-work (type $1) (result i32)
+ ;; CHECK_1-NEXT: (local $0 i32)
+ ;; CHECK_1-NEXT: (loop $loop (result i32)
+ ;; CHECK_1-NEXT: (br_if $loop
+ ;; CHECK_1-NEXT: (i32.lt_u
+ ;; CHECK_1-NEXT: (local.tee $0
+ ;; CHECK_1-NEXT: (i32.add
+ ;; CHECK_1-NEXT: (local.get $0)
+ ;; CHECK_1-NEXT: (i32.const 1)
+ ;; CHECK_1-NEXT: )
+ ;; CHECK_1-NEXT: )
+ ;; CHECK_1-NEXT: (i32.const 12345678)
+ ;; CHECK_1-NEXT: )
+ ;; CHECK_1-NEXT: )
+ ;; CHECK_1-NEXT: (local.get $0)
+ ;; CHECK_1-NEXT: )
+ ;; CHECK_1-NEXT: )
+ ;; CHECK_3: (func $pointless-work (type $1) (; has Stack IR ;) (result i32)
+ ;; CHECK_3-NEXT: (local $0 i32)
+ ;; CHECK_3-NEXT: (loop $loop (result i32)
+ ;; CHECK_3-NEXT: (br_if $loop
+ ;; CHECK_3-NEXT: (i32.lt_u
+ ;; CHECK_3-NEXT: (local.tee $0
+ ;; CHECK_3-NEXT: (i32.add
+ ;; CHECK_3-NEXT: (local.get $0)
+ ;; CHECK_3-NEXT: (i32.const 1)
+ ;; CHECK_3-NEXT: )
+ ;; CHECK_3-NEXT: )
+ ;; CHECK_3-NEXT: (i32.const 12345678)
+ ;; CHECK_3-NEXT: )
+ ;; CHECK_3-NEXT: )
+ ;; CHECK_3-NEXT: (local.get $0)
+ ;; CHECK_3-NEXT: )
+ ;; CHECK_3-NEXT: )
+ ;; CHECK_s: (func $pointless-work (type $1) (; has Stack IR ;) (result i32)
+ ;; CHECK_s-NEXT: (local $0 i32)
+ ;; CHECK_s-NEXT: (loop $loop (result i32)
+ ;; CHECK_s-NEXT: (br_if $loop
+ ;; CHECK_s-NEXT: (i32.lt_u
+ ;; CHECK_s-NEXT: (local.tee $0
+ ;; CHECK_s-NEXT: (i32.add
+ ;; CHECK_s-NEXT: (local.get $0)
+ ;; CHECK_s-NEXT: (i32.const 1)
+ ;; CHECK_s-NEXT: )
+ ;; CHECK_s-NEXT: )
+ ;; CHECK_s-NEXT: (i32.const 12345678)
+ ;; CHECK_s-NEXT: )
+ ;; CHECK_s-NEXT: )
+ ;; CHECK_s-NEXT: (local.get $0)
+ ;; CHECK_s-NEXT: )
+ ;; CHECK_s-NEXT: )
+ ;; CHECK_O: (func $pointless-work (type $1) (; has Stack IR ;) (result i32)
+ ;; CHECK_O-NEXT: (local $0 i32)
+ ;; CHECK_O-NEXT: (loop $loop (result i32)
+ ;; CHECK_O-NEXT: (br_if $loop
+ ;; CHECK_O-NEXT: (i32.lt_u
+ ;; CHECK_O-NEXT: (local.tee $0
+ ;; CHECK_O-NEXT: (i32.add
+ ;; CHECK_O-NEXT: (local.get $0)
+ ;; CHECK_O-NEXT: (i32.const 1)
+ ;; CHECK_O-NEXT: )
+ ;; CHECK_O-NEXT: )
+ ;; CHECK_O-NEXT: (i32.const 12345678)
+ ;; CHECK_O-NEXT: )
+ ;; CHECK_O-NEXT: )
+ ;; CHECK_O-NEXT: (local.get $0)
+ ;; CHECK_O-NEXT: )
+ ;; CHECK_O-NEXT: )
+ (func $pointless-work (result i32)
+ (local $x i32)
+ ;; Some pointless work, with no side effects, that cannot be inlined. (The
+ ;; changes here are not important for this test.)
+ (loop $loop
+ (local.set $x
+ (i32.add
+ (local.get $x)
+ (i32.const 1)
+ )
+ )
+ (if
+ (i32.ge_u
+ (local.get $x)
+ (i32.const 12345678)
+ )
+ (then
+ (return
+ (local.get $x)
+ )
+ )
+ )
+ (br $loop)
+ )
+ )
+)