6715633: when matching a memory node the adr_type should not change

Verify the adr_type of a mach node was not changed

Reviewed-by: rasbold, never
This commit is contained in:
Vladimir Kozlov 2008-06-20 11:10:05 -07:00
parent 694776b297
commit 0a077d276e
10 changed files with 90 additions and 27 deletions

View file

@ -262,14 +262,16 @@ const Node* MachNode::get_base_and_disp(intptr_t &offset, const TypePtr* &adr_ty
// Now we have collected every part of the ADLC MEMORY_INTER.
// See if it adds up to a base + offset.
if (index != NULL) {
if (!index->is_Con()) {
const TypeNarrowOop* narrowoop = index->bottom_type()->isa_narrowoop();
if (narrowoop != NULL) {
// Memory references through narrow oops have a
// funny base so grab the type from the index.
adr_type = narrowoop->make_oopptr();
return NULL;
}
const TypeNarrowOop* narrowoop = index->bottom_type()->isa_narrowoop();
if (narrowoop != NULL) { // EncodeN, LoadN, LoadConN, LoadNKlass.
// Memory references through narrow oops have a
// funny base so grab the type from the index:
// [R12 + narrow_oop_reg<<3 + offset]
assert(base == NULL, "Memory references through narrow oops have no base");
offset = disp;
adr_type = narrowoop->make_oopptr()->add_offset(offset);
return NULL;
} else if (!index->is_Con()) {
disp = Type::OffsetBot;
} else if (disp != Type::OffsetBot) {
const TypeX* ti = index->bottom_type()->isa_intptr_t();