annotate src/share/vm/opto/callnode.hpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents 7c57aead6d3e
children 97125851f396
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
844
bd02caa94611 6862919: Update copyright year
xdono
parents: 704
diff changeset
2 * Copyright 1997-2009 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 {
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
181 public:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
182 typedef enum {
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
183 Reexecute_Undefined = -1, // not defined -- will be translated into false later
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
184 Reexecute_False = 0, // false -- do not reexecute
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
185 Reexecute_True = 1 // true -- reexecute the bytecode
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
186 } ReexecuteState; //Reexecute State
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
187
0
a61af66fc99e Initial load
duke
parents:
diff changeset
188 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
189 JVMState* _caller; // List pointer for forming scope chains
a61af66fc99e Initial load
duke
parents:
diff changeset
190 uint _depth; // One mroe than caller depth, or one.
a61af66fc99e Initial load
duke
parents:
diff changeset
191 uint _locoff; // Offset to locals in input edge mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
192 uint _stkoff; // Offset to stack in input edge mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
193 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
194 uint _scloff; // Offset to fields of scalar objs in input edge mapping
0
a61af66fc99e Initial load
duke
parents:
diff changeset
195 uint _endoff; // Offset to end of input edge mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
196 uint _sp; // Jave Expression Stack Pointer for this state
a61af66fc99e Initial load
duke
parents:
diff changeset
197 int _bci; // Byte Code Index of this JVM point
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
198 ReexecuteState _reexecute; // Whether this bytecode need to be re-executed
0
a61af66fc99e Initial load
duke
parents:
diff changeset
199 ciMethod* _method; // Method Pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
200 SafePointNode* _map; // Map node associated with this scope
a61af66fc99e Initial load
duke
parents:
diff changeset
201 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
202 friend class Compile;
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
203 friend class PreserveReexecuteState;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Because JVMState objects live over the entire lifetime of the
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Compile object, they are allocated into the comp_arena, which
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // does not get resource marked or reset during the compile process
a61af66fc99e Initial load
duke
parents:
diff changeset
208 void *operator new( size_t x, Compile* C ) { return C->comp_arena()->Amalloc(x); }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 void operator delete( void * ) { } // fast deallocation
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Create a new JVMState, ready for abstract interpretation.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 JVMState(ciMethod* method, JVMState* caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 JVMState(int stack_size); // root state; has a null method
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Access functions for the JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
216 uint locoff() const { return _locoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 uint stkoff() const { return _stkoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
218 uint argoff() const { return _stkoff + _sp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 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
220 uint scloff() const { return _scloff; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
221 uint endoff() const { return _endoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 uint oopoff() const { return debug_end(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 int loc_size() const { return _stkoff - _locoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 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
226 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
227 int scl_size() const { return _endoff - _scloff; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 bool is_loc(uint i) const { return i >= _locoff && i < _stkoff; }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 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
231 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
232 bool is_scl(uint i) const { return i >= _scloff && i < _endoff; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
233
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
234 uint sp() const { return _sp; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
235 int bci() const { return _bci; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
236 bool should_reexecute() const { return _reexecute==Reexecute_True; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
237 bool is_reexecute_undefined() const { return _reexecute==Reexecute_Undefined; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
238 bool has_method() const { return _method != NULL; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
239 ciMethod* method() const { assert(has_method(), ""); return _method; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
240 JVMState* caller() const { return _caller; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
241 SafePointNode* map() const { return _map; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
242 uint depth() const { return _depth; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
243 uint debug_start() const; // returns locoff of root caller
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
244 uint debug_end() const; // returns endoff of self
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
245 uint debug_size() const {
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
246 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
247 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248 uint debug_depth() const; // returns sum of debug_size values at all depths
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Returns the JVM state at the desired depth (1 == root).
a61af66fc99e Initial load
duke
parents:
diff changeset
251 JVMState* of_depth(int d) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // Tells if two JVM states have the same call chain (depth, methods, & bcis).
a61af66fc99e Initial load
duke
parents:
diff changeset
254 bool same_calls_as(const JVMState* that) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // Monitors (monitors are stored as (boxNode, objNode) pairs
a61af66fc99e Initial load
duke
parents:
diff changeset
257 enum { logMonitorEdges = 1 };
a61af66fc99e Initial load
duke
parents:
diff changeset
258 int nof_monitors() const { return mon_size() >> logMonitorEdges; }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 int monitor_depth() const { return nof_monitors() + (caller() ? caller()->monitor_depth() : 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 int monitor_box_offset(int idx) const { return monoff() + (idx << logMonitorEdges) + 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 int monitor_obj_offset(int idx) const { return monoff() + (idx << logMonitorEdges) + 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
262 bool is_monitor_box(uint off) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 assert(is_mon(off), "should be called only for monitor edge");
a61af66fc99e Initial load
duke
parents:
diff changeset
264 return (0 == bitfield(off - monoff(), 0, logMonitorEdges));
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 bool is_monitor_use(uint off) const { return (is_mon(off)
a61af66fc99e Initial load
duke
parents:
diff changeset
267 && is_monitor_box(off))
a61af66fc99e Initial load
duke
parents:
diff changeset
268 || (caller() && caller()->is_monitor_use(off)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // Initialization functions for the JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
271 void set_locoff(uint off) { _locoff = off; }
a61af66fc99e Initial load
duke
parents:
diff changeset
272 void set_stkoff(uint off) { _stkoff = off; }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 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
274 void set_scloff(uint off) { _scloff = off; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 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
276 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
277 _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
278 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
279 void set_map(SafePointNode *map) { _map = map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void set_sp(uint sp) { _sp = sp; }
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
281 // _reexecute is initialized to "undefined" for a new bci
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
282 void set_bci(int bci) {if(_bci != bci)_reexecute=Reexecute_Undefined; _bci = bci; }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 704
diff changeset
283 void set_should_reexecute(bool reexec) {_reexecute = reexec ? Reexecute_True : Reexecute_False;}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Miscellaneous utility functions
a61af66fc99e Initial load
duke
parents:
diff changeset
286 JVMState* clone_deep(Compile* C) const; // recursively clones caller chain
a61af66fc99e Initial load
duke
parents:
diff changeset
287 JVMState* clone_shallow(Compile* C) const; // retains uncloned caller
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
290 void format(PhaseRegAlloc *regalloc, const Node *n, outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 void dump_on(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void dump() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 dump_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
297 };
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 //------------------------------SafePointNode----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // A SafePointNode is a subclass of a MultiNode for convenience (and
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // potential code sharing) only - conceptually it is independent of
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // the Node semantics.
a61af66fc99e Initial load
duke
parents:
diff changeset
303 class SafePointNode : public MultiNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
308 SafePointNode(uint edges, JVMState* jvms,
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // A plain safepoint advertises no memory effects (NULL):
a61af66fc99e Initial load
duke
parents:
diff changeset
310 const TypePtr* adr_type = NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
311 : MultiNode( edges ),
a61af66fc99e Initial load
duke
parents:
diff changeset
312 _jvms(jvms),
a61af66fc99e Initial load
duke
parents:
diff changeset
313 _oop_map(NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
314 _adr_type(adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
315 {
a61af66fc99e Initial load
duke
parents:
diff changeset
316 init_class_id(Class_SafePoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 OopMap* _oop_map; // Array of OopMap info (8-bit char) for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
320 JVMState* const _jvms; // Pointer to list of JVM State objects
a61af66fc99e Initial load
duke
parents:
diff changeset
321 const TypePtr* _adr_type; // What type of memory does this node produce?
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Many calls take *all* of memory as input,
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // but some produce a limited subset of that memory as output.
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // The adr_type reports the call's behavior as a store, not a load.
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 virtual JVMState* jvms() const { return _jvms; }
a61af66fc99e Initial load
duke
parents:
diff changeset
328 void set_jvms(JVMState* s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 *(JVMState**)&_jvms = s; // override const attribute in the accessor
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 OopMap *oop_map() const { return _oop_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 void set_oop_map(OopMap *om) { _oop_map = om; }
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // Functionality from old debug nodes which has changed
a61af66fc99e Initial load
duke
parents:
diff changeset
335 Node *local(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
337 return in(jvms->locoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 Node *stack(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return in(jvms->stkoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 Node *argument(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
345 return in(jvms->argoff() + idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
347 Node *monitor_box(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
349 return in(jvms->monitor_box_offset(idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
351 Node *monitor_obj(JVMState* jvms, uint idx) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
353 return in(jvms->monitor_obj_offset(idx));
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 void set_local(JVMState* jvms, uint idx, Node *c);
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 void set_stack(JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
360 set_req(jvms->stkoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
362 void set_argument(JVMState* jvms, uint idx, Node *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
364 set_req(jvms->argoff() + idx, c);
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366 void ensure_stack(JVMState* jvms, uint stk_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 assert(verify_jvms(jvms), "jvms must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
368 int grow_by = (int)stk_size - (int)jvms->stk_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
369 if (grow_by > 0) grow_stack(jvms, grow_by);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
371 void grow_stack(JVMState* jvms, uint grow_by);
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // Handle monitor stack
a61af66fc99e Initial load
duke
parents:
diff changeset
373 void push_monitor( const FastLockNode *lock );
a61af66fc99e Initial load
duke
parents:
diff changeset
374 void pop_monitor ();
a61af66fc99e Initial load
duke
parents:
diff changeset
375 Node *peek_monitor_box() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
376 Node *peek_monitor_obj() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Access functions for the JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
379 Node *control () const { return in(TypeFunc::Control ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 Node *i_o () const { return in(TypeFunc::I_O ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
381 Node *memory () const { return in(TypeFunc::Memory ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 Node *returnadr() const { return in(TypeFunc::ReturnAdr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
383 Node *frameptr () const { return in(TypeFunc::FramePtr ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 void set_control ( Node *c ) { set_req(TypeFunc::Control,c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
386 void set_i_o ( Node *c ) { set_req(TypeFunc::I_O ,c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
387 void set_memory ( Node *c ) { set_req(TypeFunc::Memory ,c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 MergeMemNode* merged_memory() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 return in(TypeFunc::Memory)->as_MergeMem();
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // The parser marks useless maps as dead when it's done with them:
a61af66fc99e Initial load
duke
parents:
diff changeset
394 bool is_killed() { return in(TypeFunc::Control) == NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // Exception states bubbling out of subgraphs such as inlined calls
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // are recorded here. (There might be more than one, hence the "next".)
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // This feature is used only for safepoints which serve as "maps"
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // for JVM states during parsing, intrinsic expansion, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
400 SafePointNode* next_exception() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
401 void set_next_exception(SafePointNode* n);
a61af66fc99e Initial load
duke
parents:
diff changeset
402 bool has_exceptions() const { return next_exception() != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Standard Node stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
405 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 virtual bool pinned() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 virtual const Type *bottom_type() const { return Type::CONTROL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
409 virtual const TypePtr *adr_type() const { return _adr_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
411 virtual Node *Identity( PhaseTransform *phase );
a61af66fc99e Initial load
duke
parents:
diff changeset
412 virtual uint ideal_reg() const { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
413 virtual const RegMask &in_RegMask(uint) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 virtual const RegMask &out_RegMask() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
415 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 static bool needs_polling_address_input();
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
420 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
421 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
422 };
a61af66fc99e Initial load
duke
parents:
diff changeset
423
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
424 //------------------------------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
425 // 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
426 // 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
427
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 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
429 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
430 // 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
431 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
432 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
433 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
434 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
435 #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
436 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
437 #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
438 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
439 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
440 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
441 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
442 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
443 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
444
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 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
446 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
447 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
448
420
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
449 // SafePointScalarObject should be always pinned to the control edge
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
450 // of the SafePoint node for which it was generated.
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
451 virtual bool pinned() const; // { return true; }
a1980da045cc 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 366
diff changeset
452
601
523ded093c31 6809798: SafePointScalarObject node placed into incorrect block during GCM
kvn
parents: 460
diff changeset
453 // SafePointScalarObject depends on the SafePoint node
523ded093c31 6809798: SafePointScalarObject node placed into incorrect block during GCM
kvn
parents: 460
diff changeset
454 // for which it was generated.
523ded093c31 6809798: SafePointScalarObject node placed into incorrect block during GCM
kvn
parents: 460
diff changeset
455 virtual bool depends_only_on_test() const; // { return false; }
523ded093c31 6809798: SafePointScalarObject node placed into incorrect block during GCM
kvn
parents: 460
diff changeset
456
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
457 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
458
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
459 // 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
460 // "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
461 // 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
462 // "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
463 // 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
464 // "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
465 // 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
466 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
467
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
468 #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
469 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
470 #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
471 };
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 39
diff changeset
472
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
473
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
474 // Simple container for the outgoing projections of a call. Useful
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
475 // for serious surgery on calls.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
476 class CallProjections : public StackObj {
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
477 public:
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
478 Node* fallthrough_proj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
479 Node* fallthrough_catchproj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
480 Node* fallthrough_memproj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
481 Node* fallthrough_ioproj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
482 Node* catchall_catchproj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
483 Node* catchall_memproj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
484 Node* catchall_ioproj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
485 Node* resproj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
486 Node* exobj;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
487 };
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
488
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
489
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490 //------------------------------CallNode---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // Call nodes now subsume the function of debug nodes at callsites, so they
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // contain the functionality of a full scope chain of debug nodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
493 class CallNode : public SafePointNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
495 const TypeFunc *_tf; // Function type
a61af66fc99e Initial load
duke
parents:
diff changeset
496 address _entry_point; // Address of method being called
a61af66fc99e Initial load
duke
parents:
diff changeset
497 float _cnt; // Estimate of number of times called
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
500 : SafePointNode(tf->domain()->cnt(), NULL, adr_type),
a61af66fc99e Initial load
duke
parents:
diff changeset
501 _tf(tf),
a61af66fc99e Initial load
duke
parents:
diff changeset
502 _entry_point(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
503 _cnt(COUNT_UNKNOWN)
a61af66fc99e Initial load
duke
parents:
diff changeset
504 {
a61af66fc99e Initial load
duke
parents:
diff changeset
505 init_class_id(Class_Call);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 init_flags(Flag_is_Call);
a61af66fc99e Initial load
duke
parents:
diff changeset
507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 const TypeFunc* tf() const { return _tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
510 const address entry_point() const { return _entry_point; }
a61af66fc99e Initial load
duke
parents:
diff changeset
511 const float cnt() const { return _cnt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 void set_tf(const TypeFunc* tf) { _tf = tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 void set_entry_point(address p) { _entry_point = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
515 void set_cnt(float c) { _cnt = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 virtual const Type *bottom_type() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 virtual const Type *Value( PhaseTransform *phase ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 virtual Node *Identity( PhaseTransform *phase ) { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
520 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 virtual uint size_of() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 virtual Node *match( const ProjNode *proj, const Matcher *m );
a61af66fc99e Initial load
duke
parents:
diff changeset
524 virtual uint ideal_reg() const { return NotAMachineReg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // Are we guaranteed that this node is a safepoint? Not true for leaf calls and
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // for some macro nodes whose expansion does not have a safepoint on the fast path.
a61af66fc99e Initial load
duke
parents:
diff changeset
527 virtual bool guaranteed_safepoint() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // For macro nodes, the JVMState gets modified during expansion, so when cloning
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // the node the JVMState must be cloned.
a61af66fc99e Initial load
duke
parents:
diff changeset
530 virtual void clone_jvms() { } // default is not to clone
a61af66fc99e Initial load
duke
parents:
diff changeset
531
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
532 // Returns true if the call may modify n
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
533 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase);
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
534 // 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
535 bool has_non_debug_use(Node *n);
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
536 // Returns the unique CheckCastPP of a call
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
537 // or result projection is there are several CheckCastPP
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
538 // or returns NULL if there is no one.
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
539 Node *result_cast();
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
540
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
541 // Collect all the interesting edges from a call for use in
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
542 // replacing the call by something else. Used by macro expansion
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
543 // and the late inlining support.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
544 void extract_projections(CallProjections* projs, bool separate_io_proj);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
545
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 virtual uint match_edge(uint idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
549 virtual void dump_req() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
550 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
551 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
552 };
a61af66fc99e Initial load
duke
parents:
diff changeset
553
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 903
diff changeset
554
0
a61af66fc99e Initial load
duke
parents:
diff changeset
555 //------------------------------CallJavaNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // Make a static or dynamic subroutine call node using Java calling
a61af66fc99e Initial load
duke
parents:
diff changeset
557 // convention. (The "Java" calling convention is the compiler's calling
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // convention, as opposed to the interpreter's or that of native C.)
a61af66fc99e Initial load
duke
parents:
diff changeset
559 class CallJavaNode : public CallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
561 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
562 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 bool _optimized_virtual;
a61af66fc99e Initial load
duke
parents:
diff changeset
565 ciMethod* _method; // Method being direct called
a61af66fc99e Initial load
duke
parents:
diff changeset
566 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
567 const int _bci; // Byte Code Index of call byte code
a61af66fc99e Initial load
duke
parents:
diff changeset
568 CallJavaNode(const TypeFunc* tf , address addr, ciMethod* method, int bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
569 : CallNode(tf, addr, TypePtr::BOTTOM),
a61af66fc99e Initial load
duke
parents:
diff changeset
570 _method(method), _bci(bci), _optimized_virtual(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
571 {
a61af66fc99e Initial load
duke
parents:
diff changeset
572 init_class_id(Class_CallJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
576 ciMethod* method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
577 void set_method(ciMethod *m) { _method = m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
578 void set_optimized_virtual(bool f) { _optimized_virtual = f; }
a61af66fc99e Initial load
duke
parents:
diff changeset
579 bool is_optimized_virtual() const { return _optimized_virtual; }
a61af66fc99e Initial load
duke
parents:
diff changeset
580
a61af66fc99e Initial load
duke
parents:
diff changeset
581 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
582 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
583 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
584 };
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 //------------------------------CallStaticJavaNode-----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // Make a direct subroutine call using Java calling convention (for static
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // calls and optimized virtual calls, plus calls to wrappers for run-time
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // routines); generates static stub.
a61af66fc99e Initial load
duke
parents:
diff changeset
590 class CallStaticJavaNode : public CallJavaNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
592 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
593 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
594 CallStaticJavaNode(const TypeFunc* tf, address addr, ciMethod* method, int bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
595 : CallJavaNode(tf, addr, method, bci), _name(NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 init_class_id(Class_CallStaticJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
598 CallStaticJavaNode(const TypeFunc* tf, address addr, const char* name, int bci,
a61af66fc99e Initial load
duke
parents:
diff changeset
599 const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
600 : CallJavaNode(tf, addr, NULL, bci), _name(name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
601 init_class_id(Class_CallStaticJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // This node calls a runtime stub, which often has narrow memory effects.
a61af66fc99e Initial load
duke
parents:
diff changeset
603 _adr_type = adr_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 const char *_name; // Runtime wrapper name
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // If this is an uncommon trap, return the request code, else zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
608 int uncommon_trap_request() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
609 static int extract_uncommon_trap_request(const Node* call);
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 virtual int Opcode() const;
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 //------------------------------CallDynamicJavaNode----------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // Make a dispatched call using Java calling convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
619 class CallDynamicJavaNode : public CallJavaNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
621 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
622 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
623 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
624 init_class_id(Class_CallDynamicJava);
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 int _vtable_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
628 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
629 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
630 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
631 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
632 };
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 //------------------------------CallRuntimeNode--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // Make a direct subroutine call node into compiled C++ code.
a61af66fc99e Initial load
duke
parents:
diff changeset
636 class CallRuntimeNode : public CallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
637 virtual uint cmp( const Node &n ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
638 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
639 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
640 CallRuntimeNode(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 : CallNode(tf, addr, adr_type),
a61af66fc99e Initial load
duke
parents:
diff changeset
643 _name(name)
a61af66fc99e Initial load
duke
parents:
diff changeset
644 {
a61af66fc99e Initial load
duke
parents:
diff changeset
645 init_class_id(Class_CallRuntime);
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648 const char *_name; // Printable name, if _method is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
649 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
650 virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
653 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
655 };
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 //------------------------------CallLeafNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // Make a direct subroutine call node into compiled C++ code, without
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
660 class CallLeafNode : public CallRuntimeNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
661 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
662 CallLeafNode(const TypeFunc* tf, address addr, const char* name,
a61af66fc99e Initial load
duke
parents:
diff changeset
663 const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
664 : CallRuntimeNode(tf, addr, name, adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
665 {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 init_class_id(Class_CallLeaf);
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
669 virtual bool guaranteed_safepoint() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
670 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
671 virtual void dump_spec(outputStream *st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
672 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
673 };
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 //------------------------------CallLeafNoFPNode-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // CallLeafNode, not using floating point or using it in the same manner as
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // the generated code
a61af66fc99e Initial load
duke
parents:
diff changeset
678 class CallLeafNoFPNode : public CallLeafNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
679 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
680 CallLeafNoFPNode(const TypeFunc* tf, address addr, const char* name,
a61af66fc99e Initial load
duke
parents:
diff changeset
681 const TypePtr* adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
682 : CallLeafNode(tf, addr, name, adr_type)
a61af66fc99e Initial load
duke
parents:
diff changeset
683 {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
686 };
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688
a61af66fc99e Initial load
duke
parents:
diff changeset
689 //------------------------------Allocate---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
690 // High-level memory allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
691 //
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // AllocateNode and AllocateArrayNode are subclasses of CallNode because they will
a61af66fc99e Initial load
duke
parents:
diff changeset
693 // get expanded into a code sequence containing a call. Unlike other CallNodes,
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // they have 2 memory projections and 2 i_o projections (which are distinguished by
a61af66fc99e Initial load
duke
parents:
diff changeset
695 // the _is_io_use flag in the projection.) This is needed when expanding the node in
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // order to differentiate the uses of the projection on the normal control path from
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // those on the exception return path.
a61af66fc99e Initial load
duke
parents:
diff changeset
698 //
a61af66fc99e Initial load
duke
parents:
diff changeset
699 class AllocateNode : public CallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
701 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
702 // Output:
a61af66fc99e Initial load
duke
parents:
diff changeset
703 RawAddress = TypeFunc::Parms, // the newly-allocated raw address
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Inputs:
a61af66fc99e Initial load
duke
parents:
diff changeset
705 AllocSize = TypeFunc::Parms, // size (in bytes) of the new object
a61af66fc99e Initial load
duke
parents:
diff changeset
706 KlassNode, // type (maybe dynamic) of the obj.
a61af66fc99e Initial load
duke
parents:
diff changeset
707 InitialTest, // slow-path test (may be constant)
a61af66fc99e Initial load
duke
parents:
diff changeset
708 ALength, // array length (or TOP if none)
a61af66fc99e Initial load
duke
parents:
diff changeset
709 ParmLimit
a61af66fc99e Initial load
duke
parents:
diff changeset
710 };
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712 static const TypeFunc* alloc_type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 const Type** fields = TypeTuple::fields(ParmLimit - TypeFunc::Parms);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 fields[AllocSize] = TypeInt::POS;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 fields[KlassNode] = TypeInstPtr::NOTNULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
716 fields[InitialTest] = TypeInt::BOOL;
a61af66fc99e Initial load
duke
parents:
diff changeset
717 fields[ALength] = TypeInt::INT; // length (can be a bad length)
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 const TypeTuple *domain = TypeTuple::make(ParmLimit, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
722 fields = TypeTuple::fields(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
723 fields[TypeFunc::Parms+0] = TypeRawPtr::NOTNULL; // Returned oop
a61af66fc99e Initial load
duke
parents:
diff changeset
724
a61af66fc99e Initial load
duke
parents:
diff changeset
725 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727 return TypeFunc::make(domain, range);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729
39
76256d272075 6667612: (Escape Analysis) disable loop cloning if it has a scalar replaceable allocation
kvn
parents: 33
diff changeset
730 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
731
0
a61af66fc99e Initial load
duke
parents:
diff changeset
732 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
733 AllocateNode(Compile* C, const TypeFunc *atype, Node *ctrl, Node *mem, Node *abio,
a61af66fc99e Initial load
duke
parents:
diff changeset
734 Node *size, Node *klass_node, Node *initial_test);
a61af66fc99e Initial load
duke
parents:
diff changeset
735 // Expansion modifies the JVMState, so we need to clone it
a61af66fc99e Initial load
duke
parents:
diff changeset
736 virtual void clone_jvms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
737 set_jvms(jvms()->clone_deep(Compile::current()));
a61af66fc99e Initial load
duke
parents:
diff changeset
738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
739 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 virtual uint ideal_reg() const { return Op_RegP; }
a61af66fc99e Initial load
duke
parents:
diff changeset
741 virtual bool guaranteed_safepoint() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
742
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
743 // allocations do not modify their arguments
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
744 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
745
0
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // Pattern-match a possible usage of AllocateNode.
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // Return null if no allocation is recognized.
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // The operand is the pointer produced by the (possible) allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
749 // It must be a projection of the Allocate or its subsequent CastPP.
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // (Note: This function is defined in file graphKit.cpp, near
a61af66fc99e Initial load
duke
parents:
diff changeset
751 // GraphKit::new_instance/new_array, whose output it recognizes.)
a61af66fc99e Initial load
duke
parents:
diff changeset
752 // The 'ptr' may not have an offset unless the 'offset' argument is given.
a61af66fc99e Initial load
duke
parents:
diff changeset
753 static AllocateNode* Ideal_allocation(Node* ptr, PhaseTransform* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
754
a61af66fc99e Initial load
duke
parents:
diff changeset
755 // Fancy version which uses AddPNode::Ideal_base_and_offset to strip
a61af66fc99e Initial load
duke
parents:
diff changeset
756 // an offset, which is reported back to the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
757 // (Note: AllocateNode::Ideal_allocation is defined in graphKit.cpp.)
a61af66fc99e Initial load
duke
parents:
diff changeset
758 static AllocateNode* Ideal_allocation(Node* ptr, PhaseTransform* phase,
a61af66fc99e Initial load
duke
parents:
diff changeset
759 intptr_t& offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 // Dig the klass operand out of a (possible) allocation site.
a61af66fc99e Initial load
duke
parents:
diff changeset
762 static Node* Ideal_klass(Node* ptr, PhaseTransform* phase) {
a61af66fc99e Initial load
duke
parents:
diff changeset
763 AllocateNode* allo = Ideal_allocation(ptr, phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
764 return (allo == NULL) ? NULL : allo->in(KlassNode);
a61af66fc99e Initial load
duke
parents:
diff changeset
765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767 // Conservatively small estimate of offset of first non-header byte.
a61af66fc99e Initial load
duke
parents:
diff changeset
768 int minimum_header_size() {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 74
diff changeset
769 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
770 instanceOopDesc::base_offset_in_bytes();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // Return the corresponding initialization barrier (or null if none).
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // Walks out edges to find it...
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // (Note: Both InitializeNode::allocation and AllocateNode::initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // are defined in graphKit.cpp, which sets up the bidirectional relation.)
a61af66fc99e Initial load
duke
parents:
diff changeset
777 InitializeNode* initialization();
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 // Convenience for initialization->maybe_set_complete(phase)
a61af66fc99e Initial load
duke
parents:
diff changeset
780 bool maybe_set_complete(PhaseGVN* phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
781 };
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 //------------------------------AllocateArray---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
784 //
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // High-level array allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
786 //
a61af66fc99e Initial load
duke
parents:
diff changeset
787 class AllocateArrayNode : public AllocateNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
789 AllocateArrayNode(Compile* C, const TypeFunc *atype, Node *ctrl, Node *mem, Node *abio,
a61af66fc99e Initial load
duke
parents:
diff changeset
790 Node* size, Node* klass_node, Node* initial_test,
a61af66fc99e Initial load
duke
parents:
diff changeset
791 Node* count_val
a61af66fc99e Initial load
duke
parents:
diff changeset
792 )
a61af66fc99e Initial load
duke
parents:
diff changeset
793 : AllocateNode(C, atype, ctrl, mem, abio, size, klass_node,
a61af66fc99e Initial load
duke
parents:
diff changeset
794 initial_test)
a61af66fc99e Initial load
duke
parents:
diff changeset
795 {
a61af66fc99e Initial load
duke
parents:
diff changeset
796 init_class_id(Class_AllocateArray);
a61af66fc99e Initial load
duke
parents:
diff changeset
797 set_req(AllocateNode::ALength, count_val);
a61af66fc99e Initial load
duke
parents:
diff changeset
798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
799 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
800 virtual uint size_of() const; // Size is bigger
704
ad8c635e757e 6823453: DeoptimizeALot causes fastdebug server jvm to fail with assert(false,"unscheduable graph")
kvn
parents: 601
diff changeset
801 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
802
366
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
803 // 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
804 Node* Ideal_length() {
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
805 return in(AllocateNode::ALength);
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
806 }
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
807
8261ee795323 6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
rasbold
parents: 196
diff changeset
808 // 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
809 // 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
810 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
811
0
a61af66fc99e Initial load
duke
parents:
diff changeset
812 // Pattern-match a possible usage of AllocateArrayNode.
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // Return null if no allocation is recognized.
a61af66fc99e Initial load
duke
parents:
diff changeset
814 static AllocateArrayNode* Ideal_array_allocation(Node* ptr, PhaseTransform* phase) {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 AllocateNode* allo = Ideal_allocation(ptr, phase);
a61af66fc99e Initial load
duke
parents:
diff changeset
816 return (allo == NULL || !allo->is_AllocateArray())
a61af66fc99e Initial load
duke
parents:
diff changeset
817 ? NULL : allo->as_AllocateArray();
a61af66fc99e Initial load
duke
parents:
diff changeset
818 }
a61af66fc99e Initial load
duke
parents:
diff changeset
819 };
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 //------------------------------AbstractLockNode-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
822 class AbstractLockNode: public CallNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 private:
460
424f9bfe6b96 6775880: EA +DeoptimizeALot: assert(mon_info->owner()->is_locked(),"object must be locked now")
kvn
parents: 420
diff changeset
824 bool _eliminate; // indicates this lock can be safely eliminated
424f9bfe6b96 6775880: EA +DeoptimizeALot: assert(mon_info->owner()->is_locked(),"object must be locked now")
kvn
parents: 420
diff changeset
825 bool _coarsened; // indicates this lock was coarsened
0
a61af66fc99e Initial load
duke
parents:
diff changeset
826 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
827 NamedCounter* _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 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
831 // helper functions for lock elimination
a61af66fc99e Initial load
duke
parents:
diff changeset
832 //
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834 bool find_matching_unlock(const Node* ctrl, LockNode* lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
835 GrowableArray<AbstractLockNode*> &lock_ops);
a61af66fc99e Initial load
duke
parents:
diff changeset
836 bool find_lock_and_unlock_through_if(Node* node, LockNode* lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
837 GrowableArray<AbstractLockNode*> &lock_ops);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 bool find_unlocks_for_region(const RegionNode* region, LockNode* lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
839 GrowableArray<AbstractLockNode*> &lock_ops);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 LockNode *find_matching_lock(UnlockNode* unlock);
a61af66fc99e Initial load
duke
parents:
diff changeset
841
a61af66fc99e Initial load
duke
parents:
diff changeset
842
a61af66fc99e Initial load
duke
parents:
diff changeset
843 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
844 AbstractLockNode(const TypeFunc *tf)
a61af66fc99e Initial load
duke
parents:
diff changeset
845 : CallNode(tf, NULL, TypeRawPtr::BOTTOM),
460
424f9bfe6b96 6775880: EA +DeoptimizeALot: assert(mon_info->owner()->is_locked(),"object must be locked now")
kvn
parents: 420
diff changeset
846 _coarsened(false),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
847 _eliminate(false)
a61af66fc99e Initial load
duke
parents:
diff changeset
848 {
a61af66fc99e Initial load
duke
parents:
diff changeset
849 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
850 _counter = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
851 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853 virtual int Opcode() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 Node * obj_node() const {return in(TypeFunc::Parms + 0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
855 Node * box_node() const {return in(TypeFunc::Parms + 1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
856 Node * fastlock_node() const {return in(TypeFunc::Parms + 2); }
a61af66fc99e Initial load
duke
parents:
diff changeset
857 const Type *sub(const Type *t1, const Type *t2) const { return TypeInt::CC;}
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 virtual uint size_of() const { return sizeof(*this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
860
a61af66fc99e Initial load
duke
parents:
diff changeset
861 bool is_eliminated() {return _eliminate; }
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // mark node as eliminated and update the counter if there is one
a61af66fc99e Initial load
duke
parents:
diff changeset
863 void set_eliminated();
a61af66fc99e Initial load
duke
parents:
diff changeset
864
460
424f9bfe6b96 6775880: EA +DeoptimizeALot: assert(mon_info->owner()->is_locked(),"object must be locked now")
kvn
parents: 420
diff changeset
865 bool is_coarsened() { return _coarsened; }
424f9bfe6b96 6775880: EA +DeoptimizeALot: assert(mon_info->owner()->is_locked(),"object must be locked now")
kvn
parents: 420
diff changeset
866 void set_coarsened() { _coarsened = true; }
424f9bfe6b96 6775880: EA +DeoptimizeALot: assert(mon_info->owner()->is_locked(),"object must be locked now")
kvn
parents: 420
diff changeset
867
65
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
868 // locking does not modify its arguments
99269dbf4ba8 6674588: (Escape Analysis) Improve Escape Analysis code
kvn
parents: 63
diff changeset
869 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
870
0
a61af66fc99e Initial load
duke
parents:
diff changeset
871 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
872 void create_lock_counter(JVMState* s);
a61af66fc99e Initial load
duke
parents:
diff changeset
873 NamedCounter* counter() const { return _counter; }
a61af66fc99e Initial load
duke
parents:
diff changeset
874 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
875 };
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 //------------------------------Lock---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // High-level lock operation
a61af66fc99e Initial load
duke
parents:
diff changeset
879 //
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // This is a subclass of CallNode because it is a macro node which gets expanded
a61af66fc99e Initial load
duke
parents:
diff changeset
881 // into a code sequence containing a call. This node takes 3 "parameters":
a61af66fc99e Initial load
duke
parents:
diff changeset
882 // 0 - object to lock
a61af66fc99e Initial load
duke
parents:
diff changeset
883 // 1 - a BoxLockNode
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // 2 - a FastLockNode
a61af66fc99e Initial load
duke
parents:
diff changeset
885 //
a61af66fc99e Initial load
duke
parents:
diff changeset
886 class LockNode : public AbstractLockNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
887 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 static const TypeFunc *lock_type() {
a61af66fc99e Initial load
duke
parents:
diff changeset
890 // create input type (domain)
a61af66fc99e Initial load
duke
parents:
diff changeset
891 const Type **fields = TypeTuple::fields(3);
a61af66fc99e Initial load
duke
parents:
diff changeset
892 fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // Object to be Locked
a61af66fc99e Initial load
duke
parents:
diff changeset
893 fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // Address of stack location for lock
a61af66fc99e Initial load
duke
parents:
diff changeset
894 fields[TypeFunc::Parms+2] = TypeInt::BOOL; // FastLock
a61af66fc99e Initial load
duke
parents:
diff changeset
895 const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+3,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
896
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // create result type (range)
a61af66fc99e Initial load
duke
parents:
diff changeset
898 fields = TypeTuple::fields(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
899
a61af66fc99e Initial load
duke
parents:
diff changeset
900 const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0,fields);
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 return TypeFunc::make(domain,range);
a61af66fc99e Initial load
duke
parents:
diff changeset
903 }
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
906 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
907 LockNode(Compile* C, const TypeFunc *tf) : AbstractLockNode( tf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
908 init_class_id(Class_Lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 init_flags(Flag_is_macro);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 C->add_macro_node(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
912 virtual bool guaranteed_safepoint() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
913
a61af66fc99e Initial load
duke
parents:
diff changeset
914 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // Expansion modifies the JVMState, so we need to clone it
a61af66fc99e Initial load
duke
parents:
diff changeset
916 virtual void clone_jvms() {
a61af66fc99e Initial load
duke
parents:
diff changeset
917 set_jvms(jvms()->clone_deep(Compile::current()));
a61af66fc99e Initial load
duke
parents:
diff changeset
918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
919 };
a61af66fc99e Initial load
duke
parents:
diff changeset
920
a61af66fc99e Initial load
duke
parents:
diff changeset
921 //------------------------------Unlock---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
922 // High-level unlock operation
a61af66fc99e Initial load
duke
parents:
diff changeset
923 class UnlockNode : public AbstractLockNode {
a61af66fc99e Initial load
duke
parents:
diff changeset
924 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
925 virtual int Opcode() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
926 virtual uint size_of() const; // Size is bigger
a61af66fc99e Initial load
duke
parents:
diff changeset
927 UnlockNode(Compile* C, const TypeFunc *tf) : AbstractLockNode( tf ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
928 init_class_id(Class_Unlock);
a61af66fc99e Initial load
duke
parents:
diff changeset
929 init_flags(Flag_is_macro);
a61af66fc99e Initial load
duke
parents:
diff changeset
930 C->add_macro_node(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
932 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
a61af66fc99e Initial load
duke
parents:
diff changeset
933 // unlock is never a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
934 virtual bool guaranteed_safepoint() { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
935 };