comparison src/share/vm/opto/type.hpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents b8f5ba577b02
children f3de1255b035
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
39 class Type; 39 class Type;
40 class TypeD; 40 class TypeD;
41 class TypeF; 41 class TypeF;
42 class TypeInt; 42 class TypeInt;
43 class TypeLong; 43 class TypeLong;
44 class TypeNarrowOop;
44 class TypeAry; 45 class TypeAry;
45 class TypeTuple; 46 class TypeTuple;
46 class TypePtr; 47 class TypePtr;
47 class TypeRawPtr; 48 class TypeRawPtr;
48 class TypeOopPtr; 49 class TypeOopPtr;
62 Control, // Control of code (not in lattice) 63 Control, // Control of code (not in lattice)
63 Top, // Top of the lattice 64 Top, // Top of the lattice
64 Int, // Integer range (lo-hi) 65 Int, // Integer range (lo-hi)
65 Long, // Long integer range (lo-hi) 66 Long, // Long integer range (lo-hi)
66 Half, // Placeholder half of doubleword 67 Half, // Placeholder half of doubleword
68 NarrowOop, // Compressed oop pointer
67 69
68 Tuple, // Method signature or object layout 70 Tuple, // Method signature or object layout
69 Array, // Array types 71 Array, // Array types
70 72
71 AnyPtr, // Any old raw, klass, inst, or array pointer 73 AnyPtr, // Any old raw, klass, inst, or array pointer
186 // Modified version of JOIN adapted to the needs Node::Value. 188 // Modified version of JOIN adapted to the needs Node::Value.
187 // Normalizes all empty values to TOP. Does not kill _widen bits. 189 // Normalizes all empty values to TOP. Does not kill _widen bits.
188 // Currently, it also works around limitations involving interface types. 190 // Currently, it also works around limitations involving interface types.
189 virtual const Type *filter( const Type *kills ) const; 191 virtual const Type *filter( const Type *kills ) const;
190 192
193 // Returns true if this pointer points at memory which contains a
194 // compressed oop references. In 32-bit builds it's non-virtual
195 // since we don't support compressed oops at all in the mode.
196 LP64_ONLY(virtual) bool is_narrow() const { return false; }
197
191 // Convenience access 198 // Convenience access
192 float getf() const; 199 float getf() const;
193 double getd() const; 200 double getd() const;
194 201
195 const TypeInt *is_int() const; 202 const TypeInt *is_int() const;
202 const TypeF *isa_float_constant() const; // Returns NULL if not a FloatCon 209 const TypeF *isa_float_constant() const; // Returns NULL if not a FloatCon
203 const TypeTuple *is_tuple() const; // Collection of fields, NOT a pointer 210 const TypeTuple *is_tuple() const; // Collection of fields, NOT a pointer
204 const TypeAry *is_ary() const; // Array, NOT array pointer 211 const TypeAry *is_ary() const; // Array, NOT array pointer
205 const TypePtr *is_ptr() const; // Asserts it is a ptr type 212 const TypePtr *is_ptr() const; // Asserts it is a ptr type
206 const TypePtr *isa_ptr() const; // Returns NULL if not ptr type 213 const TypePtr *isa_ptr() const; // Returns NULL if not ptr type
207 const TypeRawPtr *is_rawptr() const; // NOT Java oop 214 const TypeRawPtr *isa_rawptr() const; // NOT Java oop
208 const TypeOopPtr *isa_oopptr() const; // Returns NULL if not ptr type 215 const TypeRawPtr *is_rawptr() const; // Asserts is rawptr
209 const TypeKlassPtr *isa_klassptr() const; // Returns NULL if not KlassPtr 216 const TypeNarrowOop *is_narrowoop() const; // Java-style GC'd pointer
210 const TypeKlassPtr *is_klassptr() const; // assert if not KlassPtr 217 const TypeNarrowOop *isa_narrowoop() const; // Returns NULL if not oop ptr type
211 const TypeOopPtr *is_oopptr() const; // Java-style GC'd pointer 218 const TypeOopPtr *isa_oopptr() const; // Returns NULL if not oop ptr type
212 const TypeInstPtr *isa_instptr() const; // Returns NULL if not InstPtr 219 const TypeOopPtr *is_oopptr() const; // Java-style GC'd pointer
213 const TypeInstPtr *is_instptr() const; // Instance 220 const TypeKlassPtr *isa_klassptr() const; // Returns NULL if not KlassPtr
214 const TypeAryPtr *isa_aryptr() const; // Returns NULL if not AryPtr 221 const TypeKlassPtr *is_klassptr() const; // assert if not KlassPtr
215 const TypeAryPtr *is_aryptr() const; // Array oop 222 const TypeInstPtr *isa_instptr() const; // Returns NULL if not InstPtr
223 const TypeInstPtr *is_instptr() const; // Instance
224 const TypeAryPtr *isa_aryptr() const; // Returns NULL if not AryPtr
225 const TypeAryPtr *is_aryptr() const; // Array oop
216 virtual bool is_finite() const; // Has a finite value 226 virtual bool is_finite() const; // Has a finite value
217 virtual bool is_nan() const; // Is not a number (NaN) 227 virtual bool is_nan() const; // Is not a number (NaN)
218 228
219 // Special test for register pressure heuristic 229 // Special test for register pressure heuristic
220 bool is_floatingpoint() const; // True if Float or Double base type 230 bool is_floatingpoint() const; // True if Float or Double base type
538 // Class of machine Pointer Types: raw data, instances or arrays. 548 // Class of machine Pointer Types: raw data, instances or arrays.
539 // If the _base enum is AnyPtr, then this refers to all of the above. 549 // If the _base enum is AnyPtr, then this refers to all of the above.
540 // Otherwise the _base will indicate which subset of pointers is affected, 550 // Otherwise the _base will indicate which subset of pointers is affected,
541 // and the class will be inherited from. 551 // and the class will be inherited from.
542 class TypePtr : public Type { 552 class TypePtr : public Type {
553 friend class TypeNarrowOop;
543 public: 554 public:
544 enum PTR { TopPTR, AnyNull, Constant, Null, NotNull, BotPTR, lastPTR }; 555 enum PTR { TopPTR, AnyNull, Constant, Null, NotNull, BotPTR, lastPTR };
545 protected: 556 protected:
546 TypePtr( TYPES t, PTR ptr, int offset ) : Type(t), _ptr(ptr), _offset(offset) {} 557 TypePtr( TYPES t, PTR ptr, int offset ) : Type(t), _ptr(ptr), _offset(offset) {}
547 virtual bool eq( const Type *t ) const; 558 virtual bool eq( const Type *t ) const;
699 // corresponding pointer to klass, for a given instance 710 // corresponding pointer to klass, for a given instance
700 const TypeKlassPtr* as_klass_type() const; 711 const TypeKlassPtr* as_klass_type() const;
701 712
702 virtual const TypePtr *add_offset( int offset ) const; 713 virtual const TypePtr *add_offset( int offset ) const;
703 714
715 // returns the equivalent compressed version of this pointer type
716 virtual const TypeNarrowOop* make_narrowoop() const;
717
718 #ifdef _LP64
719 virtual bool is_narrow() const {
720 return (UseCompressedOops && _offset != 0);
721 }
722 #endif
723
704 virtual const Type *xmeet( const Type *t ) const; 724 virtual const Type *xmeet( const Type *t ) const;
705 virtual const Type *xdual() const; // Compute dual right now. 725 virtual const Type *xdual() const; // Compute dual right now.
706 726
707 // Do not allow interface-vs.-noninterface joins to collapse to top. 727 // Do not allow interface-vs.-noninterface joins to collapse to top.
708 virtual const Type *filter( const Type *kills ) const; 728 virtual const Type *filter( const Type *kills ) const;
819 virtual bool empty(void) const; // TRUE if type is vacuous 839 virtual bool empty(void) const; // TRUE if type is vacuous
820 virtual const TypePtr *add_offset( int offset ) const; 840 virtual const TypePtr *add_offset( int offset ) const;
821 841
822 virtual const Type *xmeet( const Type *t ) const; 842 virtual const Type *xmeet( const Type *t ) const;
823 virtual const Type *xdual() const; // Compute dual right now. 843 virtual const Type *xdual() const; // Compute dual right now.
844
845 #ifdef _LP64
846 virtual bool is_narrow() const {
847 return (UseCompressedOops && klass() != NULL && _offset != 0);
848 }
849 #endif
824 850
825 // Convenience common pre-built types. 851 // Convenience common pre-built types.
826 static const TypeAryPtr *RANGE; 852 static const TypeAryPtr *RANGE;
827 static const TypeAryPtr *OOPS; 853 static const TypeAryPtr *OOPS;
828 static const TypeAryPtr *BYTES; 854 static const TypeAryPtr *BYTES;
872 898
873 virtual const TypePtr *add_offset( int offset ) const; 899 virtual const TypePtr *add_offset( int offset ) const;
874 virtual const Type *xmeet( const Type *t ) const; 900 virtual const Type *xmeet( const Type *t ) const;
875 virtual const Type *xdual() const; // Compute dual right now. 901 virtual const Type *xdual() const; // Compute dual right now.
876 902
903 #ifdef _LP64
904 // Perm objects don't use compressed references, except for static fields
905 // which are currently compressed
906 virtual bool is_narrow() const {
907 if (UseCompressedOops && _offset != 0 && _klass->is_instance_klass()) {
908 ciInstanceKlass* ik = _klass->as_instance_klass();
909 return ik != NULL && ik->get_field_by_offset(_offset, true) != NULL;
910 }
911 return false;
912 }
913 #endif
914
877 // Convenience common pre-built types. 915 // Convenience common pre-built types.
878 static const TypeKlassPtr* OBJECT; // Not-null object klass or below 916 static const TypeKlassPtr* OBJECT; // Not-null object klass or below
879 static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same 917 static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same
880 #ifndef PRODUCT 918 #ifndef PRODUCT
881 virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping 919 virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
920 #endif
921 };
922
923 //------------------------------TypeNarrowOop----------------------------------------
924 // A compressed reference to some kind of Oop. This type wraps around
925 // a preexisting TypeOopPtr and forwards most of it's operations to
926 // the underlying type. It's only real purpose is to track the
927 // oopness of the compressed oop value when we expose the conversion
928 // between the normal and the compressed form.
929 class TypeNarrowOop : public Type {
930 protected:
931 const TypePtr* _ooptype;
932
933 TypeNarrowOop( const TypePtr* ooptype): Type(NarrowOop),
934 _ooptype(ooptype) {
935 assert(ooptype->offset() == 0 ||
936 ooptype->offset() == OffsetBot ||
937 ooptype->offset() == OffsetTop, "no real offsets");
938 }
939 public:
940 virtual bool eq( const Type *t ) const;
941 virtual int hash() const; // Type specific hashing
942 virtual bool singleton(void) const; // TRUE if type is a singleton
943
944 virtual const Type *xmeet( const Type *t ) const;
945 virtual const Type *xdual() const; // Compute dual right now.
946
947 virtual intptr_t get_con() const;
948
949 // Do not allow interface-vs.-noninterface joins to collapse to top.
950 virtual const Type *filter( const Type *kills ) const;
951
952 virtual bool empty(void) const; // TRUE if type is vacuous
953
954 static const TypeNarrowOop *make( const TypePtr* type);
955
956 static const TypeNarrowOop* make_from_constant(ciObject* con) {
957 return make(TypeOopPtr::make_from_constant(con));
958 }
959
960 // returns the equivalent oopptr type for this compressed pointer
961 virtual const TypePtr *make_oopptr() const {
962 return _ooptype;
963 }
964
965 static const TypeNarrowOop *BOTTOM;
966 static const TypeNarrowOop *NULL_PTR;
967
968 #ifndef PRODUCT
969 virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
882 #endif 970 #endif
883 }; 971 };
884 972
885 //------------------------------TypeFunc--------------------------------------- 973 //------------------------------TypeFunc---------------------------------------
886 // Class of Array Types 974 // Class of Array Types
1000 inline const TypeOopPtr *Type::isa_oopptr() const { 1088 inline const TypeOopPtr *Type::isa_oopptr() const {
1001 // OopPtr is the first and KlassPtr the last, with no non-oops between. 1089 // OopPtr is the first and KlassPtr the last, with no non-oops between.
1002 return (_base >= OopPtr && _base <= KlassPtr) ? (TypeOopPtr*)this : NULL; 1090 return (_base >= OopPtr && _base <= KlassPtr) ? (TypeOopPtr*)this : NULL;
1003 } 1091 }
1004 1092
1093 inline const TypeRawPtr *Type::isa_rawptr() const {
1094 return (_base == RawPtr) ? (TypeRawPtr*)this : NULL;
1095 }
1096
1005 inline const TypeRawPtr *Type::is_rawptr() const { 1097 inline const TypeRawPtr *Type::is_rawptr() const {
1006 assert( _base == RawPtr, "Not a raw pointer" ); 1098 assert( _base == RawPtr, "Not a raw pointer" );
1007 return (TypeRawPtr*)this; 1099 return (TypeRawPtr*)this;
1008 } 1100 }
1009 1101
1021 } 1113 }
1022 1114
1023 inline const TypeAryPtr *Type::is_aryptr() const { 1115 inline const TypeAryPtr *Type::is_aryptr() const {
1024 assert( _base == AryPtr, "Not an array pointer" ); 1116 assert( _base == AryPtr, "Not an array pointer" );
1025 return (TypeAryPtr*)this; 1117 return (TypeAryPtr*)this;
1118 }
1119
1120 inline const TypeNarrowOop *Type::is_narrowoop() const {
1121 // OopPtr is the first and KlassPtr the last, with no non-oops between.
1122 assert(_base == NarrowOop, "Not a narrow oop" ) ;
1123 return (TypeNarrowOop*)this;
1124 }
1125
1126 inline const TypeNarrowOop *Type::isa_narrowoop() const {
1127 // OopPtr is the first and KlassPtr the last, with no non-oops between.
1128 return (_base == NarrowOop) ? (TypeNarrowOop*)this : NULL;
1026 } 1129 }
1027 1130
1028 inline const TypeKlassPtr *Type::isa_klassptr() const { 1131 inline const TypeKlassPtr *Type::isa_klassptr() const {
1029 return (_base == KlassPtr) ? (TypeKlassPtr*)this : NULL; 1132 return (_base == KlassPtr) ? (TypeKlassPtr*)this : NULL;
1030 } 1133 }