# HG changeset patch # User never # Date 1283884287 25200 # Node ID b65b341bd9fa5bde5b6ed02034448da847d2299c # Parent fa7695e418a140fe7bf9c3221f394c13f8479eb5 6982533: Crash in ~StubRoutines::jbyte_fill with AggressiveOpts enabled Reviewed-by: kvn diff -r fa7695e418a1 -r b65b341bd9fa src/share/vm/opto/loopTransform.cpp --- 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";