diff options
Diffstat (limited to 'src/ast_utils.h')
-rw-r--r-- | src/ast_utils.h | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/src/ast_utils.h b/src/ast_utils.h index aa4120569..823c08f9c 100644 --- a/src/ast_utils.h +++ b/src/ast_utils.h @@ -21,6 +21,7 @@ #include "wasm-traversal.h" #include "wasm-builder.h" #include "pass.h" +#include "ast/branch-utils.h" namespace wasm { @@ -371,24 +372,19 @@ struct ReFinalize : public WalkerPass<PostWalker<ReFinalize>> { void visitLoop(Loop *curr) { curr->finalize(); } void visitBreak(Break *curr) { curr->finalize(); - if (curr->value && curr->value->type == unreachable) { - return; // not an actual break + if (BranchUtils::isBranchTaken(curr)) { + breakValues[curr->name] = getValueType(curr->value); } - if (curr->condition && curr->condition->type == unreachable) { - return; // not an actual break - } - breakValues[curr->name] = getValueType(curr->value); } void visitSwitch(Switch *curr) { curr->finalize(); - if (curr->condition->type == unreachable || (curr->value && curr->value->type == unreachable)) { - return; // not an actual break - } - auto valueType = getValueType(curr->value); - for (auto target : curr->targets) { - breakValues[target] = valueType; + if (BranchUtils::isBranchTaken(curr)) { + auto valueType = getValueType(curr->value); + for (auto target : curr->targets) { + breakValues[target] = valueType; + } + breakValues[curr->default_] = valueType; } - breakValues[curr->default_] = valueType; } void visitCall(Call *curr) { curr->finalize(); } void visitCallImport(CallImport *curr) { curr->finalize(); } |