annotate src/share/vm/opto/type.hpp @ 1721:413ad0331a0c

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