< prev index next >
src/hotspot/share/opto/ifnode.cpp
Print this page
*** 1218,1259 ****
Node* bol = in(1);
if (!bol->is_Bool() || bol->as_Bool()->_test._test != BoolTest::ne) {
return false;
}
Node* cmp = bol->in(1);
! if (cmp->Opcode() != Op_CmpI) {
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) {
! 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;
}
! if (!phase->type(addr)->isa_klassptr()) {
return false;
}
! Node* klass_load = ptr->as_AddP()->in(AddPNode::Base)->uncast();
! if (klass_load->is_DecodeNKlass()) {
! klass_load = klass_load->in(1);
! }
if (klass_load->is_Load()) {
Node* address = klass_load->in(MemNode::Address);
array = address->as_AddP()->in(AddPNode::Base);
}
return true;
--- 1218,1250 ----
Node* bol = in(1);
if (!bol->is_Bool() || bol->as_Bool()->_test._test != BoolTest::ne) {
return false;
}
Node* cmp = bol->in(1);
! if (cmp->Opcode() != Op_CmpI && cmp->Opcode() != Op_CmpL) {
return false;
}
Node* cmp_in1 = cmp->in(1);
Node* cmp_in2 = cmp->in(2);
!
! if (cmp_in1->Opcode() != Op_GetFlattenedProperty) {
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 (in2 != 0) {
return false;
}
!
! 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);
}
return true;
< prev index next >