annotate src/share/vm/opto/type.hpp @ 6972:bd7a7ce2e264

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