private void loadHelper(OPT_IR ir, OPT_AvExCache cache,
private void loadHelper(OPT_IR ir, AvExCache cache,
  private void loadHelper(OPT_IR ir, OPT_AvExCache cache, 			  OPT_Instruction inst) {    // look up the expression in the cache    OPT_AvailableExpression ae = cache.find(inst);    if (ae != null) {      OPT_RegisterOperand dest = ResultCarrier.getClearResult(inst);      if (ae.tmp == null) {        // (1) generate a new temporary, and store in the AE cache	OPT_RegisterOperand newRes = ir.regpool.makeTemp(dest.type);	ae.tmp = newRes.register;        // (2) get the CSE value into newRes        if (ae.isLoad()) {          // the first appearance was a load.	  // Modify the first load to assign its result to a new temporary	  // and then insert a move from the new temporary to the old result 	  // after the mutated first load.	  OPT_RegisterOperand res = ResultCarrier.getClearResult(ae.inst);	  ResultCarrier.setResult(ae.inst, newRes);	  ae.inst.insertAfter(Move.create(getMoveOp(res), res, newRes.copyD2U()));        } else {	  // the first appearance was a store.	  // Insert a move that assigns the value to newRes before	  // the store instruction.          OPT_Operand value;	  if (PutStatic.conforms(ae.inst))	    value = PutStatic.getValue(ae.inst);	  else 	    value = PutField.getValue(ae.inst);	  ae.inst.insertBefore(Move.create(getMoveOp(newRes), newRes, value.copy()));	}	// (3) replace second load with a move from the new temporary	Move.mutate(inst, getMoveOp(dest), dest, newRes.copyD2U());      } else {        // already have a temp. replace the load with a move	OPT_RegisterOperand newRes = new OPT_RegisterOperand(ae.tmp, dest.type);	Move.mutate(inst, getMoveOp(dest), dest, newRes);      }    } else {      // did not find a match: insert new entry in cache      cache.insert(inst);    }  }