PhiAnalysis::PhiAnalysis(const SourceInfo::ArgNames& arg_names, CFG* cfg, LivenessAnalysis* liveness, ScopeInfo* scope_info) : definedness(arg_names, cfg, scope_info), liveness(liveness) { Timer _t("PhiAnalysis()", 10); for (CFGBlock* block : cfg->blocks) { RequiredSet required; if (block->predecessors.size() > 1) { for (CFGBlock* pred : block->predecessors) { const RequiredSet& defined = definedness.getDefinedNamesAtEnd(pred); for (const auto& s : defined) { if (required.count(s) == 0 && liveness->isLiveAtEnd(s, pred)) { // printf("%d-%d %s\n", pred->idx, block->idx, s.c_str()); required.insert(s); } } } } required_phis.insert(make_pair(block, std::move(required))); } static StatCounter us_phis("us_compiling_analysis_phis"); us_phis.log(_t.end()); }
DefinednessAnalysis::DefinednessAnalysis(AST_arguments *args, CFG* cfg, ScopeInfo *scope_info) : scope_info(scope_info) { results = computeFixedPoint(cfg, DefinednessBBAnalyzer(cfg, args), false); for (const auto &p : results) { RequiredSet required; for (const auto &p2 : p.second) { if (scope_info->refersToGlobal(p2.first)) continue; //printf("%d %s %d\n", p.first->idx, p2.first.c_str(), p2.second); required.insert(p2.first); } defined.insert(make_pair(p.first, required)); } }
DefinednessAnalysis::DefinednessAnalysis(AST_arguments *args, CFG* cfg, ScopeInfo *scope_info) : scope_info(scope_info) { results = computeFixedPoint(cfg, DefinednessBBAnalyzer(args), false); for (std::unordered_map<CFGBlock*, std::unordered_map<std::string, DefinitionLevel> >::iterator it = results.begin(), end = results.end(); it != end; ++it) { RequiredSet required; for (std::unordered_map<std::string, DefinitionLevel>::iterator it2 = it->second.begin(), end2 = it->second.end(); it2 != end2; ++it2) { if (scope_info->refersToGlobal(it2->first)) continue; //printf("%d %s %d\n", it->first->idx, it2->first.c_str(), it2->second); required.insert(it2->first); } defined.insert(make_pair(it->first, required)); } }
PhiAnalysis::PhiAnalysis(AST_arguments* args, CFG* cfg, LivenessAnalysis *liveness, ScopeInfo *scope_info) : definedness(args, cfg, scope_info), liveness(liveness) { for (CFGBlock *block : cfg->blocks) { RequiredSet required; if (block->predecessors.size() < 2) continue; const RequiredSet& defined = definedness.getDefinedNamesAt(block); if (defined.size()) assert(block->predecessors.size()); for (const auto &s : defined) { if (liveness->isLiveAtEnd(s, block->predecessors[0])) { required.insert(s); } } required_phis.insert(make_pair(block, required)); } }
PhiAnalysis::PhiAnalysis(AST_arguments* args, CFG* cfg, LivenessAnalysis *liveness, ScopeInfo *scope_info) : definedness(args, cfg, scope_info), liveness(liveness) { for (int i = 0; i < cfg->blocks.size(); i++) { CFGBlock *block = cfg->blocks[i]; RequiredSet required; if (block->predecessors.size() < 2) continue; const RequiredSet& defined = definedness.getDefinedNamesAt(block); if (defined.size()) assert(block->predecessors.size()); for (RequiredSet::const_iterator it = defined.begin(), end = defined.end(); it != end; ++it) { if (liveness->isLiveAtEnd(*it, block->predecessors[0])) { required.insert(*it); } } required_phis.insert(make_pair(block, required)); } }
DefinednessAnalysis::DefinednessAnalysis(const SourceInfo::ArgNames& arg_names, CFG* cfg, ScopeInfo* scope_info) : scope_info(scope_info) { Timer _t("DefinednessAnalysis()", 10); results = computeFixedPoint(cfg, DefinednessBBAnalyzer(cfg, arg_names), false); for (const auto& p : results) { RequiredSet required; for (const auto& p2 : p.second) { if (scope_info->refersToGlobal(p2.first)) continue; // printf("%d %s %d\n", p.first->idx, p2.first.c_str(), p2.second); required.insert(p2.first); } defined_at_end.insert(make_pair(p.first, required)); } static StatCounter us_definedness("us_compiling_analysis_definedness"); us_definedness.log(_t.end()); }