6746907: Improve implicit null check generation
authorkvn
Wed, 10 Sep 2008 20:44:47 -0700
changeset 1136 9f6351874414
parent 1135 9487203e5789
child 1137 26c7642c3642
6746907: Improve implicit null check generation Summary: add missing implicit null check cases. Reviewed-by: never
hotspot/src/share/vm/opto/graphKit.cpp
hotspot/src/share/vm/opto/lcm.cpp
--- a/hotspot/src/share/vm/opto/graphKit.cpp	Wed Sep 10 18:23:32 2008 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.cpp	Wed Sep 10 20:44:47 2008 -0700
@@ -1212,6 +1212,7 @@
                     Deoptimization::Action_make_not_entrant,
                     NULL, "assert_null");
     } else {
+      replace_in_map(value, zerocon(type));
       builtin_throw(reason);
     }
   }
@@ -1960,6 +1961,7 @@
     // method will be compiled to handle NULLs.
     PreserveJVMState pjvms(this);
     set_control(*null_control);
+    replace_in_map(value, null());
     uncommon_trap(Deoptimization::Reason_null_check,
                   Deoptimization::Action_make_not_entrant);
     (*null_control) = top();    // NULL path is dead
--- a/hotspot/src/share/vm/opto/lcm.cpp	Wed Sep 10 18:23:32 2008 -0700
+++ b/hotspot/src/share/vm/opto/lcm.cpp	Wed Sep 10 20:44:47 2008 -0700
@@ -58,6 +58,9 @@
     not_null_block = _succs[0];
     null_block     = _succs[1];
   }
+  while (null_block->is_Empty() == Block::empty_with_goto) {
+    null_block     = null_block->_succs[0];
+  }
 
   // Search the exception block for an uncommon trap.
   // (See Parse::do_if and Parse::do_ifnull for the reason
@@ -149,6 +152,10 @@
       const TypePtr *adr_type = NULL;  // Do not need this return value here
       const Node* base = mach->get_base_and_disp(offset, adr_type);
       if (base == NULL || base == NodeSentinel) {
+        // Narrow oop address doesn't have base, only index
+        if( val->bottom_type()->isa_narrowoop() &&
+            MacroAssembler::needs_explicit_null_check(offset) )
+          continue;             // Give up if offset is beyond page size
         // cannot reason about it; is probably not implicit null exception
       } else {
         const TypePtr* tptr = base->bottom_type()->is_ptr();