[StackSwitching] Prune continuations in LegalizeAndPruneJSInterface (#8523)
JS traps on these types.
diff --git a/src/passes/LegalizeJSInterface.cpp b/src/passes/LegalizeJSInterface.cpp
index 5a3d884..7621b7e 100644
--- a/src/passes/LegalizeJSInterface.cpp
+++ b/src/passes/LegalizeJSInterface.cpp
@@ -432,7 +432,7 @@
bool isIllegal(Type type) {
auto features = type.getFeatures();
return features.hasSIMD() || features.hasMultivalue() ||
- features.hasExceptionHandling();
+ features.hasExceptionHandling() || features.hasStackSwitching();
}
};
diff --git a/test/lit/passes/legalize-and-prune-js-interface.wast b/test/lit/passes/legalize-and-prune-js-interface.wast
index dbd168e..3ab3873 100644
--- a/test/lit/passes/legalize-and-prune-js-interface.wast
+++ b/test/lit/passes/legalize-and-prune-js-interface.wast
@@ -150,25 +150,32 @@
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(module
- ;; CHECK: (type $0 (func (param i64) (result i64)))
+ ;; CHECK: (type $func (func))
+ (type $func (func))
+ ;; CHECK: (type $cont (cont $func))
+ (type $cont (cont $func))
- ;; CHECK: (type $1 (func (param v128)))
+ ;; CHECK: (type $2 (func (param i64) (result i64)))
- ;; CHECK: (type $2 (func (result v128)))
+ ;; CHECK: (type $3 (func (param v128)))
- ;; CHECK: (type $3 (func (result i32 i32)))
+ ;; CHECK: (type $4 (func (result v128)))
- ;; CHECK: (type $4 (func (result exnref)))
+ ;; CHECK: (type $5 (func (result i32 i32)))
- ;; CHECK: (type $5 (func (param i32)))
+ ;; CHECK: (type $6 (func (result exnref)))
- ;; CHECK: (type $6 (func (param i32 i32) (result i32)))
+ ;; CHECK: (type $7 (func (param (ref null $cont))))
- ;; CHECK: (import "env" "setTempRet0" (func $setTempRet0 (type $5) (param i32)))
+ ;; CHECK: (type $8 (func (param i32)))
+
+ ;; CHECK: (type $9 (func (param i32 i32) (result i32)))
+
+ ;; CHECK: (import "env" "setTempRet0" (func $setTempRet0 (type $8) (param i32)))
;; CHECK: (export "export-64" (func $legalstub$export-64))
- ;; CHECK: (func $export-64 (type $0) (param $x i64) (result i64)
+ ;; CHECK: (func $export-64 (type $2) (param $x i64) (result i64)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $export-64 (export "export-64") (param $x i64) (result i64)
@@ -176,7 +183,7 @@
(unreachable)
)
- ;; CHECK: (func $export-v128 (type $1) (param $x v128)
+ ;; CHECK: (func $export-v128 (type $3) (param $x v128)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $export-v128 (export "export-v128") (param $x v128)
@@ -184,7 +191,7 @@
(unreachable)
)
- ;; CHECK: (func $export-v128-result (type $2) (result v128)
+ ;; CHECK: (func $export-v128-result (type $4) (result v128)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $export-v128-result (export "export-v128-result") (result v128)
@@ -192,7 +199,7 @@
(unreachable)
)
- ;; CHECK: (func $export-mv (type $3) (result i32 i32)
+ ;; CHECK: (func $export-mv (type $5) (result i32 i32)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $export-mv (export "export-mv") (result i32 i32)
@@ -200,16 +207,22 @@
(unreachable)
)
- ;; CHECK: (func $export-exn (type $4) (result exnref)
+ ;; CHECK: (func $export-exn (type $6) (result exnref)
;; CHECK-NEXT: (ref.null noexn)
;; CHECK-NEXT: )
(func $export-exn (export "export-exn") (result exnref)
;; This will be pruned.
(ref.null noexn)
)
+
+ ;; CHECK: (func $export-cont (type $7) (param $cont (ref null $cont))
+ ;; CHECK-NEXT: )
+ (func $export-cont (export "export-cont") (param $cont (ref null $cont))
+ ;; This will be pruned.
+ )
)
-;; CHECK: (func $legalstub$export-64 (type $6) (param $0 i32) (param $1 i32) (result i32)
+;; CHECK: (func $legalstub$export-64 (type $9) (param $0 i32) (param $1 i32) (result i32)
;; CHECK-NEXT: (local $2 i64)
;; CHECK-NEXT: (local.set $2
;; CHECK-NEXT: (call $export-64