java.util.HashMap info = new java.util.HashMap();
HashMap info = new HashMap();
  public void perform (OPT_IR ir) {    // info is a mapping from OPT_Register to OPT_Register    java.util.HashMap info = new java.util.HashMap();    for (OPT_BasicBlock bb = ir.firstBasicBlockInCodeOrder(); 	 bb != null; 	 bb = bb.nextBasicBlockInCodeOrder()) {      if (!bb.isEmpty()) {	// iterate over all instructions in the basic block	for (OPT_Instruction s = bb.firstRealInstruction(), 	       sentinel = bb.lastInstruction();	     s != sentinel; 	     s = s.nextInstructionInCodeOrder()) {	  if (!info.isEmpty()) {	    // PROPAGATE COPIES	    int numUses = s.getNumberOfUses();	    if (numUses > 0) {	      boolean didSomething = false;	      int numDefs = s.getNumberOfDefs();	      for (int idx = numDefs; idx < numUses + numDefs; idx++) {		OPT_Operand use = s.getOperand(idx);		if (use instanceof OPT_RegisterOperand) {		  OPT_RegisterOperand rUse = (OPT_RegisterOperand)use;		  OPT_Operand value = (OPT_Operand)info.get(rUse.register);		  if (value != null) {		    didSomething = true;		    s.putOperand(idx, value.copy());		  }		}	      }	      if (didSomething) OPT_Simplifier.simplify(s);	    }	    // KILL	    boolean killPhysicals = s.isTSPoint() || s.operator().implicitDefs != 0;	    for (OPT_OperandEnumeration e = s.getDefs(); e.hasMoreElements();) {              OPT_Operand def = e.next();              if (def != null && def.isRegister()) {                OPT_Register r = def.asRegister().register;                info.remove(r);                // also must kill any registers mapped to r                // TODO: use a better data structure for efficiency.                // I'm being lazy for now in the name of avoiding                // premature optimization.                java.util.HashSet toRemove = new java.util.HashSet();                for (java.util.Iterator i = info.entrySet().iterator();                     i.hasNext(); ) {                  java.util.Map.Entry entry = (java.util.Map.Entry)i.next();                  OPT_Register eR =                    ((OPT_RegisterOperand)entry.getValue()).                    asRegister().register;                  if (eR == r || (killPhysicals && eR.isPhysical())) {                    // delay the removal to avoid ConcurrentModification                    // with iterator.                    toRemove.add(entry.getKey());                  }                }                // Now perform the removals.                for (java.util.Iterator i = toRemove.iterator(); i.hasNext();) {                  info.remove(i.next());                }              }            }	  }	  // GEN	  if (Move.conforms(s)) {	    OPT_Operand val = Move.getVal(s);	    if (val.isRegister()) {	      info.put(Move.getResult(s).register, val);	    } 	  }	}	info.clear();      }    }  }