diff src/share/vm/opto/cfgnode.cpp @ 853:64219d2a6493

6851282: JIT miscompilation results in null entry in array when using CompressedOops Summary: Get type for new Phi from non dead path. Reviewed-by: never
author kvn
date Thu, 16 Jul 2009 16:29:55 -0700
parents 7bb995fbd3c0
children 433f394ab509
line wrap: on
line diff
--- a/src/share/vm/opto/cfgnode.cpp	Thu Jul 16 14:10:42 2009 -0700
+++ b/src/share/vm/opto/cfgnode.cpp	Thu Jul 16 16:29:55 2009 -0700
@@ -1796,8 +1796,12 @@
     for (uint i=1; i<req(); ++i) {// For all paths in
       Node *ii = in(i);
       if (ii->is_DecodeN() && ii->bottom_type() == bottom_type()) {
-        has_decodeN = true;
-        in_decodeN = ii->in(1);
+        // Note: in_decodeN is used only to define the type of new phi.
+        // Find a non dead path otherwise phi type will be wrong.
+        if (ii->in(1)->bottom_type() != Type::TOP) {
+          has_decodeN = true;
+          in_decodeN = ii->in(1);
+        }
       } else if (!ii->is_Phi()) {
         may_push = false;
       }
@@ -1805,7 +1809,6 @@
 
     if (has_decodeN && may_push) {
       PhaseIterGVN *igvn = phase->is_IterGVN();
-      // Note: in_decodeN is used only to define the type of new phi here.
       PhiNode *new_phi = PhiNode::make_blank(in(0), in_decodeN);
       uint orig_cnt = req();
       for (uint i=1; i<req(); ++i) {// For all paths in