final void unfactor(IR ir){
  for (Enumeration<Instruction> e=forwardRealInstrEnumerator(); e.hasMoreElements(); ) {
    Instruction s=e.nextElement();
    Enumeration<BasicBlock> expOuts=getApplicableExceptionalOut(s);
    if (expOuts.hasMoreElements() && e.hasMoreElements()) {
      BasicBlock next=splitNodeWithLinksAt(s,ir);
      next.unfactor(ir);
      pruneExceptionalOut(ir);
      return;
    }
  }
}

final void unfactor ( IR ir ) { for ( Enumeration < Instruction > e = forwardRealInstrEnumerator ( ) ; e . hasMoreElements ( ) ; ) { Instruction s = e . nextElement ( ) ; Enumeration < BasicBlock > expOuts = getApplicableExceptionalOut ( s ) ; if ( expOuts . hasMoreElements ( ) && e . hasMoreElements ( ) ) { BasicBlock next = splitNodeWithLinksAt ( s , ir ) ; next . unfactor ( ir ) ; pruneExceptionalOut ( ir ) ; return ; } } }
convert a block in the fcfg into the equivalent set of cfg blocks by splitting the original block into sub - blocks at each pei that reaches at least one exception handelr . note : this is sufficient for intraprocedural analysis , since the only program point at which the " wrong " answers will be computed is the exit node , but is not good enough for interprocedural analyses . to do an interprocedural analysis , either the analysis needs to deal with the fcfg or all nodes that modify globally visible state must be unfactored .
