ir.actualSSAOptions.setScalarValid(true); ir.actualSSAOptions.setHeapValid(!scalarsOnly);
  final public void perform(OPT_IR ir) {    // Exit if we don't have to recompute SSA.    if (ir.desiredSSAOptions.getAbort()) return;    if (ir.actualSSAOptions != null)      if (ir.actualSSAOptions.satisfies(ir.desiredSSAOptions))        return;    this.ir = ir;    boolean scalarsOnly = ir.desiredSSAOptions.getScalarsOnly();    boolean backwards = ir.desiredSSAOptions.getBackwards();    Set heapTypes = ir.desiredSSAOptions.getHeapTypes();    boolean insertUsePhis = ir.desiredSSAOptions.getInsertUsePhis();    boolean insertPEIDeps = ir.desiredSSAOptions.getInsertPEIDeps();    boolean excludeGuards = ir.desiredSSAOptions.getExcludeGuards();    // make sure the dominator computation completed successfully    if (!ir.HIRInfo.dominatorsAreComputed)      throw  new OPT_OptimizingCompilerException("Need dominators for SSA");    // reset SSA dictionary information    ir.HIRInfo.SSADictionary = new OPT_SSADictionary(null, true, false, ir);    // initialize as needed for SSA options    prepare();    // work around problem with PEI-generated values and handlers    if (true /* ir.options.UNFACTOR_FOR_SSA */)      patchPEIgeneratedValues();    if (ir.options.PRINT_SSA)      OPT_SSA.printInstructions(ir);    computeSSA(ir, scalarsOnly, backwards, heapTypes,               insertUsePhis, insertPEIDeps, excludeGuards);    // reset the SSAOptions    ir.actualSSAOptions = new OPT_SSAOptions();    ir.actualSSAOptions.setScalarsOnly(scalarsOnly);    ir.actualSSAOptions.setBackwards(backwards);    ir.actualSSAOptions.setHeapTypes(heapTypes);    ir.actualSSAOptions.setInsertUsePhis(insertUsePhis);    ir.actualSSAOptions.setInsertPEIDeps(insertPEIDeps);    ir.actualSSAOptions.setExcludeGuards(excludeGuards);  }