fix use def issues (#629)

This commit is contained in:
water111
2021-06-26 16:31:38 -04:00
committed by GitHub
parent 1ffd42e090
commit ae2666a7c5
7 changed files with 126 additions and 18 deletions
+14 -6
View File
@@ -350,14 +350,15 @@ std::vector<FormElement*> FormStack::rewrite(FormPool& pool, const Env& env) con
return result;
}
void rewrite_to_get_var(std::vector<FormElement*>& default_result,
FormPool& pool,
const RegisterAccess& var,
const Env& env) {
std::optional<RegisterAccess> rewrite_to_get_var(std::vector<FormElement*>& default_result,
FormPool& pool,
const RegisterAccess& var,
const Env& env) {
bool keep_going = true;
RegisterAccess var_to_get = var;
std::vector<FormElement*> result;
std::optional<RegisterAccess> result_access;
bool first = true;
while (keep_going && !default_result.empty()) {
@@ -386,26 +387,33 @@ void rewrite_to_get_var(std::vector<FormElement*>& default_result,
} else {
result = last_op_as_set->src()->elts();
}
result_access = last_op_as_set->dst();
}
first = false;
}
if (result.empty()) {
default_result.push_back(pool.alloc_element<SimpleAtomElement>(SimpleAtom::make_var(var)));
return {};
} else {
for (auto x : result) {
x->parent_form = nullptr;
default_result.push_back(x);
}
return result_access;
}
}
std::vector<FormElement*> rewrite_to_get_var(FormStack& stack,
FormPool& pool,
const RegisterAccess& var,
const Env& env) {
const Env& env,
std::optional<RegisterAccess>* used_var) {
auto default_result = stack.rewrite(pool, env);
rewrite_to_get_var(default_result, pool, var, env);
auto uv = rewrite_to_get_var(default_result, pool, var, env);
if (used_var) {
*used_var = uv;
}
return default_result;
}