diff options
Diffstat (limited to 'src/wasm-traversal.h')
-rw-r--r-- | src/wasm-traversal.h | 113 |
1 files changed, 0 insertions, 113 deletions
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h index 5678d2f77..d3e2a19da 100644 --- a/src/wasm-traversal.h +++ b/src/wasm-traversal.h @@ -519,119 +519,6 @@ struct ExpressionStackWalker : public PostWalker<SubType, VisitorType> { } }; -// Traversal in the order of execution. This is quick and simple, but -// does not provide the same comprehensive information that a full -// conversion to basic blocks would. What it does give is a quick -// way to view straightline execution traces, i.e., that have no -// branching. This can let optimizations get most of what they -// want without the cost of creating another AST. -// -// When execution is no longer linear, this notifies via a call -// to noteNonLinear(). - -template<typename SubType, typename VisitorType = Visitor<SubType>> -struct LinearExecutionWalker : public PostWalker<SubType, VisitorType> { - LinearExecutionWalker() = default; - - // subclasses should implement this - void noteNonLinear(Expression* curr) { abort(); } - - static void doNoteNonLinear(SubType* self, Expression** currp) { - self->noteNonLinear(*currp); - } - - static void scan(SubType* self, Expression** currp) { - - Expression* curr = *currp; - - switch (curr->_id) { - case Expression::Id::InvalidId: - abort(); - case Expression::Id::BlockId: { - self->pushTask(SubType::doVisitBlock, currp); - if (curr->cast<Block>()->name.is()) { - self->pushTask(SubType::doNoteNonLinear, currp); - } - auto& list = curr->cast<Block>()->list; - for (int i = int(list.size()) - 1; i >= 0; i--) { - self->pushTask(SubType::scan, &list[i]); - } - break; - } - case Expression::Id::IfId: { - self->pushTask(SubType::doVisitIf, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - self->maybePushTask(SubType::scan, &curr->cast<If>()->ifFalse); - self->pushTask(SubType::doNoteNonLinear, currp); - self->pushTask(SubType::scan, &curr->cast<If>()->ifTrue); - self->pushTask(SubType::doNoteNonLinear, currp); - self->pushTask(SubType::scan, &curr->cast<If>()->condition); - break; - } - case Expression::Id::LoopId: { - self->pushTask(SubType::doVisitLoop, currp); - self->pushTask(SubType::scan, &curr->cast<Loop>()->body); - self->pushTask(SubType::doNoteNonLinear, currp); - break; - } - case Expression::Id::BreakId: { - self->pushTask(SubType::doVisitBreak, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - self->maybePushTask(SubType::scan, &curr->cast<Break>()->condition); - self->maybePushTask(SubType::scan, &curr->cast<Break>()->value); - break; - } - case Expression::Id::SwitchId: { - self->pushTask(SubType::doVisitSwitch, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - self->maybePushTask(SubType::scan, &curr->cast<Switch>()->value); - self->pushTask(SubType::scan, &curr->cast<Switch>()->condition); - break; - } - case Expression::Id::ReturnId: { - self->pushTask(SubType::doVisitReturn, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - self->maybePushTask(SubType::scan, &curr->cast<Return>()->value); - break; - } - case Expression::Id::TryId: { - self->pushTask(SubType::doVisitTry, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - auto& list = curr->cast<Try>()->catchBodies; - for (int i = int(list.size()) - 1; i >= 0; i--) { - self->pushTask(SubType::scan, &list[i]); - self->pushTask(SubType::doNoteNonLinear, currp); - } - self->pushTask(SubType::scan, &curr->cast<Try>()->body); - break; - } - case Expression::Id::ThrowId: { - self->pushTask(SubType::doVisitThrow, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - auto& list = curr->cast<Throw>()->operands; - for (int i = int(list.size()) - 1; i >= 0; i--) { - self->pushTask(SubType::scan, &list[i]); - } - break; - } - case Expression::Id::RethrowId: { - self->pushTask(SubType::doVisitRethrow, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - break; - } - case Expression::Id::UnreachableId: { - self->pushTask(SubType::doVisitUnreachable, currp); - self->pushTask(SubType::doNoteNonLinear, currp); - break; - } - default: { - // other node types do not have control flow, use regular post-order - PostWalker<SubType, VisitorType>::scan(self, currp); - } - } - } -}; - } // namespace wasm #endif // wasm_wasm_traversal_h |