fix local var error caused by GloabalVarCache

This commit is contained in:
2024-10-24 05:06:41 +00:00
parent d690d9ae73
commit 8e4e133fa0

View File

@ -94,12 +94,12 @@ void GlobalBuildDomForFunction(const std::shared_ptr<FunctionDefItem> &func, con
}
std::unordered_map<std::string, size_t> InNodeReplace(
CFGNodeType *cur_node, std::unordered_map<std::string, std::stack<std::string>> &var_to_name_stk) {
CFGNodeType *cur_node, std::unordered_map<std::string, std::stack<std::string>> &var_to_name_stk,
std::unordered_map<std::string, std::string> &is_an_alias_generated_by_load) {
std::unordered_map<std::string, size_t> var_to_versions_pushed;
BlockItem *cur_block = cur_node->corresponding_block;
std::list<std::shared_ptr<ActionItem>> new_actions;
std::unordered_map<std::string, std::string> is_an_alias_generated_by_load;
for (auto [origin_var_name, _] : var_to_name_stk) {
for (auto &[origin_var_name, _] : var_to_name_stk) {
if (cur_block->phi_map.find(origin_var_name) != cur_block->phi_map.end()) {
var_to_name_stk[origin_var_name].push(cur_block->phi_map[origin_var_name]->result_full);
var_to_versions_pushed[origin_var_name]++;
@ -206,12 +206,12 @@ std::unordered_map<std::string, size_t> InNodeReplace(
cur_block->actions = new_actions;
return var_to_versions_pushed;
}
void GlobalDFSReplace(CFGNodeType *cur_node,
std::unordered_map<std::string, std::stack<std::string>> &var_to_name_stk) {
void GlobalDFSReplace(CFGNodeType *cur_node, std::unordered_map<std::string, std::stack<std::string>> &var_to_name_stk,
std::unordered_map<std::string, std::string> is_an_alias_generated_by_load) {
// std::cerr << "GlobalDFSReplace: " << cur_node->corresponding_block->label_full << std::endl;
std::unordered_map<std::string, size_t> var_to_version_pushed;
// step 1: process current node
var_to_version_pushed = InNodeReplace(cur_node, var_to_name_stk);
var_to_version_pushed = InNodeReplace(cur_node, var_to_name_stk, is_an_alias_generated_by_load);
// step 2: process the phi commands in the successors in cfg
for (auto [origin_var_name, _] : var_to_name_stk) {
for (auto succ : cur_node->successors) {
@ -222,9 +222,22 @@ void GlobalDFSReplace(CFGNodeType *cur_node,
}
}
}
for (auto succ : cur_node->successors) {
for (auto &[var, _] : succ->corresponding_block->phi_map) {
if (var_to_name_stk.find(var) == var_to_name_stk.end()) {
// this phi is generated by mem2reg
auto cur_phi = succ->corresponding_block->phi_map[var];
for (auto &[val, _] : cur_phi->values) {
if (is_an_alias_generated_by_load.find(val) != is_an_alias_generated_by_load.end()) {
val = is_an_alias_generated_by_load[val];
}
}
}
}
}
// step 3: process the successors in dom tree
for (auto succ : cur_node->successors_in_dom_tree) {
GlobalDFSReplace(succ, var_to_name_stk);
GlobalDFSReplace(succ, var_to_name_stk, is_an_alias_generated_by_load);
}
// step 4: restore the stack
for (auto [var, version_pushed] : var_to_version_pushed) {
@ -296,7 +309,8 @@ void ConductGloabalVarCacheForFunction(const std::shared_ptr<FunctionDefItem> &f
var_to_name_stk[var] = std::stack<std::string>();
var_to_name_stk[var].push("~");
}
GlobalDFSReplace(cfg.entry, var_to_name_stk);
std::unordered_map<std::string, std::string> is_an_alias_generated_by_load;
GlobalDFSReplace(cfg.entry, var_to_name_stk, is_an_alias_generated_by_load);
for (auto node : cfg.nodes) {
auto block = node->corresponding_block;
for (auto &[var, _] : var_to_name_stk) {