if (bb instanceof OPT_ExceptionHandlerBasicBlock) {  for (int i=0; i<NUM_ALLOCATABLE_FPR; i++) { OPT_Register fpr = phys.getFPR(i); bb.prependInstruction(MIR_UnaryNoRes.create(DUMMY_USE, OPT_IRTools.D(fpr))); bb.prependInstruction(MIR_Nullary.create(DUMMY_DEF, OPT_IRTools.D(fpr))); } }
  final void perform(OPT_IR ir)  {    OPT_PhysicalRegisterSet phys = ir.regpool.getPhysicalRegisterSet();    for (Enumeration b = ir.getBasicBlocks(); b.hasMoreElements(); ) {      OPT_BasicBlock bb = (OPT_BasicBlock)b.nextElement();            // The following holds the floating point stack offset from its      // 'normal' position.      int fpStackOffset = 0;      for (Enumeration inst = bb.forwardInstrEnumerator();            inst.hasMoreElements();) {        OPT_Instruction s = (OPT_Instruction)inst.nextElement();        if (s.operator().isFpPop()) {          // A pop instruction 'ends' a dummy live range.          OPT_Register fpr = phys.getFPR(NUM_ALLOCATABLE_FPR-fpStackOffset);          s.insertAfter(MIR_UnaryNoRes.create(DUMMY_USE,OPT_IRTools.D(fpr)));          fpStackOffset--;        } else if (s.operator().isFpPush()) {          fpStackOffset++;          OPT_Register fpr = phys.getFPR(NUM_ALLOCATABLE_FPR-fpStackOffset);          s.insertBefore(MIR_Nullary.create(DUMMY_DEF,OPT_IRTools.D(fpr)));        }        if (VM.VerifyAssertions) VM.assert(fpStackOffset >= 0);        if (VM.VerifyAssertions) VM.assert(fpStackOffset <                                           NUM_ALLOCATABLE_FPR);      }    }  } 