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

6722113: CMS: Incorrect overflow handling during precleaning of Reference lists Summary: When we encounter marking stack overflow during precleaning of Reference lists, we were using the overflow list mechanism, which can cause problems on account of mutating the mark word of the header because of conflicts with mutator accesses and updates of that field. Instead we should use the usual mechanism for overflow handling in concurrent phases, namely dirtying of the card on which the overflowed object lies. Since precleaning effectively does a form of discovered list processing, albeit with discovery enabled, we needed to adjust some code to be correct in the face of interleaved processing and discovery. Reviewed-by: apetrusenko, jcoomes
author ysr
date Thu, 20 Nov 2008 12:27:41 -0800
parents a1980da045cc
children 424f9bfe6b96
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 168
diff changeset
2 * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // Portions of code courtesy of Clifford Click
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // Optimization - Graph Style
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class Chaitin;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 class NamedCounter;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class MultiNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class SafePointNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class CallNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class CallJavaNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class CallStaticJavaNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class CallDynamicJavaNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class CallRuntimeNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class CallLeafNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class CallLeafNoFPNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class AllocateNode;
33
3288958bf319 6667580: Optimize CmpP for allocations
kvn
parents: 0
diff changeset
41 class AllocateArrayNode;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class LockNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class UnlockNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class JVMState;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class OopMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class State;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class StartNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class MachCallNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class FastLockNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 //------------------------------StartNode--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // The method start node
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class StartNode : public MultiNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
56 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
57 const TypeTuple *_domain;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 StartNode( Node *root, const TypeTuple *domain ) : MultiNode(2), _domain(domain) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 init_class_id(Class_Start);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 init_flags(Flag_is_block_start);
a61af66fc99e Initial load
duke
parents:
diff changeset
61 init_req(0,this);
a61af66fc99e Initial load
duke
parents:
diff changeset
62 init_req(1,root);
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 virtual bool pinned() const { return true; };
a61af66fc99e Initial load
duke
parents:
diff changeset
66 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 virtual const TypePtr *adr_type() const { return TypePtr::BOTTOM; }
a61af66fc99e Initial load
duke
parents:
diff changeset
68 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_reg, uint length ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 virtual Node *match( const ProjNode *proj, const Matcher *m );
a61af66fc99e Initial load
duke
parents:
diff changeset
73 virtual uint ideal_reg() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
75 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
77 };
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 //------------------------------StartOSRNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // The method start node for on stack replacement code
a61af66fc99e Initial load
duke
parents:
diff changeset
81 class StartOSRNode : public StartNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
83 StartOSRNode( Node *root, const TypeTuple *domain ) : StartNode(root, domain) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
84 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 static const TypeTuple *osr_domain();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 };
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 //------------------------------ParmNode---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Incoming parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
91 class ParmNode : public ProjNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 static const char * const names[TypeFunc::Parms+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
93 public:
33
3288958bf319 6667580: Optimize CmpP for allocations
kvn
parents: 0
diff changeset
94 ParmNode( StartNode *src, uint con ) : ProjNode(src,con) {
3288958bf319 6667580: Optimize CmpP for allocations
kvn
parents: 0
diff changeset
95 init_class_id(Class_Parm);
3288958bf319 6667580: Optimize CmpP for allocations
kvn
parents: 0
diff changeset
96 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 virtual bool is_CFG() const { return (_con == TypeFunc::Control); }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 virtual uint ideal_reg() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
101 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
103 };
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 //------------------------------ReturnNode-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // Return from subroutine node
a61af66fc99e Initial load
duke
parents:
diff changeset
108 class ReturnNode : public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
110 ReturnNode( uint edges, Node *cntrl, Node *i_o, Node *memory, Node *retadr, Node *frameptr );
a61af66fc99e Initial load
duke
parents:
diff changeset
111 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 virtual bool is_CFG() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
113 virtual uint hash() const { return NO_HASH; } // CFG nodes do not hash
a61af66fc99e Initial load
duke
parents:
diff changeset
114 virtual bool depends_only_on_test() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
120 virtual void dump_req() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
122 };
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 //------------------------------RethrowNode------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // Rethrow of exception at call site. Ends a procedure before rethrowing;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // ends the current basic block like a ReturnNode. Restores registers and
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // unwinds stack. Rethrow happens in the caller's method.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 class RethrowNode : public Node {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 RethrowNode( Node *cntrl, Node *i_o, Node *memory, Node *frameptr, Node *ret_adr, Node *exception );
a61af66fc99e Initial load
duke
parents:
diff changeset
132 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 virtual bool is_CFG() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 virtual uint hash() const { return NO_HASH; } // CFG nodes do not hash
a61af66fc99e Initial load
duke
parents:
diff changeset
135 virtual bool depends_only_on_test() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
140 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
141 virtual void dump_req() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
143 };
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 //------------------------------TailCallNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Pop stack frame and jump indirect
a61af66fc99e Initial load
duke
parents:
diff changeset
148 class TailCallNode : public ReturnNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
150 TailCallNode( Node *cntrl, Node *i_o, Node *memory, Node *frameptr, Node *retadr, Node *target, Node *moop )
a61af66fc99e Initial load
duke
parents:
diff changeset
151 : ReturnNode( TypeFunc::Parms+2, cntrl, i_o, memory, frameptr, retadr ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 init_req(TypeFunc::Parms, target);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 init_req(TypeFunc::Parms+1, moop);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 };
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 //------------------------------TailJumpNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Pop stack frame and jump indirect
a61af66fc99e Initial load
duke
parents:
diff changeset
162 class TailJumpNode : public ReturnNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
164 TailJumpNode( Node *cntrl, Node *i_o, Node *memory, Node *frameptr, Node *target, Node *ex_oop)
a61af66fc99e Initial load
duke
parents:
diff changeset
165 : ReturnNode(TypeFunc::Parms+2, cntrl, i_o, memory, frameptr, Compile::current()->top()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 init_req(TypeFunc::Parms, target);
a61af66fc99e Initial load
duke
parents:
diff changeset
167 init_req(TypeFunc::Parms+1, ex_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
171 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 };
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 //-------------------------------JVMState-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // A linked list of JVMState nodes captures the whole interpreter state,
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // plus GC roots, for all active calls at some call site in this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // unit. (If there is no inlining, then the list has exactly one link.)
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // This provides a way to map the optimized program back into the interpreter,
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // or to let the GC mark the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
180 class JVMState : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
182 JVMState* _caller; // List pointer for forming scope chains
a61af66fc99e Initial load
duke
parents:
diff changeset
183 uint _depth; // One mroe than caller depth, or one.
a61af66fc99e Initial load
duke
parents:
diff changeset
184 uint _locoff; // Offset to locals in input edge mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
185 uint _stkoff; // Offset to stack in input edge mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
186 uint _monoff; // Offset to monitors in input edge mapping
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
187 uint _scloff; // Offset to fields of scalar objs in input edge mapping
0
a61af66fc99e Initial load
duke
parents:
diff changeset
188 uint _endoff; // Offset to end of input edge mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
189 uint _sp; // Jave Expression Stack Pointer for this state
a61af66fc99e Initial load
duke
parents:
diff changeset
190 int _bci; // Byte Code Index of this JVM point
a61af66fc99e Initial load
duke
parents:
diff changeset
191 ciMethod* _method; // Method Pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
192 SafePointNode* _map; // Map node associated with this scope
a61af66fc99e Initial load
duke
parents:
diff changeset
193 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
194 friend class Compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // Because JVMState objects live over the entire lifetime of the
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // Compile object, they are allocated into the comp_arena, which
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // does not get resource marked or reset during the compile process
a61af66fc99e Initial load
duke
parents:
diff changeset
199 void *operator new( size_t x, Compile* C ) { return C->comp_arena()->Amalloc(x); }
a61af66fc99e Initial load
duke
parents:
diff changeset
200 void operator delete( void * ) { } // fast deallocation
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // Create a new JVMState, ready for abstract interpretation.
a61af66fc99e Initial load
duke
parents:
diff changeset
203 JVMState(ciMethod* method, JVMState* caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 JVMState(int stack_size); // root state; has a null method
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Access functions for the JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
207 uint locoff() const { return _locoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 uint stkoff() const { return _stkoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 uint argoff() const { return _stkoff + _sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 uint monoff() const { return _monoff; }
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
211 uint scloff() const { return _scloff; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
212 uint endoff() const { return _endoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 uint oopoff() const { return debug_end(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 int loc_size() const { return _stkoff - _locoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 int stk_size() const { return _monoff - _stkoff; }
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
217 int mon_size() const { return _scloff - _monoff; }
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
218 int scl_size() const { return _endoff - _scloff; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 bool is_loc(uint i) const { return i >= _locoff && i < _stkoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 bool is_stk(uint i) const { return i >= _stkoff && i < _monoff; }
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
222 bool is_mon(uint i) const { return i >= _monoff && i < _scloff; }
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
223 bool is_scl(uint i) const { return i >= _scloff && i < _endoff; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 uint sp() const { return _sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 int bci() const { return _bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 bool has_method() const { return _method != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
228 ciMethod* method() const { assert(has_method(), ""); return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 JVMState* caller() const { return _caller; }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 SafePointNode* map() const { return _map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 uint depth() const { return _depth; }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 uint debug_start() const; // returns locoff of root caller
a61af66fc99e Initial load
duke
parents:
diff changeset
233 uint debug_end() const; // returns endoff of self
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
234 uint debug_size() const {
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
235 return loc_size() + sp() + mon_size() + scl_size();
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
236 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
237 uint debug_depth() const; // returns sum of debug_size values at all depths
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // Returns the JVM state at the desired depth (1 == root).
a61af66fc99e Initial load
duke
parents:
diff changeset
240 JVMState* of_depth(int d) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Tells if two JVM states have the same call chain (depth, methods, & bcis).
a61af66fc99e Initial load
duke
parents:
diff changeset
243 bool same_calls_as(const JVMState* that) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Monitors (monitors are stored as (boxNode, objNode) pairs
a61af66fc99e Initial load
duke
parents:
diff changeset
246 enum { logMonitorEdges = 1 };
a61af66fc99e Initial load
duke
parents:
diff changeset
247 int nof_monitors() const { return mon_size() >> logMonitorEdges; }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 int monitor_depth() const { return nof_monitors() + (caller() ? caller()->monitor_depth() : 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 int monitor_box_offset(int idx) const { return monoff() + (idx << logMonitorEdges) + 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 int monitor_obj_offset(int idx) const { return monoff() + (idx << logMonitorEdges) + 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 bool is_monitor_box(uint off) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 assert(is_mon(off), "should be called only for monitor edge");
a61af66fc99e Initial load
duke
parents:
diff changeset
253 return (0 == bitfield(off - monoff(), 0, logMonitorEdges));
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 bool is_monitor_use(uint off) const { return (is_mon(off)
a61af66fc99e Initial load
duke
parents:
diff changeset
256 && is_monitor_box(off))
a61af66fc99e Initial load
duke
parents:
diff changeset
257 || (caller() && caller()->is_monitor_use(off)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // Initialization functions for the JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void set_locoff(uint off) { _locoff = off; }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 void set_stkoff(uint off) { _stkoff = off; }
a61af66fc99e Initial load
duke
parents:
diff changeset
262 void set_monoff(uint off) { _monoff = off; }
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
263 void set_scloff(uint off) { _scloff = off; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 void set_endoff(uint off) { _endoff = off; }
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
265 void set_offsets(uint off) {
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
266 _locoff = _stkoff = _monoff = _scloff = _endoff = off;
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
267 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
268 void set_map(SafePointNode *map) { _map = map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
269 void set_sp(uint sp) { _sp = sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 void set_bci(int bci) { _bci = bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // Miscellaneous utility functions
a61af66fc99e Initial load
duke
parents:
diff changeset
273 JVMState* clone_deep(Compile* C) const; // recursively clones caller chain
a61af66fc99e Initial load
duke
parents:
diff changeset
274 JVMState* clone_shallow(Compile* C) const; // retains uncloned caller
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void format(PhaseRegAlloc *regalloc, const Node *n, outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 void dump_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void dump() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 dump_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
284 };
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 //------------------------------SafePointNode----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // A SafePointNode is a subclass of a MultiNode for convenience (and
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // potential code sharing) only - conceptually it is independent of
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // the Node semantics.
a61af66fc99e Initial load
duke
parents:
diff changeset
290 class SafePointNode : public MultiNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
295 SafePointNode(uint edges, JVMState* jvms,
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // A plain safepoint advertises no memory effects (NULL):
a61af66fc99e Initial load
duke
parents:
diff changeset
297 const TypePtr* adr_type = NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
298 : MultiNode( edges ),
a61af66fc99e Initial load
duke
parents:
diff changeset
299 _jvms(jvms),
a61af66fc99e Initial load
duke
parents:
diff changeset
300 _oop_map(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
301 _adr_type(adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
302 {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 init_class_id(Class_SafePoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
307 JVMState* const _jvms; // Pointer to list of JVM State objects
a61af66fc99e Initial load
duke
parents:
diff changeset
308 const TypePtr* _adr_type; // What type of memory does this node produce?
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // Many calls take *all* of memory as input,
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // but some produce a limited subset of that memory as output.
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // The adr_type reports the call's behavior as a store, not a load.
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 virtual JVMState* jvms() const { return _jvms; }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 void set_jvms(JVMState* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 *(JVMState**)&_jvms = s; // override const attribute in the accessor
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318 OopMap *oop_map() const { return _oop_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 void set_oop_map(OopMap *om) { _oop_map = om; }
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // Functionality from old debug nodes which has changed
a61af66fc99e Initial load
duke
parents:
diff changeset
322 Node *local(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
324 return in(jvms->locoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 Node *stack(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
328 return in(jvms->stkoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 Node *argument(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
332 return in(jvms->argoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 Node *monitor_box(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
336 return in(jvms->monitor_box_offset(idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 Node *monitor_obj(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
340 return in(jvms->monitor_obj_offset(idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 void set_local(JVMState* jvms, uint idx, Node *c);
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 void set_stack(JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
347 set_req(jvms->stkoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
349 void set_argument(JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
351 set_req(jvms->argoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353 void ensure_stack(JVMState* jvms, uint stk_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
354 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
355 int grow_by = (int)stk_size - (int)jvms->stk_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
356 if (grow_by > 0) grow_stack(jvms, grow_by);
a61af66fc99e Initial load
duke
parents:
diff changeset
357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
358 void grow_stack(JVMState* jvms, uint grow_by);
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // Handle monitor stack
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void push_monitor( const FastLockNode *lock );
a61af66fc99e Initial load
duke
parents:
diff changeset
361 void pop_monitor ();
a61af66fc99e Initial load
duke
parents:
diff changeset
362 Node *peek_monitor_box() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
363 Node *peek_monitor_obj() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Access functions for the JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
366 Node *control () const { return in(TypeFunc::Control ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
367 Node *i_o () const { return in(TypeFunc::I_O ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 Node *memory () const { return in(TypeFunc::Memory ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 Node *returnadr() const { return in(TypeFunc::ReturnAdr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
370 Node *frameptr () const { return in(TypeFunc::FramePtr ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 void set_control ( Node *c ) { set_req(TypeFunc::Control,c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
373 void set_i_o ( Node *c ) { set_req(TypeFunc::I_O ,c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
374 void set_memory ( Node *c ) { set_req(TypeFunc::Memory ,c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 MergeMemNode* merged_memory() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 return in(TypeFunc::Memory)->as_MergeMem();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // The parser marks useless maps as dead when it's done with them:
a61af66fc99e Initial load
duke
parents:
diff changeset
381 bool is_killed() { return in(TypeFunc::Control) == NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // Exception states bubbling out of subgraphs such as inlined calls
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // are recorded here. (There might be more than one, hence the "next".)
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // This feature is used only for safepoints which serve as "maps"
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // for JVM states during parsing, intrinsic expansion, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
387 SafePointNode* next_exception() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 void set_next_exception(SafePointNode* n);
a61af66fc99e Initial load
duke
parents:
diff changeset
389 bool has_exceptions() const { return next_exception() != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // Standard Node stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
392 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
393 virtual bool pinned() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
394 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 virtual const Type *bottom_type() const { return Type::CONTROL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 virtual const TypePtr *adr_type() const { return _adr_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 virtual Node *Identity( PhaseTransform *phase );
a61af66fc99e Initial load
duke
parents:
diff changeset
399 virtual uint ideal_reg() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
401 virtual const RegMask &out_RegMask() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
402 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 static bool needs_polling_address_input();
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
407 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
409 };
a61af66fc99e Initial load
duke
parents:
diff changeset
410
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
411 //------------------------------SafePointScalarObjectNode----------------------
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
412 // A SafePointScalarObjectNode represents the state of a scalarized object
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
413 // at a safepoint.
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
414
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
415 class SafePointScalarObjectNode: public TypeNode {
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
416 uint _first_index; // First input edge index of a SafePoint node where
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
417 // states of the scalarized object fields are collected.
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
418 uint _n_fields; // Number of non-static fields of the scalarized object.
74
2a9af0b9cb1c 6674600: (Escape Analysis) Optimize memory graph for instance's fields
kvn
parents: 65
diff changeset
419 DEBUG_ONLY(AllocateNode* _alloc;)
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
420 public:
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
421 SafePointScalarObjectNode(const TypeOopPtr* tp,
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
422 #ifdef ASSERT
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
423 AllocateNode* alloc,
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
424 #endif
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
425 uint first_index, uint n_fields);
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
426 virtual int Opcode() const;
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
427 virtual uint ideal_reg() const;
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
428 virtual const RegMask &in_RegMask(uint) const;
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
429 virtual const RegMask &out_RegMask() const;
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
430 virtual uint match_edge(uint idx) const;
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
431
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
432 uint first_index() const { return _first_index; }
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
433 uint n_fields() const { return _n_fields; }
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
434 DEBUG_ONLY(AllocateNode* alloc() const { return _alloc; })
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
435
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
436 // SafePointScalarObject should be always pinned to the control edge
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
437 // of the SafePoint node for which it was generated.
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
438 virtual bool pinned() const; // { return true; }
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
439
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
440 virtual uint size_of() const { return sizeof(*this); }
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
441
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
442 // Assumes that "this" is an argument to a safepoint node "s", and that
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
443 // "new_call" is being created to correspond to "s". But the difference
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
444 // between the start index of the jvmstates of "new_call" and "s" is
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
445 // "jvms_adj". Produce and return a SafePointScalarObjectNode that
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
446 // corresponds appropriately to "this" in "new_call". Assumes that
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
447 // "sosn_map" is a map, specific to the translation of "s" to "new_call",
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
448 // mapping old SafePointScalarObjectNodes to new, to avoid multiple copies.
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
449 SafePointScalarObjectNode* clone(int jvms_adj, Dict* sosn_map) const;
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
450
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
451 #ifndef PRODUCT
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
452 virtual void dump_spec(outputStream *st) const;
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
453 #endif
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
454 };
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
455
0
a61af66fc99e Initial load
duke
parents:
diff changeset
456 //------------------------------CallNode---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Call nodes now subsume the function of debug nodes at callsites, so they
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // contain the functionality of a full scope chain of debug nodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
459 class CallNode : public SafePointNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
461 const TypeFunc *_tf; // Function type
a61af66fc99e Initial load
duke
parents:
diff changeset
462 address _entry_point; // Address of method being called
a61af66fc99e Initial load
duke
parents:
diff changeset
463 float _cnt; // Estimate of number of times called
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
466 : SafePointNode(tf->domain()->cnt(), NULL, adr_type),
a61af66fc99e Initial load
duke
parents:
diff changeset
467 _tf(tf),
a61af66fc99e Initial load
duke
parents:
diff changeset
468 _entry_point(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
469 _cnt(COUNT_UNKNOWN)
a61af66fc99e Initial load
duke
parents:
diff changeset
470 {
a61af66fc99e Initial load
duke
parents:
diff changeset
471 init_class_id(Class_Call);
a61af66fc99e Initial load
duke
parents:
diff changeset
472 init_flags(Flag_is_Call);
a61af66fc99e Initial load
duke
parents:
diff changeset
473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 const TypeFunc* tf() const { return _tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
476 const address entry_point() const { return _entry_point; }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 const float cnt() const { return _cnt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 void set_tf(const TypeFunc* tf) { _tf = tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
480 void set_entry_point(address p) { _entry_point = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
481 void set_cnt(float c) { _cnt = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
484 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
485 virtual Node *Identity( PhaseTransform *phase ) { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
486 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 virtual uint size_of() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 virtual Node *match( const ProjNode *proj, const Matcher *m );
a61af66fc99e Initial load
duke
parents:
diff changeset
490 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // Are we guaranteed that this node is a safepoint? Not true for leaf calls and
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // for some macro nodes whose expansion does not have a safepoint on the fast path.
a61af66fc99e Initial load
duke
parents:
diff changeset
493 virtual bool guaranteed_safepoint() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // For macro nodes, the JVMState gets modified during expansion, so when cloning
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // the node the JVMState must be cloned.
a61af66fc99e Initial load
duke
parents:
diff changeset
496 virtual void clone_jvms() { } // default is not to clone
a61af66fc99e Initial load
duke
parents:
diff changeset
497
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
498 // Returns true if the call may modify n
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
499 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase);
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
500 // Does this node have a use of n other than in debug information?
168
7793bd37a336 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 113
diff changeset
501 bool has_non_debug_use(Node *n);
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
502 // Returns the unique CheckCastPP of a call
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
503 // or result projection is there are several CheckCastPP
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
504 // or returns NULL if there is no one.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
505 Node *result_cast();
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
506
0
a61af66fc99e Initial load
duke
parents:
diff changeset
507 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
510 virtual void dump_req() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
511 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
512 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
513 };
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 //------------------------------CallJavaNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // Make a static or dynamic subroutine call node using Java calling
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // convention. (The "Java" calling convention is the compiler's calling
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // convention, as opposed to the interpreter's or that of native C.)
a61af66fc99e Initial load
duke
parents:
diff changeset
519 class CallJavaNode : public CallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
521 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 bool _optimized_virtual;
a61af66fc99e Initial load
duke
parents:
diff changeset
525 ciMethod* _method; // Method being direct called
a61af66fc99e Initial load
duke
parents:
diff changeset
526 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
527 const int _bci; // Byte Code Index of call byte code
a61af66fc99e Initial load
duke
parents:
diff changeset
528 CallJavaNode(const TypeFunc* tf , address addr, ciMethod* method, int bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
529 : CallNode(tf, addr, TypePtr::BOTTOM),
a61af66fc99e Initial load
duke
parents:
diff changeset
530 _method(method), _bci(bci), _optimized_virtual(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
531 {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 init_class_id(Class_CallJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 ciMethod* method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
537 void set_method(ciMethod *m) { _method = m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
538 void set_optimized_virtual(bool f) { _optimized_virtual = f; }
a61af66fc99e Initial load
duke
parents:
diff changeset
539 bool is_optimized_virtual() const { return _optimized_virtual; }
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
542 virtual void dump_spec(outputStream *st) const;
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 //------------------------------CallStaticJavaNode-----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // Make a direct subroutine call using Java calling convention (for static
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // calls and optimized virtual calls, plus calls to wrappers for run-time
a61af66fc99e Initial load
duke
parents:
diff changeset
549 // routines); generates static stub.
a61af66fc99e Initial load
duke
parents:
diff changeset
550 class CallStaticJavaNode : public CallJavaNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
551 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
553 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
554 CallStaticJavaNode(const TypeFunc* tf, address addr, ciMethod* method, int bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
555 : CallJavaNode(tf, addr, method, bci), _name(NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
556 init_class_id(Class_CallStaticJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
557 }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 CallStaticJavaNode(const TypeFunc* tf, address addr, const char* name, int bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
559 const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
560 : CallJavaNode(tf, addr, NULL, bci), _name(name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
561 init_class_id(Class_CallStaticJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // This node calls a runtime stub, which often has narrow memory effects.
a61af66fc99e Initial load
duke
parents:
diff changeset
563 _adr_type = adr_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565 const char *_name; // Runtime wrapper name
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // If this is an uncommon trap, return the request code, else zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
568 int uncommon_trap_request() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
569 static int extract_uncommon_trap_request(const Node* call);
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
572 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
573 virtual void dump_spec(outputStream *st) const;
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 //------------------------------CallDynamicJavaNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // Make a dispatched call using Java calling convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
579 class CallDynamicJavaNode : public CallJavaNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
581 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
582 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
583 CallDynamicJavaNode( const TypeFunc *tf , address addr, ciMethod* method, int vtable_index, int bci ) : CallJavaNode(tf,addr,method,bci), _vtable_index(vtable_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 init_class_id(Class_CallDynamicJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 }
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 int _vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
589 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
590 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
591 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
592 };
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 //------------------------------CallRuntimeNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // Make a direct subroutine call node into compiled C++ code.
a61af66fc99e Initial load
duke
parents:
diff changeset
596 class CallRuntimeNode : public CallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
597 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
598 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
599 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
600 CallRuntimeNode(const TypeFunc* tf, address addr, const char* name,
a61af66fc99e Initial load
duke
parents:
diff changeset
601 const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
602 : CallNode(tf, addr, adr_type),
a61af66fc99e Initial load
duke
parents:
diff changeset
603 _name(name)
a61af66fc99e Initial load
duke
parents:
diff changeset
604 {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 init_class_id(Class_CallRuntime);
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 const char *_name; // Printable name, if _method is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
609 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
610 virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
613 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
614 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
615 };
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 //------------------------------CallLeafNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // Make a direct subroutine call node into compiled C++ code, without
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
620 class CallLeafNode : public CallRuntimeNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
621 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
622 CallLeafNode(const TypeFunc* tf, address addr, const char* name,
a61af66fc99e Initial load
duke
parents:
diff changeset
623 const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
624 : CallRuntimeNode(tf, addr, name, adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
625 {
a61af66fc99e Initial load
duke
parents:
diff changeset
626 init_class_id(Class_CallLeaf);
a61af66fc99e Initial load
duke
parents:
diff changeset
627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
628 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
629 virtual bool guaranteed_safepoint() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
630 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
631 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
632 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
633 };
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635 //------------------------------CallLeafNoFPNode-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // CallLeafNode, not using floating point or using it in the same manner as
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // the generated code
a61af66fc99e Initial load
duke
parents:
diff changeset
638 class CallLeafNoFPNode : public CallLeafNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
639 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
640 CallLeafNoFPNode(const TypeFunc* tf, address addr, const char* name,
a61af66fc99e Initial load
duke
parents:
diff changeset
641 const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
642 : CallLeafNode(tf, addr, name, adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
643 {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
645 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
646 };
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 //------------------------------Allocate---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // High-level memory allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
651 //
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // AllocateNode and AllocateArrayNode are subclasses of CallNode because they will
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // get expanded into a code sequence containing a call. Unlike other CallNodes,
a61af66fc99e Initial load
duke
parents:
diff changeset
654 // they have 2 memory projections and 2 i_o projections (which are distinguished by
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // the _is_io_use flag in the projection.) This is needed when expanding the node in
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // order to differentiate the uses of the projection on the normal control path from
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // those on the exception return path.
a61af66fc99e Initial load
duke
parents:
diff changeset
658 //
a61af66fc99e Initial load
duke
parents:
diff changeset
659 class AllocateNode : public CallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
661 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // Output:
a61af66fc99e Initial load
duke
parents:
diff changeset
663 RawAddress = TypeFunc::Parms, // the newly-allocated raw address
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // Inputs:
a61af66fc99e Initial load
duke
parents:
diff changeset
665 AllocSize = TypeFunc::Parms, // size (in bytes) of the new object
a61af66fc99e Initial load
duke
parents:
diff changeset
666 KlassNode, // type (maybe dynamic) of the obj.
a61af66fc99e Initial load
duke
parents:
diff changeset
667 InitialTest, // slow-path test (may be constant)
a61af66fc99e Initial load
duke
parents:
diff changeset
668 ALength, // array length (or TOP if none)
a61af66fc99e Initial load
duke
parents:
diff changeset
669 ParmLimit
a61af66fc99e Initial load
duke
parents:
diff changeset
670 };
a61af66fc99e Initial load
duke
parents:
diff changeset
671
a61af66fc99e Initial load
duke
parents:
diff changeset
672 static const TypeFunc* alloc_type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
673 const Type** fields = TypeTuple::fields(ParmLimit - TypeFunc::Parms);
a61af66fc99e Initial load
duke
parents:
diff changeset
674 fields[AllocSize] = TypeInt::POS;
a61af66fc99e Initial load
duke
parents:
diff changeset
675 fields[KlassNode] = TypeInstPtr::NOTNULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
676 fields[InitialTest] = TypeInt::BOOL;
a61af66fc99e Initial load
duke
parents:
diff changeset
677 fields[ALength] = TypeInt::INT; // length (can be a bad length)
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 const TypeTuple *domain = TypeTuple::make(ParmLimit, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
682 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
683 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
686
a61af66fc99e Initial load
duke
parents:
diff changeset
687 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
689
39
76256d272075 6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents: 33
diff changeset
690 bool _is_scalar_replaceable; // Result of Escape Analysis
76256d272075 6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents: 33
diff changeset
691
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
693 AllocateNode(Compile* C, const TypeFunc *atype, Node *ctrl, Node *mem, Node *abio,
a61af66fc99e Initial load
duke
parents:
diff changeset
694 Node *size, Node *klass_node, Node *initial_test);
a61af66fc99e Initial load
duke
parents:
diff changeset
695 // Expansion modifies the JVMState, so we need to clone it
a61af66fc99e Initial load
duke
parents:
diff changeset
696 virtual void clone_jvms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
697 set_jvms(jvms()->clone_deep(Compile::current()));
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
700 virtual uint ideal_reg() const { return Op_RegP; }
a61af66fc99e Initial load
duke
parents:
diff changeset
701 virtual bool guaranteed_safepoint() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
702
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
703 // allocations do not modify their arguments
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
704 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase) { return false;}
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
705
0
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // Pattern-match a possible usage of AllocateNode.
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // Return null if no allocation is recognized.
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // The operand is the pointer produced by the (possible) allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // It must be a projection of the Allocate or its subsequent CastPP.
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // (Note: This function is defined in file graphKit.cpp, near
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // GraphKit::new_instance/new_array, whose output it recognizes.)
a61af66fc99e Initial load
duke
parents:
diff changeset
712 // The 'ptr' may not have an offset unless the 'offset' argument is given.
a61af66fc99e Initial load
duke
parents:
diff changeset
713 static AllocateNode* Ideal_allocation(Node* ptr, PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
714
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // Fancy version which uses AddPNode::Ideal_base_and_offset to strip
a61af66fc99e Initial load
duke
parents:
diff changeset
716 // an offset, which is reported back to the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // (Note: AllocateNode::Ideal_allocation is defined in graphKit.cpp.)
a61af66fc99e Initial load
duke
parents:
diff changeset
718 static AllocateNode* Ideal_allocation(Node* ptr, PhaseTransform* phase,
a61af66fc99e Initial load
duke
parents:
diff changeset
719 intptr_t& offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // Dig the klass operand out of a (possible) allocation site.
a61af66fc99e Initial load
duke
parents:
diff changeset
722 static Node* Ideal_klass(Node* ptr, PhaseTransform* phase) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 AllocateNode* allo = Ideal_allocation(ptr, phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 return (allo == NULL) ? NULL : allo->in(KlassNode);
a61af66fc99e Initial load
duke
parents:
diff changeset
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 // Conservatively small estimate of offset of first non-header byte.
a61af66fc99e Initial load
duke
parents:
diff changeset
728 int minimum_header_size() {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
729 return is_AllocateArray() ? arrayOopDesc::base_offset_in_bytes(T_BYTE) :
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
730 instanceOopDesc::base_offset_in_bytes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
732
a61af66fc99e Initial load
duke
parents:
diff changeset
733 // Return the corresponding initialization barrier (or null if none).
a61af66fc99e Initial load
duke
parents:
diff changeset
734 // Walks out edges to find it...
a61af66fc99e Initial load
duke
parents:
diff changeset
735 // (Note: Both InitializeNode::allocation and AllocateNode::initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // are defined in graphKit.cpp, which sets up the bidirectional relation.)
a61af66fc99e Initial load
duke
parents:
diff changeset
737 InitializeNode* initialization();
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // Convenience for initialization->maybe_set_complete(phase)
a61af66fc99e Initial load
duke
parents:
diff changeset
740 bool maybe_set_complete(PhaseGVN* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
741 };
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 //------------------------------AllocateArray---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
744 //
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // High-level array allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
746 //
a61af66fc99e Initial load
duke
parents:
diff changeset
747 class AllocateArrayNode : public AllocateNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
748 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
749 AllocateArrayNode(Compile* C, const TypeFunc *atype, Node *ctrl, Node *mem, Node *abio,
a61af66fc99e Initial load
duke
parents:
diff changeset
750 Node* size, Node* klass_node, Node* initial_test,
a61af66fc99e Initial load
duke
parents:
diff changeset
751 Node* count_val
a61af66fc99e Initial load
duke
parents:
diff changeset
752 )
a61af66fc99e Initial load
duke
parents:
diff changeset
753 : AllocateNode(C, atype, ctrl, mem, abio, size, klass_node,
a61af66fc99e Initial load
duke
parents:
diff changeset
754 initial_test)
a61af66fc99e Initial load
duke
parents:
diff changeset
755 {
a61af66fc99e Initial load
duke
parents:
diff changeset
756 init_class_id(Class_AllocateArray);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 set_req(AllocateNode::ALength, count_val);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
760 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
761
366
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
762 // Dig the length operand out of a array allocation site.
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
763 Node* Ideal_length() {
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
764 return in(AllocateNode::ALength);
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
765 }
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
766
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
767 // Dig the length operand out of a array allocation site and narrow the
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
768 // type with a CastII, if necesssary
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
769 Node* make_ideal_length(const TypeOopPtr* ary_type, PhaseTransform *phase, bool can_create = true);
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
770
0
a61af66fc99e Initial load
duke
parents:
diff changeset
771 // Pattern-match a possible usage of AllocateArrayNode.
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // Return null if no allocation is recognized.
a61af66fc99e Initial load
duke
parents:
diff changeset
773 static AllocateArrayNode* Ideal_array_allocation(Node* ptr, PhaseTransform* phase) {
a61af66fc99e Initial load
duke
parents:
diff changeset
774 AllocateNode* allo = Ideal_allocation(ptr, phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 return (allo == NULL || !allo->is_AllocateArray())
a61af66fc99e Initial load
duke
parents:
diff changeset
776 ? NULL : allo->as_AllocateArray();
a61af66fc99e Initial load
duke
parents:
diff changeset
777 }
a61af66fc99e Initial load
duke
parents:
diff changeset
778 };
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 //------------------------------AbstractLockNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
781 class AbstractLockNode: public CallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
782 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
783 bool _eliminate; // indicates this lock can be safely eliminated
a61af66fc99e Initial load
duke
parents:
diff changeset
784 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
785 NamedCounter* _counter;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
789 // helper functions for lock elimination
a61af66fc99e Initial load
duke
parents:
diff changeset
790 //
a61af66fc99e Initial load
duke
parents:
diff changeset
791
a61af66fc99e Initial load
duke
parents:
diff changeset
792 bool find_matching_unlock(const Node* ctrl, LockNode* lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
793 GrowableArray<AbstractLockNode*> &lock_ops);
a61af66fc99e Initial load
duke
parents:
diff changeset
794 bool find_lock_and_unlock_through_if(Node* node, LockNode* lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
795 GrowableArray<AbstractLockNode*> &lock_ops);
a61af66fc99e Initial load
duke
parents:
diff changeset
796 bool find_unlocks_for_region(const RegionNode* region, LockNode* lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
797 GrowableArray<AbstractLockNode*> &lock_ops);
a61af66fc99e Initial load
duke
parents:
diff changeset
798 LockNode *find_matching_lock(UnlockNode* unlock);
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
802 AbstractLockNode(const TypeFunc *tf)
a61af66fc99e Initial load
duke
parents:
diff changeset
803 : CallNode(tf, NULL, TypeRawPtr::BOTTOM),
a61af66fc99e Initial load
duke
parents:
diff changeset
804 _eliminate(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
805 {
a61af66fc99e Initial load
duke
parents:
diff changeset
806 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
807 _counter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
810 virtual int Opcode() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
811 Node * obj_node() const {return in(TypeFunc::Parms + 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
812 Node * box_node() const {return in(TypeFunc::Parms + 1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
813 Node * fastlock_node() const {return in(TypeFunc::Parms + 2); }
a61af66fc99e Initial load
duke
parents:
diff changeset
814 const Type *sub(const Type *t1, const Type *t2) const { return TypeInt::CC;}
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 virtual uint size_of() const { return sizeof(*this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 bool is_eliminated() {return _eliminate; }
a61af66fc99e Initial load
duke
parents:
diff changeset
819 // mark node as eliminated and update the counter if there is one
a61af66fc99e Initial load
duke
parents:
diff changeset
820 void set_eliminated();
a61af66fc99e Initial load
duke
parents:
diff changeset
821
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
822 // locking does not modify its arguments
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
823 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase){ return false;}
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
824
0
a61af66fc99e Initial load
duke
parents:
diff changeset
825 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
826 void create_lock_counter(JVMState* s);
a61af66fc99e Initial load
duke
parents:
diff changeset
827 NamedCounter* counter() const { return _counter; }
a61af66fc99e Initial load
duke
parents:
diff changeset
828 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
829 };
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 //------------------------------Lock---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // High-level lock operation
a61af66fc99e Initial load
duke
parents:
diff changeset
833 //
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // This is a subclass of CallNode because it is a macro node which gets expanded
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // into a code sequence containing a call. This node takes 3 "parameters":
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // 0 - object to lock
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // 1 - a BoxLockNode
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // 2 - a FastLockNode
a61af66fc99e Initial load
duke
parents:
diff changeset
839 //
a61af66fc99e Initial load
duke
parents:
diff changeset
840 class LockNode : public AbstractLockNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
841 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
842
a61af66fc99e Initial load
duke
parents:
diff changeset
843 static const TypeFunc *lock_type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
845 const Type **fields = TypeTuple::fields(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Object to be Locked
a61af66fc99e Initial load
duke
parents:
diff changeset
847 fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // Address of stack location for lock
a61af66fc99e Initial load
duke
parents:
diff changeset
848 fields[TypeFunc::Parms+2] = TypeInt::BOOL; // FastLock
a61af66fc99e Initial load
duke
parents:
diff changeset
849 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+3,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
852 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
853
a61af66fc99e Initial load
duke
parents:
diff changeset
854 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
857 }
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
861 LockNode(Compile* C, const TypeFunc *tf) : AbstractLockNode( tf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
862 init_class_id(Class_Lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
863 init_flags(Flag_is_macro);
a61af66fc99e Initial load
duke
parents:
diff changeset
864 C->add_macro_node(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
866 virtual bool guaranteed_safepoint() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // Expansion modifies the JVMState, so we need to clone it
a61af66fc99e Initial load
duke
parents:
diff changeset
870 virtual void clone_jvms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
871 set_jvms(jvms()->clone_deep(Compile::current()));
a61af66fc99e Initial load
duke
parents:
diff changeset
872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
873 };
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 //------------------------------Unlock---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // High-level unlock operation
a61af66fc99e Initial load
duke
parents:
diff changeset
877 class UnlockNode : public AbstractLockNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
878 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
879 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
881 UnlockNode(Compile* C, const TypeFunc *tf) : AbstractLockNode( tf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
882 init_class_id(Class_Unlock);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 init_flags(Flag_is_macro);
a61af66fc99e Initial load
duke
parents:
diff changeset
884 C->add_macro_node(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
887 // unlock is never a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
888 virtual bool guaranteed_safepoint() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
889 };