summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/passes/DeadArgumentElimination.cpp15
-rw-r--r--src/passes/LocalSubtyping.cpp3
2 files changed, 15 insertions, 3 deletions
diff --git a/src/passes/DeadArgumentElimination.cpp b/src/passes/DeadArgumentElimination.cpp
index 7ba1be9f8..9d8fa5b0d 100644
--- a/src/passes/DeadArgumentElimination.cpp
+++ b/src/passes/DeadArgumentElimination.cpp
@@ -588,7 +588,8 @@ private:
// In terms of parameters, we can do this. However, we must also check
// local operations in the body, as if the parameter is reused and written
// to, then those types must be taken into account as well.
- for (auto* set : FindAll<LocalSet>(func->body).list) {
+ FindAll<LocalSet> sets(func->body);
+ for (auto* set : sets.list) {
auto index = set->index;
if (func->isParam(index) &&
!Type::isSubType(set->value->type, newParamTypes[index])) {
@@ -602,7 +603,7 @@ private:
return;
}
- // We can do this! Update the types, including the types of gets.
+ // We can do this! Update the types, including the types of gets and tees.
func->setParams(newParams);
for (auto* get : FindAll<LocalGet>(func->body).list) {
auto index = get->index;
@@ -610,6 +611,16 @@ private:
get->type = func->getLocalType(index);
}
}
+ for (auto* set : sets.list) {
+ auto index = set->index;
+ if (func->isParam(index) && set->isTee()) {
+ set->type = func->getLocalType(index);
+ set->finalize();
+ }
+ }
+
+ // Propagate the new get and set types outwards.
+ ReFinalize().walkFunctionInModule(func, module);
}
// See if the types returned from a function allow us to define a more refined
diff --git a/src/passes/LocalSubtyping.cpp b/src/passes/LocalSubtyping.cpp
index 9c6da1131..472463f44 100644
--- a/src/passes/LocalSubtyping.cpp
+++ b/src/passes/LocalSubtyping.cpp
@@ -134,8 +134,9 @@ struct LocalSubtyping : public WalkerPass<PostWalker<LocalSubtyping>> {
// NB: These tee updates will not be needed if the type of tees
// becomes that of their value, in the spec.
for (auto* set : setsForLocal[i]) {
- if (set->isTee() && set->type != Type::unreachable) {
+ if (set->isTee()) {
set->type = newType;
+ set->finalize();
}
}
}