annotate src/share/vm/opto/type.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents d20603ee9e10
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1080
diff changeset
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1080
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1080
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1080
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
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
1009
03b336640699 6885584: A particular class structure causes large allocation spike for jit
never
parents: 992
diff changeset
171 virtual const Type *widen( const Type *old, const Type* limit ) const { return this; }
0
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
820
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
193 #ifdef ASSERT
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
194 // One type is interface, the other is oop
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
195 virtual bool interface_vs_oop(const Type *t) const;
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
196 #endif
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
197
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
198 // 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
199 // compressed oop references.
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
200 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
201
0
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // Convenience access
a61af66fc99e Initial load
duke
parents:
diff changeset
203 float getf() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 double getd() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 const TypeInt *is_int() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
207 const TypeInt *isa_int() const; // Returns NULL if not an Int
a61af66fc99e Initial load
duke
parents:
diff changeset
208 const TypeLong *is_long() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
209 const TypeLong *isa_long() const; // Returns NULL if not a Long
a61af66fc99e Initial load
duke
parents:
diff changeset
210 const TypeD *is_double_constant() const; // Asserts it is a DoubleCon
a61af66fc99e Initial load
duke
parents:
diff changeset
211 const TypeD *isa_double_constant() const; // Returns NULL if not a DoubleCon
a61af66fc99e Initial load
duke
parents:
diff changeset
212 const TypeF *is_float_constant() const; // Asserts it is a FloatCon
a61af66fc99e Initial load
duke
parents:
diff changeset
213 const TypeF *isa_float_constant() const; // Returns NULL if not a FloatCon
a61af66fc99e Initial load
duke
parents:
diff changeset
214 const TypeTuple *is_tuple() const; // Collection of fields, NOT a pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
215 const TypeAry *is_ary() const; // Array, NOT array pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
216 const TypePtr *is_ptr() const; // Asserts it is a ptr type
a61af66fc99e Initial load
duke
parents:
diff changeset
217 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
218 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
219 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
220 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
221 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
222 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
223 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
224 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
225 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
226 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
227 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
228 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
229 const TypeAryPtr *is_aryptr() const; // Array oop
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 virtual bool is_finite() const; // Has a finite value
a61af66fc99e Initial load
duke
parents:
diff changeset
231 virtual bool is_nan() const; // Is not a number (NaN)
a61af66fc99e Initial load
duke
parents:
diff changeset
232
221
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
233 // 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
234 const TypePtr* make_ptr() const;
827
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
235
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
236 // Returns this oopptr type or the equivalent oopptr type for this compressed pointer.
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
237 // Asserts if the underlying type is not an oopptr or narrowoop.
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
238 const TypeOopPtr* make_oopptr() const;
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
239
221
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
240 // 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
241 // of this pointer type.
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
242 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
243
0
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Special test for register pressure heuristic
a61af66fc99e Initial load
duke
parents:
diff changeset
245 bool is_floatingpoint() const; // True if Float or Double base type
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // Do you have memory, directly or through a tuple?
a61af66fc99e Initial load
duke
parents:
diff changeset
248 bool has_memory( ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Are you a pointer type or not?
a61af66fc99e Initial load
duke
parents:
diff changeset
251 bool isa_oop_ptr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
254 virtual bool singleton(void) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // TRUE if type is above the lattice centerline, and is therefore vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
257 virtual bool empty(void) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // Return a hash for this type. The hash function is public so ConNode
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // (constants) can hash on their constant, which is represented by a Type.
a61af66fc99e Initial load
duke
parents:
diff changeset
261 virtual int hash() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Map ideal registers (machine types) to ideal types
a61af66fc99e Initial load
duke
parents:
diff changeset
264 static const Type *mreg2type[];
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // Printing, statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
267 static const char * const msg[lastype]; // Printable strings
a61af66fc99e Initial load
duke
parents:
diff changeset
268 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
269 void dump_on(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
270 void dump() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 dump_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 static void dump_stats();
a61af66fc99e Initial load
duke
parents:
diff changeset
275 static void verify_lastype(); // Check that arrays match type enum
a61af66fc99e Initial load
duke
parents:
diff changeset
276 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void typerr(const Type *t) const; // Mixing types error
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // Create basic type
a61af66fc99e Initial load
duke
parents:
diff changeset
280 static const Type* get_const_basic_type(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 assert((uint)type <= T_CONFLICT && _const_basic_type[type] != NULL, "bad type");
a61af66fc99e Initial load
duke
parents:
diff changeset
282 return _const_basic_type[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Mapping to the array element's basic type.
a61af66fc99e Initial load
duke
parents:
diff changeset
286 BasicType array_element_basic_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // Create standard type for a ciType:
a61af66fc99e Initial load
duke
parents:
diff changeset
289 static const Type* get_const_type(ciType* type);
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Create standard zero value:
a61af66fc99e Initial load
duke
parents:
diff changeset
292 static const Type* get_zero_type(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
293 assert((uint)type <= T_CONFLICT && _zero_type[type] != NULL, "bad type");
a61af66fc99e Initial load
duke
parents:
diff changeset
294 return _zero_type[type];
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // Report if this is a zero value (not top).
a61af66fc99e Initial load
duke
parents:
diff changeset
298 bool is_zero_type() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 BasicType type = basic_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if (type == T_VOID || type >= T_CONFLICT)
a61af66fc99e Initial load
duke
parents:
diff changeset
301 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 else
a61af66fc99e Initial load
duke
parents:
diff changeset
303 return (this == _zero_type[type]);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 static const Type *ABIO;
a61af66fc99e Initial load
duke
parents:
diff changeset
308 static const Type *BOTTOM;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 static const Type *CONTROL;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 static const Type *DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 static const Type *FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 static const Type *HALF;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 static const Type *MEMORY;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 static const Type *MULTI;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 static const Type *RETURN_ADDRESS;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 static const Type *TOP;
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Mapping from compiler type to VM BasicType
a61af66fc99e Initial load
duke
parents:
diff changeset
319 BasicType basic_type() const { return _basic_type[_base]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // Mapping from CI type system to compiler type:
a61af66fc99e Initial load
duke
parents:
diff changeset
322 static const Type* get_typeflow_type(ciType* type);
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // support arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
326 static const BasicType _basic_type[];
a61af66fc99e Initial load
duke
parents:
diff changeset
327 static const Type* _zero_type[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
328 static const Type* _const_basic_type[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
329 };
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 //------------------------------TypeF------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // Class of Float-Constant Types.
a61af66fc99e Initial load
duke
parents:
diff changeset
333 class TypeF : public Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 TypeF( float f ) : Type(FloatCon), _f(f) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
335 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
336 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
337 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
338 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
339 virtual bool empty(void) const; // TRUE if type is vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
340 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
341 const float _f; // Float constant
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 static const TypeF *make(float f);
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 virtual bool is_finite() const; // Has a finite value
a61af66fc99e Initial load
duke
parents:
diff changeset
346 virtual bool is_nan() const; // Is not a number (NaN)
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
351 static const TypeF *ZERO; // positive zero only
a61af66fc99e Initial load
duke
parents:
diff changeset
352 static const TypeF *ONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
354 virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
356 };
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 //------------------------------TypeD------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // Class of Double-Constant Types.
a61af66fc99e Initial load
duke
parents:
diff changeset
360 class TypeD : public Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 TypeD( double d ) : Type(DoubleCon), _d(d) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
362 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
363 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
364 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
365 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
366 virtual bool empty(void) const; // TRUE if type is vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
367 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
368 const double _d; // Double constant
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370 static const TypeD *make(double d);
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 virtual bool is_finite() const; // Has a finite value
a61af66fc99e Initial load
duke
parents:
diff changeset
373 virtual bool is_nan() const; // Is not a number (NaN)
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
376 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
378 static const TypeD *ZERO; // positive zero only
a61af66fc99e Initial load
duke
parents:
diff changeset
379 static const TypeD *ONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
381 virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
383 };
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 //------------------------------TypeInt----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Class of integer ranges, the set of integers between a lower bound and an
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // upper bound, inclusive.
a61af66fc99e Initial load
duke
parents:
diff changeset
388 class TypeInt : public Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
389 TypeInt( jint lo, jint hi, int w );
a61af66fc99e Initial load
duke
parents:
diff changeset
390 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
391 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
392 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
393 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
394 virtual bool empty(void) const; // TRUE if type is vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
395 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
396 const jint _lo, _hi; // Lower bound, upper bound
a61af66fc99e Initial load
duke
parents:
diff changeset
397 const short _widen; // Limit on times we widen this sucker
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 static const TypeInt *make(jint lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // must always specify w
a61af66fc99e Initial load
duke
parents:
diff changeset
401 static const TypeInt *make(jint lo, jint hi, int w);
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // Check for single integer
a61af66fc99e Initial load
duke
parents:
diff changeset
404 int is_con() const { return _lo==_hi; }
a61af66fc99e Initial load
duke
parents:
diff changeset
405 bool is_con(int i) const { return is_con() && _lo == i; }
a61af66fc99e Initial load
duke
parents:
diff changeset
406 jint get_con() const { assert( is_con(), "" ); return _lo; }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 virtual bool is_finite() const; // Has a finite value
a61af66fc99e Initial load
duke
parents:
diff changeset
409
a61af66fc99e Initial load
duke
parents:
diff changeset
410 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
411 virtual const Type *xdual() const; // Compute dual right now.
1009
03b336640699 6885584: A particular class structure causes large allocation spike for jit
never
parents: 992
diff changeset
412 virtual const Type *widen( const Type *t, const Type* limit_type ) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
413 virtual const Type *narrow( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // Do not kill _widen bits.
a61af66fc99e Initial load
duke
parents:
diff changeset
415 virtual const Type *filter( const Type *kills ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 static const TypeInt *MINUS_1;
a61af66fc99e Initial load
duke
parents:
diff changeset
418 static const TypeInt *ZERO;
a61af66fc99e Initial load
duke
parents:
diff changeset
419 static const TypeInt *ONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 static const TypeInt *BOOL;
a61af66fc99e Initial load
duke
parents:
diff changeset
421 static const TypeInt *CC;
a61af66fc99e Initial load
duke
parents:
diff changeset
422 static const TypeInt *CC_LT; // [-1] == MINUS_1
a61af66fc99e Initial load
duke
parents:
diff changeset
423 static const TypeInt *CC_GT; // [1] == ONE
a61af66fc99e Initial load
duke
parents:
diff changeset
424 static const TypeInt *CC_EQ; // [0] == ZERO
a61af66fc99e Initial load
duke
parents:
diff changeset
425 static const TypeInt *CC_LE; // [-1,0]
a61af66fc99e Initial load
duke
parents:
diff changeset
426 static const TypeInt *CC_GE; // [0,1] == BOOL (!)
a61af66fc99e Initial load
duke
parents:
diff changeset
427 static const TypeInt *BYTE;
624
337400e7a5dd 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 555
diff changeset
428 static const TypeInt *UBYTE;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429 static const TypeInt *CHAR;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 static const TypeInt *SHORT;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 static const TypeInt *POS;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 static const TypeInt *POS1;
a61af66fc99e Initial load
duke
parents:
diff changeset
433 static const TypeInt *INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
434 static const TypeInt *SYMINT; // symmetric range [-max_jint..max_jint]
a61af66fc99e Initial load
duke
parents:
diff changeset
435 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
436 virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
437 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
438 };
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 //------------------------------TypeLong---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // Class of long integer ranges, the set of integers between a lower bound and
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // an upper bound, inclusive.
a61af66fc99e Initial load
duke
parents:
diff changeset
444 class TypeLong : public Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 TypeLong( jlong lo, jlong hi, int w );
a61af66fc99e Initial load
duke
parents:
diff changeset
446 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
447 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
449 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
450 virtual bool empty(void) const; // TRUE if type is vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
451 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
452 const jlong _lo, _hi; // Lower bound, upper bound
a61af66fc99e Initial load
duke
parents:
diff changeset
453 const short _widen; // Limit on times we widen this sucker
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 static const TypeLong *make(jlong lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // must always specify w
a61af66fc99e Initial load
duke
parents:
diff changeset
457 static const TypeLong *make(jlong lo, jlong hi, int w);
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // Check for single integer
a61af66fc99e Initial load
duke
parents:
diff changeset
460 int is_con() const { return _lo==_hi; }
145
f3de1255b035 6603011: RFE: Optimize long division
rasbold
parents: 113
diff changeset
461 bool is_con(int i) const { return is_con() && _lo == i; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
462 jlong get_con() const { assert( is_con(), "" ); return _lo; }
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 virtual bool is_finite() const; // Has a finite value
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 virtual const Type *xdual() const; // Compute dual right now.
1009
03b336640699 6885584: A particular class structure causes large allocation spike for jit
never
parents: 992
diff changeset
468 virtual const Type *widen( const Type *t, const Type* limit_type ) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469 virtual const Type *narrow( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Do not kill _widen bits.
a61af66fc99e Initial load
duke
parents:
diff changeset
471 virtual const Type *filter( const Type *kills ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
473 static const TypeLong *MINUS_1;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 static const TypeLong *ZERO;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 static const TypeLong *ONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 static const TypeLong *POS;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 static const TypeLong *LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
478 static const TypeLong *INT; // 32-bit subrange [min_jint..max_jint]
a61af66fc99e Initial load
duke
parents:
diff changeset
479 static const TypeLong *UINT; // 32-bit unsigned [0..max_juint]
a61af66fc99e Initial load
duke
parents:
diff changeset
480 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
481 virtual void dump2( Dict &d, uint, outputStream *st ) const;// Specialized per-Type dumping
a61af66fc99e Initial load
duke
parents:
diff changeset
482 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
483 };
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 //------------------------------TypeTuple--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // Class of Tuple Types, essentially type collections for function signatures
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // and class layouts. It happens to also be a fast cache for the HotSpot
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // signature types.
a61af66fc99e Initial load
duke
parents:
diff changeset
489 class TypeTuple : public Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 TypeTuple( uint cnt, const Type **fields ) : Type(Tuple), _cnt(cnt), _fields(fields) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
492 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
493 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
494 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
495 virtual bool empty(void) const; // TRUE if type is vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
498 const uint _cnt; // Count of fields
a61af66fc99e Initial load
duke
parents:
diff changeset
499 const Type ** const _fields; // Array of field types
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // Accessors:
a61af66fc99e Initial load
duke
parents:
diff changeset
502 uint cnt() const { return _cnt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
503 const Type* field_at(uint i) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 assert(i < _cnt, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
505 return _fields[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507 void set_field_at(uint i, const Type* t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 assert(i < _cnt, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
509 _fields[i] = t;
a61af66fc99e Initial load
duke
parents:
diff changeset
510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 static const TypeTuple *make( uint cnt, const Type **fields );
a61af66fc99e Initial load
duke
parents:
diff changeset
513 static const TypeTuple *make_range(ciSignature *sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
514 static const TypeTuple *make_domain(ciInstanceKlass* recv, ciSignature *sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // Subroutine call type with space allocated for argument types
a61af66fc99e Initial load
duke
parents:
diff changeset
517 static const Type **fields( uint arg_cnt );
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
522 static const TypeTuple *IFBOTH;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 static const TypeTuple *IFFALSE;
a61af66fc99e Initial load
duke
parents:
diff changeset
524 static const TypeTuple *IFTRUE;
a61af66fc99e Initial load
duke
parents:
diff changeset
525 static const TypeTuple *IFNEITHER;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 static const TypeTuple *LOOPBODY;
a61af66fc99e Initial load
duke
parents:
diff changeset
527 static const TypeTuple *MEMBAR;
a61af66fc99e Initial load
duke
parents:
diff changeset
528 static const TypeTuple *STORECONDITIONAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
529 static const TypeTuple *START_I2C;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 static const TypeTuple *INT_PAIR;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 static const TypeTuple *LONG_PAIR;
a61af66fc99e Initial load
duke
parents:
diff changeset
532 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
533 virtual void dump2( Dict &d, uint, outputStream *st ) const; // Specialized per-Type dumping
a61af66fc99e Initial load
duke
parents:
diff changeset
534 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
535 };
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 //------------------------------TypeAry----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // Class of Array Types
a61af66fc99e Initial load
duke
parents:
diff changeset
539 class TypeAry : public Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
540 TypeAry( const Type *elem, const TypeInt *size) : Type(Array),
a61af66fc99e Initial load
duke
parents:
diff changeset
541 _elem(elem), _size(size) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
542 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
543 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
544 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
545 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
546 virtual bool empty(void) const; // TRUE if type is vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
549 const Type *_elem; // Element type of array
a61af66fc99e Initial load
duke
parents:
diff changeset
550 const TypeInt *_size; // Elements in array
a61af66fc99e Initial load
duke
parents:
diff changeset
551 friend class TypeAryPtr;
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
554 static const TypeAry *make( const Type *elem, const TypeInt *size);
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
557 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
558 bool ary_must_be_exact() const; // true if arrays of such are never generic
820
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
559 #ifdef ASSERT
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
560 // One type is interface, the other is oop
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
561 virtual bool interface_vs_oop(const Type *t) const;
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
562 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
563 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
564 virtual void dump2( Dict &d, uint, outputStream *st ) const; // Specialized per-Type dumping
a61af66fc99e Initial load
duke
parents:
diff changeset
565 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
566 };
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 //------------------------------TypePtr----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // Class of machine Pointer Types: raw data, instances or arrays.
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // If the _base enum is AnyPtr, then this refers to all of the above.
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // Otherwise the _base will indicate which subset of pointers is affected,
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // and the class will be inherited from.
a61af66fc99e Initial load
duke
parents:
diff changeset
573 class TypePtr : public Type {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
574 friend class TypeNarrowOop;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
576 enum PTR { TopPTR, AnyNull, Constant, Null, NotNull, BotPTR, lastPTR };
a61af66fc99e Initial load
duke
parents:
diff changeset
577 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
578 TypePtr( TYPES t, PTR ptr, int offset ) : Type(t), _ptr(ptr), _offset(offset) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
579 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
580 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
581 static const PTR ptr_meet[lastPTR][lastPTR];
a61af66fc99e Initial load
duke
parents:
diff changeset
582 static const PTR ptr_dual[lastPTR];
a61af66fc99e Initial load
duke
parents:
diff changeset
583 static const char * const ptr_msg[lastPTR];
a61af66fc99e Initial load
duke
parents:
diff changeset
584
a61af66fc99e Initial load
duke
parents:
diff changeset
585 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
586 const int _offset; // Offset into oop, with TOP & BOT
a61af66fc99e Initial load
duke
parents:
diff changeset
587 const PTR _ptr; // Pointer equivalence class
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 const int offset() const { return _offset; }
a61af66fc99e Initial load
duke
parents:
diff changeset
590 const PTR ptr() const { return _ptr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 static const TypePtr *make( TYPES t, PTR ptr, int offset );
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // Return a 'ptr' version of this type
a61af66fc99e Initial load
duke
parents:
diff changeset
595 virtual const Type *cast_to_ptr_type(PTR ptr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 virtual intptr_t get_con() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
598
306
af945ba2e739 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 235
diff changeset
599 int xadd_offset( intptr_t offset ) const;
af945ba2e739 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 235
diff changeset
600 virtual const TypePtr *add_offset( intptr_t offset ) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
603 virtual bool empty(void) const; // TRUE if type is vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
604 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
605 int meet_offset( int offset ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
606 int dual_offset( ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // meet, dual and join over pointer equivalence sets
a61af66fc99e Initial load
duke
parents:
diff changeset
610 PTR meet_ptr( const PTR in_ptr ) const { return ptr_meet[in_ptr][ptr()]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
611 PTR dual_ptr() const { return ptr_dual[ptr()]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // This is textually confusing unless one recalls that
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // join(t) == dual()->meet(t->dual())->dual().
a61af66fc99e Initial load
duke
parents:
diff changeset
615 PTR join_ptr( const PTR in_ptr ) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
616 return ptr_dual[ ptr_meet[ ptr_dual[in_ptr] ] [ dual_ptr() ] ];
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // Tests for relation to centerline of type lattice:
a61af66fc99e Initial load
duke
parents:
diff changeset
620 static bool above_centerline(PTR ptr) { return (ptr <= AnyNull); }
a61af66fc99e Initial load
duke
parents:
diff changeset
621 static bool below_centerline(PTR ptr) { return (ptr >= NotNull); }
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
623 static const TypePtr *NULL_PTR;
a61af66fc99e Initial load
duke
parents:
diff changeset
624 static const TypePtr *NOTNULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
625 static const TypePtr *BOTTOM;
a61af66fc99e Initial load
duke
parents:
diff changeset
626 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
627 virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
628 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
629 };
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 //------------------------------TypeRawPtr-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // Class of raw pointers, pointers to things other than Oops. Examples
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // include the stack pointer, top of heap, card-marking area, handles, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
634 class TypeRawPtr : public TypePtr {
a61af66fc99e Initial load
duke
parents:
diff changeset
635 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
636 TypeRawPtr( PTR ptr, address bits ) : TypePtr(RawPtr,ptr,0), _bits(bits){}
a61af66fc99e Initial load
duke
parents:
diff changeset
637 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
638 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
639 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 const address _bits; // Constant value, if applicable
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 static const TypeRawPtr *make( PTR ptr );
a61af66fc99e Initial load
duke
parents:
diff changeset
644 static const TypeRawPtr *make( address bits );
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // Return a 'ptr' version of this type
a61af66fc99e Initial load
duke
parents:
diff changeset
647 virtual const Type *cast_to_ptr_type(PTR ptr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 virtual intptr_t get_con() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
650
306
af945ba2e739 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 235
diff changeset
651 virtual const TypePtr *add_offset( intptr_t offset ) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
652
a61af66fc99e Initial load
duke
parents:
diff changeset
653 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
656 static const TypeRawPtr *BOTTOM;
a61af66fc99e Initial load
duke
parents:
diff changeset
657 static const TypeRawPtr *NOTNULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
658 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
659 virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
661 };
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 //------------------------------TypeOopPtr-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // Some kind of oop (Java pointer), either klass or instance or array.
a61af66fc99e Initial load
duke
parents:
diff changeset
665 class TypeOopPtr : public TypePtr {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 protected:
163
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
667 TypeOopPtr( TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
668 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
669 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
670 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
671 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
672 enum {
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
673 InstanceTop = -1, // undefined instance
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
674 InstanceBot = 0 // any possible instance
0
a61af66fc99e Initial load
duke
parents:
diff changeset
675 };
a61af66fc99e Initial load
duke
parents:
diff changeset
676 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // Oop is NULL, unless this is a constant oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
679 ciObject* _const_oop; // Constant oop
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // If _klass is NULL, then so is _sig. This is an unloaded klass.
a61af66fc99e Initial load
duke
parents:
diff changeset
681 ciKlass* _klass; // Klass object
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // Does the type exclude subclasses of the klass? (Inexact == polymorphic.)
a61af66fc99e Initial load
duke
parents:
diff changeset
683 bool _klass_is_exact;
163
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
684 bool _is_ptr_to_narrowoop;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
685
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
686 // If not InstanceTop or InstanceBot, indicates that this is
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
687 // a particular instance of this type which is distinct.
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
688 // 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
689 int _instance_id;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
a61af66fc99e Initial load
duke
parents:
diff changeset
692
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
693 int dual_instance_id() const;
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
694 int meet_instance_id(int uid) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // Creates a type given a klass. Correctly handles multi-dimensional arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // Respects UseUniqueSubclasses.
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // If the klass is final, the resulting type will be exact.
a61af66fc99e Initial load
duke
parents:
diff changeset
700 static const TypeOopPtr* make_from_klass(ciKlass* klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 return make_from_klass_common(klass, true, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // Same as before, but will produce an exact type, even if
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // the klass is not final, as long as it has exactly one implementation.
a61af66fc99e Initial load
duke
parents:
diff changeset
705 static const TypeOopPtr* make_from_klass_unique(ciKlass* klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
706 return make_from_klass_common(klass, true, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // Same as before, but does not respects UseUniqueSubclasses.
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // Use this only for creating array element types.
a61af66fc99e Initial load
duke
parents:
diff changeset
710 static const TypeOopPtr* make_from_klass_raw(ciKlass* klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
711 return make_from_klass_common(klass, false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
712 }
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // Creates a singleton type given an object.
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 958
diff changeset
714 // If the object cannot be rendered as a constant,
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 958
diff changeset
715 // may return a non-singleton type.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 958
diff changeset
716 // If require_constant, produce a NULL if a singleton is not possible.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 958
diff changeset
717 static const TypeOopPtr* make_from_constant(ciObject* o, bool require_constant = false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // Make a generic (unclassed) pointer to an oop.
992
6a8ccac44f41 6820514: meet not symmetric failure in ctw
kvn
parents: 989
diff changeset
720 static const TypeOopPtr* make(PTR ptr, int offset, int instance_id);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 ciObject* const_oop() const { return _const_oop; }
a61af66fc99e Initial load
duke
parents:
diff changeset
723 virtual ciKlass* klass() const { return _klass; }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 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
725
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
726 // 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
727 // compressed oop references.
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
728 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
729
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
730 bool is_known_instance() const { return _instance_id > 0; }
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
731 int instance_id() const { return _instance_id; }
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
732 bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 virtual intptr_t get_con() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 virtual const Type *cast_to_ptr_type(PTR ptr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 virtual const Type *cast_to_exactness(bool klass_is_exact) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
739
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
740 virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742 // corresponding pointer to klass, for a given instance
a61af66fc99e Initial load
duke
parents:
diff changeset
743 const TypeKlassPtr* as_klass_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
744
306
af945ba2e739 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 235
diff changeset
745 virtual const TypePtr *add_offset( intptr_t offset ) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // Do not allow interface-vs.-noninterface joins to collapse to top.
a61af66fc99e Initial load
duke
parents:
diff changeset
751 virtual const Type *filter( const Type *kills ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 // Convenience common pre-built type.
a61af66fc99e Initial load
duke
parents:
diff changeset
754 static const TypeOopPtr *BOTTOM;
a61af66fc99e Initial load
duke
parents:
diff changeset
755 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
756 virtual void dump2( Dict &d, uint depth, outputStream *st ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
757 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
758 };
a61af66fc99e Initial load
duke
parents:
diff changeset
759
a61af66fc99e Initial load
duke
parents:
diff changeset
760 //------------------------------TypeInstPtr------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // Class of Java object pointers, pointing either to non-array Java instances
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // or to a klassOop (including array klasses).
a61af66fc99e Initial load
duke
parents:
diff changeset
763 class TypeInstPtr : public TypeOopPtr {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 TypeInstPtr( PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id );
a61af66fc99e Initial load
duke
parents:
diff changeset
765 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
766 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768 ciSymbol* _name; // class name
a61af66fc99e Initial load
duke
parents:
diff changeset
769
a61af66fc99e Initial load
duke
parents:
diff changeset
770 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
771 ciSymbol* name() const { return _name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 bool is_loaded() const { return _klass->is_loaded(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // Make a pointer to a constant oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
776 static const TypeInstPtr *make(ciObject* o) {
a61af66fc99e Initial load
duke
parents:
diff changeset
777 return make(TypePtr::Constant, o->klass(), true, o, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // Make a pointer to a constant oop with offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
781 static const TypeInstPtr *make(ciObject* o, int offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
782 return make(TypePtr::Constant, o->klass(), true, o, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // Make a pointer to some value of type klass.
a61af66fc99e Initial load
duke
parents:
diff changeset
786 static const TypeInstPtr *make(PTR ptr, ciKlass* klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
787 return make(ptr, klass, false, NULL, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // Make a pointer to some non-polymorphic value of exactly type klass.
a61af66fc99e Initial load
duke
parents:
diff changeset
791 static const TypeInstPtr *make_exact(PTR ptr, ciKlass* klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
792 return make(ptr, klass, true, NULL, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795 // Make a pointer to some value of type klass with offset.
a61af66fc99e Initial load
duke
parents:
diff changeset
796 static const TypeInstPtr *make(PTR ptr, ciKlass* klass, int offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
797 return make(ptr, klass, false, NULL, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // Make a pointer to an oop.
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
801 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
802
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // If this is a java.lang.Class constant, return the type for it or NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // Pass to Type::get_const_type to turn it to a type, which will usually
a61af66fc99e Initial load
duke
parents:
diff changeset
805 // be a TypeInstPtr, but may also be a TypeInt::INT for int.class, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
806 ciType* java_mirror_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
807
a61af66fc99e Initial load
duke
parents:
diff changeset
808 virtual const Type *cast_to_ptr_type(PTR ptr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 virtual const Type *cast_to_exactness(bool klass_is_exact) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
811
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
812 virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
813
306
af945ba2e739 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 235
diff changeset
814 virtual const TypePtr *add_offset( intptr_t offset ) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 virtual const TypeInstPtr *xmeet_unloaded( const TypeInstPtr *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
818 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
821 static const TypeInstPtr *NOTNULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
822 static const TypeInstPtr *BOTTOM;
a61af66fc99e Initial load
duke
parents:
diff changeset
823 static const TypeInstPtr *MIRROR;
a61af66fc99e Initial load
duke
parents:
diff changeset
824 static const TypeInstPtr *MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
825 static const TypeInstPtr *KLASS;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
827 virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
a61af66fc99e Initial load
duke
parents:
diff changeset
828 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
829 };
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 //------------------------------TypeAryPtr-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // Class of Java array pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
833 class TypeAryPtr : public TypeOopPtr {
1761
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
834 TypeAryPtr( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id ) : TypeOopPtr(AryPtr,ptr,k,xk,o,offset, instance_id), _ary(ary) {
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
835 #ifdef ASSERT
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
836 if (k != NULL) {
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
837 // Verify that specified klass and TypeAryPtr::klass() follow the same rules.
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
838 ciKlass* ck = compute_klass(true);
1792
d20603ee9e10 6984346: Remove development code in type.hpp
kvn
parents: 1761
diff changeset
839 if (k != ck) {
1761
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
840 this->dump(); tty->cr();
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
841 tty->print(" k: ");
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
842 k->print(); tty->cr();
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
843 tty->print("ck: ");
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
844 if (ck != NULL) ck->print();
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
845 else tty->print("<NULL>");
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
846 tty->cr();
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
847 assert(false, "unexpected TypeAryPtr::_klass");
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
848 }
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
849 }
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
850 #endif
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
851 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
852 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
854 const TypeAry *_ary; // Array we point into
a61af66fc99e Initial load
duke
parents:
diff changeset
855
1761
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
856 ciKlass* compute_klass(DEBUG_ONLY(bool verify = false)) const;
14b92b91f460 6976400: "Meet Not Symmetric"
kvn
parents: 1552
diff changeset
857
0
a61af66fc99e Initial load
duke
parents:
diff changeset
858 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
860 ciKlass* klass() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 const TypeAry* ary() const { return _ary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
862 const Type* elem() const { return _ary->_elem; }
a61af66fc99e Initial load
duke
parents:
diff changeset
863 const TypeInt* size() const { return _ary->_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
864
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
865 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
866 // Constant pointer to array
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
867 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
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // Return a 'ptr' version of this type
a61af66fc99e Initial load
duke
parents:
diff changeset
870 virtual const Type *cast_to_ptr_type(PTR ptr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 virtual const Type *cast_to_exactness(bool klass_is_exact) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
873
223
1dd146f17531 6716441: error in meet with +DoEscapeAnalysis
kvn
parents: 221
diff changeset
874 virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
875
a61af66fc99e Initial load
duke
parents:
diff changeset
876 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
877 virtual const TypeInt* narrow_size_type(const TypeInt* size) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
878
a61af66fc99e Initial load
duke
parents:
diff changeset
879 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
880 virtual const TypePtr *add_offset( intptr_t offset ) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
881
a61af66fc99e Initial load
duke
parents:
diff changeset
882 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
883 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
886 static const TypeAryPtr *RANGE;
a61af66fc99e Initial load
duke
parents:
diff changeset
887 static const TypeAryPtr *OOPS;
163
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
888 static const TypeAryPtr *NARROWOOPS;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
889 static const TypeAryPtr *BYTES;
a61af66fc99e Initial load
duke
parents:
diff changeset
890 static const TypeAryPtr *SHORTS;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 static const TypeAryPtr *CHARS;
a61af66fc99e Initial load
duke
parents:
diff changeset
892 static const TypeAryPtr *INTS;
a61af66fc99e Initial load
duke
parents:
diff changeset
893 static const TypeAryPtr *LONGS;
a61af66fc99e Initial load
duke
parents:
diff changeset
894 static const TypeAryPtr *FLOATS;
a61af66fc99e Initial load
duke
parents:
diff changeset
895 static const TypeAryPtr *DOUBLES;
a61af66fc99e Initial load
duke
parents:
diff changeset
896 // selects one of the above:
a61af66fc99e Initial load
duke
parents:
diff changeset
897 static const TypeAryPtr *get_array_body_type(BasicType elem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
898 assert((uint)elem <= T_CONFLICT && _array_body_type[elem] != NULL, "bad elem type");
a61af66fc99e Initial load
duke
parents:
diff changeset
899 return _array_body_type[elem];
a61af66fc99e Initial load
duke
parents:
diff changeset
900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
901 static const TypeAryPtr *_array_body_type[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
902 // sharpen the type of an int which is used as an array size
820
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
903 #ifdef ASSERT
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
904 // One type is interface, the other is oop
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
905 virtual bool interface_vs_oop(const Type *t) const;
915cc9c5ebc6 6837094: False positive for "meet not symmetric" failure
kvn
parents: 628
diff changeset
906 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
907 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
908 virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
a61af66fc99e Initial load
duke
parents:
diff changeset
909 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
910 };
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 //------------------------------TypeKlassPtr-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // Class of Java Klass pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
914 class TypeKlassPtr : public TypeOopPtr {
a61af66fc99e Initial load
duke
parents:
diff changeset
915 TypeKlassPtr( PTR ptr, ciKlass* klass, int offset );
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
918 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
921 ciSymbol* name() const { return _klass->name(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
922
555
35ae4dd6c27c 6788347: C2Compiler crash 6u7
never
parents: 420
diff changeset
923 bool is_loaded() const { return _klass->is_loaded(); }
35ae4dd6c27c 6788347: C2Compiler crash 6u7
never
parents: 420
diff changeset
924
0
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // ptr to klass 'k'
a61af66fc99e Initial load
duke
parents:
diff changeset
926 static const TypeKlassPtr *make( ciKlass* k ) { return make( TypePtr::Constant, k, 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
927 // ptr to klass 'k' with offset
a61af66fc99e Initial load
duke
parents:
diff changeset
928 static const TypeKlassPtr *make( ciKlass* k, int offset ) { return make( TypePtr::Constant, k, offset); }
a61af66fc99e Initial load
duke
parents:
diff changeset
929 // ptr to klass 'k' or sub-klass
a61af66fc99e Initial load
duke
parents:
diff changeset
930 static const TypeKlassPtr *make( PTR ptr, ciKlass* k, int offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932 virtual const Type *cast_to_ptr_type(PTR ptr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 virtual const Type *cast_to_exactness(bool klass_is_exact) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 // corresponding pointer to instance, for a given class
a61af66fc99e Initial load
duke
parents:
diff changeset
937 const TypeOopPtr* as_instance_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
938
306
af945ba2e739 6741738: TypePtr::add_offset() set incorrect offset when the add overflows
kvn
parents: 235
diff changeset
939 virtual const TypePtr *add_offset( intptr_t offset ) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
940 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
941 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
944 static const TypeKlassPtr* OBJECT; // Not-null object klass or below
a61af66fc99e Initial load
duke
parents:
diff changeset
945 static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same
a61af66fc99e Initial load
duke
parents:
diff changeset
946 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
947 virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
a61af66fc99e Initial load
duke
parents:
diff changeset
948 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
949 };
a61af66fc99e Initial load
duke
parents:
diff changeset
950
163
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
951 //------------------------------TypeNarrowOop----------------------------------
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
952 // 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
953 // 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
954 // 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
955 // 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
956 // 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
957 class TypeNarrowOop : public Type {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
958 protected:
827
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
959 const TypePtr* _ptrtype; // Could be TypePtr::NULL_PTR
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
960
827
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
961 TypeNarrowOop( const TypePtr* ptrtype): Type(NarrowOop),
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
962 _ptrtype(ptrtype) {
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
963 assert(ptrtype->offset() == 0 ||
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
964 ptrtype->offset() == OffsetBot ||
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
965 ptrtype->offset() == OffsetTop, "no real offsets");
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
966 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
967 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
968 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
969 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
970 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
971
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
972 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
973 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
974
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
975 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
976
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
977 // 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
978 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
979
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
980 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
981
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
982 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
983
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
984 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
985 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
986 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
987
221
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
988 // returns the equivalent ptr type for this compressed pointer
827
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
989 const TypePtr *get_ptrtype() const {
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
990 return _ptrtype;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
991 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
992
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
993 static const TypeNarrowOop *BOTTOM;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
994 static const TypeNarrowOop *NULL_PTR;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
995
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
996 #ifndef PRODUCT
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
997 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
998 #endif
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
999 };
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
1000
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 //------------------------------TypeFunc---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 // Class of Array Types
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 class TypeFunc : public Type {
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 TypeFunc( const TypeTuple *domain, const TypeTuple *range ) : Type(Function), _domain(domain), _range(range) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 virtual bool eq( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 virtual int hash() const; // Type specific hashing
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 virtual bool singleton(void) const; // TRUE if type is a singleton
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 virtual bool empty(void) const; // TRUE if type is vacuous
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // Constants are shared among ADLC and VM
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 enum { Control = AdlcVMDeps::Control,
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 I_O = AdlcVMDeps::I_O,
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 Memory = AdlcVMDeps::Memory,
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 FramePtr = AdlcVMDeps::FramePtr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 ReturnAdr = AdlcVMDeps::ReturnAdr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 Parms = AdlcVMDeps::Parms
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 const TypeTuple* const _domain; // Domain of inputs
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 const TypeTuple* const _range; // Range of results
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // Accessors:
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 const TypeTuple* domain() const { return _domain; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 const TypeTuple* range() const { return _range; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1025
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 static const TypeFunc *make(ciMethod* method);
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 static const TypeFunc *make(ciSignature signature, const Type* extra);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 static const TypeFunc *make(const TypeTuple* domain, const TypeTuple* range);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 virtual const Type *xmeet( const Type *t ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 virtual const Type *xdual() const; // Compute dual right now.
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 BasicType return_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1034
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 virtual void dump2( Dict &d, uint depth, outputStream *st ) const; // Specialized per-Type dumping
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 void print_flattened() const; // Print a 'flattened' signature
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // Convenience common pre-built types.
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 //------------------------------accessors--------------------------------------
163
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
1043 inline bool Type::is_ptr_to_narrowoop() const {
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
1044 #ifdef _LP64
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
1045 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
1046 #else
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
1047 return false;
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
1048 #endif
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
1049 }
885ed790ecf0 6695810: null oop passed to encode_heap_oop_not_null
kvn
parents: 145
diff changeset
1050
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 inline float Type::getf() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 assert( _base == FloatCon, "Not a FloatCon" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 return ((TypeF*)this)->_f;
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1055
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 inline double Type::getd() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 assert( _base == DoubleCon, "Not a DoubleCon" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 return ((TypeD*)this)->_d;
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 inline const TypeF *Type::is_float_constant() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 assert( _base == FloatCon, "Not a Float" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 return (TypeF*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 inline const TypeF *Type::isa_float_constant() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 return ( _base == FloatCon ? (TypeF*)this : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1069
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 inline const TypeD *Type::is_double_constant() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 assert( _base == DoubleCon, "Not a Double" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 return (TypeD*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 inline const TypeD *Type::isa_double_constant() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 return ( _base == DoubleCon ? (TypeD*)this : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 inline const TypeInt *Type::is_int() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 assert( _base == Int, "Not an Int" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 return (TypeInt*)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 TypeInt *Type::isa_int() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 return ( _base == Int ? (TypeInt*)this : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1087
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 inline const TypeLong *Type::is_long() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 assert( _base == Long, "Not a Long" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 return (TypeLong*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 inline const TypeLong *Type::isa_long() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 return ( _base == Long ? (TypeLong*)this : NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1096
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 inline const TypeTuple *Type::is_tuple() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 assert( _base == Tuple, "Not a Tuple" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 return (TypeTuple*)this;
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 TypeAry *Type::is_ary() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 assert( _base == Array , "Not an Array" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 return (TypeAry*)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 TypePtr *Type::is_ptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 assert(_base >= AnyPtr && _base <= KlassPtr, "Not a pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 return (TypePtr*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1112
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 inline const TypePtr *Type::isa_ptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 // AnyPtr is the first Ptr and KlassPtr the last, with no non-ptrs between.
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 return (_base >= AnyPtr && _base <= KlassPtr) ? (TypePtr*)this : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 inline const TypeOopPtr *Type::is_oopptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // OopPtr is the first and KlassPtr the last, with no non-oops between.
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 assert(_base >= OopPtr && _base <= KlassPtr, "Not a Java pointer" ) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 return (TypeOopPtr*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1123
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 inline const TypeOopPtr *Type::isa_oopptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // OopPtr is the first and KlassPtr the last, with no non-oops between.
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 return (_base >= OopPtr && _base <= KlassPtr) ? (TypeOopPtr*)this : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
1129 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
1130 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
1131 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
1132
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 inline const TypeRawPtr *Type::is_rawptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 assert( _base == RawPtr, "Not a raw pointer" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 return (TypeRawPtr*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1137
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 inline const TypeInstPtr *Type::isa_instptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 return (_base == InstPtr) ? (TypeInstPtr*)this : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 inline const TypeInstPtr *Type::is_instptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 assert( _base == InstPtr, "Not an object pointer" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 return (TypeInstPtr*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1146
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 inline const TypeAryPtr *Type::isa_aryptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 return (_base == AryPtr) ? (TypeAryPtr*)this : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1150
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 inline const TypeAryPtr *Type::is_aryptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 assert( _base == AryPtr, "Not an array pointer" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 return (TypeAryPtr*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1155
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
1156 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
1157 // 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
1158 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
1159 return (TypeNarrowOop*)this;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
1160 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
1161
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
1162 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
1163 // 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
1164 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
1165 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 64
diff changeset
1166
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 inline const TypeKlassPtr *Type::isa_klassptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 return (_base == KlassPtr) ? (TypeKlassPtr*)this : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1170
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 inline const TypeKlassPtr *Type::is_klassptr() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 assert( _base == KlassPtr, "Not a klass pointer" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 return (TypeKlassPtr*)this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
221
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
1176 inline const TypePtr* Type::make_ptr() const {
827
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
1177 return (_base == NarrowOop) ? is_narrowoop()->get_ptrtype() :
221
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
1178 (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
1179 }
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
1180
827
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
1181 inline const TypeOopPtr* Type::make_oopptr() const {
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
1182 return (_base == NarrowOop) ? is_narrowoop()->get_ptrtype()->is_oopptr() : is_oopptr();
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
1183 }
bf3489cc0aa0 6856025: assert(_base >= OopPtr && _base <= KlassPtr,"Not a Java pointer")
never
parents: 820
diff changeset
1184
221
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
1185 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
1186 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
1187 (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
1188 }
1e026f8da827 6710487: More than half of JDI Regression tests hang with COOPs in -Xcomp mode
kvn
parents: 163
diff changeset
1189
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 inline bool Type::is_floatingpoint() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 if( (_base == FloatCon) || (_base == FloatBot) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 (_base == DoubleCon) || (_base == DoubleBot) )
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
a61af66fc99e Initial load
duke
parents:
diff changeset
1197
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 // ===============================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 // Things that need to be 64-bits in the 64-bit build but
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 // 32-bits in the 32-bit build. Done this way to get full
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 // optimization AND strong typing.
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 // For type queries and asserts
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 #define is_intptr_t is_long
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 #define isa_intptr_t isa_long
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 #define find_intptr_t_type find_long_type
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 #define find_intptr_t_con find_long_con
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 #define TypeX TypeLong
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 #define Type_X Type::Long
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 #define TypeX_X TypeLong::LONG
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 #define TypeX_ZERO TypeLong::ZERO
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // For 'ideal_reg' machine registers
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 #define Op_RegX Op_RegL
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 // For phase->intcon variants
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 #define MakeConX longcon
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 #define ConXNode ConLNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // For array index arithmetic
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 #define MulXNode MulLNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 #define AndXNode AndLNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 #define OrXNode OrLNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 #define CmpXNode CmpLNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 #define SubXNode SubLNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 #define LShiftXNode LShiftLNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // For object size computation:
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 #define AddXNode AddLNode
17
ff5961f4c095 6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents: 0
diff changeset
1227 #define RShiftXNode RShiftLNode
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // For card marks and hashcodes
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 #define URShiftXNode URShiftLNode
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
1230 // UseOptoBiasInlining
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
1231 #define XorXNode XorLNode
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
1232 #define StoreXConditionalNode StoreLConditionalNode
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // Opcodes
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 #define Op_LShiftX Op_LShiftL
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 #define Op_AndX Op_AndL
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 #define Op_AddX Op_AddL
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 #define Op_SubX Op_SubL
851
fc4be448891f 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 827
diff changeset
1238 #define Op_XorX Op_XorL
fc4be448891f 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 827
diff changeset
1239 #define Op_URShiftX Op_URShiftL
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // conversions
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 #define ConvI2X(x) ConvI2L(x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 #define ConvL2X(x) (x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 #define ConvX2I(x) ConvL2I(x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 #define ConvX2L(x) (x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1245
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 // For type queries and asserts
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 #define is_intptr_t is_int
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 #define isa_intptr_t isa_int
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 #define find_intptr_t_type find_int_type
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 #define find_intptr_t_con find_int_con
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 #define TypeX TypeInt
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 #define Type_X Type::Int
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 #define TypeX_X TypeInt::INT
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 #define TypeX_ZERO TypeInt::ZERO
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 // For 'ideal_reg' machine registers
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 #define Op_RegX Op_RegI
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 // For phase->intcon variants
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 #define MakeConX intcon
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 #define ConXNode ConINode
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 // For array index arithmetic
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 #define MulXNode MulINode
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 #define AndXNode AndINode
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 #define OrXNode OrINode
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 #define CmpXNode CmpINode
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 #define SubXNode SubINode
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 #define LShiftXNode LShiftINode
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 // For object size computation:
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 #define AddXNode AddINode
17
ff5961f4c095 6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents: 0
diff changeset
1271 #define RShiftXNode RShiftINode
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 // For card marks and hashcodes
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 #define URShiftXNode URShiftINode
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
1274 // UseOptoBiasInlining
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
1275 #define XorXNode XorINode
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
1276 #define StoreXConditionalNode StoreIConditionalNode
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 // Opcodes
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 #define Op_LShiftX Op_LShiftI
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 #define Op_AndX Op_AndI
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 #define Op_AddX Op_AddI
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 #define Op_SubX Op_SubI
851
fc4be448891f 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 827
diff changeset
1282 #define Op_XorX Op_XorI
fc4be448891f 6851742: (EA) allocation elimination doesn't work with UseG1GC
kvn
parents: 827
diff changeset
1283 #define Op_URShiftX Op_URShiftI
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 // conversions
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 #define ConvI2X(x) (x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 #define ConvL2X(x) ConvL2I(x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 #define ConvX2I(x) (x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 #define ConvX2L(x) ConvI2L(x)
a61af66fc99e Initial load
duke
parents:
diff changeset
1289
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 #endif