use better BR

This commit is contained in:
2024-10-29 15:25:15 +00:00
parent 5634022bd9
commit 1b75ca5e75
8 changed files with 243 additions and 22 deletions

View File

@ -113,13 +113,9 @@ void UseDefCollect(CFGType &cfg, [[maybe_unused]] std::vector<std::string> &id_t
std::vector<size_t> &cur_act_use = node->action_use_vars[act.get()];
std::vector<size_t> &cur_act_def = node->action_def_vars[act.get()];
if (auto br_act = std::dynamic_pointer_cast<BRAction>(act)) {
if (var_to_id.find(br_act->cond) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[br_act->cond]);
}
throw std::runtime_error("BRAction should not appear in action list");
} else if (auto ret_act = std::dynamic_pointer_cast<RETAction>(act)) {
if (!std::holds_alternative<LLVMVOIDType>(ret_act->type) && var_to_id.find(ret_act->value) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[ret_act->value]);
}
throw std::runtime_error("RETAction should not appear in action list");
} else if (auto bin_act = std::dynamic_pointer_cast<BinaryOperationAction>(act)) {
if (var_to_id.find(bin_act->operand1_full) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[bin_act->operand1_full]);
@ -273,14 +269,46 @@ void UseDefCollect(CFGType &cfg, [[maybe_unused]] std::vector<std::string> &id_t
std::vector<size_t> &cur_act_use = node->action_use_vars[act.get()];
std::vector<size_t> &cur_act_def = node->action_def_vars[act.get()];
if (auto br_act = std::dynamic_pointer_cast<BRAction>(act)) {
if (var_to_id.find(br_act->cond) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[br_act->cond]);
if (auto beq_act = std::dynamic_pointer_cast<BEQAction>(br_act)) {
if (var_to_id.find(beq_act->rs1) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[beq_act->rs1]);
}
if (beq_act->rs1 != beq_act->rs2 && var_to_id.find(beq_act->rs2) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[beq_act->rs2]);
}
} else if (auto bne_act = std::dynamic_pointer_cast<BNEAction>(br_act)) {
if (var_to_id.find(bne_act->rs1) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[bne_act->rs1]);
}
if (bne_act->rs1 != bne_act->rs2 && var_to_id.find(bne_act->rs2) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[bne_act->rs2]);
}
} else if (auto blt_act = std::dynamic_pointer_cast<BLTAction>(br_act)) {
if (var_to_id.find(blt_act->rs1) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[blt_act->rs1]);
}
if (blt_act->rs1 != blt_act->rs2 && var_to_id.find(blt_act->rs2) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[blt_act->rs2]);
}
} else if (auto bge_act = std::dynamic_pointer_cast<BGEAction>(br_act)) {
if (var_to_id.find(bge_act->rs1) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[bge_act->rs1]);
}
if (bge_act->rs1 != bge_act->rs2 && var_to_id.find(bge_act->rs2) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[bge_act->rs2]);
}
} else {
if (var_to_id.find(br_act->cond) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[br_act->cond]);
}
}
} else if (auto ret_act = std::dynamic_pointer_cast<RETAction>(act)) {
if (!std::holds_alternative<LLVMVOIDType>(ret_act->type) && var_to_id.find(ret_act->value) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[ret_act->value]);
}
}
std::sort(cur_act_use.begin(), cur_act_use.end());
std::sort(cur_act_def.begin(), cur_act_def.end());
if (!use_def_init) {
use_def_init = true;
cur_node_use = cur_act_use;
@ -377,7 +405,24 @@ void ActionLevelTracking(CFGType &cfg, CFGNodeType *node) {
void LiveAnalysis(CFGType &cfg) {
VarCollect(cfg, cfg.id_to_var, cfg.var_to_id);
// std::cerr << "all vars collected" << std::endl;
// for (auto var : cfg.id_to_var) {
// std::cerr << "\tid=" << cfg.var_to_id[var] << " var=" << var << std::endl;
// }
UseDefCollect(cfg, cfg.id_to_var, cfg.var_to_id);
// for (auto node : cfg.nodes) {
// std::cerr << "block " << node->corresponding_block->label_full << std::endl;
// std::cerr << "\tblock_use_vars=";
// for (auto i : node->block_use_vars) {
// std::cerr << i << " ";
// }
// std::cerr << std::endl;
// std::cerr << "\tblock_def_vars=";
// for (auto i : node->block_def_vars) {
// std::cerr << i << " ";
// }
// std::cerr << std::endl;
// }
BlockLevelTracking(cfg, cfg.id_to_var, cfg.var_to_id);
for (auto node : cfg.nodes) {
ActionLevelTracking(cfg, node.get());