Tue, 04 Sep 2012 23:27:55 +0200
7184649: NPG: Implement another MetdataPtr case
Summary: xmeet when both inputs are MetadataPtr.
Reviewed-by: kvn
src/share/vm/opto/type.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/opto/type.cpp Tue Sep 04 13:01:03 2012 +0200 1.2 +++ b/src/share/vm/opto/type.cpp Tue Sep 04 23:27:55 2012 +0200 1.3 @@ -3913,10 +3913,25 @@ 1.4 case AryPtr: 1.5 return TypePtr::BOTTOM; // Oop meet raw is not well defined 1.6 1.7 - case MetadataPtr: 1.8 - ShouldNotReachHere(); 1.9 + case MetadataPtr: { 1.10 + const TypeMetadataPtr *tp = t->is_metadataptr(); 1.11 + int offset = meet_offset(tp->offset()); 1.12 + PTR tptr = tp->ptr(); 1.13 + PTR ptr = meet_ptr(tptr); 1.14 + ciMetadata* md = (tptr == TopPTR) ? metadata() : tp->metadata(); 1.15 + if (tptr == TopPTR || _ptr == TopPTR || 1.16 + metadata()->equals(tp->metadata())) { 1.17 + return make(ptr, md, offset); 1.18 + } 1.19 + // metadata is different 1.20 + if( ptr == Constant ) { // Cannot be equal constants, so... 1.21 + if( tptr == Constant && _ptr != Constant) return t; 1.22 + if( _ptr == Constant && tptr != Constant) return this; 1.23 + ptr = NotNull; // Fall down in lattice 1.24 + } 1.25 + return make(ptr, NULL, offset); 1.26 break; 1.27 - 1.28 + } 1.29 } // End of switch 1.30 return this; // Return the double constant 1.31 }