annotate src/share/vm/opto/type.hpp @ 4710:41406797186b

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