--- old/src/hotspot/share/opto/ifnode.cpp 2019-09-16 13:53:52.000000000 +0200 +++ new/src/hotspot/share/opto/ifnode.cpp 2019-09-16 13:53:48.000000000 +0200 @@ -1220,38 +1220,29 @@ return false; } Node* cmp = bol->in(1); - if (cmp->Opcode() != Op_CmpI) { + if (cmp->Opcode() != Op_CmpI && cmp->Opcode() != Op_CmpL) { return false; } Node* cmp_in1 = cmp->in(1); Node* cmp_in2 = cmp->in(2); - if ((unsigned int)cmp_in2->find_int_con(0) != Klass::_lh_array_tag_vt_value) { + + if (cmp_in1->Opcode() != Op_GetFlattenedProperty) { return false; } - if (cmp_in1->Opcode() != Op_RShiftI) { - return false; - } - Node* shift_in1 = cmp_in1->in(1); - Node* shift_in2 = cmp_in1->in(2); - if ((unsigned int)shift_in2->find_int_con(0) != Klass::_lh_array_tag_shift) { - return false; - } - if (shift_in1->Opcode() != Op_LoadI) { - return false; - } - intptr_t offset; - Node* ptr = shift_in1->in(MemNode::Address); - Node* addr = AddPNode::Ideal_base_and_offset(ptr, phase, offset); - if (addr == NULL || offset != in_bytes(Klass::layout_helper_offset())) { - return false; + + jlong in2 = -1; + if (cmp->Opcode() == Op_CmpI) { + in2 = cmp_in2->find_int_con(-1); + } else { + in2 = cmp_in2->find_long_con(-1); } - if (!phase->type(addr)->isa_klassptr()) { + + if (in2 != 0) { return false; } - Node* klass_load = ptr->as_AddP()->in(AddPNode::Base)->uncast(); - if (klass_load->is_DecodeNKlass()) { - klass_load = klass_load->in(1); - } + + Node* klass_load = cmp_in1->in(1); + if (klass_load->is_Load()) { Node* address = klass_load->in(MemNode::Address); array = address->as_AddP()->in(AddPNode::Base);