コード例 #1
0
   bool ProgramAnalysis :: AnalyseFunction(Function &F)
      {

        //Clear hottrace and merge_blocks

        HotTraceCounter = 0;
        MergeCounter = 0;
        DEBUG(errs()<<"\n==== Hot trace - Function : "<<  F.getName() <<" ====\n");
        DEBUG(errs()<<"BasicBlock \t    Execution Count        Predecessors\n");
        DEBUG(errs()<<"=========================================================");

        BasicBlock* bb=F.begin();

        //Calculate the Loop Backedges and set them in BackEdges
        FindFunctionBackedges(F,BackEdges);

        while (true)//Form the Hot trace.
          {
            DEBUG(errs() << "\n==========Hot trace:" << bb->getName() << "---"<<(int)PI->getExecutionCount(bb)<<"--");
            for (pred_iterator PI = pred_begin(bb), E = pred_end(bb); PI != E; ++PI)
              {
                  BasicBlock *Pred = *PI;
                  DEBUG(errs()<<" ;"<<Pred->getName());
              }
            checkNumPredecessors(bb);
            if (getNextBasicBlock(bb))
                bb = NextBlock;
            else
                break;
          }//while Loop

        //------- print Trace----------
        //testTrace();
        //------------------------------

        //F.dump();
        return true;
      }
コード例 #2
0
ファイル: Slicing.cpp プロジェクト: Guoanshisb/smack
Slice::Slice(Instruction& I, Slices& S, string name)
  : value(I), block(*I.getParent()), function(*block.getParent()),
    context(function.getContext()), slices(S), name(name) {

  EdgeList backedges;
  FindFunctionBackedges(function, backedges);

  queue<Instruction*> workList;
  workList.push(&I);

  while (!workList.empty()) {
    Instruction* I = workList.front();
    workList.pop();
    if (values.count(I) || inputs.count(I))
      continue;

    if (PHINode* Phi = dyn_cast<PHINode>(I)) {
      if (hasIncomingBackEdge(Phi, backedges)) {
        inputs.insert(I);
        continue;
      }
    }

    if (GlobalValue* G = usedGlobal(I))
      inputs.insert(G);

    if (Value* Q = getQuantifiedVariable(I))
      inputs.insert(Q);

    // Add inputs from any subslices, excluding quantified variables
    if (Slice* S = getSubslice(I,slices))
      for (unordered_set<Value*>::iterator V = S->inputs.begin(),
          E = S->inputs.end(); V != E; ++V)
        if (!inputs.count(*V) && !dyn_cast<ConstantDataSequential>(*V))
          inputs.insert(*V);

    values.insert(I);
    values.insert(I->getParent());

    // ENSURE EACH BLOCK HAS A TERMINATOR
    if (BranchInst* Br = dyn_cast<BranchInst>(I->getParent()->getTerminator()))
      if (I->getParent() != &block)
        workList.push(Br);

    if (BranchInst* Br = dyn_cast<BranchInst>(I)) {
      if (Br->isConditional()) {
        if (Instruction* J = dyn_cast<Instruction>(Br->getCondition())) {
          workList.push(J);
        }
        values.insert(Br->getSuccessor(1));
      }
      values.insert(Br->getSuccessor(0));
      continue;
    }

    if (PHINode* Phi = dyn_cast<PHINode>(I)) {
      for (PHINode::block_iterator B = Phi->block_begin(); B != Phi->block_end(); ++B) {
        workList.push( (*B)->getTerminator() );
      }
    }

    for (User::op_iterator U = I->op_begin(); U != I->op_end(); ++U) {
      if (Instruction* J = dyn_cast<Instruction>(U)) {
        if (!contains(backedges,J->getParent(),I->getParent())) {
          workList.push(J);
        }
      }
    }
  }

}