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