changeset 1971:b65b341bd9fa

6982533: Crash in ~StubRoutines::jbyte_fill with AggressiveOpts enabled Reviewed-by: kvn
author never
date Tue, 07 Sep 2010 11:31:27 -0700
parents fa7695e418a1
children 17143f9aa19a
files src/share/vm/opto/loopTransform.cpp
diffstat 1 files changed, 10 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/opto/loopTransform.cpp	Fri Sep 03 18:43:52 2010 -0700
+++ b/src/share/vm/opto/loopTransform.cpp	Tue Sep 07 11:31:27 2010 -0700
@@ -2417,6 +2417,8 @@
       Node* value = n->in(MemNode::ValueIn);
       if (!lpt->is_invariant(value)) {
         msg  = "variant store value";
+      } else if (!_igvn.type(n->in(MemNode::Address))->isa_aryptr()) {
+        msg = "not array address";
       }
       store = n;
       store_value = value;
@@ -2468,6 +2470,7 @@
   // head->phi * elsize + con.  head->phi might have a ConvI2L.
   Node* elements[4];
   Node* conv = NULL;
+  bool found_index = false;
   int count = store->in(MemNode::Address)->as_AddP()->unpack_offsets(elements, ARRAY_SIZE(elements));
   for (int e = 0; e < count; e++) {
     Node* n = elements[e];
@@ -2484,17 +2487,20 @@
       if (value != head->phi()) {
         msg = "unhandled shift in address";
       } else {
+        found_index = true;
         shift = n;
         assert(type2aelembytes(store->as_Mem()->memory_type(), true) == 1 << shift->in(2)->get_int(), "scale should match");
       }
     } else if (n->Opcode() == Op_ConvI2L && conv == NULL) {
       if (n->in(1) == head->phi()) {
+        found_index = true;
         conv = n;
       } else {
         msg = "unhandled input to ConvI2L";
       }
     } else if (n == head->phi()) {
       // no shift, check below for allowed cases
+      found_index = true;
     } else {
       msg = "unhandled node in address";
       msg_node = n;
@@ -2506,6 +2512,10 @@
     msg_node = store;
   }
 
+  if (!found_index) {
+    msg = "missing use of index";
+  }
+
   // byte sized items won't have a shift
   if (msg == NULL && shift == NULL && t != T_BYTE && t != T_BOOLEAN) {
     msg = "can't find shift";