basically can color

This commit is contained in:
2024-10-21 16:42:40 +00:00
parent 04ab579484
commit 8216cb774c
8 changed files with 284 additions and 51 deletions

View File

@ -7,41 +7,46 @@
using namespace opt;
void VarCollect(CFGType &cfg, std::vector<std::string> &id_to_var, std::unordered_map<std::string, size_t> &var_to_id) {
auto TryAddVar = [&](const std::string &var) {
if (var_to_id.find(var) == var_to_id.end()) {
id_to_var.push_back(var);
var_to_id[var] = id_to_var.size() - 1;
}
};
for (auto node : cfg.nodes) {
auto block = node->corresponding_block;
for (auto act : block->actions) {
if (auto bin_act = std::dynamic_pointer_cast<BinaryOperationAction>(act)) {
id_to_var.push_back(bin_act->result_full);
var_to_id[bin_act->result_full] = id_to_var.size() - 1;
TryAddVar(bin_act->result_full);
} else if (auto load_act = std::dynamic_pointer_cast<LoadAction>(act)) {
id_to_var.push_back(load_act->result_full);
var_to_id[load_act->result_full] = id_to_var.size() - 1;
TryAddVar(load_act->result_full);
} else if (auto get_act = std::dynamic_pointer_cast<GetElementPtrAction>(act)) {
id_to_var.push_back(get_act->result_full);
var_to_id[get_act->result_full] = id_to_var.size() - 1;
TryAddVar(get_act->result_full);
} else if (auto icmp_act = std::dynamic_pointer_cast<ICMPAction>(act)) {
id_to_var.push_back(icmp_act->result_full);
var_to_id[icmp_act->result_full] = id_to_var.size() - 1;
TryAddVar(icmp_act->result_full);
;
} else if (auto call_act = std::dynamic_pointer_cast<CallItem>(act)) {
if (!std::holds_alternative<LLVMVOIDType>(call_act->return_type)) {
id_to_var.push_back(call_act->result_full);
var_to_id[call_act->result_full] = id_to_var.size() - 1;
TryAddVar(call_act->result_full);
}
} else if (auto select_act = std::dynamic_pointer_cast<SelectItem>(act)) {
id_to_var.push_back(select_act->result_full);
var_to_id[select_act->result_full] = id_to_var.size() - 1;
TryAddVar(select_act->result_full);
} else if (auto move_act = std::dynamic_pointer_cast<MoveInstruct>(act)) {
id_to_var.push_back(move_act->dest_full);
var_to_id[move_act->dest_full] = id_to_var.size() - 1;
TryAddVar(move_act->dest_full);
} else if (auto force_def_act = std::dynamic_pointer_cast<ForceDef>(act)) {
id_to_var.push_back(force_def_act->var_full);
var_to_id[force_def_act->var_full] = id_to_var.size() - 1;
TryAddVar(force_def_act->var_full);
} else if (auto load_spilled_args_act = std::dynamic_pointer_cast<LoadSpilledArgs>(act)) {
id_to_var.push_back(load_spilled_args_act->var_full);
var_to_id[load_spilled_args_act->var_full] = id_to_var.size() - 1;
TryAddVar(load_spilled_args_act->var_full);
} else if (auto alloca_act = std::dynamic_pointer_cast<AllocaAction>(act)) {
TryAddVar(alloca_act->name_full);
}
}
}
for (size_t i = 0; i < id_to_var.size(); i++) {
if (var_to_id.find(id_to_var[i]) == var_to_id.end())
throw std::runtime_error("var_to_id.find(id_to_var[i])==var_to_id.end()");
if (i != var_to_id[id_to_var[i]]) throw std::runtime_error("i!=var_to_id[id_to_var[i]]");
}
}
void UseDefCollect(CFGType &cfg, [[maybe_unused]] std::vector<std::string> &id_to_var,
@ -146,7 +151,7 @@ void UseDefCollect(CFGType &cfg, [[maybe_unused]] std::vector<std::string> &id_t
cur_act_def.push_back(var_to_id[select_act->result_full]);
}
} else if (auto move_act = std::dynamic_pointer_cast<MoveInstruct>(act)) {
if (var_to_id.find(move_act->src_full) != var_to_id.end()) {
if (VRegCheck(move_act->src_full) && var_to_id.find(move_act->src_full) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[move_act->src_full]);
}
if (var_to_id.find(move_act->dest_full) != var_to_id.end()) {
@ -168,6 +173,8 @@ void UseDefCollect(CFGType &cfg, [[maybe_unused]] std::vector<std::string> &id_t
if (var_to_id.find(store_spilled_args_act->var_full) != var_to_id.end()) {
cur_act_use.push_back(var_to_id[store_spilled_args_act->var_full]);
}
} else if (auto alloca_act = std::dynamic_pointer_cast<AllocaAction>(act)) {
cur_act_def.push_back(var_to_id[alloca_act->name_full]);
}
std::sort(cur_act_use.begin(), cur_act_use.end());
std::sort(cur_act_def.begin(), cur_act_def.end());