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