private static void MIROptimizations(Vector p) {
private static void MIROptimizations(ArrayList p) {
  private static void MIROptimizations(Vector p) {    ////////////////////    // MIR OPTS(1) (before register allocation)    ////////////////////    // INSTRUCTION SCHEDULING (PRE-PASS --- PRIOR TO REGISTER ALLOCATION)    addComponent(p, new OPT_PrePassScheduler());    // NullCheck combining and validation operand removal.    addComponent(p, new OPT_NullCheckCombining());    ////////////////////    // GCMapping part1 and RegisterAllocation    ////////////////////    composeComponents(p, "Register Mapping", new Object[] {      // MANDATORY: Expand calling convention      new OPT_ExpandCallingConvention(),      // MANDATORY: Perform Live analysis and create GC maps      new OPT_LiveAnalysis(true, false),      // MANDATORY: Perform register allocation      new OPT_RegisterAllocator(),      // MANDATORY: Add prologue and epilogue      new OPT_PrologueEpilogueCreator(),    });    ////////////////////    // MIR OPTS(2) (after register allocation)    // NOTE: GCMapping part 1 has created the GC maps already.    //       From now until the end of compilation, we cannot change    //       the set of live references at a GC point     //       without updating the GCMaps.    //       Effectively this means that we can only do the     //       most trivial optimizations from    //       here on out without having to some potentially complex bookkeeping.    ////////////////////    // Peephole branch optimizations    addComponent(p, new OPT_MIRBranchOptimizations(1));  }