if (ir.options.guardWithCodePatch()) { info.createCodePatchMaps(ir); }
    final void perform (OPT_IR ir) {      OPT_Options options = ir.options;      VM_Method method = ir.method;        boolean shouldPrint =        (options.PRINT_MACHINECODE) &&        (!ir.options.hasMETHOD_TO_PRINT() ||         ir.options.fuzzyMatchMETHOD_TO_PRINT(ir.method.toString()));                  if (OPT_IR.SANITY_CHECK) {        ir.verify("right before machine codegen", true);      }        //////////      // STEP 2: Generate the machinecode array.      // As part of the generation, the machinecode offset      // of every instruction will be set by calling setmcOffset.      //////////      int codeLength = OPT_Assembler.generateCode(ir, shouldPrint);        //////////      // STEP 3: Generate all the mapping information       // associated with the machine code.      //////////      VM_OptCompilerInfo info = ir.MIRInfo.info;        // 3a: Create the exception table      info.createFinalExceptionTable(ir);      // 3b: Create the primary machine code map      info.createFinalMCMap(ir, codeLength);        if (shouldPrint) {        // print exception tables (if any)        VM_OptExceptionTable etable = info.getExceptionTable();        if (etable != null)  	etable.printExceptionTable();        OPT_Compiler.bottom("Final machine code", method);      }        if (VM.runningVM)        VM_Memory.sync(VM_Magic.objectAsAddress(ir.MIRInfo.machinecode),   		     codeLength << LG_INSTRUCTION_WIDTH);    }