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