+ "  " + ir.method.name);
+ "  " + ir.method.getName());
    public void perform (OPT_IR irr) {      ir = irr;      // if the IR has no bounds checks, don't bother      if (!OPT_IRSummary.hasBoundsCheck(irr))        return;      // if IR may be too big, give up      if (ir.getNumberOfSymbolicRegisters() > 200) {        OPT_PiNodes.cleanUp(ir);        return;      }      if (ir.options.DEBUG_ABCD) {        System.out.println("\n-----------------------------------------");        System.out.println("GBoundsCheck: method = " +             ir.method.getDeclaringClass()            + "  " + ir.method.name);      }      // flush cache on each method      answers = new java.util.HashMap();      closures = new java.util.HashMap();      // recompute register lists      OPT_DefUse.clearDU(ir);      OPT_DefUse.computeDU(ir);      if (ir.options.DEBUG_ABCD) {        System.out.println("\nafter SSA with PI nodes");        ir.printInstructions();        System.out.println();      }      // iterate over all bound checks      // TODO: find a suitable iteration order or      // do better caching.      java.util.Stack redundant = new java.util.Stack();      for (OPT_BasicBlockEnumeration e = ir.getBasicBlocks();           e.hasMoreElements(); /* nothing */      ) {        OPT_BasicBlock bb = e.next();        for (OPT_Instruction instr = bb.firstRealInstruction(),             nextInstr = null;             instr != null && instr.getBasicBlock() == bb; instr = nextInstr) {          nextInstr = instr.nextInstructionInCodeOrder();          OPT_Operator operator = instr.operator;          if (operator != BOUNDS_CHECK)            continue;          if (ir.options.DEBUG_ABCD)            System.out.println("\nGBoundsCheck: check: " + instr.bcIndex                + "  " + instr);          OPT_Operand index = BoundsCheck.getIndex(instr);          // (VIVEK) TODO: extend to constant index          if (!index.isRegister())            continue;          // uncomment the following line to turn off caching across          // bound checks          answers = new java.util.HashMap();          // create the constraint (ie, query) to be proven          ABCD_Constraint constraint = new ABCD_Constraint(index.asRegister(),               -1, BoundsCheck.getRef(instr).asRegister());          try {            ABCD_Answer.nextEra();            closureSentinel = instr;            // see addClosureEdges()            closureSentinelIdom = instr;            closureSentinelIx = 0;            closureConstraint = constraint;            ABCD_Answer result = prove(constraint);            // try any transitive edge emanating from the bound check            // TODO: put the same at phi's arguments            if (!result.getResult()) {              ABCD_ClosureValue edges = (ABCD_ClosureValue)closures.get(instr);              while (edges != null) {                if (ir.options.DEBUG_ABCD)                  System.out.println(depthString() + "trying edge (" +                       edges.c + ") " + edges.src + " => " + instr);                constraint.key.var = (OPT_RegisterOperand)                    edges.src.getOperand(0);                constraint.c = -1 - edges.c;                result = prove(constraint);                if (result.getResult())                  break;        // got TRUE/TRUE_CYC                edges = edges.next;              }            }            if (ir.options.DEBUG_ABCD)              System.out.println("Result = " + result + "\n");            if (result.getResult()) {              // Remove bounds_check instruction              // needs to delay removal because isBcPiNode()               // relies on having the bc's before the pi's              redundant.push(new RedundantCheck(instr, result.getGuards()));            }          } catch (OPT_ABCDUnsupportedException ex) {            // something went wrong.  give up.            OPT_PiNodes.cleanUp(ir);            return;          }        }      }      try {        while (!redundant.empty()) {          RedundantCheck rc = (RedundantCheck)redundant.pop();          insertCompensatingGuards(rc);          OPT_DefUse.removeInstructionAndUpdateDU(rc.check);        }      } catch (EmptyStackException e) {}      OPT_PiNodes.cleanUp(ir);    }           // perform()