annotate src/share/vm/opto/type.hpp @ 10185:d50cc62e94ff

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