void dominatorCFG::calcPostDominators() { unsigned i; //fill in predecessor and successors for (i=0; i<all_blocks.size(); i++) all_blocks[i]->postDominatorPredAndSucc(); if (!entryBlock->succ.size()) { //The function doesn't have an exit block return; } //Perform main computation performComputation(); //Store results for (i=0; i<all_blocks.size(); i++) { dominatorBB *bb = all_blocks[i]; if (!bb || !bb->bpatchBlock || !bb->immDom || !bb->immDom->bpatchBlock) continue; BPatch_basicBlock *immDom = bb->immDom->bpatchBlock; BPatch_basicBlock *block = bb->bpatchBlock; block->immediatePostDominator = immDom; if (!immDom->immediatePostDominates) immDom->immediatePostDominates = new BPatch_Set<BPatch_basicBlock *>; immDom->immediatePostDominates->insert(block); } }
bool doWork(std::function<bool(int)> filter, // as before int maxVal = tenMillion) { std::vector<int> goodVals; // as before ThreadRAII t( std::thread([&filter, maxVal, &goodVals] { for (auto i = 0; i <= maxVal; ++i) { if (filter(i)) goodVals.push_back(i); } }), ThreadRAII::DtorAction::join // RAII action ); auto nh = t.get().native_handle(); // ... if (conditionsAreSatisfied()) { t.get().join(); performComputation(goodVals); return true; } return false; }
void dominatorCFG::calcDominators() { //fill in predecessor and successors unsigned i; for (i=0; i<all_blocks.size(); i++) all_blocks[i]->dominatorPredAndSucc(); //Perform main computation performComputation(); //Store results for (i=0; i<all_blocks.size(); i++) { dominatorBB *bb = all_blocks[i]; if (!bb || !bb->bpatchBlock || !bb->immDom || !bb->immDom->bpatchBlock) continue; BPatch_basicBlock *immDom = bb->immDom->bpatchBlock; BPatch_basicBlock *block = bb->bpatchBlock; block->immediateDominator = immDom; if (!immDom->immediateDominates) immDom->immediateDominates = new BPatch_Set<BPatch_basicBlock *>; immDom->immediateDominates->insert(block); } }