Beispiel #1
0
void LoopReductor::depthFirstSearch(BasicBlock *bb, Vector<BasicBlock*> *ancestors) {
	ancestors->push(bb);
	MARK(bb) = true;


	SortedSLList<Edge*, EdgeDestOrder> successors;
	for (BasicBlock::OutIterator edge(bb); edge; edge++)
		successors.add(*edge);

	for (SortedSLList<Edge*, EdgeDestOrder>::Iterator edge(successors); edge; edge++) {
		if ((edge->kind() != Edge::CALL) && !edge->target()->isExit()){
			if (MARK(edge->target()) == false) {
				depthFirstSearch(edge->target(), ancestors);
			} else {
				if (ancestors->contains(edge->target())) {
					LOOP_HEADER(edge->target()) = true;
					BACK_EDGE(edge) = true;
					bool inloop = false;
					for (Vector<BasicBlock*>::Iterator member(*ancestors); member; member++) {
						if (*member == edge->target())
							inloop = true;
						if (inloop) {
							IN_LOOPS(member)->add(edge->target()->number());
						}

					}
				}
				/* GRUIIIIIIIIIK !!! pas performant, mais bon.. */
				for (dfa::BitSet::Iterator bit(**IN_LOOPS(edge->target())); bit; bit++) {
					bool inloop = false;
					for (Vector<BasicBlock*>::Iterator member(*ancestors); member; member++) {
						if (member->number() == *bit)
							inloop = true;
						if (inloop) {
							IN_LOOPS(member)->add(*bit);
						}

					}
				}
			}
		}
	}
	ancestors->pop();
}
Beispiel #2
0
void solveSLList(string input, string output, string okfile) {
    ifstream fin(input);
    ofstream fout(output);
    ifstream fok(okfile);
    int n;
    fin >> n;
    SortedSLList <pair<double, double> > v;
    for(int i = 0 ; i < n ; ++ i) {
        double st, dr;
        fin >> st >> dr;
        v.add(make_pair(dr, st));
    }
    vector <int> ans = baloonSelectionProblem(&v);
    int sol;
    fok >> sol;
    assert(sol == ans.size());
    fout << ans.size() << '\n';
    for(auto it : ans)
        fout << v.getAtIndex(it).first << ' ' << v.getAtIndex(it).second << '\n';
}