Пример #1
0
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());
}
Пример #2
0
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));
    }
}
Пример #3
0
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));
    }
}
Пример #4
0
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));
    }
}
Пример #5
0
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));
    }
}
Пример #6
0
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());
}