OPT_DefUse.computeDU(ir);
    final void perform(OPT_IR ir) {      // 1. Compute an up-to-date loop structure tree.      OPT_DominatorsPhase dom = new OPT_DominatorsPhase(true);      dom.perform(ir);      OPT_LSTGraph lst = ir.HIRInfo.LoopStructureTree;      if (lst == null) {        throw new OPT_OptimizingCompilerException("null loop structure tree");      }      // 2. Compute liveness.      // YUCK: We will later retrieve the live analysis info, relying on the      // scratchObject field of the Basic Blocks.  Thus, liveness must be       // computed AFTER the dominators, since the dominator phase also uses      // the scratchObject field.      OPT_LiveAnalysis live =         new OPT_LiveAnalysis(false,  // don't create GC maps                             false,  // don't skip (final) local                                      // propagation step of live analysis                             false,  // don't store information at handlers                             true);  // skip guards      live.perform(ir);      // 3. Perform the analysis      HashMap result = findSplitPoints(ir,live,lst);      // 4. Perform the transformation.      transform(ir,result);      // 5. Record that we've destroyed SSA      if (ir.actualSSAOptions != null) {        ir.actualSSAOptions.setScalarValid(false);        ir.actualSSAOptions.setHeapValid(false);      }    }