summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2023-09-21 12:42:07 -0700
committerGitHub <noreply@github.com>2023-09-21 12:42:07 -0700
commitd491136eeb94b748225be50bdcc86c74cdbd154e (patch)
tree1c1633be02656af1a9c7b05a78a4e9a0928a5fad /test
parentec0f05cb98d6a4e30375a7a6a78966d25fdb5d9c (diff)
downloadbinaryen-d491136eeb94b748225be50bdcc86c74cdbd154e.tar.gz
binaryen-d491136eeb94b748225be50bdcc86c74cdbd154e.tar.bz2
binaryen-d491136eeb94b748225be50bdcc86c74cdbd154e.zip
[Parser] Parse if-else in the new wat parser and IRBuilder (#5963)
Parse both the straight-line and folded versions of if, including the abbreviations that allow omitting the else clause. In the IRBuilder, generalize the scope stack to be able to track scopes other than blocks and add methods for visiting the beginnings of ifs and elses.
Diffstat (limited to 'test')
-rw-r--r--test/lit/wat-kitchen-sink.wast386
1 files changed, 373 insertions, 13 deletions
diff --git a/test/lit/wat-kitchen-sink.wast b/test/lit/wat-kitchen-sink.wast
index 3b42db434..375b8c993 100644
--- a/test/lit/wat-kitchen-sink.wast
+++ b/test/lit/wat-kitchen-sink.wast
@@ -5,18 +5,18 @@
(module $parse
;; types
+ ;; CHECK: (type $void (sub (func)))
+
;; CHECK: (type $ret2 (func (result i32 i32)))
(type $ret2 (func (result i32 i32)))
(rec
- ;; CHECK: (type $void (sub (func)))
+ ;; CHECK: (type $2 (func (result i32)))
;; CHECK: (type $pair (struct (field (mut i32)) (field (mut i64))))
;; CHECK: (type $a1 (array i64))
- ;; CHECK: (type $4 (func (result i32)))
-
;; CHECK: (type $5 (func (param i32 i64)))
;; CHECK: (type $a2 (array (mut f32)))
@@ -233,7 +233,7 @@
;; CHECK: (func $f2 (type $8) (param $x i32)
;; CHECK-NEXT: )
(func $f2 (param $x i32))
- ;; CHECK: (func $f3 (type $4) (result i32)
+ ;; CHECK: (func $f3 (type $2) (result i32)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
(func $f3 (result i32)
@@ -307,7 +307,7 @@
nop
)
- ;; CHECK: (func $add (type $4) (result i32)
+ ;; CHECK: (func $add (type $2) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
@@ -319,7 +319,7 @@
i32.add
)
- ;; CHECK: (func $add-folded (type $4) (result i32)
+ ;; CHECK: (func $add-folded (type $2) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (i32.const 2)
@@ -332,7 +332,7 @@
)
)
- ;; CHECK: (func $add-stacky (type $4) (result i32)
+ ;; CHECK: (func $add-stacky (type $2) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (block (result i32)
@@ -352,7 +352,7 @@
i32.add
)
- ;; CHECK: (func $add-stacky-2 (type $4) (result i32)
+ ;; CHECK: (func $add-stacky-2 (type $2) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (i32.const 1)
@@ -372,7 +372,7 @@
i32.add
)
- ;; CHECK: (func $add-stacky-3 (type $4) (result i32)
+ ;; CHECK: (func $add-stacky-3 (type $2) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local.set $scratch
;; CHECK-NEXT: (i32.add
@@ -390,7 +390,7 @@
nop
)
- ;; CHECK: (func $add-stacky-4 (type $4) (result i32)
+ ;; CHECK: (func $add-stacky-4 (type $2) (result i32)
;; CHECK-NEXT: (local $scratch i32)
;; CHECK-NEXT: (local $scratch_1 i32)
;; CHECK-NEXT: (local $scratch_2 i32)
@@ -424,7 +424,7 @@
nop
)
- ;; CHECK: (func $add-unreachable (type $4) (result i32)
+ ;; CHECK: (func $add-unreachable (type $2) (result i32)
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (i32.const 1)
@@ -436,7 +436,7 @@
i32.add
)
- ;; CHECK: (func $add-unreachable-2 (type $4) (result i32)
+ ;; CHECK: (func $add-unreachable-2 (type $2) (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
@@ -451,7 +451,7 @@
i32.add
)
- ;; CHECK: (func $add-unreachable-3 (type $4) (result i32)
+ ;; CHECK: (func $add-unreachable-3 (type $2) (result i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
@@ -810,6 +810,366 @@
nop
)
+ ;; CHECK: (func $if-else (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else
+ i32.const 0
+ if
+ nop
+ else
+ nop
+ end
+ )
+
+ ;; CHECK: (func $if-else-empty (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-empty
+ i32.const 0
+ if
+ else
+ end
+ )
+
+ ;; CHECK: (func $if-else-many (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-many
+ i32.const 0
+ if
+ nop
+ nop
+ else
+ nop
+ nop
+ end
+ )
+
+ ;; CHECK: (func $if-else-single-nested (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (f32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (f64.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-single-nested
+ i32.const 0
+ if
+ f32.const 1
+ drop
+ else
+ f64.const 2
+ drop
+ end
+ )
+
+ ;; CHECK: (func $if-else-labeled (type $void)
+ ;; CHECK-NEXT: (block $l
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-labeled
+ i32.const 0
+ if $l
+ nop
+ else $l
+ nop
+ end $l
+ )
+
+ ;; CHECK: (func $if-no-else (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-no-else
+ i32.const 0
+ if
+ nop
+ end
+ )
+
+ ;; CHECK: (func $if-else-result (type $2) (result i32)
+ ;; CHECK-NEXT: (if (result i32)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-result (result i32)
+ i32.const 0
+ if (result i32)
+ i32.const 1
+ else
+ i32.const 2
+ end
+ )
+
+ ;; CHECK: (func $if-else-labeled-result (type $2) (result i32)
+ ;; CHECK-NEXT: (block $l (result i32)
+ ;; CHECK-NEXT: (if (result i32)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-labeled-result (result i32)
+ i32.const 0
+ if $l (result i32)
+ i32.const 1
+ else
+ i32.const 2
+ end
+ )
+
+ ;; CHECK: (func $if-else-folded (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-folded
+ (if
+ (i32.const 0)
+ (then
+ nop
+ )
+ (else
+ nop
+ )
+ )
+ )
+
+ ;; CHECK: (func $if-else-folded-empty (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-folded-empty
+ (if
+ (i32.const 0)
+ (then)
+ (else)
+ )
+ )
+
+ ;; CHECK: (func $if-else-folded-many (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (block
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-folded-many
+ (if
+ (i32.const 0)
+ (then
+ nop
+ nop
+ )
+ (else
+ nop
+ nop
+ )
+ )
+ )
+
+ ;; CHECK: (func $if-else-folded-single-nested (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.eqz
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-folded-single-nested
+ (if
+ (i32.eqz
+ (i32.const 0)
+ )
+ (then
+ (drop
+ (i32.const 1)
+ )
+ )
+ (else
+ (drop
+ (i32.const 2)
+ )
+ )
+ )
+ )
+
+ ;; CHECK: (func $if-else-folded-labeled (type $void)
+ ;; CHECK-NEXT: (block $l
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-folded-labeled
+ (if $l
+ (i32.const 0)
+ (then
+ nop
+ )
+ (else
+ nop
+ )
+ )
+ )
+
+ ;; CHECK: (func $if-no-else-folded (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (nop)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-no-else-folded
+ (if
+ (i32.const 0)
+ (then
+ nop
+ )
+ )
+ )
+
+ ;; CHECK: (func $if-else-folded-result (type $2) (result i32)
+ ;; CHECK-NEXT: (if (result i32)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-folded-result (result i32)
+ (if (result i32)
+ (i32.const 0)
+ (then
+ i32.const 1
+ )
+ (else
+ i32.const 2
+ )
+ )
+ )
+
+ ;; CHECK: (func $if-else-folded-labeled-result (type $2) (result i32)
+ ;; CHECK-NEXT: (block $l (result i32)
+ ;; CHECK-NEXT: (if (result i32)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-folded-labeled-result (result i32)
+ (if $l (result i32)
+ (i32.const 0)
+ (then
+ i32.const 1
+ )
+ (else
+ i32.const 2
+ )
+ )
+ )
+
+ ;; CHECK: (func $if-else-mixed (type $void)
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (if (result i32)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (if (result i32)
+ ;; CHECK-NEXT: (i32.const 3)
+ ;; CHECK-NEXT: (i32.const 4)
+ ;; CHECK-NEXT: (i32.const 5)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 6)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 7)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $if-else-mixed
+ i32.const 0
+ if (result i32)
+ i32.const 1
+ else
+ i32.const 2
+ end
+ if
+ (if
+ (if (result i32)
+ (i32.const 3)
+ (then
+ (i32.const 4)
+ )
+ (else
+ (i32.const 5)
+ )
+ )
+ (then
+ i32.const 6
+ if
+ i32.const 7
+ drop
+ end
+ )
+ )
+ end
+ )
+
;; CHECK: (func $multivalue-nested (type $ret2) (result i32 i32)
;; CHECK-NEXT: (local $scratch (i32 i32))
;; CHECK-NEXT: (block (result i32 i32)