From 8e4e133fa02f94ec4123d44f2be7a5cd0e64bcec Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Thu, 24 Oct 2024 05:06:41 +0000 Subject: [PATCH] fix local var error caused by GloabalVarCache --- src/opt/global_var_cache.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/opt/global_var_cache.cpp b/src/opt/global_var_cache.cpp index 11202b7..f4498aa 100644 --- a/src/opt/global_var_cache.cpp +++ b/src/opt/global_var_cache.cpp @@ -94,12 +94,12 @@ void GlobalBuildDomForFunction(const std::shared_ptr &func, con } std::unordered_map InNodeReplace( - CFGNodeType *cur_node, std::unordered_map> &var_to_name_stk) { + CFGNodeType *cur_node, std::unordered_map> &var_to_name_stk, + std::unordered_map &is_an_alias_generated_by_load) { std::unordered_map var_to_versions_pushed; BlockItem *cur_block = cur_node->corresponding_block; std::list> new_actions; - std::unordered_map 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 InNodeReplace( cur_block->actions = new_actions; return var_to_versions_pushed; } -void GlobalDFSReplace(CFGNodeType *cur_node, - std::unordered_map> &var_to_name_stk) { +void GlobalDFSReplace(CFGNodeType *cur_node, std::unordered_map> &var_to_name_stk, + std::unordered_map is_an_alias_generated_by_load) { // std::cerr << "GlobalDFSReplace: " << cur_node->corresponding_block->label_full << std::endl; std::unordered_map 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 &f var_to_name_stk[var] = std::stack(); var_to_name_stk[var].push("~"); } - GlobalDFSReplace(cfg.entry, var_to_name_stk); + std::unordered_map 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) {