hotspot/src/share/vm/opto/type.hpp
changeset 589 a44a1e70a3e4
parent 392 0b3167e2f2de
child 767 64fb1fd7186d
child 670 ddf3e9583f2f
equal deleted inserted replaced
588:96be33305a55 589:a44a1e70a3e4
   189   // Normalizes all empty values to TOP.  Does not kill _widen bits.
   189   // Normalizes all empty values to TOP.  Does not kill _widen bits.
   190   // Currently, it also works around limitations involving interface types.
   190   // Currently, it also works around limitations involving interface types.
   191   virtual const Type *filter( const Type *kills ) const;
   191   virtual const Type *filter( const Type *kills ) const;
   192 
   192 
   193   // Returns true if this pointer points at memory which contains a
   193   // Returns true if this pointer points at memory which contains a
   194   // compressed oop references.  In 32-bit builds it's non-virtual
   194   // compressed oop references.
   195   // since we don't support compressed oops at all in the mode.
   195   bool is_ptr_to_narrowoop() const;
   196   LP64_ONLY(virtual) bool is_narrow() const { return false; }
       
   197 
   196 
   198   // Convenience access
   197   // Convenience access
   199   float getf() const;
   198   float getf() const;
   200   double getd() const;
   199   double getd() const;
   201 
   200 
   211   const TypeAry    *is_ary() const;              // Array, NOT array pointer
   210   const TypeAry    *is_ary() const;              // Array, NOT array pointer
   212   const TypePtr    *is_ptr() const;              // Asserts it is a ptr type
   211   const TypePtr    *is_ptr() const;              // Asserts it is a ptr type
   213   const TypePtr    *isa_ptr() const;             // Returns NULL if not ptr type
   212   const TypePtr    *isa_ptr() const;             // Returns NULL if not ptr type
   214   const TypeRawPtr *isa_rawptr() const;          // NOT Java oop
   213   const TypeRawPtr *isa_rawptr() const;          // NOT Java oop
   215   const TypeRawPtr *is_rawptr() const;           // Asserts is rawptr
   214   const TypeRawPtr *is_rawptr() const;           // Asserts is rawptr
   216   const TypeNarrowOop  *is_narrowoop() const;        // Java-style GC'd pointer
   215   const TypeNarrowOop  *is_narrowoop() const;    // Java-style GC'd pointer
   217   const TypeNarrowOop  *isa_narrowoop() const;       // Returns NULL if not oop ptr type
   216   const TypeNarrowOop  *isa_narrowoop() const;   // Returns NULL if not oop ptr type
   218   const TypeOopPtr   *isa_oopptr() const;        // Returns NULL if not oop ptr type
   217   const TypeOopPtr   *isa_oopptr() const;        // Returns NULL if not oop ptr type
   219   const TypeOopPtr   *is_oopptr() const;         // Java-style GC'd pointer
   218   const TypeOopPtr   *is_oopptr() const;         // Java-style GC'd pointer
   220   const TypeKlassPtr *isa_klassptr() const;      // Returns NULL if not KlassPtr
   219   const TypeKlassPtr *isa_klassptr() const;      // Returns NULL if not KlassPtr
   221   const TypeKlassPtr *is_klassptr() const;       // assert if not KlassPtr
   220   const TypeKlassPtr *is_klassptr() const;       // assert if not KlassPtr
   222   const TypeInstPtr  *isa_instptr() const;       // Returns NULL if not InstPtr
   221   const TypeInstPtr  *isa_instptr() const;       // Returns NULL if not InstPtr
   641 
   640 
   642 //------------------------------TypeOopPtr-------------------------------------
   641 //------------------------------TypeOopPtr-------------------------------------
   643 // Some kind of oop (Java pointer), either klass or instance or array.
   642 // Some kind of oop (Java pointer), either klass or instance or array.
   644 class TypeOopPtr : public TypePtr {
   643 class TypeOopPtr : public TypePtr {
   645 protected:
   644 protected:
   646   TypeOopPtr( TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id ) : TypePtr(t, ptr, offset), _const_oop(o), _klass(k), _klass_is_exact(xk), _instance_id(instance_id) { }
   645   TypeOopPtr( TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id );
   647 public:
   646 public:
   648   virtual bool eq( const Type *t ) const;
   647   virtual bool eq( const Type *t ) const;
   649   virtual int  hash() const;             // Type specific hashing
   648   virtual int  hash() const;             // Type specific hashing
   650   virtual bool singleton(void) const;    // TRUE if type is a singleton
   649   virtual bool singleton(void) const;    // TRUE if type is a singleton
   651   enum {
   650   enum {
   658   ciObject*     _const_oop;   // Constant oop
   657   ciObject*     _const_oop;   // Constant oop
   659   // If _klass is NULL, then so is _sig.  This is an unloaded klass.
   658   // If _klass is NULL, then so is _sig.  This is an unloaded klass.
   660   ciKlass*      _klass;       // Klass object
   659   ciKlass*      _klass;       // Klass object
   661   // Does the type exclude subclasses of the klass?  (Inexact == polymorphic.)
   660   // Does the type exclude subclasses of the klass?  (Inexact == polymorphic.)
   662   bool          _klass_is_exact;
   661   bool          _klass_is_exact;
   663 
   662   bool          _is_ptr_to_narrowoop;
   664   int          _instance_id;   // if not UNKNOWN_INSTANCE, indicates that this is a particular instance
   663 
       
   664   int           _instance_id;  // if not UNKNOWN_INSTANCE, indicates that this is a particular instance
   665                                // of this type which is distinct.  This is the  the node index of the
   665                                // of this type which is distinct.  This is the  the node index of the
   666                                // node creating this instance
   666                                // node creating this instance
   667 
   667 
   668   static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
   668   static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
   669 
   669 
   694   static const TypeOopPtr* make(PTR ptr, int offset);
   694   static const TypeOopPtr* make(PTR ptr, int offset);
   695 
   695 
   696   ciObject* const_oop()    const { return _const_oop; }
   696   ciObject* const_oop()    const { return _const_oop; }
   697   virtual ciKlass* klass() const { return _klass;     }
   697   virtual ciKlass* klass() const { return _klass;     }
   698   bool klass_is_exact()    const { return _klass_is_exact; }
   698   bool klass_is_exact()    const { return _klass_is_exact; }
       
   699 
       
   700   // Returns true if this pointer points at memory which contains a
       
   701   // compressed oop references.
       
   702   bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; }
       
   703 
   699   bool is_instance()       const { return _instance_id != UNKNOWN_INSTANCE; }
   704   bool is_instance()       const { return _instance_id != UNKNOWN_INSTANCE; }
   700   uint instance_id()       const { return _instance_id; }
   705   uint instance_id()       const { return _instance_id; }
   701   bool is_instance_field() const { return _instance_id != UNKNOWN_INSTANCE && _offset >= 0; }
   706   bool is_instance_field() const { return _instance_id != UNKNOWN_INSTANCE && _offset >= 0; }
   702 
   707 
   703   virtual intptr_t get_con() const;
   708   virtual intptr_t get_con() const;
   713 
   718 
   714   virtual const TypePtr *add_offset( int offset ) const;
   719   virtual const TypePtr *add_offset( int offset ) const;
   715 
   720 
   716   // returns the equivalent compressed version of this pointer type
   721   // returns the equivalent compressed version of this pointer type
   717   virtual const TypeNarrowOop* make_narrowoop() const;
   722   virtual const TypeNarrowOop* make_narrowoop() const;
   718 
       
   719 #ifdef _LP64
       
   720   virtual bool is_narrow() const {
       
   721     return (UseCompressedOops && _offset != 0);
       
   722   }
       
   723 #endif
       
   724 
   723 
   725   virtual const Type *xmeet( const Type *t ) const;
   724   virtual const Type *xmeet( const Type *t ) const;
   726   virtual const Type *xdual() const;    // Compute dual right now.
   725   virtual const Type *xdual() const;    // Compute dual right now.
   727 
   726 
   728   // Do not allow interface-vs.-noninterface joins to collapse to top.
   727   // Do not allow interface-vs.-noninterface joins to collapse to top.
   841   virtual const TypePtr *add_offset( int offset ) const;
   840   virtual const TypePtr *add_offset( int offset ) const;
   842 
   841 
   843   virtual const Type *xmeet( const Type *t ) const;
   842   virtual const Type *xmeet( const Type *t ) const;
   844   virtual const Type *xdual() const;    // Compute dual right now.
   843   virtual const Type *xdual() const;    // Compute dual right now.
   845 
   844 
   846 #ifdef _LP64
       
   847   virtual bool is_narrow() const {
       
   848     return (UseCompressedOops && klass() != NULL && _offset != 0);
       
   849   }
       
   850 #endif
       
   851 
       
   852   // Convenience common pre-built types.
   845   // Convenience common pre-built types.
   853   static const TypeAryPtr *RANGE;
   846   static const TypeAryPtr *RANGE;
   854   static const TypeAryPtr *OOPS;
   847   static const TypeAryPtr *OOPS;
       
   848   static const TypeAryPtr *NARROWOOPS;
   855   static const TypeAryPtr *BYTES;
   849   static const TypeAryPtr *BYTES;
   856   static const TypeAryPtr *SHORTS;
   850   static const TypeAryPtr *SHORTS;
   857   static const TypeAryPtr *CHARS;
   851   static const TypeAryPtr *CHARS;
   858   static const TypeAryPtr *INTS;
   852   static const TypeAryPtr *INTS;
   859   static const TypeAryPtr *LONGS;
   853   static const TypeAryPtr *LONGS;
   899 
   893 
   900   virtual const TypePtr *add_offset( int offset ) const;
   894   virtual const TypePtr *add_offset( int offset ) const;
   901   virtual const Type    *xmeet( const Type *t ) const;
   895   virtual const Type    *xmeet( const Type *t ) const;
   902   virtual const Type    *xdual() const;      // Compute dual right now.
   896   virtual const Type    *xdual() const;      // Compute dual right now.
   903 
   897 
   904 #ifdef _LP64
       
   905   // Perm objects don't use compressed references, except for static fields
       
   906   // which are currently compressed
       
   907   virtual bool is_narrow() const {
       
   908     if (UseCompressedOops && _offset != 0 && _klass->is_instance_klass()) {
       
   909       ciInstanceKlass* ik = _klass->as_instance_klass();
       
   910       return ik != NULL && ik->get_field_by_offset(_offset, true) != NULL;
       
   911     }
       
   912     return false;
       
   913   }
       
   914 #endif
       
   915 
       
   916   // Convenience common pre-built types.
   898   // Convenience common pre-built types.
   917   static const TypeKlassPtr* OBJECT; // Not-null object klass or below
   899   static const TypeKlassPtr* OBJECT; // Not-null object klass or below
   918   static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same
   900   static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same
   919 #ifndef PRODUCT
   901 #ifndef PRODUCT
   920   virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
   902   virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
   921 #endif
   903 #endif
   922 };
   904 };
   923 
   905 
   924 //------------------------------TypeNarrowOop----------------------------------------
   906 //------------------------------TypeNarrowOop----------------------------------
   925 // A compressed reference to some kind of Oop.  This type wraps around
   907 // A compressed reference to some kind of Oop.  This type wraps around
   926 // a preexisting TypeOopPtr and forwards most of it's operations to
   908 // a preexisting TypeOopPtr and forwards most of it's operations to
   927 // the underlying type.  It's only real purpose is to track the
   909 // the underlying type.  It's only real purpose is to track the
   928 // oopness of the compressed oop value when we expose the conversion
   910 // oopness of the compressed oop value when we expose the conversion
   929 // between the normal and the compressed form.
   911 // between the normal and the compressed form.
  1011 #endif
   993 #endif
  1012   // Convenience common pre-built types.
   994   // Convenience common pre-built types.
  1013 };
   995 };
  1014 
   996 
  1015 //------------------------------accessors--------------------------------------
   997 //------------------------------accessors--------------------------------------
       
   998 inline bool Type::is_ptr_to_narrowoop() const {
       
   999 #ifdef _LP64
       
  1000   return (isa_oopptr() != NULL && is_oopptr()->is_ptr_to_narrowoop_nv());
       
  1001 #else
       
  1002   return false;
       
  1003 #endif
       
  1004 }
       
  1005 
  1016 inline float Type::getf() const {
  1006 inline float Type::getf() const {
  1017   assert( _base == FloatCon, "Not a FloatCon" );
  1007   assert( _base == FloatCon, "Not a FloatCon" );
  1018   return ((TypeF*)this)->_f;
  1008   return ((TypeF*)this)->_f;
  1019 }
  1009 }
  1020 
  1010