1 /*
   2  * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "c1/c1_Canonicalizer.hpp"
  27 #include "c1/c1_Optimizer.hpp"
  28 #include "c1/c1_ValueMap.hpp"
  29 #include "c1/c1_ValueSet.hpp"
  30 #include "c1/c1_ValueStack.hpp"
  31 #include "utilities/bitMap.inline.hpp"
  32 
  33 define_array(ValueSetArray, ValueSet*);
  34 define_stack(ValueSetList, ValueSetArray);
  35 
  36 
  37 Optimizer::Optimizer(IR* ir) {
  38   assert(ir->is_valid(), "IR must be valid");
  39   _ir = ir;
  40 }
  41 
  42 class CE_Eliminator: public BlockClosure {
  43  private:
  44   IR* _hir;
  45   int _cee_count;                                // the number of CEs successfully eliminated
  46   int _ifop_count;                               // the number of IfOps successfully simplified
  47   int _has_substitution;
  48 
  49  public:
  50   CE_Eliminator(IR* hir) : _cee_count(0), _ifop_count(0), _hir(hir) {
  51     _has_substitution = false;
  52     _hir->iterate_preorder(this);
  53     if (_has_substitution) {
  54       // substituted some ifops/phis, so resolve the substitution
  55       SubstitutionResolver sr(_hir);
  56     }
  57   }
  58   int cee_count() const                          { return _cee_count; }
  59   int ifop_count() const                         { return _ifop_count; }
  60 
  61   void adjust_exception_edges(BlockBegin* block, BlockBegin* sux) {
  62     int e = sux->number_of_exception_handlers();
  63     for (int i = 0; i < e; i++) {
  64       BlockBegin* xhandler = sux->exception_handler_at(i);
  65       block->add_exception_handler(xhandler);
  66 
  67       assert(xhandler->is_predecessor(sux), "missing predecessor");
  68       if (sux->number_of_preds() == 0) {
  69         // sux is disconnected from graph so disconnect from exception handlers
  70         xhandler->remove_predecessor(sux);
  71       }
  72       if (!xhandler->is_predecessor(block)) {
  73         xhandler->add_predecessor(block);
  74       }
  75     }
  76   }
  77 
  78   virtual void block_do(BlockBegin* block);
  79 
  80  private:
  81   Value make_ifop(Value x, Instruction::Condition cond, Value y, Value tval, Value fval);
  82 };
  83 
  84 void CE_Eliminator::block_do(BlockBegin* block) {
  85   // 1) find conditional expression
  86   // check if block ends with an If
  87   If* if_ = block->end()->as_If();
  88   if (if_ == NULL) return;
  89 
  90   // check if If works on int or object types
  91   // (we cannot handle If's working on long, float or doubles yet,
  92   // since IfOp doesn't support them - these If's show up if cmp
  93   // operations followed by If's are eliminated)
  94   ValueType* if_type = if_->x()->type();
  95   if (!if_type->is_int() && !if_type->is_object()) return;
  96 
  97   BlockBegin* t_block = if_->tsux();
  98   BlockBegin* f_block = if_->fsux();
  99   Instruction* t_cur = t_block->next();
 100   Instruction* f_cur = f_block->next();
 101 
 102   // one Constant may be present between BlockBegin and BlockEnd
 103   Value t_const = NULL;
 104   Value f_const = NULL;
 105   if (t_cur->as_Constant() != NULL && !t_cur->can_trap()) {
 106     t_const = t_cur;
 107     t_cur = t_cur->next();
 108   }
 109   if (f_cur->as_Constant() != NULL && !f_cur->can_trap()) {
 110     f_const = f_cur;
 111     f_cur = f_cur->next();
 112   }
 113 
 114   // check if both branches end with a goto
 115   Goto* t_goto = t_cur->as_Goto();
 116   if (t_goto == NULL) return;
 117   Goto* f_goto = f_cur->as_Goto();
 118   if (f_goto == NULL) return;
 119 
 120   // check if both gotos merge into the same block
 121   BlockBegin* sux = t_goto->default_sux();
 122   if (sux != f_goto->default_sux()) return;
 123 
 124   // check if at least one word was pushed on sux_state
 125   // inlining depths must match
 126   ValueStack* if_state = if_->state();
 127   ValueStack* sux_state = sux->state();
 128   if (if_state->scope()->level() > sux_state->scope()->level()) {
 129     while (sux_state->scope() != if_state->scope()) {
 130       if_state = if_state->caller_state();
 131       assert(if_state != NULL, "states do not match up");
 132     }
 133   } else if (if_state->scope()->level() < sux_state->scope()->level()) {
 134     while (sux_state->scope() != if_state->scope()) {
 135       sux_state = sux_state->caller_state();
 136       assert(sux_state != NULL, "states do not match up");
 137     }
 138   }
 139 
 140   if (sux_state->stack_size() <= if_state->stack_size()) return;
 141 
 142   // check if phi function is present at end of successor stack and that
 143   // only this phi was pushed on the stack
 144   Value sux_phi = sux_state->stack_at(if_state->stack_size());
 145   if (sux_phi == NULL || sux_phi->as_Phi() == NULL || sux_phi->as_Phi()->block() != sux) return;
 146   if (sux_phi->type()->size() != sux_state->stack_size() - if_state->stack_size()) return;
 147 
 148   // get the values that were pushed in the true- and false-branch
 149   Value t_value = t_goto->state()->stack_at(if_state->stack_size());
 150   Value f_value = f_goto->state()->stack_at(if_state->stack_size());
 151 
 152   // backend does not support floats
 153   assert(t_value->type()->base() == f_value->type()->base(), "incompatible types");
 154   if (t_value->type()->is_float_kind()) return;
 155 
 156   // check that successor has no other phi functions but sux_phi
 157   // this can happen when t_block or f_block contained additonal stores to local variables
 158   // that are no longer represented by explicit instructions
 159   for_each_phi_fun(sux, phi,
 160                    if (phi != sux_phi) return;
 161                    );
 162   // true and false blocks can't have phis
 163   for_each_phi_fun(t_block, phi, return; );
 164   for_each_phi_fun(f_block, phi, return; );
 165 
 166   // 2) substitute conditional expression
 167   //    with an IfOp followed by a Goto
 168   // cut if_ away and get node before
 169   Instruction* cur_end = if_->prev(block);
 170 
 171   // append constants of true- and false-block if necessary
 172   // clone constants because original block must not be destroyed
 173   assert((t_value != f_const && f_value != t_const) || t_const == f_const, "mismatch");
 174   if (t_value == t_const) {
 175     t_value = new Constant(t_const->type());
 176     NOT_PRODUCT(t_value->set_printable_bci(if_->printable_bci()));
 177     cur_end = cur_end->set_next(t_value);
 178   }
 179   if (f_value == f_const) {
 180     f_value = new Constant(f_const->type());
 181     NOT_PRODUCT(f_value->set_printable_bci(if_->printable_bci()));
 182     cur_end = cur_end->set_next(f_value);
 183   }
 184 
 185   Value result = make_ifop(if_->x(), if_->cond(), if_->y(), t_value, f_value);
 186   assert(result != NULL, "make_ifop must return a non-null instruction");
 187   if (!result->is_linked() && result->can_be_linked()) {
 188     NOT_PRODUCT(result->set_printable_bci(if_->printable_bci()));
 189     cur_end = cur_end->set_next(result);
 190   }
 191 
 192   // append Goto to successor
 193   ValueStack* state_before = if_->is_safepoint() ? if_->state_before() : NULL;
 194   Goto* goto_ = new Goto(sux, state_before, if_->is_safepoint() || t_goto->is_safepoint() || f_goto->is_safepoint());
 195 
 196   // prepare state for Goto
 197   ValueStack* goto_state = if_state;
 198   goto_state = goto_state->copy(ValueStack::StateAfter, goto_state->bci());
 199   goto_state->push(result->type(), result);
 200   assert(goto_state->is_same(sux_state), "states must match now");
 201   goto_->set_state(goto_state);
 202 
 203   cur_end = cur_end->set_next(goto_, goto_state->bci());
 204 
 205   // Adjust control flow graph
 206   BlockBegin::disconnect_edge(block, t_block);
 207   BlockBegin::disconnect_edge(block, f_block);
 208   if (t_block->number_of_preds() == 0) {
 209     BlockBegin::disconnect_edge(t_block, sux);
 210   }
 211   adjust_exception_edges(block, t_block);
 212   if (f_block->number_of_preds() == 0) {
 213     BlockBegin::disconnect_edge(f_block, sux);
 214   }
 215   adjust_exception_edges(block, f_block);
 216 
 217   // update block end
 218   block->set_end(goto_);
 219 
 220   // substitute the phi if possible
 221   if (sux_phi->as_Phi()->operand_count() == 1) {
 222     assert(sux_phi->as_Phi()->operand_at(0) == result, "screwed up phi");
 223     sux_phi->set_subst(result);
 224     _has_substitution = true;
 225   }
 226 
 227   // 3) successfully eliminated a conditional expression
 228   _cee_count++;
 229   if (PrintCEE) {
 230     tty->print_cr("%d. CEE in B%d (B%d B%d)", cee_count(), block->block_id(), t_block->block_id(), f_block->block_id());
 231     tty->print_cr("%d. IfOp in B%d", ifop_count(), block->block_id());
 232   }
 233 
 234   _hir->verify();
 235 }
 236 
 237 Value CE_Eliminator::make_ifop(Value x, Instruction::Condition cond, Value y, Value tval, Value fval) {
 238   if (!OptimizeIfOps) {
 239     return new IfOp(x, cond, y, tval, fval);
 240   }
 241 
 242   tval = tval->subst();
 243   fval = fval->subst();
 244   if (tval == fval) {
 245     _ifop_count++;
 246     return tval;
 247   }
 248 
 249   x = x->subst();
 250   y = y->subst();
 251 
 252   Constant* y_const = y->as_Constant();
 253   if (y_const != NULL) {
 254     IfOp* x_ifop = x->as_IfOp();
 255     if (x_ifop != NULL) {                 // x is an ifop, y is a constant
 256       Constant* x_tval_const = x_ifop->tval()->subst()->as_Constant();
 257       Constant* x_fval_const = x_ifop->fval()->subst()->as_Constant();
 258 
 259       if (x_tval_const != NULL && x_fval_const != NULL) {
 260         Instruction::Condition x_ifop_cond = x_ifop->cond();
 261 
 262         Constant::CompareResult t_compare_res = x_tval_const->compare(cond, y_const);
 263         Constant::CompareResult f_compare_res = x_fval_const->compare(cond, y_const);
 264 
 265         // not_comparable here is a valid return in case we're comparing unloaded oop constants
 266         if (t_compare_res != Constant::not_comparable && f_compare_res != Constant::not_comparable) {
 267           Value new_tval = t_compare_res == Constant::cond_true ? tval : fval;
 268           Value new_fval = f_compare_res == Constant::cond_true ? tval : fval;
 269 
 270           _ifop_count++;
 271           if (new_tval == new_fval) {
 272             return new_tval;
 273           } else {
 274             return new IfOp(x_ifop->x(), x_ifop_cond, x_ifop->y(), new_tval, new_fval);
 275           }
 276         }
 277       }
 278     } else {
 279       Constant* x_const = x->as_Constant();
 280       if (x_const != NULL) {         // x and y are constants
 281         Constant::CompareResult x_compare_res = x_const->compare(cond, y_const);
 282         // not_comparable here is a valid return in case we're comparing unloaded oop constants
 283         if (x_compare_res != Constant::not_comparable) {
 284           _ifop_count++;
 285           return x_compare_res == Constant::cond_true ? tval : fval;
 286         }
 287       }
 288     }
 289   }
 290   return new IfOp(x, cond, y, tval, fval);
 291 }
 292 
 293 void Optimizer::eliminate_conditional_expressions() {
 294   // find conditional expressions & replace them with IfOps
 295   CE_Eliminator ce(ir());
 296 }
 297 
 298 class BlockMerger: public BlockClosure {
 299  private:
 300   IR* _hir;
 301   int _merge_count;              // the number of block pairs successfully merged
 302 
 303  public:
 304   BlockMerger(IR* hir)
 305   : _hir(hir)
 306   , _merge_count(0)
 307   {
 308     _hir->iterate_preorder(this);
 309   }
 310 
 311   bool try_merge(BlockBegin* block) {
 312     BlockEnd* end = block->end();
 313     if (end->as_Goto() != NULL) {
 314       assert(end->number_of_sux() == 1, "end must have exactly one successor");
 315       // Note: It would be sufficient to check for the number of successors (= 1)
 316       //       in order to decide if this block can be merged potentially. That
 317       //       would then also include switch statements w/ only a default case.
 318       //       However, in that case we would need to make sure the switch tag
 319       //       expression is executed if it can produce observable side effects.
 320       //       We should probably have the canonicalizer simplifying such switch
 321       //       statements and then we are sure we don't miss these merge opportunities
 322       //       here (was bug - gri 7/7/99).
 323       BlockBegin* sux = end->default_sux();
 324       if (sux->number_of_preds() == 1 && !sux->is_entry_block() && !end->is_safepoint()) {
 325         // merge the two blocks
 326 
 327 #ifdef ASSERT
 328         // verify that state at the end of block and at the beginning of sux are equal
 329         // no phi functions must be present at beginning of sux
 330         ValueStack* sux_state = sux->state();
 331         ValueStack* end_state = end->state();
 332 
 333         assert(end_state->scope() == sux_state->scope(), "scopes must match");
 334         assert(end_state->stack_size() == sux_state->stack_size(), "stack not equal");
 335         assert(end_state->locals_size() == sux_state->locals_size(), "locals not equal");
 336 
 337         int index;
 338         Value sux_value;
 339         for_each_stack_value(sux_state, index, sux_value) {
 340           assert(sux_value == end_state->stack_at(index), "stack not equal");
 341         }
 342         for_each_local_value(sux_state, index, sux_value) {
 343           assert(sux_value == end_state->local_at(index), "locals not equal");
 344         }
 345         assert(sux_state->caller_state() == end_state->caller_state(), "caller not equal");
 346 #endif
 347 
 348         // find instruction before end & append first instruction of sux block
 349         Instruction* prev = end->prev(block);
 350         Instruction* next = sux->next();
 351         assert(prev->as_BlockEnd() == NULL, "must not be a BlockEnd");
 352         prev->set_next(next);
 353         sux->disconnect_from_graph();
 354         block->set_end(sux->end());
 355         // add exception handlers of deleted block, if any
 356         for (int k = 0; k < sux->number_of_exception_handlers(); k++) {
 357           BlockBegin* xhandler = sux->exception_handler_at(k);
 358           block->add_exception_handler(xhandler);
 359 
 360           // also substitute predecessor of exception handler
 361           assert(xhandler->is_predecessor(sux), "missing predecessor");
 362           xhandler->remove_predecessor(sux);
 363           if (!xhandler->is_predecessor(block)) {
 364             xhandler->add_predecessor(block);
 365           }
 366         }
 367 
 368         // debugging output
 369         _merge_count++;
 370         if (PrintBlockElimination) {
 371           tty->print_cr("%d. merged B%d & B%d (stack size = %d)",
 372                         _merge_count, block->block_id(), sux->block_id(), sux->state()->stack_size());
 373         }
 374 
 375         _hir->verify();
 376 
 377         If* if_ = block->end()->as_If();
 378         if (if_) {
 379           IfOp* ifop    = if_->x()->as_IfOp();
 380           Constant* con = if_->y()->as_Constant();
 381           bool swapped = false;
 382           if (!con || !ifop) {
 383             ifop = if_->y()->as_IfOp();
 384             con  = if_->x()->as_Constant();
 385             swapped = true;
 386           }
 387           if (con && ifop) {
 388             Constant* tval = ifop->tval()->as_Constant();
 389             Constant* fval = ifop->fval()->as_Constant();
 390             if (tval && fval) {
 391               // Find the instruction before if_, starting with ifop.
 392               // When if_ and ifop are not in the same block, prev
 393               // becomes NULL In such (rare) cases it is not
 394               // profitable to perform the optimization.
 395               Value prev = ifop;
 396               while (prev != NULL && prev->next() != if_) {
 397                 prev = prev->next();
 398               }
 399 
 400               if (prev != NULL) {
 401                 Instruction::Condition cond = if_->cond();
 402                 BlockBegin* tsux = if_->tsux();
 403                 BlockBegin* fsux = if_->fsux();
 404                 if (swapped) {
 405                   cond = Instruction::mirror(cond);
 406                 }
 407 
 408                 BlockBegin* tblock = tval->compare(cond, con, tsux, fsux);
 409                 BlockBegin* fblock = fval->compare(cond, con, tsux, fsux);
 410                 if (tblock != fblock && !if_->is_safepoint()) {
 411                   If* newif = new If(ifop->x(), ifop->cond(), false, ifop->y(),
 412                                      tblock, fblock, if_->state_before(), if_->is_safepoint());
 413                   newif->set_state(if_->state()->copy());
 414 
 415                   assert(prev->next() == if_, "must be guaranteed by above search");
 416                   NOT_PRODUCT(newif->set_printable_bci(if_->printable_bci()));
 417                   prev->set_next(newif);
 418                   block->set_end(newif);
 419 
 420                   _merge_count++;
 421                   if (PrintBlockElimination) {
 422                     tty->print_cr("%d. replaced If and IfOp at end of B%d with single If", _merge_count, block->block_id());
 423                   }
 424 
 425                   _hir->verify();
 426                 }
 427               }
 428             }
 429           }
 430         }
 431 
 432         return true;
 433       }
 434     }
 435     return false;
 436   }
 437 
 438   virtual void block_do(BlockBegin* block) {
 439     _hir->verify();
 440     // repeat since the same block may merge again
 441     while (try_merge(block)) {
 442       _hir->verify();
 443     }
 444   }
 445 };
 446 
 447 
 448 void Optimizer::eliminate_blocks() {
 449   // merge blocks if possible
 450   BlockMerger bm(ir());
 451 }
 452 
 453 
 454 class NullCheckEliminator;
 455 class NullCheckVisitor: public InstructionVisitor {
 456 private:
 457   NullCheckEliminator* _nce;
 458   NullCheckEliminator* nce() { return _nce; }
 459 
 460 public:
 461   NullCheckVisitor() {}
 462 
 463   void set_eliminator(NullCheckEliminator* nce) { _nce = nce; }
 464 
 465   void do_Phi            (Phi*             x);
 466   void do_Local          (Local*           x);
 467   void do_Constant       (Constant*        x);
 468   void do_LoadField      (LoadField*       x);
 469   void do_StoreField     (StoreField*      x);
 470   void do_ArrayLength    (ArrayLength*     x);
 471   void do_LoadIndexed    (LoadIndexed*     x);
 472   void do_StoreIndexed   (StoreIndexed*    x);
 473   void do_NegateOp       (NegateOp*        x);
 474   void do_ArithmeticOp   (ArithmeticOp*    x);
 475   void do_ShiftOp        (ShiftOp*         x);
 476   void do_LogicOp        (LogicOp*         x);
 477   void do_CompareOp      (CompareOp*       x);
 478   void do_IfOp           (IfOp*            x);
 479   void do_Convert        (Convert*         x);
 480   void do_NullCheck      (NullCheck*       x);
 481   void do_Invoke         (Invoke*          x);
 482   void do_NewInstance    (NewInstance*     x);
 483   void do_NewTypeArray   (NewTypeArray*    x);
 484   void do_NewObjectArray (NewObjectArray*  x);
 485   void do_NewMultiArray  (NewMultiArray*   x);
 486   void do_CheckCast      (CheckCast*       x);
 487   void do_InstanceOf     (InstanceOf*      x);
 488   void do_MonitorEnter   (MonitorEnter*    x);
 489   void do_MonitorExit    (MonitorExit*     x);
 490   void do_Intrinsic      (Intrinsic*       x);
 491   void do_BlockBegin     (BlockBegin*      x);
 492   void do_Goto           (Goto*            x);
 493   void do_If             (If*              x);
 494   void do_IfInstanceOf   (IfInstanceOf*    x);
 495   void do_TableSwitch    (TableSwitch*     x);
 496   void do_LookupSwitch   (LookupSwitch*    x);
 497   void do_Return         (Return*          x);
 498   void do_Throw          (Throw*           x);
 499   void do_Base           (Base*            x);
 500   void do_OsrEntry       (OsrEntry*        x);
 501   void do_ExceptionObject(ExceptionObject* x);
 502   void do_RoundFP        (RoundFP*         x);
 503   void do_UnsafeGetRaw   (UnsafeGetRaw*    x);
 504   void do_UnsafePutRaw   (UnsafePutRaw*    x);
 505   void do_UnsafeGetObject(UnsafeGetObject* x);
 506   void do_UnsafePutObject(UnsafePutObject* x);
 507   void do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x);
 508   void do_UnsafePrefetchRead (UnsafePrefetchRead*  x);
 509   void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x);
 510   void do_ProfileCall    (ProfileCall*     x);
 511   void do_ProfileInvoke  (ProfileInvoke*   x);
 512   void do_RuntimeCall    (RuntimeCall*     x);
 513   void do_MemBar         (MemBar*          x);
 514 };
 515 
 516 
 517 // Because of a static contained within (for the purpose of iteration
 518 // over instructions), it is only valid to have one of these active at
 519 // a time
 520 class NullCheckEliminator: public ValueVisitor {
 521  private:
 522   Optimizer*        _opt;
 523 
 524   ValueSet*         _visitable_instructions;        // Visit each instruction only once per basic block
 525   BlockList*        _work_list;                   // Basic blocks to visit
 526 
 527   bool visitable(Value x) {
 528     assert(_visitable_instructions != NULL, "check");
 529     return _visitable_instructions->contains(x);
 530   }
 531   void mark_visited(Value x) {
 532     assert(_visitable_instructions != NULL, "check");
 533     _visitable_instructions->remove(x);
 534   }
 535   void mark_visitable(Value x) {
 536     assert(_visitable_instructions != NULL, "check");
 537     _visitable_instructions->put(x);
 538   }
 539   void clear_visitable_state() {
 540     assert(_visitable_instructions != NULL, "check");
 541     _visitable_instructions->clear();
 542   }
 543 
 544   ValueSet*         _set;                         // current state, propagated to subsequent BlockBegins
 545   ValueSetList      _block_states;                // BlockBegin null-check states for all processed blocks
 546   NullCheckVisitor  _visitor;
 547   NullCheck*        _last_explicit_null_check;
 548 
 549   bool set_contains(Value x)                      { assert(_set != NULL, "check"); return _set->contains(x); }
 550   void set_put     (Value x)                      { assert(_set != NULL, "check"); _set->put(x); }
 551   void set_remove  (Value x)                      { assert(_set != NULL, "check"); _set->remove(x); }
 552 
 553   BlockList* work_list()                          { return _work_list; }
 554 
 555   void iterate_all();
 556   void iterate_one(BlockBegin* block);
 557 
 558   ValueSet* state()                               { return _set; }
 559   void      set_state_from (ValueSet* state)      { _set->set_from(state); }
 560   ValueSet* state_for      (BlockBegin* block)    { return _block_states[block->block_id()]; }
 561   void      set_state_for  (BlockBegin* block, ValueSet* stack) { _block_states[block->block_id()] = stack; }
 562   // Returns true if caused a change in the block's state.
 563   bool      merge_state_for(BlockBegin* block,
 564                             ValueSet*   incoming_state);
 565 
 566  public:
 567   // constructor
 568   NullCheckEliminator(Optimizer* opt)
 569     : _opt(opt)
 570     , _set(new ValueSet())
 571     , _last_explicit_null_check(NULL)
 572     , _block_states(BlockBegin::number_of_blocks(), NULL)
 573     , _work_list(new BlockList()) {
 574     _visitable_instructions = new ValueSet();
 575     _visitor.set_eliminator(this);
 576   }
 577 
 578   Optimizer*  opt()                               { return _opt; }
 579   IR*         ir ()                               { return opt()->ir(); }
 580 
 581   // Process a graph
 582   void iterate(BlockBegin* root);
 583 
 584   void visit(Value* f);
 585 
 586   // In some situations (like NullCheck(x); getfield(x)) the debug
 587   // information from the explicit NullCheck can be used to populate
 588   // the getfield, even if the two instructions are in different
 589   // scopes; this allows implicit null checks to be used but the
 590   // correct exception information to be generated. We must clear the
 591   // last-traversed NullCheck when we reach a potentially-exception-
 592   // throwing instruction, as well as in some other cases.
 593   void        set_last_explicit_null_check(NullCheck* check) { _last_explicit_null_check = check; }
 594   NullCheck*  last_explicit_null_check()                     { return _last_explicit_null_check; }
 595   Value       last_explicit_null_check_obj()                 { return (_last_explicit_null_check
 596                                                                          ? _last_explicit_null_check->obj()
 597                                                                          : NULL); }
 598   NullCheck*  consume_last_explicit_null_check() {
 599     _last_explicit_null_check->unpin(Instruction::PinExplicitNullCheck);
 600     _last_explicit_null_check->set_can_trap(false);
 601     return _last_explicit_null_check;
 602   }
 603   void        clear_last_explicit_null_check()               { _last_explicit_null_check = NULL; }
 604 
 605   // Handlers for relevant instructions
 606   // (separated out from NullCheckVisitor for clarity)
 607 
 608   // The basic contract is that these must leave the instruction in
 609   // the desired state; must not assume anything about the state of
 610   // the instruction. We make multiple passes over some basic blocks
 611   // and the last pass is the only one whose result is valid.
 612   void handle_AccessField     (AccessField* x);
 613   void handle_ArrayLength     (ArrayLength* x);
 614   void handle_LoadIndexed     (LoadIndexed* x);
 615   void handle_StoreIndexed    (StoreIndexed* x);
 616   void handle_NullCheck       (NullCheck* x);
 617   void handle_Invoke          (Invoke* x);
 618   void handle_NewInstance     (NewInstance* x);
 619   void handle_NewArray        (NewArray* x);
 620   void handle_AccessMonitor   (AccessMonitor* x);
 621   void handle_Intrinsic       (Intrinsic* x);
 622   void handle_ExceptionObject (ExceptionObject* x);
 623   void handle_Phi             (Phi* x);
 624 };
 625 
 626 
 627 // NEEDS_CLEANUP
 628 // There may be other instructions which need to clear the last
 629 // explicit null check. Anything across which we can not hoist the
 630 // debug information for a NullCheck instruction must clear it. It
 631 // might be safer to pattern match "NullCheck ; {AccessField,
 632 // ArrayLength, LoadIndexed}" but it is more easily structured this way.
 633 // Should test to see performance hit of clearing it for all handlers
 634 // with empty bodies below. If it is negligible then we should leave
 635 // that in for safety, otherwise should think more about it.
 636 void NullCheckVisitor::do_Phi            (Phi*             x) { nce()->handle_Phi(x);      }
 637 void NullCheckVisitor::do_Local          (Local*           x) {}
 638 void NullCheckVisitor::do_Constant       (Constant*        x) { /* FIXME: handle object constants */ }
 639 void NullCheckVisitor::do_LoadField      (LoadField*       x) { nce()->handle_AccessField(x); }
 640 void NullCheckVisitor::do_StoreField     (StoreField*      x) { nce()->handle_AccessField(x); }
 641 void NullCheckVisitor::do_ArrayLength    (ArrayLength*     x) { nce()->handle_ArrayLength(x); }
 642 void NullCheckVisitor::do_LoadIndexed    (LoadIndexed*     x) { nce()->handle_LoadIndexed(x); }
 643 void NullCheckVisitor::do_StoreIndexed   (StoreIndexed*    x) { nce()->handle_StoreIndexed(x); }
 644 void NullCheckVisitor::do_NegateOp       (NegateOp*        x) {}
 645 void NullCheckVisitor::do_ArithmeticOp   (ArithmeticOp*    x) { if (x->can_trap()) nce()->clear_last_explicit_null_check(); }
 646 void NullCheckVisitor::do_ShiftOp        (ShiftOp*         x) {}
 647 void NullCheckVisitor::do_LogicOp        (LogicOp*         x) {}
 648 void NullCheckVisitor::do_CompareOp      (CompareOp*       x) {}
 649 void NullCheckVisitor::do_IfOp           (IfOp*            x) {}
 650 void NullCheckVisitor::do_Convert        (Convert*         x) {}
 651 void NullCheckVisitor::do_NullCheck      (NullCheck*       x) { nce()->handle_NullCheck(x); }
 652 void NullCheckVisitor::do_Invoke         (Invoke*          x) { nce()->handle_Invoke(x); }
 653 void NullCheckVisitor::do_NewInstance    (NewInstance*     x) { nce()->handle_NewInstance(x); }
 654 void NullCheckVisitor::do_NewTypeArray   (NewTypeArray*    x) { nce()->handle_NewArray(x); }
 655 void NullCheckVisitor::do_NewObjectArray (NewObjectArray*  x) { nce()->handle_NewArray(x); }
 656 void NullCheckVisitor::do_NewMultiArray  (NewMultiArray*   x) { nce()->handle_NewArray(x); }
 657 void NullCheckVisitor::do_CheckCast      (CheckCast*       x) { nce()->clear_last_explicit_null_check(); }
 658 void NullCheckVisitor::do_InstanceOf     (InstanceOf*      x) {}
 659 void NullCheckVisitor::do_MonitorEnter   (MonitorEnter*    x) { nce()->handle_AccessMonitor(x); }
 660 void NullCheckVisitor::do_MonitorExit    (MonitorExit*     x) { nce()->handle_AccessMonitor(x); }
 661 void NullCheckVisitor::do_Intrinsic      (Intrinsic*       x) { nce()->handle_Intrinsic(x);     }
 662 void NullCheckVisitor::do_BlockBegin     (BlockBegin*      x) {}
 663 void NullCheckVisitor::do_Goto           (Goto*            x) {}
 664 void NullCheckVisitor::do_If             (If*              x) {}
 665 void NullCheckVisitor::do_IfInstanceOf   (IfInstanceOf*    x) {}
 666 void NullCheckVisitor::do_TableSwitch    (TableSwitch*     x) {}
 667 void NullCheckVisitor::do_LookupSwitch   (LookupSwitch*    x) {}
 668 void NullCheckVisitor::do_Return         (Return*          x) {}
 669 void NullCheckVisitor::do_Throw          (Throw*           x) { nce()->clear_last_explicit_null_check(); }
 670 void NullCheckVisitor::do_Base           (Base*            x) {}
 671 void NullCheckVisitor::do_OsrEntry       (OsrEntry*        x) {}
 672 void NullCheckVisitor::do_ExceptionObject(ExceptionObject* x) { nce()->handle_ExceptionObject(x); }
 673 void NullCheckVisitor::do_RoundFP        (RoundFP*         x) {}
 674 void NullCheckVisitor::do_UnsafeGetRaw   (UnsafeGetRaw*    x) {}
 675 void NullCheckVisitor::do_UnsafePutRaw   (UnsafePutRaw*    x) {}
 676 void NullCheckVisitor::do_UnsafeGetObject(UnsafeGetObject* x) {}
 677 void NullCheckVisitor::do_UnsafePutObject(UnsafePutObject* x) {}
 678 void NullCheckVisitor::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {}
 679 void NullCheckVisitor::do_UnsafePrefetchRead (UnsafePrefetchRead*  x) {}
 680 void NullCheckVisitor::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {}
 681 void NullCheckVisitor::do_ProfileCall    (ProfileCall*     x) { nce()->clear_last_explicit_null_check(); }
 682 void NullCheckVisitor::do_ProfileInvoke  (ProfileInvoke*   x) {}
 683 void NullCheckVisitor::do_RuntimeCall    (RuntimeCall*     x) {}
 684 void NullCheckVisitor::do_MemBar         (MemBar*          x) {}
 685 
 686 
 687 void NullCheckEliminator::visit(Value* p) {
 688   assert(*p != NULL, "should not find NULL instructions");
 689   if (visitable(*p)) {
 690     mark_visited(*p);
 691     (*p)->visit(&_visitor);
 692   }
 693 }
 694 
 695 bool NullCheckEliminator::merge_state_for(BlockBegin* block, ValueSet* incoming_state) {
 696   ValueSet* state = state_for(block);
 697   if (state == NULL) {
 698     state = incoming_state->copy();
 699     set_state_for(block, state);
 700     return true;
 701   } else {
 702     bool changed = state->set_intersect(incoming_state);
 703     if (PrintNullCheckElimination && changed) {
 704       tty->print_cr("Block %d's null check state changed", block->block_id());
 705     }
 706     return changed;
 707   }
 708 }
 709 
 710 
 711 void NullCheckEliminator::iterate_all() {
 712   while (work_list()->length() > 0) {
 713     iterate_one(work_list()->pop());
 714   }
 715 }
 716 
 717 
 718 void NullCheckEliminator::iterate_one(BlockBegin* block) {
 719   clear_visitable_state();
 720   // clear out an old explicit null checks
 721   set_last_explicit_null_check(NULL);
 722 
 723   if (PrintNullCheckElimination) {
 724     tty->print_cr(" ...iterating block %d in null check elimination for %s::%s%s",
 725                   block->block_id(),
 726                   ir()->method()->holder()->name()->as_utf8(),
 727                   ir()->method()->name()->as_utf8(),
 728                   ir()->method()->signature()->as_symbol()->as_utf8());
 729   }
 730 
 731   // Create new state if none present (only happens at root)
 732   if (state_for(block) == NULL) {
 733     ValueSet* tmp_state = new ValueSet();
 734     set_state_for(block, tmp_state);
 735     // Initial state is that local 0 (receiver) is non-null for
 736     // non-static methods
 737     ValueStack* stack  = block->state();
 738     IRScope*    scope  = stack->scope();
 739     ciMethod*   method = scope->method();
 740     if (!method->is_static()) {
 741       Local* local0 = stack->local_at(0)->as_Local();
 742       assert(local0 != NULL, "must be");
 743       assert(local0->type() == objectType, "invalid type of receiver");
 744 
 745       if (local0 != NULL) {
 746         // Local 0 is used in this scope
 747         tmp_state->put(local0);
 748         if (PrintNullCheckElimination) {
 749           tty->print_cr("Local 0 (value %d) proven non-null upon entry", local0->id());
 750         }
 751       }
 752     }
 753   }
 754 
 755   // Must copy block's state to avoid mutating it during iteration
 756   // through the block -- otherwise "not-null" states can accidentally
 757   // propagate "up" through the block during processing of backward
 758   // branches and algorithm is incorrect (and does not converge)
 759   set_state_from(state_for(block));
 760 
 761   // allow visiting of Phis belonging to this block
 762   for_each_phi_fun(block, phi,
 763                    mark_visitable(phi);
 764                    );
 765 
 766   BlockEnd* e = block->end();
 767   assert(e != NULL, "incomplete graph");
 768   int i;
 769 
 770   // Propagate the state before this block into the exception
 771   // handlers.  They aren't true successors since we aren't guaranteed
 772   // to execute the whole block before executing them.  Also putting
 773   // them on first seems to help reduce the amount of iteration to
 774   // reach a fixed point.
 775   for (i = 0; i < block->number_of_exception_handlers(); i++) {
 776     BlockBegin* next = block->exception_handler_at(i);
 777     if (merge_state_for(next, state())) {
 778       if (!work_list()->contains(next)) {
 779         work_list()->push(next);
 780       }
 781     }
 782   }
 783 
 784   // Iterate through block, updating state.
 785   for (Instruction* instr = block; instr != NULL; instr = instr->next()) {
 786     // Mark instructions in this block as visitable as they are seen
 787     // in the instruction list.  This keeps the iteration from
 788     // visiting instructions which are references in other blocks or
 789     // visiting instructions more than once.
 790     mark_visitable(instr);
 791     if (instr->is_pinned() || instr->can_trap() || (instr->as_NullCheck() != NULL)) {
 792       mark_visited(instr);
 793       instr->input_values_do(this);
 794       instr->visit(&_visitor);
 795     }
 796   }
 797 
 798   // Propagate state to successors if necessary
 799   for (i = 0; i < e->number_of_sux(); i++) {
 800     BlockBegin* next = e->sux_at(i);
 801     if (merge_state_for(next, state())) {
 802       if (!work_list()->contains(next)) {
 803         work_list()->push(next);
 804       }
 805     }
 806   }
 807 }
 808 
 809 
 810 void NullCheckEliminator::iterate(BlockBegin* block) {
 811   work_list()->push(block);
 812   iterate_all();
 813 }
 814 
 815 void NullCheckEliminator::handle_AccessField(AccessField* x) {
 816   if (x->is_static()) {
 817     if (x->as_LoadField() != NULL) {
 818       // If the field is a non-null static final object field (as is
 819       // often the case for sun.misc.Unsafe), put this LoadField into
 820       // the non-null map
 821       ciField* field = x->field();
 822       if (field->is_constant()) {
 823         ciConstant field_val = field->constant_value();
 824         BasicType field_type = field_val.basic_type();
 825         if (field_type == T_OBJECT || field_type == T_ARRAY) {
 826           ciObject* obj_val = field_val.as_object();
 827           if (!obj_val->is_null_object()) {
 828             if (PrintNullCheckElimination) {
 829               tty->print_cr("AccessField %d proven non-null by static final non-null oop check",
 830                             x->id());
 831             }
 832             set_put(x);
 833           }
 834         }
 835       }
 836     }
 837     // Be conservative
 838     clear_last_explicit_null_check();
 839     return;
 840   }
 841 
 842   Value obj = x->obj();
 843   if (set_contains(obj)) {
 844     // Value is non-null => update AccessField
 845     if (last_explicit_null_check_obj() == obj && !x->needs_patching()) {
 846       x->set_explicit_null_check(consume_last_explicit_null_check());
 847       x->set_needs_null_check(true);
 848       if (PrintNullCheckElimination) {
 849         tty->print_cr("Folded NullCheck %d into AccessField %d's null check for value %d",
 850                       x->explicit_null_check()->id(), x->id(), obj->id());
 851       }
 852     } else {
 853       x->set_explicit_null_check(NULL);
 854       x->set_needs_null_check(false);
 855       if (PrintNullCheckElimination) {
 856         tty->print_cr("Eliminated AccessField %d's null check for value %d", x->id(), obj->id());
 857       }
 858     }
 859   } else {
 860     set_put(obj);
 861     if (PrintNullCheckElimination) {
 862       tty->print_cr("AccessField %d of value %d proves value to be non-null", x->id(), obj->id());
 863     }
 864     // Ensure previous passes do not cause wrong state
 865     x->set_needs_null_check(true);
 866     x->set_explicit_null_check(NULL);
 867   }
 868   clear_last_explicit_null_check();
 869 }
 870 
 871 
 872 void NullCheckEliminator::handle_ArrayLength(ArrayLength* x) {
 873   Value array = x->array();
 874   if (set_contains(array)) {
 875     // Value is non-null => update AccessArray
 876     if (last_explicit_null_check_obj() == array) {
 877       x->set_explicit_null_check(consume_last_explicit_null_check());
 878       x->set_needs_null_check(true);
 879       if (PrintNullCheckElimination) {
 880         tty->print_cr("Folded NullCheck %d into ArrayLength %d's null check for value %d",
 881                       x->explicit_null_check()->id(), x->id(), array->id());
 882       }
 883     } else {
 884       x->set_explicit_null_check(NULL);
 885       x->set_needs_null_check(false);
 886       if (PrintNullCheckElimination) {
 887         tty->print_cr("Eliminated ArrayLength %d's null check for value %d", x->id(), array->id());
 888       }
 889     }
 890   } else {
 891     set_put(array);
 892     if (PrintNullCheckElimination) {
 893       tty->print_cr("ArrayLength %d of value %d proves value to be non-null", x->id(), array->id());
 894     }
 895     // Ensure previous passes do not cause wrong state
 896     x->set_needs_null_check(true);
 897     x->set_explicit_null_check(NULL);
 898   }
 899   clear_last_explicit_null_check();
 900 }
 901 
 902 
 903 void NullCheckEliminator::handle_LoadIndexed(LoadIndexed* x) {
 904   Value array = x->array();
 905   if (set_contains(array)) {
 906     // Value is non-null => update AccessArray
 907     if (last_explicit_null_check_obj() == array) {
 908       x->set_explicit_null_check(consume_last_explicit_null_check());
 909       x->set_needs_null_check(true);
 910       if (PrintNullCheckElimination) {
 911         tty->print_cr("Folded NullCheck %d into LoadIndexed %d's null check for value %d",
 912                       x->explicit_null_check()->id(), x->id(), array->id());
 913       }
 914     } else {
 915       x->set_explicit_null_check(NULL);
 916       x->set_needs_null_check(false);
 917       if (PrintNullCheckElimination) {
 918         tty->print_cr("Eliminated LoadIndexed %d's null check for value %d", x->id(), array->id());
 919       }
 920     }
 921   } else {
 922     set_put(array);
 923     if (PrintNullCheckElimination) {
 924       tty->print_cr("LoadIndexed %d of value %d proves value to be non-null", x->id(), array->id());
 925     }
 926     // Ensure previous passes do not cause wrong state
 927     x->set_needs_null_check(true);
 928     x->set_explicit_null_check(NULL);
 929   }
 930   clear_last_explicit_null_check();
 931 }
 932 
 933 
 934 void NullCheckEliminator::handle_StoreIndexed(StoreIndexed* x) {
 935   Value array = x->array();
 936   if (set_contains(array)) {
 937     // Value is non-null => update AccessArray
 938     if (PrintNullCheckElimination) {
 939       tty->print_cr("Eliminated StoreIndexed %d's null check for value %d", x->id(), array->id());
 940     }
 941     x->set_needs_null_check(false);
 942   } else {
 943     set_put(array);
 944     if (PrintNullCheckElimination) {
 945       tty->print_cr("StoreIndexed %d of value %d proves value to be non-null", x->id(), array->id());
 946     }
 947     // Ensure previous passes do not cause wrong state
 948     x->set_needs_null_check(true);
 949   }
 950   clear_last_explicit_null_check();
 951 }
 952 
 953 
 954 void NullCheckEliminator::handle_NullCheck(NullCheck* x) {
 955   Value obj = x->obj();
 956   if (set_contains(obj)) {
 957     // Already proven to be non-null => this NullCheck is useless
 958     if (PrintNullCheckElimination) {
 959       tty->print_cr("Eliminated NullCheck %d for value %d", x->id(), obj->id());
 960     }
 961     // Don't unpin since that may shrink obj's live range and make it unavailable for debug info.
 962     // The code generator won't emit LIR for a NullCheck that cannot trap.
 963     x->set_can_trap(false);
 964   } else {
 965     // May be null => add to map and set last explicit NullCheck
 966     x->set_can_trap(true);
 967     // make sure it's pinned if it can trap
 968     x->pin(Instruction::PinExplicitNullCheck);
 969     set_put(obj);
 970     set_last_explicit_null_check(x);
 971     if (PrintNullCheckElimination) {
 972       tty->print_cr("NullCheck %d of value %d proves value to be non-null", x->id(), obj->id());
 973     }
 974   }
 975 }
 976 
 977 
 978 void NullCheckEliminator::handle_Invoke(Invoke* x) {
 979   if (!x->has_receiver()) {
 980     // Be conservative
 981     clear_last_explicit_null_check();
 982     return;
 983   }
 984 
 985   Value recv = x->receiver();
 986   if (!set_contains(recv)) {
 987     set_put(recv);
 988     if (PrintNullCheckElimination) {
 989       tty->print_cr("Invoke %d of value %d proves value to be non-null", x->id(), recv->id());
 990     }
 991   }
 992   clear_last_explicit_null_check();
 993 }
 994 
 995 
 996 void NullCheckEliminator::handle_NewInstance(NewInstance* x) {
 997   set_put(x);
 998   if (PrintNullCheckElimination) {
 999     tty->print_cr("NewInstance %d is non-null", x->id());
1000   }
1001 }
1002 
1003 
1004 void NullCheckEliminator::handle_NewArray(NewArray* x) {
1005   set_put(x);
1006   if (PrintNullCheckElimination) {
1007     tty->print_cr("NewArray %d is non-null", x->id());
1008   }
1009 }
1010 
1011 
1012 void NullCheckEliminator::handle_ExceptionObject(ExceptionObject* x) {
1013   set_put(x);
1014   if (PrintNullCheckElimination) {
1015     tty->print_cr("ExceptionObject %d is non-null", x->id());
1016   }
1017 }
1018 
1019 
1020 void NullCheckEliminator::handle_AccessMonitor(AccessMonitor* x) {
1021   Value obj = x->obj();
1022   if (set_contains(obj)) {
1023     // Value is non-null => update AccessMonitor
1024     if (PrintNullCheckElimination) {
1025       tty->print_cr("Eliminated AccessMonitor %d's null check for value %d", x->id(), obj->id());
1026     }
1027     x->set_needs_null_check(false);
1028   } else {
1029     set_put(obj);
1030     if (PrintNullCheckElimination) {
1031       tty->print_cr("AccessMonitor %d of value %d proves value to be non-null", x->id(), obj->id());
1032     }
1033     // Ensure previous passes do not cause wrong state
1034     x->set_needs_null_check(true);
1035   }
1036   clear_last_explicit_null_check();
1037 }
1038 
1039 
1040 void NullCheckEliminator::handle_Intrinsic(Intrinsic* x) {
1041   if (!x->has_receiver()) {
1042     if (x->id() == vmIntrinsics::_arraycopy) {
1043       for (int i = 0; i < x->number_of_arguments(); i++) {
1044         x->set_arg_needs_null_check(i, !set_contains(x->argument_at(i)));
1045       }
1046     }
1047 
1048     // Be conservative
1049     clear_last_explicit_null_check();
1050     return;
1051   }
1052 
1053   Value recv = x->receiver();
1054   if (set_contains(recv)) {
1055     // Value is non-null => update Intrinsic
1056     if (PrintNullCheckElimination) {
1057       tty->print_cr("Eliminated Intrinsic %d's null check for value %d", x->id(), recv->id());
1058     }
1059     x->set_needs_null_check(false);
1060   } else {
1061     set_put(recv);
1062     if (PrintNullCheckElimination) {
1063       tty->print_cr("Intrinsic %d of value %d proves value to be non-null", x->id(), recv->id());
1064     }
1065     // Ensure previous passes do not cause wrong state
1066     x->set_needs_null_check(true);
1067   }
1068   clear_last_explicit_null_check();
1069 }
1070 
1071 
1072 void NullCheckEliminator::handle_Phi(Phi* x) {
1073   int i;
1074   bool all_non_null = true;
1075   if (x->is_illegal()) {
1076     all_non_null = false;
1077   } else {
1078     for (i = 0; i < x->operand_count(); i++) {
1079       Value input = x->operand_at(i);
1080       if (!set_contains(input)) {
1081         all_non_null = false;
1082       }
1083     }
1084   }
1085 
1086   if (all_non_null) {
1087     // Value is non-null => update Phi
1088     if (PrintNullCheckElimination) {
1089       tty->print_cr("Eliminated Phi %d's null check for phifun because all inputs are non-null", x->id());
1090     }
1091     x->set_needs_null_check(false);
1092   } else if (set_contains(x)) {
1093     set_remove(x);
1094   }
1095 }
1096 
1097 
1098 void Optimizer::eliminate_null_checks() {
1099   ResourceMark rm;
1100 
1101   NullCheckEliminator nce(this);
1102 
1103   if (PrintNullCheckElimination) {
1104     tty->print_cr("Starting null check elimination for method %s::%s%s",
1105                   ir()->method()->holder()->name()->as_utf8(),
1106                   ir()->method()->name()->as_utf8(),
1107                   ir()->method()->signature()->as_symbol()->as_utf8());
1108   }
1109 
1110   // Apply to graph
1111   nce.iterate(ir()->start());
1112 
1113   // walk over the graph looking for exception
1114   // handlers and iterate over them as well
1115   int nblocks = BlockBegin::number_of_blocks();
1116   BlockList blocks(nblocks);
1117   boolArray visited_block(nblocks, false);
1118 
1119   blocks.push(ir()->start());
1120   visited_block[ir()->start()->block_id()] = true;
1121   for (int i = 0; i < blocks.length(); i++) {
1122     BlockBegin* b = blocks[i];
1123     // exception handlers need to be treated as additional roots
1124     for (int e = b->number_of_exception_handlers(); e-- > 0; ) {
1125       BlockBegin* excp = b->exception_handler_at(e);
1126       int id = excp->block_id();
1127       if (!visited_block[id]) {
1128         blocks.push(excp);
1129         visited_block[id] = true;
1130         nce.iterate(excp);
1131       }
1132     }
1133     // traverse successors
1134     BlockEnd *end = b->end();
1135     for (int s = end->number_of_sux(); s-- > 0; ) {
1136       BlockBegin* next = end->sux_at(s);
1137       int id = next->block_id();
1138       if (!visited_block[id]) {
1139         blocks.push(next);
1140         visited_block[id] = true;
1141       }
1142     }
1143   }
1144 
1145 
1146   if (PrintNullCheckElimination) {
1147     tty->print_cr("Done with null check elimination for method %s::%s%s",
1148                   ir()->method()->holder()->name()->as_utf8(),
1149                   ir()->method()->name()->as_utf8(),
1150                   ir()->method()->signature()->as_symbol()->as_utf8());
1151   }
1152 }