src/hotspot/share/opto/type.hpp
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58372 43c4fb8ba96b
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 53041
diff changeset
     2
 * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
1
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
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4450
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4450
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4450
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 53041
diff changeset
    25
#ifndef SHARE_OPTO_TYPE_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 53041
diff changeset
    26
#define SHARE_OPTO_TYPE_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6462
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6462
diff changeset
    28
#include "opto/adlcVMDeps.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6462
diff changeset
    29
#include "runtime/handles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6462
diff changeset
    30
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// Portions of code courtesy of Clifford Click
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
// Optimization - Graph Style
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
// This class defines a Type lattice.  The lattice is used in the constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// propagation algorithms, and for some type-checking of the iloc code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
// Basic types include RSD's (lower bound, upper bound, stride for integers),
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// float & double precision constants, sets of data-labels and code-labels.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// The complete lattice is described below.  Subtypes have no relationship to
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// up or down in the lattice; that is entirely determined by the behavior of
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// the MEET/JOIN functions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
class Dict;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
class Type;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
class   TypeD;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
class   TypeF;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
class   TypeInt;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
class   TypeLong;
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
    50
class   TypeNarrowPtr;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
    51
class     TypeNarrowOop;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
    52
class     TypeNarrowKlass;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
class   TypeAry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
class   TypeTuple;
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    55
class   TypeVect;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    56
class     TypeVectS;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    57
class     TypeVectD;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    58
class     TypeVectX;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    59
class     TypeVectY;
30624
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
    60
class     TypeVectZ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
class   TypePtr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
class     TypeRawPtr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
class     TypeOopPtr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
class       TypeInstPtr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
class       TypeAryPtr;
21202
0356e40b1017 8027140: Assertion in compiler when running bigapps/Kitchensink/stability
roland
parents: 21105
diff changeset
    66
class     TypeKlassPtr;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
    67
class     TypeMetadataPtr;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
//------------------------------Type-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
// Basic Type object, represents a set of primitive Values.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
// Types are hash-cons'd into a private class dictionary, so only one of each
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
// different kind of Type exists.  Types are never modified after creation, so
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
// all their interesting fields are constant.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
class Type {
10547
ea4a2ec31ae2 7088955: add C2 IR support to the SA
never
parents: 8921
diff changeset
    75
  friend class VMStructs;
ea4a2ec31ae2 7088955: add C2 IR support to the SA
never
parents: 8921
diff changeset
    76
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  enum TYPES {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    Bad=0,                      // Type check
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    Control,                    // Control of code (not in lattice)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    Top,                        // Top of the lattice
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    Int,                        // Integer range (lo-hi)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    Long,                       // Long integer range (lo-hi)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    Half,                       // Placeholder half of doubleword
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
    85
    NarrowOop,                  // Compressed oop pointer
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
    86
    NarrowKlass,                // Compressed klass pointer
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    Tuple,                      // Method signature or object layout
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    Array,                      // Array types
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    90
    VectorS,                    //  32bit Vector types
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    91
    VectorD,                    //  64bit Vector types
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    92
    VectorX,                    // 128bit Vector types
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
    93
    VectorY,                    // 256bit Vector types
30624
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
    94
    VectorZ,                    // 512bit Vector types
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    AnyPtr,                     // Any old raw, klass, inst, or array pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    RawPtr,                     // Raw (non-oop) pointers
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    OopPtr,                     // Any and all Java heap entities
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    InstPtr,                    // Instance pointers (non-array objects)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    AryPtr,                     // Array pointers
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   101
    // (Ptr order matters:  See is_ptr, isa_ptr, is_oopptr, isa_oopptr.)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   102
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   103
    MetadataPtr,                // Generic metadata
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    KlassPtr,                   // Klass pointers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    Function,                   // Function signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    Abio,                       // Abstract I/O
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    Return_Address,             // Subroutine return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
    Memory,                     // Abstract store
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    FloatTop,                   // No float value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    FloatCon,                   // Floating point constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
    FloatBot,                   // Any float value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    DoubleTop,                  // No double value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
    DoubleCon,                  // Double precision constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    DoubleBot,                  // Any double value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    Bottom,                     // Bottom of lattice
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    lastype                     // Bogus ending type (not in lattice)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  // Signal values for offsets from a base pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  enum OFFSET_SIGNALS {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    OffsetTop = -2000000000,    // undefined offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    OffsetBot = -2000000001     // any possible offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  // Min and max WIDEN values.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  enum WIDEN {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    WidenMin = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    WidenMax = 3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
private:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   133
  typedef struct {
46378
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 40881
diff changeset
   134
    TYPES                dual_type;
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 40881
diff changeset
   135
    BasicType            basic_type;
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 40881
diff changeset
   136
    const char*          msg;
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 40881
diff changeset
   137
    bool                 isa_oop;
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 40881
diff changeset
   138
    uint                 ideal_reg;
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 40881
diff changeset
   139
    relocInfo::relocType reloc;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   140
  } TypeInfo;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   141
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  // Dictionary of types shared among compilations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  static Dict* _shared_type_dict;
46378
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 40881
diff changeset
   144
  static const TypeInfo _type_info[];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  static int uhash( const Type *const t );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  // Structural equality check.  Assumes that cmp() has already compared
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // the _base types and thus knows it can cast 't' appropriately.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  // Top-level hash-table of types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  static Dict *type_dict() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    return Compile::current()->type_dict();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  // DUAL operation: reflect around lattice centerline.  Used instead of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // join to ensure my lattice is symmetric up and down.  Dual is computed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  // lazily, on demand, and cached in _dual.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  const Type *_dual;            // Cached dual value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // Table for efficient dualing of base types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  static const TYPES dual_type[lastype];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
   163
#ifdef ASSERT
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
   164
  // One type is interface, the other is oop
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
   165
  virtual bool interface_vs_oop_helper(const Type *t) const;
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
   166
#endif
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
   167
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   168
  const Type *meet_helper(const Type *t, bool include_speculative) const;
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   169
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  // Each class of type is also identified by its base.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  const TYPES _base;            // Enum of Types type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  Type( TYPES t ) : _dual(NULL),  _base(t) {} // Simple types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  // ~Type();                   // Use fast deallocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  const Type *hashcons();       // Hash-cons the type
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   177
  virtual const Type *filter_helper(const Type *kills, bool include_speculative) const;
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   178
  const Type *join_helper(const Type *t, bool include_speculative) const {
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   179
    return dual()->meet_helper(t->dual(), include_speculative)->dual();
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   180
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
19696
bd5a0131bde1 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 17383
diff changeset
   184
  inline void* operator new( size_t x ) throw() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    Compile* compile = Compile::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
    compile->set_type_last_size(x);
55583
82fae48799e4 8227173: Minor cleanup of unused code in compile.hpp
thartmann
parents: 53623
diff changeset
   187
    return compile->type_arena()->Amalloc_D(x);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  inline void operator delete( void* ptr ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
    Compile* compile = Compile::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    compile->type_arena()->Afree(ptr,compile->type_last_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  // Initialize the type system for a particular compilation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  static void Initialize(Compile* compile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // Initialize the types shared by all compilations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  static void Initialize_shared(Compile* compile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  TYPES base() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    assert(_base > Bad && _base < lastype, "sanity");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    return _base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // Create a new hash-consd type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  static const Type *make(enum TYPES);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  // Test for equivalence of types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  static int cmp( const Type *const t1, const Type *const t2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // Test for higher or equal in lattice
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   210
  // Variant that drops the speculative part of the types
40880
74222f8c095e 8162101: C2: Handle "wide" aliases for unsafe accesses
vlivanov
parents: 40871
diff changeset
   211
  bool higher_equal(const Type *t) const {
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   212
    return !cmp(meet(t),t->remove_speculative());
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   213
  }
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   214
  // Variant that keeps the speculative part of the types
40880
74222f8c095e 8162101: C2: Handle "wide" aliases for unsafe accesses
vlivanov
parents: 40871
diff changeset
   215
  bool higher_equal_speculative(const Type *t) const {
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   216
    return !cmp(meet_speculative(t),t);
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   217
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  // MEET operation; lower in lattice.
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   220
  // Variant that drops the speculative part of the types
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   221
  const Type *meet(const Type *t) const {
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   222
    return meet_helper(t, false);
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   223
  }
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   224
  // Variant that keeps the speculative part of the types
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   225
  const Type *meet_speculative(const Type *t) const {
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   226
    return meet_helper(t, true)->cleanup_speculative();
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   227
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // WIDEN: 'widens' for Ints and other range types
4012
579b7bad9983 6885584: A particular class structure causes large allocation spike for jit
never
parents: 3911
diff changeset
   229
  virtual const Type *widen( const Type *old, const Type* limit ) const { return this; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // NARROW: complement for widen, used by pessimistic phases
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  virtual const Type *narrow( const Type *old ) const { return this; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // DUAL operation: reflect around lattice centerline.  Used instead of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // join to ensure my lattice is symmetric up and down.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  const Type *dual() const { return _dual; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  // Compute meet dependent on base type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // JOIN operation; higher in lattice.  Done by finding the dual of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  // meet of the dual of the 2 inputs.
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   243
  // Variant that drops the speculative part of the types
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   244
  const Type *join(const Type *t) const {
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   245
    return join_helper(t, false);
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   246
  }
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   247
  // Variant that keeps the speculative part of the types
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   248
  const Type *join_speculative(const Type *t) const {
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   249
    return join_helper(t, true)->cleanup_speculative();
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   250
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  // Modified version of JOIN adapted to the needs Node::Value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  // Normalizes all empty values to TOP.  Does not kill _widen bits.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  // Currently, it also works around limitations involving interface types.
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   255
  // Variant that drops the speculative part of the types
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   256
  const Type *filter(const Type *kills) const {
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   257
    return filter_helper(kills, false);
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   258
  }
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   259
  // Variant that keeps the speculative part of the types
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   260
  const Type *filter_speculative(const Type *kills) const {
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   261
    return filter_helper(kills, true)->cleanup_speculative();
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   262
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
3173
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   264
#ifdef ASSERT
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   265
  // One type is interface, the other is oop
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   266
  virtual bool interface_vs_oop(const Type *t) const;
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   267
#endif
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   268
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   269
  // Returns true if this pointer points at memory which contains a
589
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
   270
  // compressed oop references.
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
   271
  bool is_ptr_to_narrowoop() const;
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   272
  bool is_ptr_to_narrowklass() const;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   273
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
   274
  bool is_ptr_to_boxing_obj() const;
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
   275
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
   276
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // Convenience access
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  float getf() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  double getd() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  const TypeInt    *is_int() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  const TypeInt    *isa_int() const;             // Returns NULL if not an Int
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  const TypeLong   *is_long() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  const TypeLong   *isa_long() const;            // Returns NULL if not a Long
14621
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
   285
  const TypeD      *isa_double() const;          // Returns NULL if not a Double{Top,Con,Bot}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  const TypeD      *is_double_constant() const;  // Asserts it is a DoubleCon
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  const TypeD      *isa_double_constant() const; // Returns NULL if not a DoubleCon
14621
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
   288
  const TypeF      *isa_float() const;           // Returns NULL if not a Float{Top,Con,Bot}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  const TypeF      *is_float_constant() const;   // Asserts it is a FloatCon
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  const TypeF      *isa_float_constant() const;  // Returns NULL if not a FloatCon
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  const TypeTuple  *is_tuple() const;            // Collection of fields, NOT a pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  const TypeAry    *is_ary() const;              // Array, NOT array pointer
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   293
  const TypeVect   *is_vect() const;             // Vector
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   294
  const TypeVect   *isa_vect() const;            // Returns NULL if not a Vector
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  const TypePtr    *is_ptr() const;              // Asserts it is a ptr type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  const TypePtr    *isa_ptr() const;             // Returns NULL if not ptr type
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   297
  const TypeRawPtr *isa_rawptr() const;          // NOT Java oop
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   298
  const TypeRawPtr *is_rawptr() const;           // Asserts is rawptr
589
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
   299
  const TypeNarrowOop  *is_narrowoop() const;    // Java-style GC'd pointer
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
   300
  const TypeNarrowOop  *isa_narrowoop() const;   // Returns NULL if not oop ptr type
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   301
  const TypeNarrowKlass *is_narrowklass() const; // compressed klass pointer
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   302
  const TypeNarrowKlass *isa_narrowklass() const;// Returns NULL if not oop ptr type
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   303
  const TypeOopPtr   *isa_oopptr() const;        // Returns NULL if not oop ptr type
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   304
  const TypeOopPtr   *is_oopptr() const;         // Java-style GC'd pointer
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   305
  const TypeInstPtr  *isa_instptr() const;       // Returns NULL if not InstPtr
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   306
  const TypeInstPtr  *is_instptr() const;        // Instance
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   307
  const TypeAryPtr   *isa_aryptr() const;        // Returns NULL if not AryPtr
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
   308
  const TypeAryPtr   *is_aryptr() const;         // Array oop
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   309
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   310
  const TypeMetadataPtr   *isa_metadataptr() const;   // Returns NULL if not oop ptr type
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   311
  const TypeMetadataPtr   *is_metadataptr() const;    // Java-style GC'd pointer
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   312
  const TypeKlassPtr      *isa_klassptr() const;      // Returns NULL if not KlassPtr
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   313
  const TypeKlassPtr      *is_klassptr() const;       // assert if not KlassPtr
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   314
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  virtual bool      is_finite() const;           // Has a finite value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  virtual bool      is_nan()    const;           // Is not a number (NaN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
   318
  // Returns this ptr type or the equivalent ptr type for this compressed pointer.
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
   319
  const TypePtr* make_ptr() const;
3180
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
   320
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
   321
  // Returns this oopptr type or the equivalent oopptr type for this compressed pointer.
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
   322
  // Asserts if the underlying type is not an oopptr or narrowoop.
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
   323
  const TypeOopPtr* make_oopptr() const;
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
   324
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
   325
  // Returns this compressed pointer or the equivalent compressed version
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
   326
  // of this pointer type.
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
   327
  const TypeNarrowOop* make_narrowoop() const;
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
   328
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   329
  // Returns this compressed klass pointer or the equivalent
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   330
  // compressed version of this pointer type.
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   331
  const TypeNarrowKlass* make_narrowklass() const;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   332
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  // Special test for register pressure heuristic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  bool is_floatingpoint() const;        // True if Float or Double base type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  // Do you have memory, directly or through a tuple?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  bool has_memory( ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  virtual bool singleton(void) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  // TRUE if type is above the lattice centerline, and is therefore vacuous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  virtual bool empty(void) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  // Return a hash for this type.  The hash function is public so ConNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  // (constants) can hash on their constant, which is represented by a Type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  virtual int hash() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  // Map ideal registers (machine types) to ideal types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  static const Type *mreg2type[];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  // Printing, statistics
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  void         dump_on(outputStream *st) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  void         dump() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
    dump_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  static  void dump_stats();
40881
a4955213b573 8155635: C2: Mixed unsafe accesses break alias analysis
vlivanov
parents: 40880
diff changeset
   360
a4955213b573 8155635: C2: Mixed unsafe accesses break alias analysis
vlivanov
parents: 40880
diff changeset
   361
  static const char* str(const Type* t);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  void typerr(const Type *t) const; // Mixing types error
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  // Create basic type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  static const Type* get_const_basic_type(BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
    assert((uint)type <= T_CONFLICT && _const_basic_type[type] != NULL, "bad type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    return _const_basic_type[type];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
34202
5d19ca9c25a8 8141551: C2 can not handle returns with inccompatible interface arrays
simonis
parents: 31857
diff changeset
   371
  // For two instance arrays of same dimension, return the base element types.
5d19ca9c25a8 8141551: C2 can not handle returns with inccompatible interface arrays
simonis
parents: 31857
diff changeset
   372
  // Otherwise or if the arrays have different dimensions, return NULL.
5d19ca9c25a8 8141551: C2 can not handle returns with inccompatible interface arrays
simonis
parents: 31857
diff changeset
   373
  static void get_arrays_base_elements(const Type *a1, const Type *a2,
5d19ca9c25a8 8141551: C2 can not handle returns with inccompatible interface arrays
simonis
parents: 31857
diff changeset
   374
                                       const TypeInstPtr **e1, const TypeInstPtr **e2);
5d19ca9c25a8 8141551: C2 can not handle returns with inccompatible interface arrays
simonis
parents: 31857
diff changeset
   375
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  // Mapping to the array element's basic type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  BasicType array_element_basic_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  // Create standard type for a ciType:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  static const Type* get_const_type(ciType* type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  // Create standard zero value:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  static const Type* get_zero_type(BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    assert((uint)type <= T_CONFLICT && _zero_type[type] != NULL, "bad type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    return _zero_type[type];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  // Report if this is a zero value (not top).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  bool is_zero_type() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
    BasicType type = basic_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
    if (type == T_VOID || type >= T_CONFLICT)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
    else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
      return (this == _zero_type[type]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  static const Type *ABIO;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  static const Type *BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  static const Type *CONTROL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  static const Type *DOUBLE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  static const Type *FLOAT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  static const Type *HALF;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  static const Type *MEMORY;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  static const Type *MULTI;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  static const Type *RETURN_ADDRESS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  static const Type *TOP;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  // Mapping from compiler type to VM BasicType
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   410
  BasicType basic_type() const       { return _type_info[_base].basic_type; }
46378
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 40881
diff changeset
   411
  uint ideal_reg() const             { return _type_info[_base].ideal_reg; }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   412
  const char* msg() const            { return _type_info[_base].msg; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   413
  bool isa_oop_ptr() const           { return _type_info[_base].isa_oop; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   414
  relocInfo::relocType reloc() const { return _type_info[_base].reloc; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  // Mapping from CI type system to compiler type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  static const Type* get_typeflow_type(ciType* type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
19770
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
   419
  static const Type* make_from_constant(ciConstant constant,
38030
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   420
                                        bool require_constant = false,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   421
                                        int stable_dimension = 0,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   422
                                        bool is_narrow = false,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   423
                                        bool is_autobox_cache = false);
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   424
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   425
  static const Type* make_constant_from_field(ciInstance* holder,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   426
                                              int off,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   427
                                              bool is_unsigned_load,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   428
                                              BasicType loadbt);
31857
adbf29d9ca43 8078629: VM should constant fold Unsafe.get*() loads from final fields
vlivanov
parents: 30624
diff changeset
   429
38030
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   430
  static const Type* make_constant_from_field(ciField* field,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   431
                                              ciInstance* holder,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   432
                                              BasicType loadbt,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   433
                                              bool is_unsigned_load);
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   434
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   435
  static const Type* make_constant_from_array_element(ciArray* array,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   436
                                                      int off,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   437
                                                      int stable_dimension,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   438
                                                      BasicType loadbt,
93f24e7b3c43 8152590: C2: @Stable support doesn't always work w/ incremental inlining
vlivanov
parents: 34202
diff changeset
   439
                                                      bool is_unsigned_load);
19770
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
   440
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   441
  // Speculative type helper methods. See TypePtr.
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   442
  virtual const TypePtr* speculative() const                                  { return NULL; }
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   443
  virtual ciKlass* speculative_type() const                                   { return NULL; }
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   444
  virtual ciKlass* speculative_type_not_null() const                          { return NULL; }
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   445
  virtual bool speculative_maybe_null() const                                 { return true; }
46542
73dd19b96b5d 8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents: 46378
diff changeset
   446
  virtual bool speculative_always_null() const                                { return true; }
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   447
  virtual const Type* remove_speculative() const                              { return this; }
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   448
  virtual const Type* cleanup_speculative() const                             { return this; }
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   449
  virtual bool would_improve_type(ciKlass* exact_kls, int inline_depth) const { return exact_kls != NULL; }
46542
73dd19b96b5d 8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents: 46378
diff changeset
   450
  virtual bool would_improve_ptr(ProfilePtrKind ptr_kind) const { return ptr_kind == ProfileAlwaysNull || ptr_kind == ProfileNeverNull; }
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   451
  const Type* maybe_remove_speculative(bool include_speculative) const;
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
   452
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   453
  virtual bool maybe_null() const { return true; }
22928
b2bb101a9ae3 8031754: Type speculation should favor profile data from outermost inlined method
roland
parents: 22911
diff changeset
   454
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  // support arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  static const BasicType _basic_type[];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  static const Type*        _zero_type[T_CONFLICT+1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  static const Type* _const_basic_type[T_CONFLICT+1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
//------------------------------TypeF------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
// Class of Float-Constant Types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
class TypeF : public Type {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  TypeF( float f ) : Type(FloatCon), _f(f) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  virtual bool empty(void) const;        // TRUE if type is vacuous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  const float _f;               // Float constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  static const TypeF *make(float f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  virtual bool        is_finite() const;  // Has a finite value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  virtual bool        is_nan()    const;  // Is not a number (NaN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  static const TypeF *ZERO; // positive zero only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  static const TypeF *ONE;
53041
f15af1e2c683 8212043: Add floating-point Math.min/max intrinsics
pli
parents: 52925
diff changeset
   484
  static const TypeF *POS_INF;
f15af1e2c683 8212043: Add floating-point Math.min/max intrinsics
pli
parents: 52925
diff changeset
   485
  static const TypeF *NEG_INF;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
//------------------------------TypeD------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
// Class of Double-Constant Types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
class TypeD : public Type {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  TypeD( double d ) : Type(DoubleCon), _d(d) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  virtual bool empty(void) const;        // TRUE if type is vacuous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  const double _d;              // Double constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  static const TypeD *make(double d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  virtual bool        is_finite() const;  // Has a finite value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  virtual bool        is_nan()    const;  // Is not a number (NaN)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  static const TypeD *ZERO; // positive zero only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
  static const TypeD *ONE;
53041
f15af1e2c683 8212043: Add floating-point Math.min/max intrinsics
pli
parents: 52925
diff changeset
   513
  static const TypeD *POS_INF;
f15af1e2c683 8212043: Add floating-point Math.min/max intrinsics
pli
parents: 52925
diff changeset
   514
  static const TypeD *NEG_INF;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
//------------------------------TypeInt----------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
// Class of integer ranges, the set of integers between a lower bound and an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
// upper bound, inclusive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
class TypeInt : public Type {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  TypeInt( jint lo, jint hi, int w );
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   525
protected:
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   526
  virtual const Type *filter_helper(const Type *kills, bool include_speculative) const;
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   527
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
public:
22911
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   529
  typedef jint NativeType;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  virtual bool empty(void) const;        // TRUE if type is vacuous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  const jint _lo, _hi;          // Lower bound, upper bound
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  const short _widen;           // Limit on times we widen this sucker
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  static const TypeInt *make(jint lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  // must always specify w
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  static const TypeInt *make(jint lo, jint hi, int w);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  // Check for single integer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  int is_con() const { return _lo==_hi; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  bool is_con(int i) const { return is_con() && _lo == i; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  jint get_con() const { assert( is_con(), "" );  return _lo; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  virtual bool        is_finite() const;  // Has a finite value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  virtual const Type *xdual() const;    // Compute dual right now.
4012
579b7bad9983 6885584: A particular class structure causes large allocation spike for jit
never
parents: 3911
diff changeset
   550
  virtual const Type *widen( const Type *t, const Type* limit_type ) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  virtual const Type *narrow( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  // Do not kill _widen bits.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  static const TypeInt *MINUS_1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  static const TypeInt *ZERO;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  static const TypeInt *ONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  static const TypeInt *BOOL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  static const TypeInt *CC;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  static const TypeInt *CC_LT;  // [-1]  == MINUS_1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  static const TypeInt *CC_GT;  // [1]   == ONE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  static const TypeInt *CC_EQ;  // [0]   == ZERO
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  static const TypeInt *CC_LE;  // [-1,0]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  static const TypeInt *CC_GE;  // [0,1] == BOOL (!)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  static const TypeInt *BYTE;
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2019
diff changeset
   565
  static const TypeInt *UBYTE;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  static const TypeInt *CHAR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  static const TypeInt *SHORT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  static const TypeInt *POS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  static const TypeInt *POS1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  static const TypeInt *INT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  static const TypeInt *SYMINT; // symmetric range [-max_jint..max_jint]
22911
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   572
  static const TypeInt *TYPE_DOMAIN; // alias for TypeInt::INT
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   573
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   574
  static const TypeInt *as_self(const Type *t) { return t->is_int(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
//------------------------------TypeLong---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
// Class of long integer ranges, the set of integers between a lower bound and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
// an upper bound, inclusive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
class TypeLong : public Type {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  TypeLong( jlong lo, jlong hi, int w );
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   586
protected:
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   587
  // Do not kill _widen bits.
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   588
  virtual const Type *filter_helper(const Type *kills, bool include_speculative) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
public:
22911
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   590
  typedef jlong NativeType;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  virtual bool empty(void) const;        // TRUE if type is vacuous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  const jlong _lo, _hi;         // Lower bound, upper bound
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  const short _widen;           // Limit on times we widen this sucker
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  static const TypeLong *make(jlong lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  // must always specify w
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  static const TypeLong *make(jlong lo, jlong hi, int w);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  // Check for single integer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  int is_con() const { return _lo==_hi; }
392
0b3167e2f2de 6603011: RFE: Optimize long division
rasbold
parents: 360
diff changeset
   605
  bool is_con(int i) const { return is_con() && _lo == i; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  jlong get_con() const { assert( is_con(), "" ); return _lo; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
22853
308672304981 8028767: PPC64: (part 121): smaller shared changes needed to build C2
goetz
parents: 21202
diff changeset
   608
  // Check for positive 32-bit value.
308672304981 8028767: PPC64: (part 121): smaller shared changes needed to build C2
goetz
parents: 21202
diff changeset
   609
  int is_positive_int() const { return _lo >= 0 && _hi <= (jlong)max_jint; }
308672304981 8028767: PPC64: (part 121): smaller shared changes needed to build C2
goetz
parents: 21202
diff changeset
   610
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  virtual bool        is_finite() const;  // Has a finite value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
22911
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   613
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  virtual const Type *xdual() const;    // Compute dual right now.
4012
579b7bad9983 6885584: A particular class structure causes large allocation spike for jit
never
parents: 3911
diff changeset
   616
  virtual const Type *widen( const Type *t, const Type* limit_type ) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  virtual const Type *narrow( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  static const TypeLong *MINUS_1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  static const TypeLong *ZERO;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  static const TypeLong *ONE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  static const TypeLong *POS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  static const TypeLong *LONG;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  static const TypeLong *INT;    // 32-bit subrange [min_jint..max_jint]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  static const TypeLong *UINT;   // 32-bit unsigned [0..max_juint]
22911
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   626
  static const TypeLong *TYPE_DOMAIN; // alias for TypeLong::LONG
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   627
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   628
  // static convenience methods.
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   629
  static const TypeLong *as_self(const Type *t) { return t->is_long(); }
ff49c48c887d 8027754: Enable loop optimizations for loops with MathExact inside
rbackman
parents: 22873
diff changeset
   630
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  virtual void dump2( Dict &d, uint, outputStream *st  ) const;// Specialized per-Type dumping
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
//------------------------------TypeTuple--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
// Class of Tuple Types, essentially type collections for function signatures
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
// and class layouts.  It happens to also be a fast cache for the HotSpot
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
// signature types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
class TypeTuple : public Type {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  TypeTuple( uint cnt, const Type **fields ) : Type(Tuple), _cnt(cnt), _fields(fields) { }
25911
d47a5d9c5b89 8050860: Cleanup TypeTuple and TypeFunc
anoll
parents: 24425
diff changeset
   642
d47a5d9c5b89 8050860: Cleanup TypeTuple and TypeFunc
anoll
parents: 24425
diff changeset
   643
  const uint          _cnt;              // Count of fields
d47a5d9c5b89 8050860: Cleanup TypeTuple and TypeFunc
anoll
parents: 24425
diff changeset
   644
  const Type ** const _fields;           // Array of field types
d47a5d9c5b89 8050860: Cleanup TypeTuple and TypeFunc
anoll
parents: 24425
diff changeset
   645
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  virtual bool empty(void) const;        // TRUE if type is vacuous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  // Accessors:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  uint cnt() const { return _cnt; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  const Type* field_at(uint i) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
    assert(i < _cnt, "oob");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
    return _fields[i];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  void set_field_at(uint i, const Type* t) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
    assert(i < _cnt, "oob");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
    _fields[i] = t;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  static const TypeTuple *make( uint cnt, const Type **fields );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  static const TypeTuple *make_range(ciSignature *sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  static const TypeTuple *make_domain(ciInstanceKlass* recv, ciSignature *sig);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  // Subroutine call type with space allocated for argument types
26310
c78739f05ded 8051415: TypeTuple::make_domain() and TypeTuple::make_range() allocate too much memory
zmajo
parents: 25911
diff changeset
   668
  // Memory for Control, I_O, Memory, FramePtr, and ReturnAdr is allocated implicitly
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  static const Type **fields( uint arg_cnt );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  static const TypeTuple *IFBOTH;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  static const TypeTuple *IFFALSE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  static const TypeTuple *IFTRUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  static const TypeTuple *IFNEITHER;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  static const TypeTuple *LOOPBODY;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  static const TypeTuple *MEMBAR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  static const TypeTuple *STORECONDITIONAL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  static const TypeTuple *START_I2C;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  static const TypeTuple *INT_PAIR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  static const TypeTuple *LONG_PAIR;
20289
35d78de0c547 8024924: Intrinsify java.lang.Math.addExact
rbackman
parents: 19770
diff changeset
   684
  static const TypeTuple *INT_CC_PAIR;
21105
47618ee96ed5 8026844: Various Math functions needs intrinsification
rbackman
parents: 21099
diff changeset
   685
  static const TypeTuple *LONG_CC_PAIR;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  virtual void dump2( Dict &d, uint, outputStream *st  ) const; // Specialized per-Type dumping
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
//------------------------------TypeAry----------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
// Class of Array Types
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
class TypeAry : public Type {
19770
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
   694
  TypeAry(const Type* elem, const TypeInt* size, bool stable) : Type(Array),
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
   695
      _elem(elem), _size(size), _stable(stable) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  virtual bool empty(void) const;        // TRUE if type is vacuous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  const Type *_elem;            // Element type of array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  const TypeInt *_size;         // Elements in array
19770
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
   705
  const bool _stable;           // Are elements @Stable?
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  friend class TypeAryPtr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
public:
19770
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
   709
  static const TypeAry* make(const Type* elem, const TypeInt* size, bool stable = false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  bool ary_must_be_exact() const;  // true if arrays of such are never generic
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   714
  virtual const Type* remove_speculative() const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   715
  virtual const Type* cleanup_speculative() const;
3173
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   716
#ifdef ASSERT
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   717
  // One type is interface, the other is oop
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   718
  virtual bool interface_vs_oop(const Type *t) const;
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
   719
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  virtual void dump2( Dict &d, uint, outputStream *st  ) const; // Specialized per-Type dumping
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   725
//------------------------------TypeVect---------------------------------------
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   726
// Class of Vector Types
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   727
class TypeVect : public Type {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   728
  const Type*   _elem;  // Vector's element type
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   729
  const uint  _length;  // Elements in vector (power of 2)
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   730
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   731
protected:
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   732
  TypeVect(TYPES t, const Type* elem, uint length) : Type(t),
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   733
    _elem(elem), _length(length) {}
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   734
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   735
public:
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   736
  const Type* element_type() const { return _elem; }
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   737
  BasicType element_basic_type() const { return _elem->array_element_basic_type(); }
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   738
  uint length() const { return _length; }
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   739
  uint length_in_bytes() const {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   740
   return _length * type2aelembytes(element_basic_type());
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   741
  }
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   742
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   743
  virtual bool eq(const Type *t) const;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   744
  virtual int  hash() const;             // Type specific hashing
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   745
  virtual bool singleton(void) const;    // TRUE if type is a singleton
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   746
  virtual bool empty(void) const;        // TRUE if type is vacuous
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   747
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   748
  static const TypeVect *make(const BasicType elem_bt, uint length) {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   749
    // Use bottom primitive type.
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   750
    return make(get_const_basic_type(elem_bt), length);
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   751
  }
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   752
  // Used directly by Replicate nodes to construct singleton vector.
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   753
  static const TypeVect *make(const Type* elem, uint length);
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   754
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   755
  virtual const Type *xmeet( const Type *t) const;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   756
  virtual const Type *xdual() const;     // Compute dual right now.
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   757
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   758
  static const TypeVect *VECTS;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   759
  static const TypeVect *VECTD;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   760
  static const TypeVect *VECTX;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   761
  static const TypeVect *VECTY;
30624
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
   762
  static const TypeVect *VECTZ;
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   763
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   764
#ifndef PRODUCT
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   765
  virtual void dump2(Dict &d, uint, outputStream *st) const; // Specialized per-Type dumping
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   766
#endif
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   767
};
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   768
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   769
class TypeVectS : public TypeVect {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   770
  friend class TypeVect;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   771
  TypeVectS(const Type* elem, uint length) : TypeVect(VectorS, elem, length) {}
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   772
};
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   773
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   774
class TypeVectD : public TypeVect {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   775
  friend class TypeVect;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   776
  TypeVectD(const Type* elem, uint length) : TypeVect(VectorD, elem, length) {}
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   777
};
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   778
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   779
class TypeVectX : public TypeVect {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   780
  friend class TypeVect;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   781
  TypeVectX(const Type* elem, uint length) : TypeVect(VectorX, elem, length) {}
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   782
};
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   783
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   784
class TypeVectY : public TypeVect {
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   785
  friend class TypeVect;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   786
  TypeVectY(const Type* elem, uint length) : TypeVect(VectorY, elem, length) {}
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   787
};
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
   788
30624
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
   789
class TypeVectZ : public TypeVect {
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
   790
  friend class TypeVect;
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
   791
  TypeVectZ(const Type* elem, uint length) : TypeVect(VectorZ, elem, length) {}
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
   792
};
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
   793
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
//------------------------------TypePtr----------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
// Class of machine Pointer Types: raw data, instances or arrays.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
// If the _base enum is AnyPtr, then this refers to all of the above.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
// Otherwise the _base will indicate which subset of pointers is affected,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
// and the class will be inherited from.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
class TypePtr : public Type {
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   800
  friend class TypeNarrowPtr;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  enum PTR { TopPTR, AnyNull, Constant, Null, NotNull, BotPTR, lastPTR };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
protected:
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   804
  TypePtr(TYPES t, PTR ptr, int offset,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   805
          const TypePtr* speculative = NULL,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   806
          int inline_depth = InlineDepthBottom) :
51333
f6641fcf7b7e 8208670: Compiler changes to allow enabling -Wreorder
tschatzl
parents: 47216
diff changeset
   807
    Type(t), _speculative(speculative), _inline_depth(inline_depth), _offset(offset),
f6641fcf7b7e 8208670: Compiler changes to allow enabling -Wreorder
tschatzl
parents: 47216
diff changeset
   808
    _ptr(ptr) {}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  static const PTR ptr_meet[lastPTR][lastPTR];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  static const PTR ptr_dual[lastPTR];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
  static const char * const ptr_msg[lastPTR];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   813
  enum {
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   814
    InlineDepthBottom = INT_MAX,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   815
    InlineDepthTop = -InlineDepthBottom
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   816
  };
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   817
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   818
  // Extra type information profiling gave us. We propagate it the
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   819
  // same way the rest of the type info is propagated. If we want to
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   820
  // use it, then we have to emit a guard: this part of the type is
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   821
  // not something we know but something we speculate about the type.
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   822
  const TypePtr*   _speculative;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   823
  // For speculative types, we record at what inlining depth the
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   824
  // profiling point that provided the data is. We want to favor
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   825
  // profile data coming from outer scopes which are likely better for
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   826
  // the current compilation.
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   827
  int _inline_depth;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   828
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   829
  // utility methods to work on the speculative part of the type
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   830
  const TypePtr* dual_speculative() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   831
  const TypePtr* xmeet_speculative(const TypePtr* other) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   832
  bool eq_speculative(const TypePtr* other) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   833
  int hash_speculative() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   834
  const TypePtr* add_offset_speculative(intptr_t offset) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   835
#ifndef PRODUCT
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   836
  void dump_speculative(outputStream *st) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   837
#endif
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   838
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   839
  // utility methods to work on the inline depth of the type
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   840
  int dual_inline_depth() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   841
  int meet_inline_depth(int depth) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   842
#ifndef PRODUCT
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   843
  void dump_inline_depth(outputStream *st) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   844
#endif
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   845
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  const int _offset;            // Offset into oop, with TOP & BOT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  const PTR _ptr;               // Pointer equivalence class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  const int offset() const { return _offset; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  const PTR ptr()    const { return _ptr; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   853
  static const TypePtr *make(TYPES t, PTR ptr, int offset,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   854
                             const TypePtr* speculative = NULL,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   855
                             int inline_depth = InlineDepthBottom);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
  // Return a 'ptr' version of this type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  virtual const Type *cast_to_ptr_type(PTR ptr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  virtual intptr_t get_con() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
1068
720698d9c89b 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 781
diff changeset
   862
  int xadd_offset( intptr_t offset ) const;
720698d9c89b 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 781
diff changeset
   863
  virtual const TypePtr *add_offset( intptr_t offset ) const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   864
  virtual bool eq(const Type *t) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   865
  virtual int  hash() const;             // Type specific hashing
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  virtual bool empty(void) const;        // TRUE if type is vacuous
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
  virtual const Type *xmeet( const Type *t ) const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   870
  virtual const Type *xmeet_helper( const Type *t ) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  int meet_offset( int offset ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
  int dual_offset( ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  // meet, dual and join over pointer equivalence sets
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
  PTR meet_ptr( const PTR in_ptr ) const { return ptr_meet[in_ptr][ptr()]; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  PTR dual_ptr()                   const { return ptr_dual[ptr()];      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  // This is textually confusing unless one recalls that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  // join(t) == dual()->meet(t->dual())->dual().
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  PTR join_ptr( const PTR in_ptr ) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
    return ptr_dual[ ptr_meet[ ptr_dual[in_ptr] ] [ dual_ptr() ] ];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   885
  // Speculative type helper methods.
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   886
  virtual const TypePtr* speculative() const { return _speculative; }
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   887
  int inline_depth() const                   { return _inline_depth; }
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   888
  virtual ciKlass* speculative_type() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   889
  virtual ciKlass* speculative_type_not_null() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   890
  virtual bool speculative_maybe_null() const;
46542
73dd19b96b5d 8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents: 46378
diff changeset
   891
  virtual bool speculative_always_null() const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   892
  virtual const Type* remove_speculative() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   893
  virtual const Type* cleanup_speculative() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   894
  virtual bool would_improve_type(ciKlass* exact_kls, int inline_depth) const;
46542
73dd19b96b5d 8181211: C2: Use profiling data to optimize on/off heap unsafe accesses
roland
parents: 46378
diff changeset
   895
  virtual bool would_improve_ptr(ProfilePtrKind maybe_null) const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   896
  virtual const TypePtr* with_inline_depth(int depth) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   897
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   898
  virtual bool maybe_null() const { return meet_ptr(Null) == ptr(); }
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   899
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  // Tests for relation to centerline of type lattice:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  static bool above_centerline(PTR ptr) { return (ptr <= AnyNull); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  static bool below_centerline(PTR ptr) { return (ptr >= NotNull); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  static const TypePtr *NULL_PTR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  static const TypePtr *NOTNULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  static const TypePtr *BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  virtual void dump2( Dict &d, uint depth, outputStream *st  ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
//------------------------------TypeRawPtr-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
// Class of raw pointers, pointers to things other than Oops.  Examples
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
// include the stack pointer, top of heap, card-marking area, handles, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
class TypeRawPtr : public TypePtr {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  TypeRawPtr( PTR ptr, address bits ) : TypePtr(RawPtr,ptr,0), _bits(bits){}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  virtual int  hash() const;     // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  const address _bits;          // Constant value, if applicable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  static const TypeRawPtr *make( PTR ptr );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  static const TypeRawPtr *make( address bits );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  // Return a 'ptr' version of this type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  virtual const Type *cast_to_ptr_type(PTR ptr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
  virtual intptr_t get_con() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
1068
720698d9c89b 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 781
diff changeset
   932
  virtual const TypePtr *add_offset( intptr_t offset ) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  static const TypeRawPtr *BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  static const TypeRawPtr *NOTNULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  virtual void dump2( Dict &d, uint depth, outputStream *st  ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
//------------------------------TypeOopPtr-------------------------------------
40047
124ad42f6e96 8160360: Mismatched field loads are folded in LoadNode::Value
vlivanov
parents: 38030
diff changeset
   945
// Some kind of oop (Java pointer), either instance or array.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
class TypeOopPtr : public TypePtr {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
protected:
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   948
  TypeOopPtr(TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
   949
             const TypePtr* speculative, int inline_depth);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
  enum {
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
   955
   InstanceTop = -1,   // undefined instance
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
   956
   InstanceBot = 0     // any possible instance
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
  // Oop is NULL, unless this is a constant oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  ciObject*     _const_oop;   // Constant oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
  // If _klass is NULL, then so is _sig.  This is an unloaded klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  ciKlass*      _klass;       // Klass object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
  // Does the type exclude subclasses of the klass?  (Inexact == polymorphic.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  bool          _klass_is_exact;
589
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
   966
  bool          _is_ptr_to_narrowoop;
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
   967
  bool          _is_ptr_to_narrowklass;
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
   968
  bool          _is_ptr_to_boxed_value;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
   970
  // If not InstanceTop or InstanceBot, indicates that this is
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
   971
  // a particular instance of this type which is distinct.
40871
82848b0654f8 8038348: Instance field load is replaced by wrong data Phi
thartmann
parents: 40047
diff changeset
   972
  // This is the node index of the allocation node creating this instance.
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
   973
  int           _instance_id;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
   977
  int dual_instance_id() const;
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
   978
  int meet_instance_id(int uid) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   980
  // Do not allow interface-vs.-noninterface joins to collapse to top.
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   981
  virtual const Type *filter_helper(const Type *kills, bool include_speculative) const;
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
   982
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  // Creates a type given a klass. Correctly handles multi-dimensional arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  // Respects UseUniqueSubclasses.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  // If the klass is final, the resulting type will be exact.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  static const TypeOopPtr* make_from_klass(ciKlass* klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
    return make_from_klass_common(klass, true, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  // Same as before, but will produce an exact type, even if
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  // the klass is not final, as long as it has exactly one implementation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  static const TypeOopPtr* make_from_klass_unique(ciKlass* klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
    return make_from_klass_common(klass, true, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
  // Same as before, but does not respects UseUniqueSubclasses.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
  // Use this only for creating array element types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
  static const TypeOopPtr* make_from_klass_raw(ciKlass* klass) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
    return make_from_klass_common(klass, false, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  // Creates a singleton type given an object.
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3805
diff changeset
  1001
  // If the object cannot be rendered as a constant,
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3805
diff changeset
  1002
  // may return a non-singleton type.
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3805
diff changeset
  1003
  // If require_constant, produce a NULL if a singleton is not possible.
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1004
  static const TypeOopPtr* make_from_constant(ciObject* o,
31857
adbf29d9ca43 8078629: VM should constant fold Unsafe.get*() loads from final fields
vlivanov
parents: 30624
diff changeset
  1005
                                              bool require_constant = false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  // Make a generic (unclassed) pointer to an oop.
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1008
  static const TypeOopPtr* make(PTR ptr, int offset, int instance_id,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1009
                                const TypePtr* speculative = NULL,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1010
                                int inline_depth = InlineDepthBottom);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
  ciObject* const_oop()    const { return _const_oop; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
  virtual ciKlass* klass() const { return _klass;     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  bool klass_is_exact()    const { return _klass_is_exact; }
589
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1015
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1016
  // Returns true if this pointer points at memory which contains a
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1017
  // compressed oop references.
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1018
  bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; }
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1019
  bool is_ptr_to_narrowklass_nv() const { return _is_ptr_to_narrowklass; }
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1020
  bool is_ptr_to_boxed_value()   const { return _is_ptr_to_boxed_value; }
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
  1021
  bool is_known_instance()       const { return _instance_id > 0; }
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
  1022
  int  instance_id()             const { return _instance_id; }
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
  1023
  bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  virtual intptr_t get_con() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  virtual const Type *cast_to_ptr_type(PTR ptr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  virtual const Type *cast_to_exactness(bool klass_is_exact) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
  1031
  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1033
  virtual const TypeOopPtr *cast_to_nonconst() const;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1034
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  // corresponding pointer to klass, for a given instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  const TypeKlassPtr* as_klass_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
1068
720698d9c89b 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 781
diff changeset
  1038
  virtual const TypePtr *add_offset( intptr_t offset ) const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1039
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1040
  // Speculative type helper methods.
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1041
  virtual const Type* remove_speculative() const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1042
  virtual const Type* cleanup_speculative() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1043
  virtual bool would_improve_type(ciKlass* exact_kls, int inline_depth) const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1044
  virtual const TypePtr* with_inline_depth(int depth) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
53623
83b40a7bf00d 8217918: C2: -XX:+AggressiveUnboxing is broken
vlivanov
parents: 53244
diff changeset
  1046
  virtual const TypePtr* with_instance_id(int instance_id) const;
83b40a7bf00d 8217918: C2: -XX:+AggressiveUnboxing is broken
vlivanov
parents: 53244
diff changeset
  1047
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  virtual const Type *xdual() const;    // Compute dual right now.
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1049
  // the core of the computation of the meet for TypeOopPtr and for its subclasses
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1050
  virtual const Type *xmeet_helper(const Type *t) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  // Convenience common pre-built type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  static const TypeOopPtr *BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
//------------------------------TypeInstPtr------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
// Class of Java object pointers, pointing either to non-array Java instances
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1061
// or to a Klass* (including array klasses).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
class TypeInstPtr : public TypeOopPtr {
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1063
  TypeInstPtr(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1064
              const TypePtr* speculative, int inline_depth);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  ciSymbol*  _name;        // class name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  ciSymbol* name()         const { return _name; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  bool  is_loaded() const { return _klass->is_loaded(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
  // Make a pointer to a constant oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
  static const TypeInstPtr *make(ciObject* o) {
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1077
    return make(TypePtr::Constant, o->klass(), true, o, 0, InstanceBot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
  // Make a pointer to a constant oop with offset.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  static const TypeInstPtr *make(ciObject* o, int offset) {
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1081
    return make(TypePtr::Constant, o->klass(), true, o, offset, InstanceBot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
  // Make a pointer to some value of type klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  static const TypeInstPtr *make(PTR ptr, ciKlass* klass) {
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1086
    return make(ptr, klass, false, NULL, 0, InstanceBot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  // Make a pointer to some non-polymorphic value of exactly type klass.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  static const TypeInstPtr *make_exact(PTR ptr, ciKlass* klass) {
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1091
    return make(ptr, klass, true, NULL, 0, InstanceBot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
  // Make a pointer to some value of type klass with offset.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  static const TypeInstPtr *make(PTR ptr, ciKlass* klass, int offset) {
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1096
    return make(ptr, klass, false, NULL, offset, InstanceBot);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  // Make a pointer to an oop.
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1100
  static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1101
                                 int instance_id = InstanceBot,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1102
                                 const TypePtr* speculative = NULL,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1103
                                 int inline_depth = InlineDepthBottom);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1105
  /** Create constant type for a constant boxed value */
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1106
  const Type* get_const_boxed_value() const;
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1107
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  // If this is a java.lang.Class constant, return the type for it or NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  // Pass to Type::get_const_type to turn it to a type, which will usually
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
  // be a TypeInstPtr, but may also be a TypeInt::INT for int.class, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
  ciType* java_mirror_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  virtual const Type *cast_to_ptr_type(PTR ptr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
  virtual const Type *cast_to_exactness(bool klass_is_exact) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
  1117
  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1119
  virtual const TypeOopPtr *cast_to_nonconst() const;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1120
1068
720698d9c89b 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 781
diff changeset
  1121
  virtual const TypePtr *add_offset( intptr_t offset ) const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1122
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1123
  // Speculative type helper methods.
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1124
  virtual const Type* remove_speculative() const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1125
  virtual const TypePtr* with_inline_depth(int depth) const;
53623
83b40a7bf00d 8217918: C2: -XX:+AggressiveUnboxing is broken
vlivanov
parents: 53244
diff changeset
  1126
  virtual const TypePtr* with_instance_id(int instance_id) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1128
  // the core of the computation of the meet of 2 types
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1129
  virtual const Type *xmeet_helper(const Type *t) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  virtual const TypeInstPtr *xmeet_unloaded( const TypeInstPtr *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  static const TypeInstPtr *NOTNULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  static const TypeInstPtr *BOTTOM;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  static const TypeInstPtr *MIRROR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  static const TypeInstPtr *MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  static const TypeInstPtr *KLASS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
//------------------------------TypeAryPtr-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
// Class of Java array pointers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
class TypeAryPtr : public TypeOopPtr {
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1147
  TypeAryPtr( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk,
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1148
              int offset, int instance_id, bool is_autobox_cache,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1149
              const TypePtr* speculative, int inline_depth)
22928
b2bb101a9ae3 8031754: Type speculation should favor profile data from outermost inlined method
roland
parents: 22911
diff changeset
  1150
    : TypeOopPtr(AryPtr,ptr,k,xk,o,offset, instance_id, speculative, inline_depth),
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1151
    _ary(ary),
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1152
    _is_autobox_cache(is_autobox_cache)
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1153
 {
6431
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1154
#ifdef ASSERT
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1155
    if (k != NULL) {
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1156
      // Verify that specified klass and TypeAryPtr::klass() follow the same rules.
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1157
      ciKlass* ck = compute_klass(true);
6462
04f64d06050a 6984346: Remove development code in type.hpp
kvn
parents: 6431
diff changeset
  1158
      if (k != ck) {
6431
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1159
        this->dump(); tty->cr();
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1160
        tty->print(" k: ");
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1161
        k->print(); tty->cr();
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1162
        tty->print("ck: ");
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1163
        if (ck != NULL) ck->print();
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1164
        else tty->print("<NULL>");
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1165
        tty->cr();
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1166
        assert(false, "unexpected TypeAryPtr::_klass");
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1167
      }
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1168
    }
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1169
#endif
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1170
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
  virtual int hash() const;     // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
  const TypeAry *_ary;          // Array we point into
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1174
  const bool     _is_autobox_cache;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
6431
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1176
  ciKlass* compute_klass(DEBUG_ONLY(bool verify = false)) const;
d76212f83824 6976400: "Meet Not Symmetric"
kvn
parents: 5547
diff changeset
  1177
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  // Accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  ciKlass* klass() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  const TypeAry* ary() const  { return _ary; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  const Type*    elem() const { return _ary->_elem; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  const TypeInt* size() const { return _ary->_size; }
19770
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
  1184
  bool      is_stable() const { return _ary->_stable; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1186
  bool is_autobox_cache() const { return _is_autobox_cache; }
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1187
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1188
  static const TypeAryPtr *make(PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1189
                                int instance_id = InstanceBot,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1190
                                const TypePtr* speculative = NULL,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1191
                                int inline_depth = InlineDepthBottom);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
  // Constant pointer to array
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1193
  static const TypeAryPtr *make(PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1194
                                int instance_id = InstanceBot,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1195
                                const TypePtr* speculative = NULL,
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1196
                                int inline_depth = InlineDepthBottom, bool is_autobox_cache = false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  // Return a 'ptr' version of this type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
  virtual const Type *cast_to_ptr_type(PTR ptr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
  virtual const Type *cast_to_exactness(bool klass_is_exact) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
769
78e5090c7a20 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 767
diff changeset
  1203
  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1205
  virtual const TypeOopPtr *cast_to_nonconst() const;
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1206
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  virtual const TypeAryPtr* cast_to_size(const TypeInt* size) const;
1398
342890a5d031 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 1068
diff changeset
  1208
  virtual const TypeInt* narrow_size_type(const TypeInt* size) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  virtual bool empty(void) const;        // TRUE if type is vacuous
1068
720698d9c89b 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 781
diff changeset
  1211
  virtual const TypePtr *add_offset( intptr_t offset ) const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1212
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1213
  // Speculative type helper methods.
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1214
  virtual const Type* remove_speculative() const;
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1215
  virtual const TypePtr* with_inline_depth(int depth) const;
53623
83b40a7bf00d 8217918: C2: -XX:+AggressiveUnboxing is broken
vlivanov
parents: 53244
diff changeset
  1216
  virtual const TypePtr* with_instance_id(int instance_id) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
21099
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1218
  // the core of the computation of the meet of 2 types
46e6bbecd9e5 8024070: C2 needs some form of type speculation
roland
parents: 20289
diff changeset
  1219
  virtual const Type *xmeet_helper(const Type *t) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
19770
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
  1222
  const TypeAryPtr* cast_to_stable(bool stable, int stable_dimension = 1) const;
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
  1223
  int stable_dimension() const;
7cb9f982ea81 8001107: @Stable annotation for constant folding of lazily evaluated variables
vlivanov
parents: 19696
diff changeset
  1224
31857
adbf29d9ca43 8078629: VM should constant fold Unsafe.get*() loads from final fields
vlivanov
parents: 30624
diff changeset
  1225
  const TypeAryPtr* cast_to_autobox_cache(bool cache) const;
adbf29d9ca43 8078629: VM should constant fold Unsafe.get*() loads from final fields
vlivanov
parents: 30624
diff changeset
  1226
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
  static const TypeAryPtr *RANGE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
  static const TypeAryPtr *OOPS;
589
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1230
  static const TypeAryPtr *NARROWOOPS;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  static const TypeAryPtr *BYTES;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
  static const TypeAryPtr *SHORTS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
  static const TypeAryPtr *CHARS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  static const TypeAryPtr *INTS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
  static const TypeAryPtr *LONGS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  static const TypeAryPtr *FLOATS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
  static const TypeAryPtr *DOUBLES;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  // selects one of the above:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
  static const TypeAryPtr *get_array_body_type(BasicType elem) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
    assert((uint)elem <= T_CONFLICT && _array_body_type[elem] != NULL, "bad elem type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
    return _array_body_type[elem];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  static const TypeAryPtr *_array_body_type[T_CONFLICT+1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  // sharpen the type of an int which is used as an array size
3173
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
  1245
#ifdef ASSERT
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
  1246
  // One type is interface, the other is oop
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
  1247
  virtual bool interface_vs_oop(const Type *t) const;
c15503e54406 6837094: False positive for "meet not symmetric" failure
kvn
parents: 2154
diff changeset
  1248
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1254
//------------------------------TypeMetadataPtr-------------------------------------
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1255
// Some kind of metadata, either Method*, MethodData* or CPCacheOop
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1256
class TypeMetadataPtr : public TypePtr {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1257
protected:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1258
  TypeMetadataPtr(PTR ptr, ciMetadata* metadata, int offset);
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1259
  // Do not allow interface-vs.-noninterface joins to collapse to top.
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1260
  virtual const Type *filter_helper(const Type *kills, bool include_speculative) const;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1261
public:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1262
  virtual bool eq( const Type *t ) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1263
  virtual int  hash() const;             // Type specific hashing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1264
  virtual bool singleton(void) const;    // TRUE if type is a singleton
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1265
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1266
private:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1267
  ciMetadata*   _metadata;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1268
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1269
public:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1270
  static const TypeMetadataPtr* make(PTR ptr, ciMetadata* m, int offset);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1271
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1272
  static const TypeMetadataPtr* make(ciMethod* m);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1273
  static const TypeMetadataPtr* make(ciMethodData* m);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1274
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1275
  ciMetadata* metadata() const { return _metadata; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1276
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1277
  virtual const Type *cast_to_ptr_type(PTR ptr) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1278
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1279
  virtual const TypePtr *add_offset( intptr_t offset ) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1280
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1281
  virtual const Type *xmeet( const Type *t ) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1282
  virtual const Type *xdual() const;    // Compute dual right now.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1283
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1284
  virtual intptr_t get_con() const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1285
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1286
  // Convenience common pre-built types.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1287
  static const TypeMetadataPtr *BOTTOM;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1288
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1289
#ifndef PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1290
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1291
#endif
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1292
};
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1293
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
//------------------------------TypeKlassPtr-----------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
// Class of Java Klass pointers
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1296
class TypeKlassPtr : public TypePtr {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
  TypeKlassPtr( PTR ptr, ciKlass* klass, int offset );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1299
protected:
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1300
  virtual const Type *filter_helper(const Type *kills, bool include_speculative) const;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1301
 public:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
  virtual int hash() const;             // Type specific hashing
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1304
  virtual bool singleton(void) const;    // TRUE if type is a singleton
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1305
 private:
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1306
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1307
  static const TypeKlassPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1308
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1309
  ciKlass* _klass;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1310
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1311
  // Does the type exclude subclasses of the klass?  (Inexact == polymorphic.)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1312
  bool          _klass_is_exact;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
public:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1315
  ciSymbol* name()  const { return klass()->name(); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1316
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1317
  ciKlass* klass() const { return  _klass; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1318
  bool klass_is_exact()    const { return _klass_is_exact; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1319
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1320
  bool  is_loaded() const { return klass()->is_loaded(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1322
  // Creates a type given a klass. Correctly handles multi-dimensional arrays
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1323
  // Respects UseUniqueSubclasses.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1324
  // If the klass is final, the resulting type will be exact.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1325
  static const TypeKlassPtr* make_from_klass(ciKlass* klass) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1326
    return make_from_klass_common(klass, true, false);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1327
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1328
  // Same as before, but will produce an exact type, even if
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1329
  // the klass is not final, as long as it has exactly one implementation.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1330
  static const TypeKlassPtr* make_from_klass_unique(ciKlass* klass) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1331
    return make_from_klass_common(klass, true, true);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1332
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1333
  // Same as before, but does not respects UseUniqueSubclasses.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1334
  // Use this only for creating array element types.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1335
  static const TypeKlassPtr* make_from_klass_raw(ciKlass* klass) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1336
    return make_from_klass_common(klass, false, false);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1337
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1338
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1339
  // Make a generic (unclassed) pointer to metadata.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1340
  static const TypeKlassPtr* make(PTR ptr, int offset);
2019
086661823c2b 6788347: C2Compiler crash 6u7
never
parents: 1500
diff changeset
  1341
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
  // ptr to klass 'k'
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
  static const TypeKlassPtr *make( ciKlass* k ) { return make( TypePtr::Constant, k, 0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
  // ptr to klass 'k' with offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
  static const TypeKlassPtr *make( ciKlass* k, int offset ) { return make( TypePtr::Constant, k, offset); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  // ptr to klass 'k' or sub-klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
  static const TypeKlassPtr *make( PTR ptr, ciKlass* k, int offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
  virtual const Type *cast_to_ptr_type(PTR ptr) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
  virtual const Type *cast_to_exactness(bool klass_is_exact) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  // corresponding pointer to instance, for a given class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
  const TypeOopPtr* as_instance_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
1068
720698d9c89b 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 781
diff changeset
  1356
  virtual const TypePtr *add_offset( intptr_t offset ) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
  virtual const Type    *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
  virtual const Type    *xdual() const;      // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1360
  virtual intptr_t get_con() const;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1361
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
  static const TypeKlassPtr* OBJECT; // Not-null object klass or below
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
  static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1370
class TypeNarrowPtr : public Type {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1371
protected:
3180
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
  1372
  const TypePtr* _ptrtype; // Could be TypePtr::NULL_PTR
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1373
51333
f6641fcf7b7e 8208670: Compiler changes to allow enabling -Wreorder
tschatzl
parents: 47216
diff changeset
  1374
  TypeNarrowPtr(TYPES t, const TypePtr* ptrtype): Type(t),
f6641fcf7b7e 8208670: Compiler changes to allow enabling -Wreorder
tschatzl
parents: 47216
diff changeset
  1375
                                                  _ptrtype(ptrtype) {
3180
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
  1376
    assert(ptrtype->offset() == 0 ||
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
  1377
           ptrtype->offset() == OffsetBot ||
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
  1378
           ptrtype->offset() == OffsetTop, "no real offsets");
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1379
  }
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1380
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1381
  virtual const TypeNarrowPtr *isa_same_narrowptr(const Type *t) const = 0;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1382
  virtual const TypeNarrowPtr *is_same_narrowptr(const Type *t) const = 0;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1383
  virtual const TypeNarrowPtr *make_same_narrowptr(const TypePtr *t) const = 0;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1384
  virtual const TypeNarrowPtr *make_hash_same_narrowptr(const TypePtr *t) const = 0;
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1385
  // Do not allow interface-vs.-noninterface joins to collapse to top.
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1386
  virtual const Type *filter_helper(const Type *kills, bool include_speculative) const;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1387
public:
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1388
  virtual bool eq( const Type *t ) const;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1389
  virtual int  hash() const;             // Type specific hashing
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1390
  virtual bool singleton(void) const;    // TRUE if type is a singleton
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1391
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1392
  virtual const Type *xmeet( const Type *t ) const;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1393
  virtual const Type *xdual() const;    // Compute dual right now.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1394
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1395
  virtual intptr_t get_con() const;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1396
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1397
  virtual bool empty(void) const;        // TRUE if type is vacuous
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1398
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1399
  // returns the equivalent ptr type for this compressed pointer
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1400
  const TypePtr *get_ptrtype() const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1401
    return _ptrtype;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1402
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1403
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1404
#ifndef PRODUCT
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1405
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1406
#endif
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1407
};
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1408
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1409
//------------------------------TypeNarrowOop----------------------------------
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1410
// A compressed reference to some kind of Oop.  This type wraps around
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1411
// a preexisting TypeOopPtr and forwards most of it's operations to
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1412
// the underlying type.  It's only real purpose is to track the
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1413
// oopness of the compressed oop value when we expose the conversion
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1414
// between the normal and the compressed form.
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1415
class TypeNarrowOop : public TypeNarrowPtr {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1416
protected:
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1417
  TypeNarrowOop( const TypePtr* ptrtype): TypeNarrowPtr(NarrowOop, ptrtype) {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1418
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1419
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1420
  virtual const TypeNarrowPtr *isa_same_narrowptr(const Type *t) const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1421
    return t->isa_narrowoop();
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1422
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1423
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1424
  virtual const TypeNarrowPtr *is_same_narrowptr(const Type *t) const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1425
    return t->is_narrowoop();
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1426
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1427
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1428
  virtual const TypeNarrowPtr *make_same_narrowptr(const TypePtr *t) const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1429
    return new TypeNarrowOop(t);
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1430
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1431
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1432
  virtual const TypeNarrowPtr *make_hash_same_narrowptr(const TypePtr *t) const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1433
    return (const TypeNarrowPtr*)((new TypeNarrowOop(t))->hashcons());
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1434
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1435
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1436
public:
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1437
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1438
  static const TypeNarrowOop *make( const TypePtr* type);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1439
8728
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 7397
diff changeset
  1440
  static const TypeNarrowOop* make_from_constant(ciObject* con, bool require_constant = false) {
3f1bcd33068e 6962931: move interned strings out of the perm gen
jcoomes
parents: 7397
diff changeset
  1441
    return make(TypeOopPtr::make_from_constant(con, require_constant));
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1442
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1443
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1444
  static const TypeNarrowOop *BOTTOM;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1445
  static const TypeNarrowOop *NULL_PTR;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1446
23525
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1447
  virtual const Type* remove_speculative() const;
e3eb08ead679 8031755: Type speculation should be used to optimize explicit null checks
roland
parents: 23495
diff changeset
  1448
  virtual const Type* cleanup_speculative() const;
22799
83e58bac7980 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
roland
parents: 21202
diff changeset
  1449
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1450
#ifndef PRODUCT
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1451
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1452
#endif
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1453
};
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1454
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1455
//------------------------------TypeNarrowKlass----------------------------------
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1456
// A compressed reference to klass pointer.  This type wraps around a
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1457
// preexisting TypeKlassPtr and forwards most of it's operations to
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1458
// the underlying type.
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1459
class TypeNarrowKlass : public TypeNarrowPtr {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1460
protected:
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1461
  TypeNarrowKlass( const TypePtr* ptrtype): TypeNarrowPtr(NarrowKlass, ptrtype) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1462
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1463
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1464
  virtual const TypeNarrowPtr *isa_same_narrowptr(const Type *t) const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1465
    return t->isa_narrowklass();
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1466
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1467
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1468
  virtual const TypeNarrowPtr *is_same_narrowptr(const Type *t) const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1469
    return t->is_narrowklass();
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1470
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1471
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1472
  virtual const TypeNarrowPtr *make_same_narrowptr(const TypePtr *t) const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1473
    return new TypeNarrowKlass(t);
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1474
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1475
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1476
  virtual const TypeNarrowPtr *make_hash_same_narrowptr(const TypePtr *t) const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1477
    return (const TypeNarrowPtr*)((new TypeNarrowKlass(t))->hashcons());
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1478
  }
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1479
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1480
public:
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1481
  static const TypeNarrowKlass *make( const TypePtr* type);
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1482
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1483
  // static const TypeNarrowKlass *BOTTOM;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1484
  static const TypeNarrowKlass *NULL_PTR;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1485
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1486
#ifndef PRODUCT
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1487
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1488
#endif
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1489
};
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1490
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
//------------------------------TypeFunc---------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
// Class of Array Types
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
class TypeFunc : public Type {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
  TypeFunc( const TypeTuple *domain, const TypeTuple *range ) : Type(Function),  _domain(domain), _range(range) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
  virtual bool eq( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
  virtual int  hash() const;             // Type specific hashing
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
  virtual bool singleton(void) const;    // TRUE if type is a singleton
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
  virtual bool empty(void) const;        // TRUE if type is vacuous
25911
d47a5d9c5b89 8050860: Cleanup TypeTuple and TypeFunc
anoll
parents: 24425
diff changeset
  1499
d47a5d9c5b89 8050860: Cleanup TypeTuple and TypeFunc
anoll
parents: 24425
diff changeset
  1500
  const TypeTuple* const _domain;     // Domain of inputs
d47a5d9c5b89 8050860: Cleanup TypeTuple and TypeFunc
anoll
parents: 24425
diff changeset
  1501
  const TypeTuple* const _range;      // Range of results
d47a5d9c5b89 8050860: Cleanup TypeTuple and TypeFunc
anoll
parents: 24425
diff changeset
  1502
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
  // Constants are shared among ADLC and VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
  enum { Control    = AdlcVMDeps::Control,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
         I_O        = AdlcVMDeps::I_O,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
         Memory     = AdlcVMDeps::Memory,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
         FramePtr   = AdlcVMDeps::FramePtr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
         ReturnAdr  = AdlcVMDeps::ReturnAdr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
         Parms      = AdlcVMDeps::Parms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
  // Accessors:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
  const TypeTuple* domain() const { return _domain; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
  const TypeTuple* range()  const { return _range; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
  static const TypeFunc *make(ciMethod* method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
  static const TypeFunc *make(ciSignature signature, const Type* extra);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
  static const TypeFunc *make(const TypeTuple* domain, const TypeTuple* range);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
  virtual const Type *xmeet( const Type *t ) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
  virtual const Type *xdual() const;    // Compute dual right now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
  BasicType return_type() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
  virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
  // Convenience common pre-built types.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
//------------------------------accessors--------------------------------------
589
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1534
inline bool Type::is_ptr_to_narrowoop() const {
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1535
#ifdef _LP64
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1536
  return (isa_oopptr() != NULL && is_oopptr()->is_ptr_to_narrowoop_nv());
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1537
#else
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1538
  return false;
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1539
#endif
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1540
}
a44a1e70a3e4 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 392
diff changeset
  1541
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1542
inline bool Type::is_ptr_to_narrowklass() const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1543
#ifdef _LP64
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1544
  return (isa_oopptr() != NULL && is_oopptr()->is_ptr_to_narrowklass_nv());
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1545
#else
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1546
  return false;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1547
#endif
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1548
}
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1549
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
inline float Type::getf() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
  assert( _base == FloatCon, "Not a FloatCon" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
  return ((TypeF*)this)->_f;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
inline double Type::getd() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
  assert( _base == DoubleCon, "Not a DoubleCon" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
  return ((TypeD*)this)->_d;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
inline const TypeInt *Type::is_int() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
  assert( _base == Int, "Not an Int" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
  return (TypeInt*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
inline const TypeInt *Type::isa_int() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
  return ( _base == Int ? (TypeInt*)this : NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
inline const TypeLong *Type::is_long() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
  assert( _base == Long, "Not a Long" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
  return (TypeLong*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
inline const TypeLong *Type::isa_long() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
  return ( _base == Long ? (TypeLong*)this : NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
14621
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1578
inline const TypeF *Type::isa_float() const {
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1579
  return ((_base == FloatTop ||
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1580
           _base == FloatCon ||
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1581
           _base == FloatBot) ? (TypeF*)this : NULL);
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1582
}
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1583
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1584
inline const TypeF *Type::is_float_constant() const {
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1585
  assert( _base == FloatCon, "Not a Float" );
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1586
  return (TypeF*)this;
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1587
}
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1588
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1589
inline const TypeF *Type::isa_float_constant() const {
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1590
  return ( _base == FloatCon ? (TypeF*)this : NULL);
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1591
}
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1592
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1593
inline const TypeD *Type::isa_double() const {
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1594
  return ((_base == DoubleTop ||
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1595
           _base == DoubleCon ||
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1596
           _base == DoubleBot) ? (TypeD*)this : NULL);
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1597
}
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1598
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1599
inline const TypeD *Type::is_double_constant() const {
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1600
  assert( _base == DoubleCon, "Not a Double" );
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1601
  return (TypeD*)this;
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1602
}
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1603
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1604
inline const TypeD *Type::isa_double_constant() const {
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1605
  return ( _base == DoubleCon ? (TypeD*)this : NULL);
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1606
}
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 13969
diff changeset
  1607
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
inline const TypeTuple *Type::is_tuple() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
  assert( _base == Tuple, "Not a Tuple" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
  return (TypeTuple*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
inline const TypeAry *Type::is_ary() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
  assert( _base == Array , "Not an Array" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
  return (TypeAry*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
  1618
inline const TypeVect *Type::is_vect() const {
30624
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
  1619
  assert( _base >= VectorS && _base <= VectorZ, "Not a Vector" );
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
  1620
  return (TypeVect*)this;
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
  1621
}
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
  1622
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
  1623
inline const TypeVect *Type::isa_vect() const {
30624
2e1803c8a26d 8076276: Add support for AVX512
kvn
parents: 26310
diff changeset
  1624
  return (_base >= VectorS && _base <= VectorZ) ? (TypeVect*)this : NULL;
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
  1625
}
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 10547
diff changeset
  1626
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
inline const TypePtr *Type::is_ptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
  // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
  assert(_base >= AnyPtr && _base <= KlassPtr, "Not a pointer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
  return (TypePtr*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
inline const TypePtr *Type::isa_ptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
  // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
  return (_base >= AnyPtr && _base <= KlassPtr) ? (TypePtr*)this : NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
inline const TypeOopPtr *Type::is_oopptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
  // OopPtr is the first and KlassPtr the last, with no non-oops between.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1640
  assert(_base >= OopPtr && _base <= AryPtr, "Not a Java pointer" ) ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
  return (TypeOopPtr*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
inline const TypeOopPtr *Type::isa_oopptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
  // OopPtr is the first and KlassPtr the last, with no non-oops between.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1646
  return (_base >= OopPtr && _base <= AryPtr) ? (TypeOopPtr*)this : NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1649
inline const TypeRawPtr *Type::isa_rawptr() const {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1650
  return (_base == RawPtr) ? (TypeRawPtr*)this : NULL;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1651
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1652
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
inline const TypeRawPtr *Type::is_rawptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
  assert( _base == RawPtr, "Not a raw pointer" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
  return (TypeRawPtr*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
inline const TypeInstPtr *Type::isa_instptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
  return (_base == InstPtr) ? (TypeInstPtr*)this : NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
inline const TypeInstPtr *Type::is_instptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
  assert( _base == InstPtr, "Not an object pointer" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
  return (TypeInstPtr*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
inline const TypeAryPtr *Type::isa_aryptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
  return (_base == AryPtr) ? (TypeAryPtr*)this : NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
inline const TypeAryPtr *Type::is_aryptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
  assert( _base == AryPtr, "Not an array pointer" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
  return (TypeAryPtr*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1676
inline const TypeNarrowOop *Type::is_narrowoop() const {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1677
  // OopPtr is the first and KlassPtr the last, with no non-oops between.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1678
  assert(_base == NarrowOop, "Not a narrow oop" ) ;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1679
  return (TypeNarrowOop*)this;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1680
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1681
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1682
inline const TypeNarrowOop *Type::isa_narrowoop() const {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1683
  // OopPtr is the first and KlassPtr the last, with no non-oops between.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1684
  return (_base == NarrowOop) ? (TypeNarrowOop*)this : NULL;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1685
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 237
diff changeset
  1686
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1687
inline const TypeNarrowKlass *Type::is_narrowklass() const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1688
  assert(_base == NarrowKlass, "Not a narrow oop" ) ;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1689
  return (TypeNarrowKlass*)this;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1690
}
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1691
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1692
inline const TypeNarrowKlass *Type::isa_narrowklass() const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1693
  return (_base == NarrowKlass) ? (TypeNarrowKlass*)this : NULL;
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1694
}
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1695
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1696
inline const TypeMetadataPtr *Type::is_metadataptr() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1697
  // MetadataPtr is the first and CPCachePtr the last
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1698
  assert(_base == MetadataPtr, "Not a metadata pointer" ) ;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1699
  return (TypeMetadataPtr*)this;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1700
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1701
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1702
inline const TypeMetadataPtr *Type::isa_metadataptr() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1703
  return (_base == MetadataPtr) ? (TypeMetadataPtr*)this : NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1704
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
  1705
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
inline const TypeKlassPtr *Type::isa_klassptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
  return (_base == KlassPtr) ? (TypeKlassPtr*)this : NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
inline const TypeKlassPtr *Type::is_klassptr() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
  assert( _base == KlassPtr, "Not a klass pointer" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
  return (TypeKlassPtr*)this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
  1715
inline const TypePtr* Type::make_ptr() const {
3180
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
  1716
  return (_base == NarrowOop) ? is_narrowoop()->get_ptrtype() :
31857
adbf29d9ca43 8078629: VM should constant fold Unsafe.get*() loads from final fields
vlivanov
parents: 30624
diff changeset
  1717
                              ((_base == NarrowKlass) ? is_narrowklass()->get_ptrtype() :
adbf29d9ca43 8078629: VM should constant fold Unsafe.get*() loads from final fields
vlivanov
parents: 30624
diff changeset
  1718
                                                       isa_ptr());
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
  1719
}
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
  1720
3180
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
  1721
inline const TypeOopPtr* Type::make_oopptr() const {
31857
adbf29d9ca43 8078629: VM should constant fold Unsafe.get*() loads from final fields
vlivanov
parents: 30624
diff changeset
  1722
  return (_base == NarrowOop) ? is_narrowoop()->get_ptrtype()->isa_oopptr() : isa_oopptr();
3180
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
  1723
}
c589129153a4 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 3173
diff changeset
  1724
767
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
  1725
inline const TypeNarrowOop* Type::make_narrowoop() const {
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
  1726
  return (_base == NarrowOop) ? is_narrowoop() :
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
  1727
                                (isa_ptr() ? TypeNarrowOop::make(is_ptr()) : NULL);
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
  1728
}
64fb1fd7186d 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 589
diff changeset
  1729
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1730
inline const TypeNarrowKlass* Type::make_narrowklass() const {
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1731
  return (_base == NarrowKlass) ? is_narrowklass() :
31857
adbf29d9ca43 8078629: VM should constant fold Unsafe.get*() loads from final fields
vlivanov
parents: 30624
diff changeset
  1732
                                  (isa_ptr() ? TypeNarrowKlass::make(is_ptr()) : NULL);
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1733
}
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13728
diff changeset
  1734
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
inline bool Type::is_floatingpoint() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
  if( (_base == FloatCon)  || (_base == FloatBot) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
      (_base == DoubleCon) || (_base == DoubleBot) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
17383
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1742
inline bool Type::is_ptr_to_boxing_obj() const {
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1743
  const TypeInstPtr* tp = isa_instptr();
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1744
  return (tp != NULL) && (tp->offset() == 0) &&
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1745
         tp->klass()->is_instance_klass()  &&
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1746
         tp->klass()->as_instance_klass()->is_box_klass();
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1747
}
3665c0901a0d 6934604: enable parts of EliminateAutoBox by default
kvn
parents: 14621
diff changeset
  1748
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
// ===============================================================
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
// Things that need to be 64-bits in the 64-bit build but
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
// 32-bits in the 32-bit build.  Done this way to get full
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
// optimization AND strong typing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
// For type queries and asserts
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
#define is_intptr_t  is_long
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
#define isa_intptr_t isa_long
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
#define find_intptr_t_type find_long_type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
#define find_intptr_t_con  find_long_con
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
#define TypeX        TypeLong
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
#define Type_X       Type::Long
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
#define TypeX_X      TypeLong::LONG
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
#define TypeX_ZERO   TypeLong::ZERO
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
// For 'ideal_reg' machine registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
#define Op_RegX      Op_RegL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
// For phase->intcon variants
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
#define MakeConX     longcon
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
#define ConXNode     ConLNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
// For array index arithmetic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
#define MulXNode     MulLNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
#define AndXNode     AndLNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
#define OrXNode      OrLNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
#define CmpXNode     CmpLNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
#define SubXNode     SubLNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
#define LShiftXNode  LShiftLNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
// For object size computation:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
#define AddXNode     AddLNode
190
e9a0a9dcd4f6 6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents: 1
diff changeset
  1779
#define RShiftXNode  RShiftLNode
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
// For card marks and hashcodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
#define URShiftXNode URShiftLNode
1500
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1398
diff changeset
  1782
// UseOptoBiasInlining
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1398
diff changeset
  1783
#define XorXNode     XorLNode
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1398
diff changeset
  1784
#define StoreXConditionalNode StoreLConditionalNode
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1785
#define LoadXNode    LoadLNode
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1786
#define StoreXNode   StoreLNode
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
// Opcodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
#define Op_LShiftX   Op_LShiftL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
#define Op_AndX      Op_AndL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
#define Op_AddX      Op_AddL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
#define Op_SubX      Op_SubL
3268
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 3180
diff changeset
  1792
#define Op_XorX      Op_XorL
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 3180
diff changeset
  1793
#define Op_URShiftX  Op_URShiftL
58372
43c4fb8ba96b 8227384: C2 compilation fails with "graph should be schedulable" when running with -XX:-EliminateLocks
roland
parents: 55583
diff changeset
  1794
#define Op_LoadX     Op_LoadL
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
// conversions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
#define ConvI2X(x)   ConvI2L(x)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
#define ConvL2X(x)   (x)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
#define ConvX2I(x)   ConvL2I(x)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
#define ConvX2L(x)   (x)
23495
f222fac90da2 6653795: C2 intrinsic for Unsafe.getAddress performs pointer sign extension on 32-bit systems
poonam
parents: 22928
diff changeset
  1800
#define ConvX2UL(x)  (x)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
// For type queries and asserts
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
#define is_intptr_t  is_int
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
#define isa_intptr_t isa_int
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
#define find_intptr_t_type find_int_type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
#define find_intptr_t_con  find_int_con
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
#define TypeX        TypeInt
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
#define Type_X       Type::Int
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
#define TypeX_X      TypeInt::INT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
#define TypeX_ZERO   TypeInt::ZERO
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
// For 'ideal_reg' machine registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
#define Op_RegX      Op_RegI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
// For phase->intcon variants
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
#define MakeConX     intcon
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
#define ConXNode     ConINode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
// For array index arithmetic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
#define MulXNode     MulINode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
#define AndXNode     AndINode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
#define OrXNode      OrINode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
#define CmpXNode     CmpINode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
#define SubXNode     SubINode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
#define LShiftXNode  LShiftINode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
// For object size computation:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
#define AddXNode     AddINode
190
e9a0a9dcd4f6 6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents: 1
diff changeset
  1827
#define RShiftXNode  RShiftINode
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
// For card marks and hashcodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
#define URShiftXNode URShiftINode
1500
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1398
diff changeset
  1830
// UseOptoBiasInlining
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1398
diff changeset
  1831
#define XorXNode     XorINode
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1398
diff changeset
  1832
#define StoreXConditionalNode StoreIConditionalNode
52925
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1833
#define LoadXNode    LoadINode
9c18c9d839d3 8214259: Implementation: JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
rkennke
parents: 51333
diff changeset
  1834
#define StoreXNode   StoreINode
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
// Opcodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
#define Op_LShiftX   Op_LShiftI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
#define Op_AndX      Op_AndI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
#define Op_AddX      Op_AddI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
#define Op_SubX      Op_SubI
3268
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 3180
diff changeset
  1840
#define Op_XorX      Op_XorI
f034e0c86895 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 3180
diff changeset
  1841
#define Op_URShiftX  Op_URShiftI
58372
43c4fb8ba96b 8227384: C2 compilation fails with "graph should be schedulable" when running with -XX:-EliminateLocks
roland
parents: 55583
diff changeset
  1842
#define Op_LoadX     Op_LoadI
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
// conversions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
#define ConvI2X(x)   (x)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
#define ConvL2X(x)   ConvL2I(x)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
#define ConvX2I(x)   (x)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
#define ConvX2L(x)   ConvI2L(x)
23495
f222fac90da2 6653795: C2 intrinsic for Unsafe.getAddress performs pointer sign extension on 32-bit systems
poonam
parents: 22928
diff changeset
  1848
#define ConvX2UL(x)  ConvI2UL(x)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6462
diff changeset
  1851
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 53041
diff changeset
  1852
#endif // SHARE_OPTO_TYPE_HPP