summaryrefslogtreecommitdiff
path: root/test/passes/local-cse.wast
diff options
context:
space:
mode:
Diffstat (limited to 'test/passes/local-cse.wast')
-rw-r--r--test/passes/local-cse.wast163
1 files changed, 163 insertions, 0 deletions
diff --git a/test/passes/local-cse.wast b/test/passes/local-cse.wast
new file mode 100644
index 000000000..b1155ce9d
--- /dev/null
+++ b/test/passes/local-cse.wast
@@ -0,0 +1,163 @@
+(module
+ (memory 100 100)
+ (func $basics
+ (local $x i32)
+ (local $y i32)
+ (drop
+ (i32.add (i32.const 1) (i32.const 2))
+ )
+ (drop
+ (i32.add (i32.const 1) (i32.const 2))
+ )
+ (if (i32.const 0) (nop))
+ (drop ;; we can't do this yet, non-linear
+ (i32.add (i32.const 1) (i32.const 2))
+ )
+ (drop
+ (i32.add (get_local $x) (get_local $y))
+ )
+ (drop
+ (i32.add (get_local $x) (get_local $y))
+ )
+ (drop
+ (i32.add (get_local $x) (get_local $y))
+ )
+ (call $basics) ;; side effects, but no matter for our locals
+ (drop
+ (i32.add (get_local $x) (get_local $y))
+ )
+ (set_local $x (i32.const 100))
+ (drop ;; x was changed!
+ (i32.add (get_local $x) (get_local $y))
+ )
+ )
+ (func $recursive1
+ (local $x i32)
+ (local $y i32)
+ (drop
+ (i32.add
+ (i32.const 1)
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ )
+ (drop
+ (i32.add
+ (i32.const 1)
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ )
+ (drop
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ )
+ (func $recursive2
+ (local $x i32)
+ (local $y i32)
+ (drop
+ (i32.add
+ (i32.const 1)
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ )
+ (drop
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ (drop
+ (i32.add
+ (i32.const 1)
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ )
+ )
+ (func $self
+ (local $x i32)
+ (local $y i32)
+ (drop
+ (i32.add
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ )
+ (drop
+ (i32.add
+ (i32.const 2)
+ (i32.const 3)
+ )
+ )
+ )
+ (func $loads
+ (drop
+ (i32.load (i32.const 10))
+ )
+ (drop
+ (i32.load (i32.const 10)) ;; implicit traps, sad
+ )
+ )
+ (func $8 (param $var$0 i32) (result i32)
+ (local $var$1 i32)
+ (local $var$2 i32)
+ (local $var$3 i32)
+ (block $label$0 i32
+ (i32.store
+ (tee_local $var$2
+ (i32.add
+ (get_local $var$1)
+ (i32.const 4)
+ )
+ )
+ (i32.and
+ (i32.load
+ (get_local $var$2)
+ )
+ (i32.xor
+ (tee_local $var$2
+ (i32.const 74)
+ )
+ (i32.const -1)
+ )
+ )
+ )
+ (i32.store
+ (tee_local $var$1
+ (i32.add
+ (get_local $var$1)
+ (i32.const 4)
+ )
+ )
+ (i32.or
+ (i32.load
+ (get_local $var$1)
+ )
+ (i32.and
+ (get_local $var$2)
+ (i32.const 8)
+ )
+ )
+ )
+ )
+ )
+)