annotate src/share/vm/opto/type.hpp @ 452:00b023ae2d78

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