annotate src/share/vm/opto/matcher.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 bd02caa94611
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: 775
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 class Compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
26 class Node;
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class MachNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class MachTypeNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class MachOper;
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 //---------------------------Matcher-------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class Matcher : public PhaseTransform {
a61af66fc99e Initial load
duke
parents:
diff changeset
33 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // Private arena of State objects
a61af66fc99e Initial load
duke
parents:
diff changeset
35 ResourceArea _states_arena;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 VectorSet _visited; // Visit bits
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // Used to control the Label pass
a61af66fc99e Initial load
duke
parents:
diff changeset
40 VectorSet _shared; // Shared Ideal Node
a61af66fc99e Initial load
duke
parents:
diff changeset
41 VectorSet _dontcare; // Nothing the matcher cares about
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Private methods which perform the actual matching and reduction
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Walks the label tree, generating machine nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
45 MachNode *ReduceInst( State *s, int rule, Node *&mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
46 void ReduceInst_Chain_Rule( State *s, int rule, Node *&mem, MachNode *mach);
a61af66fc99e Initial load
duke
parents:
diff changeset
47 uint ReduceInst_Interior(State *s, int rule, Node *&mem, MachNode *mach, uint num_opnds);
a61af66fc99e Initial load
duke
parents:
diff changeset
48 void ReduceOper( State *s, int newrule, Node *&mem, MachNode *mach );
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // If this node already matched using "rule", return the MachNode for it.
168
7793bd37a336 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 0
diff changeset
51 MachNode* find_shared_node(Node* n, uint rule);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // Convert a dense opcode number to an expanded rule number
a61af66fc99e Initial load
duke
parents:
diff changeset
54 const int *_reduceOp;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 const int *_leftOp;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 const int *_rightOp;
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // Map dense opcode number to info on when rule is swallowed constant.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 const bool *_swallowed;
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Map dense rule number to determine if this is an instruction chain rule
a61af66fc99e Initial load
duke
parents:
diff changeset
62 const uint _begin_inst_chain_rule;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 const uint _end_inst_chain_rule;
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // We want to clone constants and possible CmpI-variants.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // If we do not clone CmpI, then we can have many instances of
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // condition codes alive at once. This is OK on some chips and
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // bad on others. Hence the machine-dependent table lookup.
a61af66fc99e Initial load
duke
parents:
diff changeset
69 const char *_must_clone;
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // Find shared Nodes, or Nodes that otherwise are Matcher roots
a61af66fc99e Initial load
duke
parents:
diff changeset
72 void find_shared( Node *n );
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // Debug and profile information for nodes in old space:
a61af66fc99e Initial load
duke
parents:
diff changeset
75 GrowableArray<Node_Notes*>* _old_node_note_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // Node labeling iterator for instruction selection
a61af66fc99e Initial load
duke
parents:
diff changeset
78 Node *Label_Root( const Node *n, State *svec, Node *control, const Node *mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 Node *transform( Node *dummy );
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 Node_List &_proj_list; // For Machine nodes killing many values
a61af66fc99e Initial load
duke
parents:
diff changeset
83
168
7793bd37a336 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 0
diff changeset
84 Node_Array _shared_nodes;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 debug_only(Node_Array _old2new_map;) // Map roots of ideal-trees to machine-roots
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
87 debug_only(Node_Array _new2old_map;) // Maps machine nodes back to ideal
0
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Accessors for the inherited field PhaseTransform::_nodes:
a61af66fc99e Initial load
duke
parents:
diff changeset
90 void grow_new_node_array(uint idx_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _nodes.map(idx_limit-1, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 bool has_new_node(const Node* n) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 return _nodes.at(n->_idx) != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 Node* new_node(const Node* n) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 assert(has_new_node(n), "set before get");
a61af66fc99e Initial load
duke
parents:
diff changeset
98 return _nodes.at(n->_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void set_new_node(const Node* n, Node *nn) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 assert(!has_new_node(n), "set only once");
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _nodes.map(n->_idx, nn);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Make sure only new nodes are reachable from this node
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void verify_new_nodes_only(Node* root);
216
8d191a7697e2 6715633: when matching a memory node the adr_type should not change
kvn
parents: 168
diff changeset
108
8d191a7697e2 6715633: when matching a memory node the adr_type should not change
kvn
parents: 168
diff changeset
109 Node* _mem_node; // Ideal memory node consumed by mach node
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
111
729
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
112 // Mach node for ConP #NULL
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
113 MachNode* _mach_null;
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
114
0
a61af66fc99e Initial load
duke
parents:
diff changeset
115 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
116 int LabelRootDepth;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 static const int base2reg[]; // Map Types to machine register types
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Convert ideal machine register to a register mask for spill-loads
a61af66fc99e Initial load
duke
parents:
diff changeset
119 static const RegMask *idealreg2regmask[];
a61af66fc99e Initial load
duke
parents:
diff changeset
120 RegMask *idealreg2spillmask[_last_machine_leaf];
a61af66fc99e Initial load
duke
parents:
diff changeset
121 RegMask *idealreg2debugmask[_last_machine_leaf];
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void init_spill_mask( Node *ret );
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Convert machine register number to register mask
a61af66fc99e Initial load
duke
parents:
diff changeset
124 static uint mreg2regmask_max;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 static RegMask mreg2regmask[];
a61af66fc99e Initial load
duke
parents:
diff changeset
126 static RegMask STACK_ONLY_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
127
729
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
128 MachNode* mach_null() const { return _mach_null; }
04fa5affa478 6709742: find_base_for_derived's use of Ideal NULL is unsafe causing crashes during register allocation
kvn
parents: 415
diff changeset
129
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 bool is_shared( Node *n ) { return _shared.test(n->_idx) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void set_shared( Node *n ) { _shared.set(n->_idx); }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 bool is_visited( Node *n ) { return _visited.test(n->_idx) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133 void set_visited( Node *n ) { _visited.set(n->_idx); }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 bool is_dontcare( Node *n ) { return _dontcare.test(n->_idx) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void set_dontcare( Node *n ) { _dontcare.set(n->_idx); }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // Mode bit to tell DFA and expand rules whether we are running after
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // (or during) register selection. Usually, the matcher runs before,
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // but it will also get called to generate post-allocation spill code.
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // In this situation, it is a deadly error to attempt to allocate more
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // temporary registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
142 bool _allocation_started;
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Machine register names
a61af66fc99e Initial load
duke
parents:
diff changeset
145 static const char *regName[];
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Machine register encodings
a61af66fc99e Initial load
duke
parents:
diff changeset
147 static const unsigned char _regEncode[];
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Machine Node names
a61af66fc99e Initial load
duke
parents:
diff changeset
149 const char **_ruleName;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Rules that are cheaper to rematerialize than to spill
a61af66fc99e Initial load
duke
parents:
diff changeset
151 static const uint _begin_rematerialize;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 static const uint _end_rematerialize;
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // An array of chars, from 0 to _last_Mach_Reg.
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // No Save = 'N' (for register windows)
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Save on Entry = 'E'
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Save on Call = 'C'
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // Always Save = 'A' (same as SOE + SOC)
a61af66fc99e Initial load
duke
parents:
diff changeset
159 const char *_register_save_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 const char *_c_reg_save_policy;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Convert a machine register to a machine register type, so-as to
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // properly match spill code.
a61af66fc99e Initial load
duke
parents:
diff changeset
163 const int *_register_save_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // Maps from machine register to boolean; true if machine register can
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // be holding a call argument in some signature.
a61af66fc99e Initial load
duke
parents:
diff changeset
166 static bool can_be_java_arg( int reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // Maps from machine register to boolean; true if machine register holds
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // a spillable argument.
a61af66fc99e Initial load
duke
parents:
diff changeset
169 static bool is_spillable_arg( int reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // List of IfFalse or IfTrue Nodes that indicate a taken null test.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // List is valid in the post-matching space.
a61af66fc99e Initial load
duke
parents:
diff changeset
173 Node_List _null_check_tests;
368
36ccc817fca4 6747051: Improve code and implicit null check generation for compressed oops
kvn
parents: 235
diff changeset
174 void collect_null_checks( Node *proj, Node *orig_proj );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
175 void validate_null_checks( );
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 Matcher( Node_List &proj_list );
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // Select instructions for entire method
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void match( );
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Helper for match
a61af66fc99e Initial load
duke
parents:
diff changeset
182 OptoReg::Name warp_incoming_stk_arg( VMReg reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Transform, then walk. Does implicit DCE while walking.
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Name changed from "transform" to avoid it being virtual.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 Node *xform( Node *old_space_node, int Nodes );
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Match a single Ideal Node - turn it into a 1-Node tree; Label & Reduce.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 MachNode *match_tree( const Node *n );
a61af66fc99e Initial load
duke
parents:
diff changeset
190 MachNode *match_sfpt( SafePointNode *sfpt );
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // Helper for match_sfpt
a61af66fc99e Initial load
duke
parents:
diff changeset
192 OptoReg::Name warp_outgoing_stk_arg( VMReg reg, OptoReg::Name begin_out_arg_area, OptoReg::Name &out_arg_limit_per_call );
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Initialize first stack mask and related masks.
a61af66fc99e Initial load
duke
parents:
diff changeset
195 void init_first_stack_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // If we should save-on-entry this register
a61af66fc99e Initial load
duke
parents:
diff changeset
198 bool is_save_on_entry( int reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // Fixup the save-on-entry registers
a61af66fc99e Initial load
duke
parents:
diff changeset
201 void Fixup_Save_On_Entry( );
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // --- Frame handling ---
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Register number of the stack slot corresponding to the incoming SP.
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Per the Big Picture in the AD file, it is:
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // SharedInfo::stack0 + locks + in_preserve_stack_slots + pad2.
a61af66fc99e Initial load
duke
parents:
diff changeset
208 OptoReg::Name _old_SP;
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // Register number of the stack slot corresponding to the highest incoming
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // argument on the stack. Per the Big Picture in the AD file, it is:
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // _old_SP + out_preserve_stack_slots + incoming argument size.
a61af66fc99e Initial load
duke
parents:
diff changeset
213 OptoReg::Name _in_arg_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Register number of the stack slot corresponding to the new SP.
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Per the Big Picture in the AD file, it is:
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // _in_arg_limit + pad0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 OptoReg::Name _new_SP;
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Register number of the stack slot corresponding to the highest outgoing
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // argument on the stack. Per the Big Picture in the AD file, it is:
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // _new_SP + max outgoing arguments of all calls
a61af66fc99e Initial load
duke
parents:
diff changeset
223 OptoReg::Name _out_arg_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 OptoRegPair *_parm_regs; // Array of machine registers per argument
a61af66fc99e Initial load
duke
parents:
diff changeset
226 RegMask *_calling_convention_mask; // Array of RegMasks per argument
a61af66fc99e Initial load
duke
parents:
diff changeset
227
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
228 // Does matcher have a match rule for this ideal node?
0
a61af66fc99e Initial load
duke
parents:
diff changeset
229 static const bool has_match_rule(int opcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 static const bool _hasMatchRule[_last_opcode];
a61af66fc99e Initial load
duke
parents:
diff changeset
231
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
232 // Does matcher have a match rule for this ideal node and is the
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
233 // predicate (if there is one) true?
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
234 // NOTE: If this function is used more commonly in the future, ADLC
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
235 // should generate this one.
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
236 static const bool match_rule_supported(int opcode);
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 729
diff changeset
237
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // Used to determine if we have fast l2f conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // USII has it, USIII doesn't
a61af66fc99e Initial load
duke
parents:
diff changeset
240 static const bool convL2FSupported(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Vector width in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
243 static const uint vector_width_in_bytes(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Vector ideal reg
a61af66fc99e Initial load
duke
parents:
diff changeset
246 static const uint vector_ideal_reg(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // Used to determine a "low complexity" 64-bit constant. (Zero is simple.)
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // The standard of comparison is one (StoreL ConL) vs. two (StoreI ConI).
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Depends on the details of 64-bit constant generation on the CPU.
a61af66fc99e Initial load
duke
parents:
diff changeset
251 static const bool isSimpleConstant64(jlong con);
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // These calls are all generated by the ADLC
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // TRUE - grows up, FALSE - grows down (Intel)
a61af66fc99e Initial load
duke
parents:
diff changeset
256 virtual bool stack_direction() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // Java-Java calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // (what you use when Java calls Java)
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // Alignment of stack in bytes, standard Intel word alignment is 4.
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // Sparc probably wants at least double-word (8).
a61af66fc99e Initial load
duke
parents:
diff changeset
263 static uint stack_alignment_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // Alignment of stack, measured in stack slots.
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // The size of stack slots is defined by VMRegImpl::stack_slot_size.
a61af66fc99e Initial load
duke
parents:
diff changeset
266 static uint stack_alignment_in_slots() {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 return stack_alignment_in_bytes() / (VMRegImpl::stack_slot_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // Array mapping arguments to registers. Argument 0 is usually the 'this'
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // pointer. Registers can include stack-slots and regular registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
272 static void calling_convention( BasicType *, VMRegPair *, uint len, bool is_outgoing );
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Convert a sig into a calling convention register layout
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // and find interesting things about it.
a61af66fc99e Initial load
duke
parents:
diff changeset
276 static OptoReg::Name find_receiver( bool is_outgoing );
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Return address register. On Intel it is a stack-slot. On PowerPC
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // it is the Link register. On Sparc it is r31?
a61af66fc99e Initial load
duke
parents:
diff changeset
279 virtual OptoReg::Name return_addr() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
280 RegMask _return_addr_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // Return value register. On Intel it is EAX. On Sparc i0/o0.
a61af66fc99e Initial load
duke
parents:
diff changeset
282 static OptoRegPair return_value(int ideal_reg, bool is_outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
283 static OptoRegPair c_return_value(int ideal_reg, bool is_outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
284 RegMask _return_value_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Inline Cache Register
a61af66fc99e Initial load
duke
parents:
diff changeset
286 static OptoReg::Name inline_cache_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
287 static const RegMask &inline_cache_reg_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
288 static int inline_cache_reg_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // Register for DIVI projection of divmodI
a61af66fc99e Initial load
duke
parents:
diff changeset
291 static RegMask divI_proj_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // Register for MODI projection of divmodI
a61af66fc99e Initial load
duke
parents:
diff changeset
293 static RegMask modI_proj_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // Register for DIVL projection of divmodL
a61af66fc99e Initial load
duke
parents:
diff changeset
296 static RegMask divL_proj_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // Register for MODL projection of divmodL
a61af66fc99e Initial load
duke
parents:
diff changeset
298 static RegMask modL_proj_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // Java-Interpreter calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // (what you use when calling between compiled-Java and Interpreted-Java
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // Number of callee-save + always-save registers
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Ignores frame pointer and "special" registers
a61af66fc99e Initial load
duke
parents:
diff changeset
305 static int number_of_saved_registers();
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // The Method-klass-holder may be passed in the inline_cache_reg
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // and then expanded into the inline_cache_reg and a method_oop register
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 static OptoReg::Name interpreter_method_oop_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
311 static const RegMask &interpreter_method_oop_reg_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
312 static int interpreter_method_oop_reg_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 static OptoReg::Name compiler_method_oop_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 static const RegMask &compiler_method_oop_reg_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
316 static int compiler_method_oop_reg_encode();
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Interpreter's Frame Pointer Register
a61af66fc99e Initial load
duke
parents:
diff changeset
319 static OptoReg::Name interpreter_frame_pointer_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
320 static const RegMask &interpreter_frame_pointer_reg_mask();
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // Java-Native calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // (what you use when intercalling between Java and C++ code)
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // Array mapping arguments to registers. Argument 0 is usually the 'this'
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // pointer. Registers can include stack-slots and regular registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
327 static void c_calling_convention( BasicType*, VMRegPair *, uint );
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // Frame pointer. The frame pointer is kept at the base of the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // and so is probably the stack pointer for most machines. On Intel
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // it is ESP. On the PowerPC it is R1. On Sparc it is SP.
a61af66fc99e Initial load
duke
parents:
diff changeset
331 OptoReg::Name c_frame_pointer() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 static RegMask c_frame_ptr_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // !!!!! Special stuff for building ScopeDescs
a61af66fc99e Initial load
duke
parents:
diff changeset
335 virtual int regnum_to_fpu_offset(int regnum);
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // Is this branch offset small enough to be addressed by a short branch?
415
4d9884b01ba6 6754519: don't emit flag fixup for NaN when condition being tested doesn't need it
never
parents: 368
diff changeset
338 bool is_short_branch_offset(int rule, int offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // Optional scaling for the parameter to the ClearArray/CopyArray node.
a61af66fc99e Initial load
duke
parents:
diff changeset
341 static const bool init_array_count_is_in_bytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
342
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // Threshold small size (in bytes) for a ClearArray/CopyArray node.
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // Anything this size or smaller may get converted to discrete scalar stores.
a61af66fc99e Initial load
duke
parents:
diff changeset
345 static const int init_array_short_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Should the Matcher clone shifts on addressing modes, expecting them to
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // be subsumed into complex addressing expressions or compute them into
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // registers? True for Intel but false for most RISCs
a61af66fc99e Initial load
duke
parents:
diff changeset
350 static const bool clone_shift_expressions;
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // Is it better to copy float constants, or load them directly from memory?
a61af66fc99e Initial load
duke
parents:
diff changeset
353 // Intel can load a float constant from a direct address, requiring no
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // extra registers. Most RISCs will have to materialize an address into a
a61af66fc99e Initial load
duke
parents:
diff changeset
355 // register first, so they may as well materialize the constant immediately.
a61af66fc99e Initial load
duke
parents:
diff changeset
356 static const bool rematerialize_float_constants;
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // If CPU can load and store mis-aligned doubles directly then no fixup is
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // needed. Else we split the double into 2 integer pieces and move it
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // piece-by-piece. Only happens when passing doubles into C code or when
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // calling i2c adapters as the Java calling convention forces doubles to be
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
363 static const bool misaligned_doubles_ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // Perform a platform dependent implicit null fixup. This is needed
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // on windows95 to take care of some unusual register constraints.
a61af66fc99e Initial load
duke
parents:
diff changeset
367 void pd_implicit_null_fixup(MachNode *load, uint idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 // Advertise here if the CPU requires explicit rounding operations
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // to implement the UseStrictFP mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
371 static const bool strict_fp_requires_explicit_rounding;
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // Do floats take an entire double register or just half?
a61af66fc99e Initial load
duke
parents:
diff changeset
374 static const bool float_in_double;
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // Do ints take an entire long register or just half?
a61af66fc99e Initial load
duke
parents:
diff changeset
376 static const bool int_in_long;
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // This routine is run whenever a graph fails to match.
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // If it returns, the compiler should bailout to interpreter without error.
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // In non-product mode, SoftMatchFailure is false to detect non-canonical
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // graphs. Print a message and exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
382 static void soft_match_failure() {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 if( SoftMatchFailure ) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
384 else { fatal("SoftMatchFailure is not allowed except in product"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Used by the DFA in dfa_sparc.cpp. Check for a prior FastLock
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // acting as an Acquire and thus we don't need an Acquire here. We
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // retain the Node to act as a compiler ordering barrier.
a61af66fc99e Initial load
duke
parents:
diff changeset
390 static bool prior_fast_lock( const Node *acq );
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // Used by the DFA in dfa_sparc.cpp. Check for a following
a61af66fc99e Initial load
duke
parents:
diff changeset
393 // FastUnLock acting as a Release and thus we don't need a Release
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // here. We retain the Node to act as a compiler ordering barrier.
a61af66fc99e Initial load
duke
parents:
diff changeset
395 static bool post_fast_unlock( const Node *rel );
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Check for a following volatile memory barrier without an
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // intervening load and thus we don't need a barrier here. We
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // retain the Node to act as a compiler ordering barrier.
a61af66fc99e Initial load
duke
parents:
diff changeset
400 static bool post_store_load_barrier(const Node* mb);
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
404 void dump_old2new_map(); // machine-independent to machine-dependent
222
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
405
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
406 Node* find_old_node(Node* new_node) {
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
407 return _new2old_map[new_node->_idx];
2a1a77d3458f 6718676: putback for 6604014 is incomplete
never
parents: 216
diff changeset
408 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
409 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
410 };