1 /*
   2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_VM_OPTO_TYPE_HPP
  26 #define SHARE_VM_OPTO_TYPE_HPP
  27 
  28 #include "libadt/port.hpp"
  29 #include "opto/adlcVMDeps.hpp"
  30 #include "runtime/handles.hpp"
  31 
  32 // Portions of code courtesy of Clifford Click
  33 
  34 // Optimization - Graph Style
  35 
  36 
  37 // This class defines a Type lattice.  The lattice is used in the constant
  38 // propagation algorithms, and for some type-checking of the iloc code.
  39 // Basic types include RSD's (lower bound, upper bound, stride for integers),
  40 // float & double precision constants, sets of data-labels and code-labels.
  41 // The complete lattice is described below.  Subtypes have no relationship to
  42 // up or down in the lattice; that is entirely determined by the behavior of
  43 // the MEET/JOIN functions.
  44 
  45 class Dict;
  46 class Type;
  47 class   TypeD;
  48 class   TypeF;
  49 class   TypeInt;
  50 class   TypeLong;
  51 class   TypeNarrowOop;
  52 class   TypeAry;
  53 class   TypeTuple;
  54 class   TypeVect;
  55 class     TypeVectS;
  56 class     TypeVectD;
  57 class     TypeVectX;
  58 class     TypeVectY;
  59 class   TypePtr;
  60 class     TypeRawPtr;
  61 class     TypeOopPtr;
  62 class       TypeInstPtr;
  63 class       TypeAryPtr;
  64 class       TypeKlassPtr;
  65 
  66 //------------------------------Type-------------------------------------------
  67 // Basic Type object, represents a set of primitive Values.
  68 // Types are hash-cons'd into a private class dictionary, so only one of each
  69 // different kind of Type exists.  Types are never modified after creation, so
  70 // all their interesting fields are constant.
  71 class Type {
  72   friend class VMStructs;
  73 
  74 public:
  75   enum TYPES {
  76     Bad=0,                      // Type check
  77     Control,                    // Control of code (not in lattice)
  78     Top,                        // Top of the lattice
  79     Int,                        // Integer range (lo-hi)
  80     Long,                       // Long integer range (lo-hi)
  81     Half,                       // Placeholder half of doubleword
  82     NarrowOop,                  // Compressed oop pointer
  83 
  84     Tuple,                      // Method signature or object layout
  85     Array,                      // Array types
  86     VectorS,                    //  32bit Vector types
  87     VectorD,                    //  64bit Vector types
  88     VectorX,                    // 128bit Vector types
  89     VectorY,                    // 256bit Vector types
  90 
  91     AnyPtr,                     // Any old raw, klass, inst, or array pointer
  92     RawPtr,                     // Raw (non-oop) pointers
  93     OopPtr,                     // Any and all Java heap entities
  94     InstPtr,                    // Instance pointers (non-array objects)
  95     AryPtr,                     // Array pointers
  96     KlassPtr,                   // Klass pointers
  97     // (Ptr order matters:  See is_ptr, isa_ptr, is_oopptr, isa_oopptr.)
  98 
  99     Function,                   // Function signature
 100     Abio,                       // Abstract I/O
 101     Return_Address,             // Subroutine return address
 102     Memory,                     // Abstract store
 103     FloatTop,                   // No float value
 104     FloatCon,                   // Floating point constant
 105     FloatBot,                   // Any float value
 106     DoubleTop,                  // No double value
 107     DoubleCon,                  // Double precision constant
 108     DoubleBot,                  // Any double value
 109     Bottom,                     // Bottom of lattice
 110     lastype                     // Bogus ending type (not in lattice)
 111   };
 112 
 113   // Signal values for offsets from a base pointer
 114   enum OFFSET_SIGNALS {
 115     OffsetTop = -2000000000,    // undefined offset
 116     OffsetBot = -2000000001     // any possible offset
 117   };
 118 
 119   // Min and max WIDEN values.
 120   enum WIDEN {
 121     WidenMin = 0,
 122     WidenMax = 3
 123   };
 124 
 125 private:
 126   // Dictionary of types shared among compilations.
 127   static Dict* _shared_type_dict;
 128 
 129   static int uhash( const Type *const t );
 130   // Structural equality check.  Assumes that cmp() has already compared
 131   // the _base types and thus knows it can cast 't' appropriately.
 132   virtual bool eq( const Type *t ) const;
 133 
 134   // Top-level hash-table of types
 135   static Dict *type_dict() {
 136     return Compile::current()->type_dict();
 137   }
 138 
 139   // DUAL operation: reflect around lattice centerline.  Used instead of
 140   // join to ensure my lattice is symmetric up and down.  Dual is computed
 141   // lazily, on demand, and cached in _dual.
 142   const Type *_dual;            // Cached dual value
 143   // Table for efficient dualing of base types
 144   static const TYPES dual_type[lastype];
 145 
 146 protected:
 147   // Each class of type is also identified by its base.
 148   const TYPES _base;            // Enum of Types type
 149 
 150   Type( TYPES t ) : _dual(NULL),  _base(t) {} // Simple types
 151   // ~Type();                   // Use fast deallocation
 152   const Type *hashcons();       // Hash-cons the type
 153 
 154 public:
 155 
 156   inline void* operator new( size_t x ) {
 157     Compile* compile = Compile::current();
 158     compile->set_type_last_size(x);
 159     void *temp = compile->type_arena()->Amalloc_D(x);
 160     compile->set_type_hwm(temp);
 161     return temp;
 162   }
 163   inline void operator delete( void* ptr ) {
 164     Compile* compile = Compile::current();
 165     compile->type_arena()->Afree(ptr,compile->type_last_size());
 166   }
 167 
 168   // Initialize the type system for a particular compilation.
 169   static void Initialize(Compile* compile);
 170 
 171   // Initialize the types shared by all compilations.
 172   static void Initialize_shared(Compile* compile);
 173 
 174   TYPES base() const {
 175     assert(_base > Bad && _base < lastype, "sanity");
 176     return _base;
 177   }
 178 
 179   // Create a new hash-consd type
 180   static const Type *make(enum TYPES);
 181   // Test for equivalence of types
 182   static int cmp( const Type *const t1, const Type *const t2 );
 183   // Test for higher or equal in lattice
 184   int higher_equal( const Type *t ) const { return !cmp(meet(t),t); }
 185 
 186   // MEET operation; lower in lattice.
 187   const Type *meet( const Type *t ) const;
 188   // WIDEN: 'widens' for Ints and other range types
 189   virtual const Type *widen( const Type *old, const Type* limit ) const { return this; }
 190   // NARROW: complement for widen, used by pessimistic phases
 191   virtual const Type *narrow( const Type *old ) const { return this; }
 192 
 193   // DUAL operation: reflect around lattice centerline.  Used instead of
 194   // join to ensure my lattice is symmetric up and down.
 195   const Type *dual() const { return _dual; }
 196 
 197   // Compute meet dependent on base type
 198   virtual const Type *xmeet( const Type *t ) const;
 199   virtual const Type *xdual() const;    // Compute dual right now.
 200 
 201   // JOIN operation; higher in lattice.  Done by finding the dual of the
 202   // meet of the dual of the 2 inputs.
 203   const Type *join( const Type *t ) const {
 204     return dual()->meet(t->dual())->dual(); }
 205 
 206   // Modified version of JOIN adapted to the needs Node::Value.
 207   // Normalizes all empty values to TOP.  Does not kill _widen bits.
 208   // Currently, it also works around limitations involving interface types.
 209   virtual const Type *filter( const Type *kills ) const;
 210 
 211 #ifdef ASSERT
 212   // One type is interface, the other is oop
 213   virtual bool interface_vs_oop(const Type *t) const;
 214 #endif
 215 
 216   // Returns true if this pointer points at memory which contains a
 217   // compressed oop references.
 218   bool is_ptr_to_narrowoop() const;
 219 
 220   // Convenience access
 221   float getf() const;
 222   double getd() const;
 223 
 224   const TypeInt    *is_int() const;
 225   const TypeInt    *isa_int() const;             // Returns NULL if not an Int
 226   const TypeLong   *is_long() const;
 227   const TypeLong   *isa_long() const;            // Returns NULL if not a Long
 228   const TypeD      *is_double_constant() const;  // Asserts it is a DoubleCon
 229   const TypeD      *isa_double_constant() const; // Returns NULL if not a DoubleCon
 230   const TypeF      *is_float_constant() const;   // Asserts it is a FloatCon
 231   const TypeF      *isa_float_constant() const;  // Returns NULL if not a FloatCon
 232   const TypeTuple  *is_tuple() const;            // Collection of fields, NOT a pointer
 233   const TypeAry    *is_ary() const;              // Array, NOT array pointer
 234   const TypeVect   *is_vect() const;             // Vector
 235   const TypeVect   *isa_vect() const;            // Returns NULL if not a Vector
 236   const TypePtr    *is_ptr() const;              // Asserts it is a ptr type
 237   const TypePtr    *isa_ptr() const;             // Returns NULL if not ptr type
 238   const TypeRawPtr *isa_rawptr() const;          // NOT Java oop
 239   const TypeRawPtr *is_rawptr() const;           // Asserts is rawptr
 240   const TypeNarrowOop  *is_narrowoop() const;    // Java-style GC'd pointer
 241   const TypeNarrowOop  *isa_narrowoop() const;   // Returns NULL if not oop ptr type
 242   const TypeOopPtr   *isa_oopptr() const;        // Returns NULL if not oop ptr type
 243   const TypeOopPtr   *is_oopptr() const;         // Java-style GC'd pointer
 244   const TypeKlassPtr *isa_klassptr() const;      // Returns NULL if not KlassPtr
 245   const TypeKlassPtr *is_klassptr() const;       // assert if not KlassPtr
 246   const TypeInstPtr  *isa_instptr() const;       // Returns NULL if not InstPtr
 247   const TypeInstPtr  *is_instptr() const;        // Instance
 248   const TypeAryPtr   *isa_aryptr() const;        // Returns NULL if not AryPtr
 249   const TypeAryPtr   *is_aryptr() const;         // Array oop
 250   virtual bool      is_finite() const;           // Has a finite value
 251   virtual bool      is_nan()    const;           // Is not a number (NaN)
 252 
 253   // Returns this ptr type or the equivalent ptr type for this compressed pointer.
 254   const TypePtr* make_ptr() const;
 255 
 256   // Returns this oopptr type or the equivalent oopptr type for this compressed pointer.
 257   // Asserts if the underlying type is not an oopptr or narrowoop.
 258   const TypeOopPtr* make_oopptr() const;
 259 
 260   // Returns this compressed pointer or the equivalent compressed version
 261   // of this pointer type.
 262   const TypeNarrowOop* make_narrowoop() const;
 263 
 264   // Special test for register pressure heuristic
 265   bool is_floatingpoint() const;        // True if Float or Double base type
 266 
 267   // Do you have memory, directly or through a tuple?
 268   bool has_memory( ) const;
 269 
 270   // Are you a pointer type or not?
 271   bool isa_oop_ptr() const;
 272 
 273   // TRUE if type is a singleton
 274   virtual bool singleton(void) const;
 275 
 276   // TRUE if type is above the lattice centerline, and is therefore vacuous
 277   virtual bool empty(void) const;
 278 
 279   // Return a hash for this type.  The hash function is public so ConNode
 280   // (constants) can hash on their constant, which is represented by a Type.
 281   virtual int hash() const;
 282 
 283   // Map ideal registers (machine types) to ideal types
 284   static const Type *mreg2type[];
 285 
 286   // Printing, statistics
 287   static const char * const msg[lastype]; // Printable strings
 288 #ifndef PRODUCT
 289   void         dump_on(outputStream *st) const;
 290   void         dump() const {
 291     dump_on(tty);
 292   }
 293   virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
 294   static  void dump_stats();
 295   static  void verify_lastype();          // Check that arrays match type enum
 296 #endif
 297   void typerr(const Type *t) const; // Mixing types error
 298 
 299   // Create basic type
 300   static const Type* get_const_basic_type(BasicType type) {
 301     assert((uint)type <= T_CONFLICT && _const_basic_type[type] != NULL, "bad type");
 302     return _const_basic_type[type];
 303   }
 304 
 305   // Mapping to the array element's basic type.
 306   BasicType array_element_basic_type() const;
 307 
 308   // Create standard type for a ciType:
 309   static const Type* get_const_type(ciType* type);
 310 
 311   // Create standard zero value:
 312   static const Type* get_zero_type(BasicType type) {
 313     assert((uint)type <= T_CONFLICT && _zero_type[type] != NULL, "bad type");
 314     return _zero_type[type];
 315   }
 316 
 317   // Report if this is a zero value (not top).
 318   bool is_zero_type() const {
 319     BasicType type = basic_type();
 320     if (type == T_VOID || type >= T_CONFLICT)
 321       return false;
 322     else
 323       return (this == _zero_type[type]);
 324   }
 325 
 326   // Convenience common pre-built types.
 327   static const Type *ABIO;
 328   static const Type *BOTTOM;
 329   static const Type *CONTROL;
 330   static const Type *DOUBLE;
 331   static const Type *FLOAT;
 332   static const Type *HALF;
 333   static const Type *MEMORY;
 334   static const Type *MULTI;
 335   static const Type *RETURN_ADDRESS;
 336   static const Type *TOP;
 337 
 338   // Mapping from compiler type to VM BasicType
 339   BasicType basic_type() const { return _basic_type[_base]; }
 340 
 341   // Mapping from CI type system to compiler type:
 342   static const Type* get_typeflow_type(ciType* type);
 343 
 344 private:
 345   // support arrays
 346   static const BasicType _basic_type[];
 347   static const Type*        _zero_type[T_CONFLICT+1];
 348   static const Type* _const_basic_type[T_CONFLICT+1];
 349 };
 350 
 351 //------------------------------TypeF------------------------------------------
 352 // Class of Float-Constant Types.
 353 class TypeF : public Type {
 354   TypeF( float f ) : Type(FloatCon), _f(f) {};
 355 public:
 356   virtual bool eq( const Type *t ) const;
 357   virtual int  hash() const;             // Type specific hashing
 358   virtual bool singleton(void) const;    // TRUE if type is a singleton
 359   virtual bool empty(void) const;        // TRUE if type is vacuous
 360 public:
 361   const float _f;               // Float constant
 362 
 363   static const TypeF *make(float f);
 364 
 365   virtual bool        is_finite() const;  // Has a finite value
 366   virtual bool        is_nan()    const;  // Is not a number (NaN)
 367 
 368   virtual const Type *xmeet( const Type *t ) const;
 369   virtual const Type *xdual() const;    // Compute dual right now.
 370   // Convenience common pre-built types.
 371   static const TypeF *ZERO; // positive zero only
 372   static const TypeF *ONE;
 373 #ifndef PRODUCT
 374   virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
 375 #endif
 376 };
 377 
 378 //------------------------------TypeD------------------------------------------
 379 // Class of Double-Constant Types.
 380 class TypeD : public Type {
 381   TypeD( double d ) : Type(DoubleCon), _d(d) {};
 382 public:
 383   virtual bool eq( const Type *t ) const;
 384   virtual int  hash() const;             // Type specific hashing
 385   virtual bool singleton(void) const;    // TRUE if type is a singleton
 386   virtual bool empty(void) const;        // TRUE if type is vacuous
 387 public:
 388   const double _d;              // Double constant
 389 
 390   static const TypeD *make(double d);
 391 
 392   virtual bool        is_finite() const;  // Has a finite value
 393   virtual bool        is_nan()    const;  // Is not a number (NaN)
 394 
 395   virtual const Type *xmeet( const Type *t ) const;
 396   virtual const Type *xdual() const;    // Compute dual right now.
 397   // Convenience common pre-built types.
 398   static const TypeD *ZERO; // positive zero only
 399   static const TypeD *ONE;
 400 #ifndef PRODUCT
 401   virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
 402 #endif
 403 };
 404 
 405 //------------------------------TypeInt----------------------------------------
 406 // Class of integer ranges, the set of integers between a lower bound and an
 407 // upper bound, inclusive.
 408 class TypeInt : public Type {
 409   TypeInt( jint lo, jint hi, int w );
 410 public:
 411   virtual bool eq( const Type *t ) const;
 412   virtual int  hash() const;             // Type specific hashing
 413   virtual bool singleton(void) const;    // TRUE if type is a singleton
 414   virtual bool empty(void) const;        // TRUE if type is vacuous
 415 public:
 416   const jint _lo, _hi;          // Lower bound, upper bound
 417   const short _widen;           // Limit on times we widen this sucker
 418 
 419   static const TypeInt *make(jint lo);
 420   // must always specify w
 421   static const TypeInt *make(jint lo, jint hi, int w);
 422 
 423   // Check for single integer
 424   int is_con() const { return _lo==_hi; }
 425   bool is_con(int i) const { return is_con() && _lo == i; }
 426   jint get_con() const { assert( is_con(), "" );  return _lo; }
 427 
 428   virtual bool        is_finite() const;  // Has a finite value
 429 
 430   virtual const Type *xmeet( const Type *t ) const;
 431   virtual const Type *xdual() const;    // Compute dual right now.
 432   virtual const Type *widen( const Type *t, const Type* limit_type ) const;
 433   virtual const Type *narrow( const Type *t ) const;
 434   // Do not kill _widen bits.
 435   virtual const Type *filter( const Type *kills ) const;
 436   // Convenience common pre-built types.
 437   static const TypeInt *MINUS_1;
 438   static const TypeInt *ZERO;
 439   static const TypeInt *ONE;
 440   static const TypeInt *BOOL;
 441   static const TypeInt *CC;
 442   static const TypeInt *CC_LT;  // [-1]  == MINUS_1
 443   static const TypeInt *CC_GT;  // [1]   == ONE
 444   static const TypeInt *CC_EQ;  // [0]   == ZERO
 445   static const TypeInt *CC_LE;  // [-1,0]
 446   static const TypeInt *CC_GE;  // [0,1] == BOOL (!)
 447   static const TypeInt *BYTE;
 448   static const TypeInt *UBYTE;
 449   static const TypeInt *CHAR;
 450   static const TypeInt *SHORT;
 451   static const TypeInt *POS;
 452   static const TypeInt *POS1;
 453   static const TypeInt *INT;
 454   static const TypeInt *SYMINT; // symmetric range [-max_jint..max_jint]
 455 #ifndef PRODUCT
 456   virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
 457 #endif
 458 };
 459 
 460 
 461 //------------------------------TypeLong---------------------------------------
 462 // Class of long integer ranges, the set of integers between a lower bound and
 463 // an upper bound, inclusive.
 464 class TypeLong : public Type {
 465   TypeLong( jlong lo, jlong hi, int w );
 466 public:
 467   virtual bool eq( const Type *t ) const;
 468   virtual int  hash() const;             // Type specific hashing
 469   virtual bool singleton(void) const;    // TRUE if type is a singleton
 470   virtual bool empty(void) const;        // TRUE if type is vacuous
 471 public:
 472   const jlong _lo, _hi;         // Lower bound, upper bound
 473   const short _widen;           // Limit on times we widen this sucker
 474 
 475   static const TypeLong *make(jlong lo);
 476   // must always specify w
 477   static const TypeLong *make(jlong lo, jlong hi, int w);
 478 
 479   // Check for single integer
 480   int is_con() const { return _lo==_hi; }
 481   bool is_con(int i) const { return is_con() && _lo == i; }
 482   jlong get_con() const { assert( is_con(), "" ); return _lo; }
 483 
 484   virtual bool        is_finite() const;  // Has a finite value
 485 
 486   virtual const Type *xmeet( const Type *t ) const;
 487   virtual const Type *xdual() const;    // Compute dual right now.
 488   virtual const Type *widen( const Type *t, const Type* limit_type ) const;
 489   virtual const Type *narrow( const Type *t ) const;
 490   // Do not kill _widen bits.
 491   virtual const Type *filter( const Type *kills ) const;
 492   // Convenience common pre-built types.
 493   static const TypeLong *MINUS_1;
 494   static const TypeLong *ZERO;
 495   static const TypeLong *ONE;
 496   static const TypeLong *POS;
 497   static const TypeLong *LONG;
 498   static const TypeLong *INT;    // 32-bit subrange [min_jint..max_jint]
 499   static const TypeLong *UINT;   // 32-bit unsigned [0..max_juint]
 500 #ifndef PRODUCT
 501   virtual void dump2( Dict &d, uint, outputStream *st  ) const;// Specialized per-Type dumping
 502 #endif
 503 };
 504 
 505 //------------------------------TypeTuple--------------------------------------
 506 // Class of Tuple Types, essentially type collections for function signatures
 507 // and class layouts.  It happens to also be a fast cache for the HotSpot
 508 // signature types.
 509 class TypeTuple : public Type {
 510   TypeTuple( uint cnt, const Type **fields ) : Type(Tuple), _cnt(cnt), _fields(fields) { }
 511 public:
 512   virtual bool eq( const Type *t ) const;
 513   virtual int  hash() const;             // Type specific hashing
 514   virtual bool singleton(void) const;    // TRUE if type is a singleton
 515   virtual bool empty(void) const;        // TRUE if type is vacuous
 516 
 517 public:
 518   const uint          _cnt;              // Count of fields
 519   const Type ** const _fields;           // Array of field types
 520 
 521   // Accessors:
 522   uint cnt() const { return _cnt; }
 523   const Type* field_at(uint i) const {
 524     assert(i < _cnt, "oob");
 525     return _fields[i];
 526   }
 527   void set_field_at(uint i, const Type* t) {
 528     assert(i < _cnt, "oob");
 529     _fields[i] = t;
 530   }
 531 
 532   static const TypeTuple *make( uint cnt, const Type **fields );
 533   static const TypeTuple *make_range(ciSignature *sig);
 534   static const TypeTuple *make_domain(ciInstanceKlass* recv, ciSignature *sig);
 535 
 536   // Subroutine call type with space allocated for argument types
 537   static const Type **fields( uint arg_cnt );
 538 
 539   virtual const Type *xmeet( const Type *t ) const;
 540   virtual const Type *xdual() const;    // Compute dual right now.
 541   // Convenience common pre-built types.
 542   static const TypeTuple *IFBOTH;
 543   static const TypeTuple *IFFALSE;
 544   static const TypeTuple *IFTRUE;
 545   static const TypeTuple *IFNEITHER;
 546   static const TypeTuple *LOOPBODY;
 547   static const TypeTuple *MEMBAR;
 548   static const TypeTuple *STORECONDITIONAL;
 549   static const TypeTuple *START_I2C;
 550   static const TypeTuple *INT_PAIR;
 551   static const TypeTuple *LONG_PAIR;
 552 #ifndef PRODUCT
 553   virtual void dump2( Dict &d, uint, outputStream *st  ) const; // Specialized per-Type dumping
 554 #endif
 555 };
 556 
 557 //------------------------------TypeAry----------------------------------------
 558 // Class of Array Types
 559 class TypeAry : public Type {
 560   TypeAry( const Type *elem, const TypeInt *size) : Type(Array),
 561     _elem(elem), _size(size) {}
 562 public:
 563   virtual bool eq( const Type *t ) const;
 564   virtual int  hash() const;             // Type specific hashing
 565   virtual bool singleton(void) const;    // TRUE if type is a singleton
 566   virtual bool empty(void) const;        // TRUE if type is vacuous
 567 
 568 private:
 569   const Type *_elem;            // Element type of array
 570   const TypeInt *_size;         // Elements in array
 571   friend class TypeAryPtr;
 572 
 573 public:
 574   static const TypeAry *make(  const Type *elem, const TypeInt *size);
 575 
 576   virtual const Type *xmeet( const Type *t ) const;
 577   virtual const Type *xdual() const;    // Compute dual right now.
 578   bool ary_must_be_exact() const;  // true if arrays of such are never generic
 579 #ifdef ASSERT
 580   // One type is interface, the other is oop
 581   virtual bool interface_vs_oop(const Type *t) const;
 582 #endif
 583 #ifndef PRODUCT
 584   virtual void dump2( Dict &d, uint, outputStream *st  ) const; // Specialized per-Type dumping
 585 #endif
 586 };
 587 
 588 //------------------------------TypeVect---------------------------------------
 589 // Class of Vector Types
 590 class TypeVect : public Type {
 591   const Type*   _elem;  // Vector's element type
 592   const uint  _length;  // Elements in vector (power of 2)
 593 
 594 protected:
 595   TypeVect(TYPES t, const Type* elem, uint length) : Type(t),
 596     _elem(elem), _length(length) {}
 597 
 598 public:
 599   const Type* element_type() const { return _elem; }
 600   BasicType element_basic_type() const { return _elem->array_element_basic_type(); }
 601   uint length() const { return _length; }
 602   uint length_in_bytes() const {
 603    return _length * type2aelembytes(element_basic_type());
 604   }
 605 
 606   virtual bool eq(const Type *t) const;
 607   virtual int  hash() const;             // Type specific hashing
 608   virtual bool singleton(void) const;    // TRUE if type is a singleton
 609   virtual bool empty(void) const;        // TRUE if type is vacuous
 610 
 611   static const TypeVect *make(const BasicType elem_bt, uint length) {
 612     // Use bottom primitive type.
 613     return make(get_const_basic_type(elem_bt), length);
 614   }
 615   // Used directly by Replicate nodes to construct singleton vector.
 616   static const TypeVect *make(const Type* elem, uint length);
 617 
 618   virtual const Type *xmeet( const Type *t) const;
 619   virtual const Type *xdual() const;     // Compute dual right now.
 620 
 621   static const TypeVect *VECTS;
 622   static const TypeVect *VECTD;
 623   static const TypeVect *VECTX;
 624   static const TypeVect *VECTY;
 625 
 626 #ifndef PRODUCT
 627   virtual void dump2(Dict &d, uint, outputStream *st) const; // Specialized per-Type dumping
 628 #endif
 629 };
 630 
 631 class TypeVectS : public TypeVect {
 632   friend class TypeVect;
 633   TypeVectS(const Type* elem, uint length) : TypeVect(VectorS, elem, length) {}
 634 };
 635 
 636 class TypeVectD : public TypeVect {
 637   friend class TypeVect;
 638   TypeVectD(const Type* elem, uint length) : TypeVect(VectorD, elem, length) {}
 639 };
 640 
 641 class TypeVectX : public TypeVect {
 642   friend class TypeVect;
 643   TypeVectX(const Type* elem, uint length) : TypeVect(VectorX, elem, length) {}
 644 };
 645 
 646 class TypeVectY : public TypeVect {
 647   friend class TypeVect;
 648   TypeVectY(const Type* elem, uint length) : TypeVect(VectorY, elem, length) {}
 649 };
 650 
 651 //------------------------------TypePtr----------------------------------------
 652 // Class of machine Pointer Types: raw data, instances or arrays.
 653 // If the _base enum is AnyPtr, then this refers to all of the above.
 654 // Otherwise the _base will indicate which subset of pointers is affected,
 655 // and the class will be inherited from.
 656 class TypePtr : public Type {
 657   friend class TypeNarrowOop;
 658 public:
 659   enum PTR { TopPTR, AnyNull, Constant, Null, NotNull, BotPTR, lastPTR };
 660 protected:
 661   TypePtr( TYPES t, PTR ptr, int offset ) : Type(t), _ptr(ptr), _offset(offset) {}
 662   virtual bool eq( const Type *t ) const;
 663   virtual int  hash() const;             // Type specific hashing
 664   static const PTR ptr_meet[lastPTR][lastPTR];
 665   static const PTR ptr_dual[lastPTR];
 666   static const char * const ptr_msg[lastPTR];
 667 
 668 public:
 669   const int _offset;            // Offset into oop, with TOP & BOT
 670   const PTR _ptr;               // Pointer equivalence class
 671 
 672   const int offset() const { return _offset; }
 673   const PTR ptr()    const { return _ptr; }
 674 
 675   static const TypePtr *make( TYPES t, PTR ptr, int offset );
 676 
 677   // Return a 'ptr' version of this type
 678   virtual const Type *cast_to_ptr_type(PTR ptr) const;
 679 
 680   virtual intptr_t get_con() const;
 681 
 682   int xadd_offset( intptr_t offset ) const;
 683   virtual const TypePtr *add_offset( intptr_t offset ) const;
 684 
 685   virtual bool singleton(void) const;    // TRUE if type is a singleton
 686   virtual bool empty(void) const;        // TRUE if type is vacuous
 687   virtual const Type *xmeet( const Type *t ) const;
 688   int meet_offset( int offset ) const;
 689   int dual_offset( ) const;
 690   virtual const Type *xdual() const;    // Compute dual right now.
 691 
 692   // meet, dual and join over pointer equivalence sets
 693   PTR meet_ptr( const PTR in_ptr ) const { return ptr_meet[in_ptr][ptr()]; }
 694   PTR dual_ptr()                   const { return ptr_dual[ptr()];      }
 695 
 696   // This is textually confusing unless one recalls that
 697   // join(t) == dual()->meet(t->dual())->dual().
 698   PTR join_ptr( const PTR in_ptr ) const {
 699     return ptr_dual[ ptr_meet[ ptr_dual[in_ptr] ] [ dual_ptr() ] ];
 700   }
 701 
 702   // Tests for relation to centerline of type lattice:
 703   static bool above_centerline(PTR ptr) { return (ptr <= AnyNull); }
 704   static bool below_centerline(PTR ptr) { return (ptr >= NotNull); }
 705   // Convenience common pre-built types.
 706   static const TypePtr *NULL_PTR;
 707   static const TypePtr *NOTNULL;
 708   static const TypePtr *BOTTOM;
 709 #ifndef PRODUCT
 710   virtual void dump2( Dict &d, uint depth, outputStream *st  ) const;
 711 #endif
 712 };
 713 
 714 //------------------------------TypeRawPtr-------------------------------------
 715 // Class of raw pointers, pointers to things other than Oops.  Examples
 716 // include the stack pointer, top of heap, card-marking area, handles, etc.
 717 class TypeRawPtr : public TypePtr {
 718 protected:
 719   TypeRawPtr( PTR ptr, address bits ) : TypePtr(RawPtr,ptr,0), _bits(bits){}
 720 public:
 721   virtual bool eq( const Type *t ) const;
 722   virtual int  hash() const;     // Type specific hashing
 723 
 724   const address _bits;          // Constant value, if applicable
 725 
 726   static const TypeRawPtr *make( PTR ptr );
 727   static const TypeRawPtr *make( address bits );
 728 
 729   // Return a 'ptr' version of this type
 730   virtual const Type *cast_to_ptr_type(PTR ptr) const;
 731 
 732   virtual intptr_t get_con() const;
 733 
 734   virtual const TypePtr *add_offset( intptr_t offset ) const;
 735 
 736   virtual const Type *xmeet( const Type *t ) const;
 737   virtual const Type *xdual() const;    // Compute dual right now.
 738   // Convenience common pre-built types.
 739   static const TypeRawPtr *BOTTOM;
 740   static const TypeRawPtr *NOTNULL;
 741 #ifndef PRODUCT
 742   virtual void dump2( Dict &d, uint depth, outputStream *st  ) const;
 743 #endif
 744 };
 745 
 746 //------------------------------TypeOopPtr-------------------------------------
 747 // Some kind of oop (Java pointer), either klass or instance or array.
 748 class TypeOopPtr : public TypePtr {
 749 protected:
 750   TypeOopPtr( TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id );
 751 public:
 752   virtual bool eq( const Type *t ) const;
 753   virtual int  hash() const;             // Type specific hashing
 754   virtual bool singleton(void) const;    // TRUE if type is a singleton
 755   enum {
 756    InstanceTop = -1,   // undefined instance
 757    InstanceBot = 0     // any possible instance
 758   };
 759 protected:
 760 
 761   // Oop is NULL, unless this is a constant oop.
 762   ciObject*     _const_oop;   // Constant oop
 763   // If _klass is NULL, then so is _sig.  This is an unloaded klass.
 764   ciKlass*      _klass;       // Klass object
 765   // Does the type exclude subclasses of the klass?  (Inexact == polymorphic.)
 766   bool          _klass_is_exact;
 767   bool          _is_ptr_to_narrowoop;
 768 
 769   // If not InstanceTop or InstanceBot, indicates that this is
 770   // a particular instance of this type which is distinct.
 771   // This is the the node index of the allocation node creating this instance.
 772   int           _instance_id;
 773 
 774   static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
 775 
 776   int dual_instance_id() const;
 777   int meet_instance_id(int uid) const;
 778 
 779 public:
 780   // Creates a type given a klass. Correctly handles multi-dimensional arrays
 781   // Respects UseUniqueSubclasses.
 782   // If the klass is final, the resulting type will be exact.
 783   static const TypeOopPtr* make_from_klass(ciKlass* klass) {
 784     return make_from_klass_common(klass, true, false);
 785   }
 786   // Same as before, but will produce an exact type, even if
 787   // the klass is not final, as long as it has exactly one implementation.
 788   static const TypeOopPtr* make_from_klass_unique(ciKlass* klass) {
 789     return make_from_klass_common(klass, true, true);
 790   }
 791   // Same as before, but does not respects UseUniqueSubclasses.
 792   // Use this only for creating array element types.
 793   static const TypeOopPtr* make_from_klass_raw(ciKlass* klass) {
 794     return make_from_klass_common(klass, false, false);
 795   }
 796   // Creates a singleton type given an object.
 797   // If the object cannot be rendered as a constant,
 798   // may return a non-singleton type.
 799   // If require_constant, produce a NULL if a singleton is not possible.
 800   static const TypeOopPtr* make_from_constant(ciObject* o, bool require_constant = false);
 801 
 802   // Make a generic (unclassed) pointer to an oop.
 803   static const TypeOopPtr* make(PTR ptr, int offset, int instance_id);
 804 
 805   ciObject* const_oop()    const { return _const_oop; }
 806   virtual ciKlass* klass() const { return _klass;     }
 807   bool klass_is_exact()    const { return _klass_is_exact; }
 808 
 809   // Returns true if this pointer points at memory which contains a
 810   // compressed oop references.
 811   bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; }
 812 
 813   bool is_known_instance()       const { return _instance_id > 0; }
 814   int  instance_id()             const { return _instance_id; }
 815   bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; }
 816 
 817   virtual intptr_t get_con() const;
 818 
 819   virtual const Type *cast_to_ptr_type(PTR ptr) const;
 820 
 821   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 822 
 823   virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 824 
 825   // corresponding pointer to klass, for a given instance
 826   const TypeKlassPtr* as_klass_type() const;
 827 
 828   virtual const TypePtr *add_offset( intptr_t offset ) const;
 829 
 830   virtual const Type *xmeet( const Type *t ) const;
 831   virtual const Type *xdual() const;    // Compute dual right now.
 832 
 833   // Do not allow interface-vs.-noninterface joins to collapse to top.
 834   virtual const Type *filter( const Type *kills ) const;
 835 
 836   // Convenience common pre-built type.
 837   static const TypeOopPtr *BOTTOM;
 838 #ifndef PRODUCT
 839   virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
 840 #endif
 841 };
 842 
 843 //------------------------------TypeInstPtr------------------------------------
 844 // Class of Java object pointers, pointing either to non-array Java instances
 845 // or to a klassOop (including array klasses).
 846 class TypeInstPtr : public TypeOopPtr {
 847   TypeInstPtr( PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id );
 848   virtual bool eq( const Type *t ) const;
 849   virtual int  hash() const;             // Type specific hashing
 850 
 851   ciSymbol*  _name;        // class name
 852 
 853  public:
 854   ciSymbol* name()         const { return _name; }
 855 
 856   bool  is_loaded() const { return _klass->is_loaded(); }
 857 
 858   // Make a pointer to a constant oop.
 859   static const TypeInstPtr *make(ciObject* o) {
 860     return make(TypePtr::Constant, o->klass(), true, o, 0);
 861   }
 862 
 863   // Make a pointer to a constant oop with offset.
 864   static const TypeInstPtr *make(ciObject* o, int offset) {
 865     return make(TypePtr::Constant, o->klass(), true, o, offset);
 866   }
 867 
 868   // Make a pointer to some value of type klass.
 869   static const TypeInstPtr *make(PTR ptr, ciKlass* klass) {
 870     return make(ptr, klass, false, NULL, 0);
 871   }
 872 
 873   // Make a pointer to some non-polymorphic value of exactly type klass.
 874   static const TypeInstPtr *make_exact(PTR ptr, ciKlass* klass) {
 875     return make(ptr, klass, true, NULL, 0);
 876   }
 877 
 878   // Make a pointer to some value of type klass with offset.
 879   static const TypeInstPtr *make(PTR ptr, ciKlass* klass, int offset) {
 880     return make(ptr, klass, false, NULL, offset);
 881   }
 882 
 883   // Make a pointer to an oop.
 884   static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = InstanceBot );
 885 
 886   // If this is a java.lang.Class constant, return the type for it or NULL.
 887   // Pass to Type::get_const_type to turn it to a type, which will usually
 888   // be a TypeInstPtr, but may also be a TypeInt::INT for int.class, etc.
 889   ciType* java_mirror_type() const;
 890 
 891   virtual const Type *cast_to_ptr_type(PTR ptr) const;
 892 
 893   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 894 
 895   virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 896 
 897   virtual const TypePtr *add_offset( intptr_t offset ) const;
 898 
 899   virtual const Type *xmeet( const Type *t ) const;
 900   virtual const TypeInstPtr *xmeet_unloaded( const TypeInstPtr *t ) const;
 901   virtual const Type *xdual() const;    // Compute dual right now.
 902 
 903   // Convenience common pre-built types.
 904   static const TypeInstPtr *NOTNULL;
 905   static const TypeInstPtr *BOTTOM;
 906   static const TypeInstPtr *MIRROR;
 907   static const TypeInstPtr *MARK;
 908   static const TypeInstPtr *KLASS;
 909 #ifndef PRODUCT
 910   virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
 911 #endif
 912 };
 913 
 914 //------------------------------TypeAryPtr-------------------------------------
 915 // Class of Java array pointers
 916 class TypeAryPtr : public TypeOopPtr {
 917   TypeAryPtr( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id ) : TypeOopPtr(AryPtr,ptr,k,xk,o,offset, instance_id), _ary(ary) {
 918 #ifdef ASSERT
 919     if (k != NULL) {
 920       // Verify that specified klass and TypeAryPtr::klass() follow the same rules.
 921       ciKlass* ck = compute_klass(true);
 922       if (k != ck) {
 923         this->dump(); tty->cr();
 924         tty->print(" k: ");
 925         k->print(); tty->cr();
 926         tty->print("ck: ");
 927         if (ck != NULL) ck->print();
 928         else tty->print("<NULL>");
 929         tty->cr();
 930         assert(false, "unexpected TypeAryPtr::_klass");
 931       }
 932     }
 933 #endif
 934   }
 935   virtual bool eq( const Type *t ) const;
 936   virtual int hash() const;     // Type specific hashing
 937   const TypeAry *_ary;          // Array we point into
 938 
 939   ciKlass* compute_klass(DEBUG_ONLY(bool verify = false)) const;
 940 
 941 public:
 942   // Accessors
 943   ciKlass* klass() const;
 944   const TypeAry* ary() const  { return _ary; }
 945   const Type*    elem() const { return _ary->_elem; }
 946   const TypeInt* size() const { return _ary->_size; }
 947 
 948   static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot);
 949   // Constant pointer to array
 950   static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot);
 951 
 952   // Return a 'ptr' version of this type
 953   virtual const Type *cast_to_ptr_type(PTR ptr) const;
 954 
 955   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 956 
 957   virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 958 
 959   virtual const TypeAryPtr* cast_to_size(const TypeInt* size) const;
 960   virtual const TypeInt* narrow_size_type(const TypeInt* size) const;
 961 
 962   virtual bool empty(void) const;        // TRUE if type is vacuous
 963   virtual const TypePtr *add_offset( intptr_t offset ) const;
 964 
 965   virtual const Type *xmeet( const Type *t ) const;
 966   virtual const Type *xdual() const;    // Compute dual right now.
 967 
 968   // Convenience common pre-built types.
 969   static const TypeAryPtr *RANGE;
 970   static const TypeAryPtr *OOPS;
 971   static const TypeAryPtr *NARROWOOPS;
 972   static const TypeAryPtr *BYTES;
 973   static const TypeAryPtr *SHORTS;
 974   static const TypeAryPtr *CHARS;
 975   static const TypeAryPtr *INTS;
 976   static const TypeAryPtr *LONGS;
 977   static const TypeAryPtr *FLOATS;
 978   static const TypeAryPtr *DOUBLES;
 979   // selects one of the above:
 980   static const TypeAryPtr *get_array_body_type(BasicType elem) {
 981     assert((uint)elem <= T_CONFLICT && _array_body_type[elem] != NULL, "bad elem type");
 982     return _array_body_type[elem];
 983   }
 984   static const TypeAryPtr *_array_body_type[T_CONFLICT+1];
 985   // sharpen the type of an int which is used as an array size
 986 #ifdef ASSERT
 987   // One type is interface, the other is oop
 988   virtual bool interface_vs_oop(const Type *t) const;
 989 #endif
 990 #ifndef PRODUCT
 991   virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
 992 #endif
 993 };
 994 
 995 //------------------------------TypeKlassPtr-----------------------------------
 996 // Class of Java Klass pointers
 997 class TypeKlassPtr : public TypeOopPtr {
 998   TypeKlassPtr( PTR ptr, ciKlass* klass, int offset );
 999 
1000   virtual bool eq( const Type *t ) const;
1001   virtual int hash() const;             // Type specific hashing
1002 
1003 public:
1004   ciSymbol* name()  const { return _klass->name(); }
1005 
1006   bool  is_loaded() const { return _klass->is_loaded(); }
1007 
1008   // ptr to klass 'k'
1009   static const TypeKlassPtr *make( ciKlass* k ) { return make( TypePtr::Constant, k, 0); }
1010   // ptr to klass 'k' with offset
1011   static const TypeKlassPtr *make( ciKlass* k, int offset ) { return make( TypePtr::Constant, k, offset); }
1012   // ptr to klass 'k' or sub-klass
1013   static const TypeKlassPtr *make( PTR ptr, ciKlass* k, int offset);
1014 
1015   virtual const Type *cast_to_ptr_type(PTR ptr) const;
1016 
1017   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
1018 
1019   // corresponding pointer to instance, for a given class
1020   const TypeOopPtr* as_instance_type() const;
1021 
1022   virtual const TypePtr *add_offset( intptr_t offset ) const;
1023   virtual const Type    *xmeet( const Type *t ) const;
1024   virtual const Type    *xdual() const;      // Compute dual right now.
1025 
1026   // Convenience common pre-built types.
1027   static const TypeKlassPtr* OBJECT; // Not-null object klass or below
1028   static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same
1029 #ifndef PRODUCT
1030   virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
1031 #endif
1032 };
1033 
1034 //------------------------------TypeNarrowOop----------------------------------
1035 // A compressed reference to some kind of Oop.  This type wraps around
1036 // a preexisting TypeOopPtr and forwards most of it's operations to
1037 // the underlying type.  It's only real purpose is to track the
1038 // oopness of the compressed oop value when we expose the conversion
1039 // between the normal and the compressed form.
1040 class TypeNarrowOop : public Type {
1041 protected:
1042   const TypePtr* _ptrtype; // Could be TypePtr::NULL_PTR
1043 
1044   TypeNarrowOop( const TypePtr* ptrtype): Type(NarrowOop),
1045     _ptrtype(ptrtype) {
1046     assert(ptrtype->offset() == 0 ||
1047            ptrtype->offset() == OffsetBot ||
1048            ptrtype->offset() == OffsetTop, "no real offsets");
1049   }
1050 public:
1051   virtual bool eq( const Type *t ) const;
1052   virtual int  hash() const;             // Type specific hashing
1053   virtual bool singleton(void) const;    // TRUE if type is a singleton
1054 
1055   virtual const Type *xmeet( const Type *t ) const;
1056   virtual const Type *xdual() const;    // Compute dual right now.
1057 
1058   virtual intptr_t get_con() const;
1059 
1060   // Do not allow interface-vs.-noninterface joins to collapse to top.
1061   virtual const Type *filter( const Type *kills ) const;
1062 
1063   virtual bool empty(void) const;        // TRUE if type is vacuous
1064 
1065   static const TypeNarrowOop *make( const TypePtr* type);
1066 
1067   static const TypeNarrowOop* make_from_constant(ciObject* con, bool require_constant = false) {
1068     return make(TypeOopPtr::make_from_constant(con, require_constant));
1069   }
1070 
1071   // returns the equivalent ptr type for this compressed pointer
1072   const TypePtr *get_ptrtype() const {
1073     return _ptrtype;
1074   }
1075 
1076   static const TypeNarrowOop *BOTTOM;
1077   static const TypeNarrowOop *NULL_PTR;
1078 
1079 #ifndef PRODUCT
1080   virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
1081 #endif
1082 };
1083 
1084 //------------------------------TypeFunc---------------------------------------
1085 // Class of Array Types
1086 class TypeFunc : public Type {
1087   TypeFunc( const TypeTuple *domain, const TypeTuple *range ) : Type(Function),  _domain(domain), _range(range) {}
1088   virtual bool eq( const Type *t ) const;
1089   virtual int  hash() const;             // Type specific hashing
1090   virtual bool singleton(void) const;    // TRUE if type is a singleton
1091   virtual bool empty(void) const;        // TRUE if type is vacuous
1092 public:
1093   // Constants are shared among ADLC and VM
1094   enum { Control    = AdlcVMDeps::Control,
1095          I_O        = AdlcVMDeps::I_O,
1096          Memory     = AdlcVMDeps::Memory,
1097          FramePtr   = AdlcVMDeps::FramePtr,
1098          ReturnAdr  = AdlcVMDeps::ReturnAdr,
1099          Parms      = AdlcVMDeps::Parms
1100   };
1101 
1102   const TypeTuple* const _domain;     // Domain of inputs
1103   const TypeTuple* const _range;      // Range of results
1104 
1105   // Accessors:
1106   const TypeTuple* domain() const { return _domain; }
1107   const TypeTuple* range()  const { return _range; }
1108 
1109   static const TypeFunc *make(ciMethod* method);
1110   static const TypeFunc *make(ciSignature signature, const Type* extra);
1111   static const TypeFunc *make(const TypeTuple* domain, const TypeTuple* range);
1112 
1113   virtual const Type *xmeet( const Type *t ) const;
1114   virtual const Type *xdual() const;    // Compute dual right now.
1115 
1116   BasicType return_type() const;
1117 
1118 #ifndef PRODUCT
1119   virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
1120   void print_flattened() const; // Print a 'flattened' signature
1121 #endif
1122   // Convenience common pre-built types.
1123 };
1124 
1125 //------------------------------accessors--------------------------------------
1126 inline bool Type::is_ptr_to_narrowoop() const {
1127 #ifdef _LP64
1128   return (isa_oopptr() != NULL && is_oopptr()->is_ptr_to_narrowoop_nv());
1129 #else
1130   return false;
1131 #endif
1132 }
1133 
1134 inline float Type::getf() const {
1135   assert( _base == FloatCon, "Not a FloatCon" );
1136   return ((TypeF*)this)->_f;
1137 }
1138 
1139 inline double Type::getd() const {
1140   assert( _base == DoubleCon, "Not a DoubleCon" );
1141   return ((TypeD*)this)->_d;
1142 }
1143 
1144 inline const TypeF *Type::is_float_constant() const {
1145   assert( _base == FloatCon, "Not a Float" );
1146   return (TypeF*)this;
1147 }
1148 
1149 inline const TypeF *Type::isa_float_constant() const {
1150   return ( _base == FloatCon ? (TypeF*)this : NULL);
1151 }
1152 
1153 inline const TypeD *Type::is_double_constant() const {
1154   assert( _base == DoubleCon, "Not a Double" );
1155   return (TypeD*)this;
1156 }
1157 
1158 inline const TypeD *Type::isa_double_constant() const {
1159   return ( _base == DoubleCon ? (TypeD*)this : NULL);
1160 }
1161 
1162 inline const TypeInt *Type::is_int() const {
1163   assert( _base == Int, "Not an Int" );
1164   return (TypeInt*)this;
1165 }
1166 
1167 inline const TypeInt *Type::isa_int() const {
1168   return ( _base == Int ? (TypeInt*)this : NULL);
1169 }
1170 
1171 inline const TypeLong *Type::is_long() const {
1172   assert( _base == Long, "Not a Long" );
1173   return (TypeLong*)this;
1174 }
1175 
1176 inline const TypeLong *Type::isa_long() const {
1177   return ( _base == Long ? (TypeLong*)this : NULL);
1178 }
1179 
1180 inline const TypeTuple *Type::is_tuple() const {
1181   assert( _base == Tuple, "Not a Tuple" );
1182   return (TypeTuple*)this;
1183 }
1184 
1185 inline const TypeAry *Type::is_ary() const {
1186   assert( _base == Array , "Not an Array" );
1187   return (TypeAry*)this;
1188 }
1189 
1190 inline const TypeVect *Type::is_vect() const {
1191   assert( _base >= VectorS && _base <= VectorY, "Not a Vector" );
1192   return (TypeVect*)this;
1193 }
1194 
1195 inline const TypeVect *Type::isa_vect() const {
1196   return (_base >= VectorS && _base <= VectorY) ? (TypeVect*)this : NULL;
1197 }
1198 
1199 inline const TypePtr *Type::is_ptr() const {
1200   // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
1201   assert(_base >= AnyPtr && _base <= KlassPtr, "Not a pointer");
1202   return (TypePtr*)this;
1203 }
1204 
1205 inline const TypePtr *Type::isa_ptr() const {
1206   // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
1207   return (_base >= AnyPtr && _base <= KlassPtr) ? (TypePtr*)this : NULL;
1208 }
1209 
1210 inline const TypeOopPtr *Type::is_oopptr() const {
1211   // OopPtr is the first and KlassPtr the last, with no non-oops between.
1212   assert(_base >= OopPtr && _base <= KlassPtr, "Not a Java pointer" ) ;
1213   return (TypeOopPtr*)this;
1214 }
1215 
1216 inline const TypeOopPtr *Type::isa_oopptr() const {
1217   // OopPtr is the first and KlassPtr the last, with no non-oops between.
1218   return (_base >= OopPtr && _base <= KlassPtr) ? (TypeOopPtr*)this : NULL;
1219 }
1220 
1221 inline const TypeRawPtr *Type::isa_rawptr() const {
1222   return (_base == RawPtr) ? (TypeRawPtr*)this : NULL;
1223 }
1224 
1225 inline const TypeRawPtr *Type::is_rawptr() const {
1226   assert( _base == RawPtr, "Not a raw pointer" );
1227   return (TypeRawPtr*)this;
1228 }
1229 
1230 inline const TypeInstPtr *Type::isa_instptr() const {
1231   return (_base == InstPtr) ? (TypeInstPtr*)this : NULL;
1232 }
1233 
1234 inline const TypeInstPtr *Type::is_instptr() const {
1235   assert( _base == InstPtr, "Not an object pointer" );
1236   return (TypeInstPtr*)this;
1237 }
1238 
1239 inline const TypeAryPtr *Type::isa_aryptr() const {
1240   return (_base == AryPtr) ? (TypeAryPtr*)this : NULL;
1241 }
1242 
1243 inline const TypeAryPtr *Type::is_aryptr() const {
1244   assert( _base == AryPtr, "Not an array pointer" );
1245   return (TypeAryPtr*)this;
1246 }
1247 
1248 inline const TypeNarrowOop *Type::is_narrowoop() const {
1249   // OopPtr is the first and KlassPtr the last, with no non-oops between.
1250   assert(_base == NarrowOop, "Not a narrow oop" ) ;
1251   return (TypeNarrowOop*)this;
1252 }
1253 
1254 inline const TypeNarrowOop *Type::isa_narrowoop() const {
1255   // OopPtr is the first and KlassPtr the last, with no non-oops between.
1256   return (_base == NarrowOop) ? (TypeNarrowOop*)this : NULL;
1257 }
1258 
1259 inline const TypeKlassPtr *Type::isa_klassptr() const {
1260   return (_base == KlassPtr) ? (TypeKlassPtr*)this : NULL;
1261 }
1262 
1263 inline const TypeKlassPtr *Type::is_klassptr() const {
1264   assert( _base == KlassPtr, "Not a klass pointer" );
1265   return (TypeKlassPtr*)this;
1266 }
1267 
1268 inline const TypePtr* Type::make_ptr() const {
1269   return (_base == NarrowOop) ? is_narrowoop()->get_ptrtype() :
1270                                 (isa_ptr() ? is_ptr() : NULL);
1271 }
1272 
1273 inline const TypeOopPtr* Type::make_oopptr() const {
1274   return (_base == NarrowOop) ? is_narrowoop()->get_ptrtype()->is_oopptr() : is_oopptr();
1275 }
1276 
1277 inline const TypeNarrowOop* Type::make_narrowoop() const {
1278   return (_base == NarrowOop) ? is_narrowoop() :
1279                                 (isa_ptr() ? TypeNarrowOop::make(is_ptr()) : NULL);
1280 }
1281 
1282 inline bool Type::is_floatingpoint() const {
1283   if( (_base == FloatCon)  || (_base == FloatBot) ||
1284       (_base == DoubleCon) || (_base == DoubleBot) )
1285     return true;
1286   return false;
1287 }
1288 
1289 
1290 // ===============================================================
1291 // Things that need to be 64-bits in the 64-bit build but
1292 // 32-bits in the 32-bit build.  Done this way to get full
1293 // optimization AND strong typing.
1294 #ifdef _LP64
1295 
1296 // For type queries and asserts
1297 #define is_intptr_t  is_long
1298 #define isa_intptr_t isa_long
1299 #define find_intptr_t_type find_long_type
1300 #define find_intptr_t_con  find_long_con
1301 #define TypeX        TypeLong
1302 #define Type_X       Type::Long
1303 #define TypeX_X      TypeLong::LONG
1304 #define TypeX_ZERO   TypeLong::ZERO
1305 // For 'ideal_reg' machine registers
1306 #define Op_RegX      Op_RegL
1307 // For phase->intcon variants
1308 #define MakeConX     longcon
1309 #define ConXNode     ConLNode
1310 // For array index arithmetic
1311 #define MulXNode     MulLNode
1312 #define AndXNode     AndLNode
1313 #define OrXNode      OrLNode
1314 #define CmpXNode     CmpLNode
1315 #define SubXNode     SubLNode
1316 #define LShiftXNode  LShiftLNode
1317 // For object size computation:
1318 #define AddXNode     AddLNode
1319 #define RShiftXNode  RShiftLNode
1320 // For card marks and hashcodes
1321 #define URShiftXNode URShiftLNode
1322 // UseOptoBiasInlining
1323 #define XorXNode     XorLNode
1324 #define StoreXConditionalNode StoreLConditionalNode
1325 // Opcodes
1326 #define Op_LShiftX   Op_LShiftL
1327 #define Op_AndX      Op_AndL
1328 #define Op_AddX      Op_AddL
1329 #define Op_SubX      Op_SubL
1330 #define Op_XorX      Op_XorL
1331 #define Op_URShiftX  Op_URShiftL
1332 // conversions
1333 #define ConvI2X(x)   ConvI2L(x)
1334 #define ConvL2X(x)   (x)
1335 #define ConvX2I(x)   ConvL2I(x)
1336 #define ConvX2L(x)   (x)
1337 
1338 #else
1339 
1340 // For type queries and asserts
1341 #define is_intptr_t  is_int
1342 #define isa_intptr_t isa_int
1343 #define find_intptr_t_type find_int_type
1344 #define find_intptr_t_con  find_int_con
1345 #define TypeX        TypeInt
1346 #define Type_X       Type::Int
1347 #define TypeX_X      TypeInt::INT
1348 #define TypeX_ZERO   TypeInt::ZERO
1349 // For 'ideal_reg' machine registers
1350 #define Op_RegX      Op_RegI
1351 // For phase->intcon variants
1352 #define MakeConX     intcon
1353 #define ConXNode     ConINode
1354 // For array index arithmetic
1355 #define MulXNode     MulINode
1356 #define AndXNode     AndINode
1357 #define OrXNode      OrINode
1358 #define CmpXNode     CmpINode
1359 #define SubXNode     SubINode
1360 #define LShiftXNode  LShiftINode
1361 // For object size computation:
1362 #define AddXNode     AddINode
1363 #define RShiftXNode  RShiftINode
1364 // For card marks and hashcodes
1365 #define URShiftXNode URShiftINode
1366 // UseOptoBiasInlining
1367 #define XorXNode     XorINode
1368 #define StoreXConditionalNode StoreIConditionalNode
1369 // Opcodes
1370 #define Op_LShiftX   Op_LShiftI
1371 #define Op_AndX      Op_AndI
1372 #define Op_AddX      Op_AddI
1373 #define Op_SubX      Op_SubI
1374 #define Op_XorX      Op_XorI
1375 #define Op_URShiftX  Op_URShiftI
1376 // conversions
1377 #define ConvI2X(x)   (x)
1378 #define ConvL2X(x)   ConvL2I(x)
1379 #define ConvX2I(x)   (x)
1380 #define ConvX2L(x)   ConvI2L(x)
1381 
1382 #endif
1383 
1384 #endif // SHARE_VM_OPTO_TYPE_HPP