Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/passes/Print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3550,7 +3550,8 @@ static std::ostream& printStackIR(StackIR* ir, PrintSExpression& printer) {
[[fallthrough]];
case StackInst::BlockBegin:
case StackInst::IfBegin:
case StackInst::LoopBegin: {
case StackInst::LoopBegin:
case StackInst::TryTableBegin: {
controlFlowDepth++;
doIndent();
PrintExpressionContents(printer).visit(inst->origin);
Expand All @@ -3562,7 +3563,8 @@ static std::ostream& printStackIR(StackIR* ir, PrintSExpression& printer) {
[[fallthrough]];
case StackInst::BlockEnd:
case StackInst::IfEnd:
case StackInst::LoopEnd: {
case StackInst::LoopEnd:
case StackInst::TryTableEnd: {
controlFlowDepth--;
indent--;
doIndent();
Expand Down
9 changes: 6 additions & 3 deletions src/passes/StackIR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,8 @@ class StackIROptimizer {
case StackInst::Catch:
case StackInst::CatchAll:
case StackInst::Delegate:
case StackInst::TryEnd: {
case StackInst::TryEnd:
case StackInst::TryTableEnd: {
return true;
}
default: { return false; }
Expand All @@ -305,7 +306,8 @@ class StackIROptimizer {
case StackInst::BlockBegin:
case StackInst::IfBegin:
case StackInst::LoopBegin:
case StackInst::TryBegin: {
case StackInst::TryBegin:
case StackInst::TryTableBegin: {
return true;
}
default: { return false; }
Expand All @@ -319,7 +321,8 @@ class StackIROptimizer {
case StackInst::IfEnd:
case StackInst::LoopEnd:
case StackInst::TryEnd:
case StackInst::Delegate: {
case StackInst::Delegate:
case StackInst::TryTableEnd: {
return true;
}
default: { return false; }
Expand Down
30 changes: 16 additions & 14 deletions src/wasm-stack.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,20 +60,22 @@ class StackInst {
StackInst(MixedArena&) {}

enum Op {
Basic, // an instruction directly corresponding to a non-control-flow
// Binaryen IR node
BlockBegin, // the beginning of a block
BlockEnd, // the ending of a block
IfBegin, // the beginning of a if
IfElse, // the else of a if
IfEnd, // the ending of a if
LoopBegin, // the beginning of a loop
LoopEnd, // the ending of a loop
TryBegin, // the beginning of a try
Catch, // the catch within a try
CatchAll, // the catch_all within a try
Delegate, // the delegate within a try
TryEnd // the ending of a try
Basic, // an instruction directly corresponding to a
// non-control-flow Binaryen IR node
BlockBegin, // the beginning of a block
BlockEnd, // the ending of a block
IfBegin, // the beginning of a if
IfElse, // the else of a if
IfEnd, // the ending of a if
LoopBegin, // the beginning of a loop
LoopEnd, // the ending of a loop
TryBegin, // the beginning of a try
Catch, // the catch within a try
CatchAll, // the catch_all within a try
Delegate, // the delegate within a try
TryEnd, // the ending of a try
TryTableBegin, // the beginning of a try_table
TryTableEnd // the ending of a try_table
} op;

Expression* origin; // the expression this originates from
Expand Down
21 changes: 14 additions & 7 deletions src/wasm/wasm-stack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2680,6 +2680,8 @@ void StackIRGenerator::emit(Expression* curr) {
stackInst = makeStackInst(StackInst::LoopBegin, curr);
} else if (curr->is<Try>()) {
stackInst = makeStackInst(StackInst::TryBegin, curr);
} else if (curr->is<TryTable>()) {
stackInst = makeStackInst(StackInst::TryTableBegin, curr);
} else {
stackInst = makeStackInst(curr);
}
Expand All @@ -2696,6 +2698,8 @@ void StackIRGenerator::emitScopeEnd(Expression* curr) {
stackInst = makeStackInst(StackInst::LoopEnd, curr);
} else if (curr->is<Try>()) {
stackInst = makeStackInst(StackInst::TryEnd, curr);
} else if (curr->is<TryTable>()) {
stackInst = makeStackInst(StackInst::TryTableEnd, curr);
} else {
WASM_UNREACHABLE("unexpected expr type");
}
Expand All @@ -2709,14 +2713,15 @@ StackInst* StackIRGenerator::makeStackInst(StackInst::Op op,
ret->origin = origin;
auto stackType = origin->type;
if (origin->is<Block>() || origin->is<Loop>() || origin->is<If>() ||
origin->is<Try>()) {
origin->is<Try>() || origin->is<TryTable>()) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can replace this condition with Properties::isControlFlowStructure perhaps? It's equivalent and I think it has the right meaning here.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

if (stackType == Type::unreachable) {
// There are no unreachable blocks, loops, or ifs. we emit extra
// unreachables to fix that up, so that they are valid as having none
// type.
// There are no unreachable blocks, loops, ifs, trys, or try_tables. we
// emit extra unreachables to fix that up, so that they are valid as
// having none type.
stackType = Type::none;
} else if (op != StackInst::BlockEnd && op != StackInst::IfEnd &&
op != StackInst::LoopEnd && op != StackInst::TryEnd) {
op != StackInst::LoopEnd && op != StackInst::TryEnd &&
op != StackInst::TryTableEnd) {
// If a concrete type is returned, we mark the end of the construct has
// having that type (as it is pushed to the value stack at that point),
// other parts are marked as none).
Expand All @@ -2742,7 +2747,8 @@ void StackIRToBinaryWriter::write() {
case StackInst::Basic:
case StackInst::BlockBegin:
case StackInst::IfBegin:
case StackInst::LoopBegin: {
case StackInst::LoopBegin:
case StackInst::TryTableBegin: {
writer.visit(inst->origin);
break;
}
Expand All @@ -2751,7 +2757,8 @@ void StackIRToBinaryWriter::write() {
[[fallthrough]];
case StackInst::BlockEnd:
case StackInst::IfEnd:
case StackInst::LoopEnd: {
case StackInst::LoopEnd:
case StackInst::TryTableEnd: {
writer.emitScopeEnd(inst->origin);
break;
}
Expand Down
61 changes: 61 additions & 0 deletions test/lit/passes/stack-ir-eh.wast
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
;; RUN: wasm-opt %s --generate-stack-ir --optimize-stack-ir \
;; RUN: -all --print-stack-ir | filecheck %s

(module
;; CHECK: (tag $e-i32 (param i32))
(tag $e-i32 (param i32))

;; CHECK: (func $foo (type $0)
;; CHECK-NEXT: )
(func $foo)

;; CHECK: (func $test (type $0)
;; CHECK-NEXT: block $outer
;; CHECK-NEXT: block $l-catch (result i32)
;; CHECK-NEXT: block $l-catch-ref (type $1) (result i32 exnref)
;; CHECK-NEXT: block $l-catch-all
;; CHECK-NEXT: block $l-catch-all-ref (result exnref)
;; CHECK-NEXT: try_table (catch $e-i32 $l-catch) (catch_ref $e-i32 $l-catch-ref) (catch_all $l-catch-all) (catch_all_ref $l-catch-all-ref)
;; CHECK-NEXT: call $foo
;; CHECK-NEXT: end
;; CHECK-NEXT: br $outer
;; CHECK-NEXT: end
;; CHECK-NEXT: throw_ref
;; CHECK-NEXT: end
;; CHECK-NEXT: br $outer
;; CHECK-NEXT: end
;; CHECK-NEXT: tuple.drop 2
;; CHECK-NEXT: br $outer
;; CHECK-NEXT: end
;; CHECK-NEXT: drop
;; CHECK-NEXT: end
;; CHECK-NEXT: )
(func $test
(block $outer
(drop
(block $l-catch (result i32)
(tuple.drop 2
(block $l-catch-ref (result i32 exnref)
(block $l-catch-all
(throw_ref
(block $l-catch-all-ref (result exnref)
(try_table (catch $e-i32 $l-catch)
(catch_ref $e-i32 $l-catch-ref)
(catch_all $l-catch-all)
(catch_all_ref $l-catch-all-ref)
(call $foo)
)
(br $outer)
)
)
)
(br $outer)
)
)
(br $outer)
)
)
)
)
)