From 87639c7444f2c87860473068f3a8b72905ef1031 Mon Sep 17 00:00:00 2001 From: roland Date: Tue, 4 Sep 2012 23:27:55 +0200 Subject: [PATCH] 7184649: NPG: Implement another MetdataPtr case Summary: xmeet when both inputs are MetadataPtr. Reviewed-by: kvn --- src/share/vm/opto/type.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/share/vm/opto/type.cpp b/src/share/vm/opto/type.cpp index 7ce52ce32..1e85be7d4 100644 --- a/src/share/vm/opto/type.cpp +++ b/src/share/vm/opto/type.cpp @@ -3913,10 +3913,25 @@ const Type *TypeMetadataPtr::xmeet( const Type *t ) const { case AryPtr: return TypePtr::BOTTOM; // Oop meet raw is not well defined - case MetadataPtr: - ShouldNotReachHere(); + case MetadataPtr: { + const TypeMetadataPtr *tp = t->is_metadataptr(); + int offset = meet_offset(tp->offset()); + PTR tptr = tp->ptr(); + PTR ptr = meet_ptr(tptr); + ciMetadata* md = (tptr == TopPTR) ? metadata() : tp->metadata(); + if (tptr == TopPTR || _ptr == TopPTR || + metadata()->equals(tp->metadata())) { + return make(ptr, md, offset); + } + // metadata is different + if( ptr == Constant ) { // Cannot be equal constants, so... + if( tptr == Constant && _ptr != Constant) return t; + if( _ptr == Constant && tptr != Constant) return this; + ptr = NotNull; // Fall down in lattice + } + return make(ptr, NULL, offset); break; - + } } // End of switch return this; // Return the double constant } -- GitLab