fix local var error caused by GloabalVarCache
This commit is contained in:
@ -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) {
|
||||
|
Reference in New Issue
Block a user