annotate src/share/vm/opto/parse.hpp @ 1994:6cd6d394f280

7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed()) 7002546: regression on SpecJbb2005 on 7b118 comparing to 7b117 on small heaps Summary: Relaxed assertion checking related to incremental_collection_failed flag to allow for ExplicitGCInvokesConcurrent behaviour where we do not want a failing scavenge to bail to a stop-world collection. Parameterized incremental_collection_will_fail() so we can selectively use, or not use, as appropriate, the statistical prediction at specific use sites. This essentially reverts the scavenge bail-out logic to what it was prior to some recent changes that had inadvertently started using the statistical prediction which can be noisy in the presence of bursty loads. Added some associated verbose non-product debugging messages. Reviewed-by: johnc, tonyp
author ysr
date Tue, 07 Dec 2010 21:55:53 -0800
parents f95d63e2154a
children c7f3d0b4570f 9dc311b8473e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1344
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1344
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1344
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
25 #ifndef SHARE_VM_OPTO_PARSE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
26 #define SHARE_VM_OPTO_PARSE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
28 #include "ci/ciMethodData.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
29 #include "ci/ciTypeFlow.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
30 #include "compiler/methodLiveness.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
31 #include "libadt/vectset.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
32 #include "oops/generateOopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
33 #include "opto/graphKit.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
34 #include "opto/subnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
35
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class BytecodeParseHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class InlineTree;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class Parse;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class SwitchRange;
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 //------------------------------InlineTree-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class InlineTree : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 Compile* C; // cache
a61af66fc99e Initial load
duke
parents:
diff changeset
45 JVMState* _caller_jvms; // state of caller
a61af66fc99e Initial load
duke
parents:
diff changeset
46 ciMethod* _method; // method being called by the caller_jvms
a61af66fc99e Initial load
duke
parents:
diff changeset
47 InlineTree* _caller_tree;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 uint _count_inline_bcs; // Accumulated count of inlined bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // Call-site count / interpreter invocation count, scaled recursively.
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Always between 0.0 and 1.0. Represents the percentage of the method's
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // total execution time used at this call site.
a61af66fc99e Initial load
duke
parents:
diff changeset
52 const float _site_invoke_ratio;
1157
c3b315a0d58a 6912063: inlining parameters need to be adjusted for some uses of the JVM
jrose
parents: 989
diff changeset
53 const int _site_depth_adjust;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 float compute_callee_frequency( int caller_bci ) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 GrowableArray<InlineTree*> _subtrees;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 friend class Compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
60 InlineTree(Compile* C,
a61af66fc99e Initial load
duke
parents:
diff changeset
61 const InlineTree* caller_tree,
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ciMethod* callee_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
63 JVMState* caller_jvms,
a61af66fc99e Initial load
duke
parents:
diff changeset
64 int caller_bci,
1157
c3b315a0d58a 6912063: inlining parameters need to be adjusted for some uses of the JVM
jrose
parents: 989
diff changeset
65 float site_invoke_ratio,
c3b315a0d58a 6912063: inlining parameters need to be adjusted for some uses of the JVM
jrose
parents: 989
diff changeset
66 int site_depth_adjust);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 InlineTree *build_inline_tree_for_callee(ciMethod* callee_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
68 JVMState* caller_jvms,
a61af66fc99e Initial load
duke
parents:
diff changeset
69 int caller_bci);
41
874b2c4f43d1 6667605: (Escape Analysis) inline java constructors when EA is on
kvn
parents: 0
diff changeset
70 const char* try_to_inline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result);
874b2c4f43d1 6667605: (Escape Analysis) inline java constructors when EA is on
kvn
parents: 0
diff changeset
71 const char* shouldInline(ciMethod* callee_method, ciMethod* caller_method, int caller_bci, ciCallProfile& profile, WarmCallInfo* wci_result) const;
874b2c4f43d1 6667605: (Escape Analysis) inline java constructors when EA is on
kvn
parents: 0
diff changeset
72 const char* shouldNotInline(ciMethod* callee_method, ciMethod* caller_method, WarmCallInfo* wci_result) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void print_inlining(ciMethod *callee_method, int caller_bci, const char *failure_msg) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 InlineTree *caller_tree() const { return _caller_tree; }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 InlineTree* callee_at(int bci, ciMethod* m) const;
1157
c3b315a0d58a 6912063: inlining parameters need to be adjusted for some uses of the JVM
jrose
parents: 989
diff changeset
77 int inline_depth() const { return stack_depth() + _site_depth_adjust; }
c3b315a0d58a 6912063: inlining parameters need to be adjusted for some uses of the JVM
jrose
parents: 989
diff changeset
78 int stack_depth() const { return _caller_jvms ? _caller_jvms->depth() : 0; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static InlineTree* build_inline_tree_root();
a61af66fc99e Initial load
duke
parents:
diff changeset
82 static InlineTree* find_subtree_from_root(InlineTree* root, JVMState* jvms, ciMethod* callee, bool create_if_not_found = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // For temporary (stack-allocated, stateless) ilts:
1157
c3b315a0d58a 6912063: inlining parameters need to be adjusted for some uses of the JVM
jrose
parents: 989
diff changeset
85 InlineTree(Compile* c, ciMethod* callee_method, JVMState* caller_jvms, float site_invoke_ratio, int site_depth_adjust);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // InlineTree enum
a61af66fc99e Initial load
duke
parents:
diff changeset
88 enum InlineStyle {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 Inline_do_not_inline = 0, //
a61af66fc99e Initial load
duke
parents:
diff changeset
90 Inline_cha_is_monomorphic = 1, //
a61af66fc99e Initial load
duke
parents:
diff changeset
91 Inline_type_profile_monomorphic = 2 //
a61af66fc99e Initial load
duke
parents:
diff changeset
92 };
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // See if it is OK to inline.
605
98cb887364d3 6810672: Comment typos
twisti
parents: 435
diff changeset
95 // The receiver is the inline tree for the caller.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 //
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // The result is a temperature indication. If it is hot or cold,
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // inlining is immediate or undesirable. Otherwise, the info block
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // returned is newly allocated and may be enqueued.
a61af66fc99e Initial load
duke
parents:
diff changeset
100 //
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // If the method is inlinable, a new inline subtree is created on the fly,
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // and may be accessed by find_subtree_from_root.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // The call_method is the dest_method for a special or static invocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // The call_method is an optimized virtual method candidate otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
105 WarmCallInfo* ok_to_inline(ciMethod *call_method, JVMState* caller_jvms, ciCallProfile& profile, WarmCallInfo* wci);
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // Information about inlined method
a61af66fc99e Initial load
duke
parents:
diff changeset
108 JVMState* caller_jvms() const { return _caller_jvms; }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 ciMethod *method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 int caller_bci() const { return _caller_jvms ? _caller_jvms->bci() : InvocationEntryBci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 uint count_inline_bcs() const { return _count_inline_bcs; }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 float site_invoke_ratio() const { return _site_invoke_ratio; };
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
115 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
116 uint _count_inlines; // Count of inlined methods
a61af66fc99e Initial load
duke
parents:
diff changeset
117 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Debug information collected during parse
a61af66fc99e Initial load
duke
parents:
diff changeset
119 uint count_inlines() const { return _count_inlines; };
a61af66fc99e Initial load
duke
parents:
diff changeset
120 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
121 GrowableArray<InlineTree*> subtrees() { return _subtrees; }
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 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
126 //------------------------------Parse------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Parse bytecodes, build a Graph
a61af66fc99e Initial load
duke
parents:
diff changeset
128 class Parse : public GraphKit {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // Per-block information needed by the parser:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 class Block {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
133 ciTypeFlow::Block* _flow;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 int _pred_count; // how many predecessors in CFG?
a61af66fc99e Initial load
duke
parents:
diff changeset
135 int _preds_parsed; // how many of these have been parsed?
a61af66fc99e Initial load
duke
parents:
diff changeset
136 uint _count; // how many times executed? Currently only set by _goto's
a61af66fc99e Initial load
duke
parents:
diff changeset
137 bool _is_parsed; // has this block been parsed yet?
a61af66fc99e Initial load
duke
parents:
diff changeset
138 bool _is_handler; // is this block an exception handler?
a61af66fc99e Initial load
duke
parents:
diff changeset
139 SafePointNode* _start_map; // all values flowing into this block
a61af66fc99e Initial load
duke
parents:
diff changeset
140 MethodLivenessResult _live_locals; // lazily initialized liveness bitmap
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 int _num_successors; // Includes only normal control flow.
a61af66fc99e Initial load
duke
parents:
diff changeset
143 int _all_successors; // Include exception paths also.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 Block** _successors;
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Use init_node/init_graph to initialize Blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // Block() : _live_locals((uintptr_t*)NULL,0) { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 Block() : _live_locals(NULL,0) { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Set up the block data structure itself.
a61af66fc99e Initial load
duke
parents:
diff changeset
153 void init_node(Parse* outer, int po);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Set up the block's relations to other blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
155 void init_graph(Parse* outer);
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 ciTypeFlow::Block* flow() const { return _flow; }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int pred_count() const { return _pred_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 int preds_parsed() const { return _preds_parsed; }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 bool is_parsed() const { return _is_parsed; }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 bool is_handler() const { return _is_handler; }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 void set_count( uint x ) { _count = x; }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 uint count() const { return _count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 SafePointNode* start_map() const { assert(is_merged(),""); return _start_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 void set_start_map(SafePointNode* m) { assert(!is_merged(), ""); _start_map = m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // True after any predecessor flows control into this block
a61af66fc99e Initial load
duke
parents:
diff changeset
169 bool is_merged() const { return _start_map != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // True when all non-exception predecessors have been parsed.
a61af66fc99e Initial load
duke
parents:
diff changeset
172 bool is_ready() const { return preds_parsed() == pred_count(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 int num_successors() const { return _num_successors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 int all_successors() const { return _all_successors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 Block* successor_at(int i) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 assert((uint)i < (uint)all_successors(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return _successors[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 Block* successor_for_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 int start() const { return flow()->start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 int limit() const { return flow()->limit(); }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
184 int rpo() const { return flow()->rpo(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 int start_sp() const { return flow()->stack_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
187 bool is_loop_head() const { return flow()->is_loop_head(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
188 bool is_SEL_head() const { return flow()->is_single_entry_loop_head(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
189 bool is_SEL_backedge(Block* pred) const{ return is_SEL_head() && pred->rpo() >= rpo(); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
190 bool is_invariant_local(uint i) const {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
191 const JVMState* jvms = start_map()->jvms();
435
b1d6a3e95810 6766316: assert(!nocreate,"Cannot build a phi for a block already parsed.")
kvn
parents: 367
diff changeset
192 if (!jvms->is_loc(i) || flow()->outer()->has_irreducible_entry()) return false;
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
193 return flow()->is_invariant_local(i - jvms->locoff());
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
194 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
195 bool can_elide_SEL_phi(uint i) const { assert(is_SEL_head(),""); return is_invariant_local(i); }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
196
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 const Type* peek(int off=0) const { return stack_type_at(start_sp() - (off+1)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 const Type* stack_type_at(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 const Type* local_type_at(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 static const Type* get_type(ciType* t) { return Type::get_typeflow_type(t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 bool has_trap_at(int bci) const { return flow()->has_trap() && flow()->trap_bci() == bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Call this just before parsing a block.
a61af66fc99e Initial load
duke
parents:
diff changeset
206 void mark_parsed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 assert(!_is_parsed, "must parse each block exactly once");
a61af66fc99e Initial load
duke
parents:
diff changeset
208 _is_parsed = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Return the phi/region input index for the "current" pred,
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // and bump the pred number. For historical reasons these index
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // numbers are handed out in descending order. The last index is
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // always PhiNode::Input (i.e., 1). The value returned is known
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // as a "path number" because it distinguishes by which path we are
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // entering the block.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 int next_path_num() {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 assert(preds_parsed() < pred_count(), "too many preds?");
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return pred_count() - _preds_parsed++;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // Add a previously unaccounted predecessor to this block.
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // This operates by increasing the size of the block's region
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // and all its phi nodes (if any). The value returned is a
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // path number ("pnum").
a61af66fc99e Initial load
duke
parents:
diff changeset
226 int add_new_path();
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Initialize me by recording the parser's map. My own map must be NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
229 void record_state(Parse* outer);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 };
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // BytecodeParseHistogram collects number of bytecodes parsed, nodes constructed, and transformations.
a61af66fc99e Initial load
duke
parents:
diff changeset
234 class BytecodeParseHistogram : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
236 enum BPHType {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 BPH_transforms,
a61af66fc99e Initial load
duke
parents:
diff changeset
238 BPH_values
a61af66fc99e Initial load
duke
parents:
diff changeset
239 };
a61af66fc99e Initial load
duke
parents:
diff changeset
240 static bool _initialized;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 static uint _bytecodes_parsed [Bytecodes::number_of_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
242 static uint _nodes_constructed[Bytecodes::number_of_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
243 static uint _nodes_transformed[Bytecodes::number_of_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
244 static uint _new_values [Bytecodes::number_of_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 Bytecodes::Code _initial_bytecode;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 int _initial_node_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
248 int _initial_transforms;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 int _initial_values;
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 Parse *_parser;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 Compile *_compiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
255 static void reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // Return info being collected, select with global flag 'BytecodeParseInfo'
a61af66fc99e Initial load
duke
parents:
diff changeset
258 int current_count(BPHType info_selector);
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
261 BytecodeParseHistogram(Parse *p, Compile *c);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 static bool initialized();
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // Record info when starting to parse one bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
265 void set_initial_state( Bytecodes::Code bc );
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // Record results of parsing one bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
267 void record_change();
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Profile printing
a61af66fc99e Initial load
duke
parents:
diff changeset
270 static void print(float cutoff = 0.01F); // cutoff in percent
a61af66fc99e Initial load
duke
parents:
diff changeset
271 };
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Record work done during parsing
a61af66fc99e Initial load
duke
parents:
diff changeset
275 BytecodeParseHistogram* _parse_histogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 void set_parse_histogram(BytecodeParseHistogram *bph) { _parse_histogram = bph; }
a61af66fc99e Initial load
duke
parents:
diff changeset
277 BytecodeParseHistogram* parse_histogram() { return _parse_histogram; }
a61af66fc99e Initial load
duke
parents:
diff changeset
278 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
281 friend class Block;
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Variables which characterize this compilation as a whole:
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 JVMState* _caller; // JVMS which carries incoming args & state.
a61af66fc99e Initial load
duke
parents:
diff changeset
286 float _expected_uses; // expected number of calls to this code
a61af66fc99e Initial load
duke
parents:
diff changeset
287 float _prof_factor; // discount applied to my profile counts
a61af66fc99e Initial load
duke
parents:
diff changeset
288 int _depth; // Inline tree depth, for debug printouts
a61af66fc99e Initial load
duke
parents:
diff changeset
289 const TypeFunc*_tf; // My kind of function type
a61af66fc99e Initial load
duke
parents:
diff changeset
290 int _entry_bci; // the osr bci or InvocationEntryBci
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 ciTypeFlow* _flow; // Results of previous flow pass.
a61af66fc99e Initial load
duke
parents:
diff changeset
293 Block* _blocks; // Array of basic-block structs.
a61af66fc99e Initial load
duke
parents:
diff changeset
294 int _block_count; // Number of elements in _blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 GraphKit _exits; // Record all normal returns and throws here.
a61af66fc99e Initial load
duke
parents:
diff changeset
297 bool _wrote_final; // Did we write a final field?
a61af66fc99e Initial load
duke
parents:
diff changeset
298 bool _count_invocations; // update and test invocation counter
a61af66fc99e Initial load
duke
parents:
diff changeset
299 bool _method_data_update; // update method data oop
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // Variables which track Java semantics during bytecode parsing:
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 Block* _block; // block currently getting parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
304 ciBytecodeStream _iter; // stream of this method's bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 int _blocks_merged; // Progress meter: state merges from BB preds
a61af66fc99e Initial load
duke
parents:
diff changeset
307 int _blocks_parsed; // Progress meter: BBs actually parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 const FastLockNode* _synch_lock; // FastLockNode for synchronized method
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
312 int _max_switch_depth; // Debugging SwitchRanges.
a61af66fc99e Initial load
duke
parents:
diff changeset
313 int _est_switch_depth; // Debugging SwitchRanges.
a61af66fc99e Initial load
duke
parents:
diff changeset
314 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
318 Parse(JVMState* caller, ciMethod* parse_method, float expected_uses);
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320 virtual Parse* is_Parse() const { return (Parse*)this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Accessors.
a61af66fc99e Initial load
duke
parents:
diff changeset
324 JVMState* caller() const { return _caller; }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 float expected_uses() const { return _expected_uses; }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 float prof_factor() const { return _prof_factor; }
a61af66fc99e Initial load
duke
parents:
diff changeset
327 int depth() const { return _depth; }
a61af66fc99e Initial load
duke
parents:
diff changeset
328 const TypeFunc* tf() const { return _tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // entry_bci() -- see osr_bci, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 ciTypeFlow* flow() const { return _flow; }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
332 // blocks() -- see rpo_at, start_block, etc.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333 int block_count() const { return _block_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 GraphKit& exits() { return _exits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
336 bool wrote_final() const { return _wrote_final; }
a61af66fc99e Initial load
duke
parents:
diff changeset
337 void set_wrote_final(bool z) { _wrote_final = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 bool count_invocations() const { return _count_invocations; }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 bool method_data_update() const { return _method_data_update; }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 Block* block() const { return _block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
342 ciBytecodeStream& iter() { return _iter; }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 Bytecodes::Code bc() const { return _iter.cur_bc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 void set_block(Block* b) { _block = b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Derived accessors:
a61af66fc99e Initial load
duke
parents:
diff changeset
348 bool is_normal_parse() const { return _entry_bci == InvocationEntryBci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
349 bool is_osr_parse() const { return _entry_bci != InvocationEntryBci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
350 int osr_bci() const { assert(is_osr_parse(),""); return _entry_bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 void set_parse_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // Must this parse be aborted?
a61af66fc99e Initial load
duke
parents:
diff changeset
355 bool failing() { return C->failing(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
356
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
357 Block* rpo_at(int rpo) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
358 assert(0 <= rpo && rpo < _block_count, "oob");
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
359 return &_blocks[rpo];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361 Block* start_block() {
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 248
diff changeset
362 return rpo_at(flow()->start_block()->rpo());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // Can return NULL if the flow pass did not complete a block.
a61af66fc99e Initial load
duke
parents:
diff changeset
365 Block* successor_for_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 return block()->successor_for_bci(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
370 // Create a JVMS & map for the initial state of this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
371 SafePointNode* create_entry_map();
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // OSR helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
374 Node *fetch_interpreter_state(int index, BasicType bt, Node *local_addrs, Node *local_addrs_base);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 Node* check_interpreter_type(Node* l, const Type* type, SafePointNode* &bad_type_exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
376 void load_interpreter_state(Node* osr_buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Functions for managing basic blocks:
a61af66fc99e Initial load
duke
parents:
diff changeset
379 void init_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
380 void load_state_from(Block* b);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 void store_state_to(Block* b) { b->record_state(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // Parse all the basic blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
384 void do_all_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Parse the current basic block
a61af66fc99e Initial load
duke
parents:
diff changeset
387 void do_one_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
388
a61af66fc99e Initial load
duke
parents:
diff changeset
389 // Raise an error if we get a bad ciTypeFlow CFG.
a61af66fc99e Initial load
duke
parents:
diff changeset
390 void handle_missing_successor(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // first actions (before BCI 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
393 void do_method_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // implementation of monitorenter/monitorexit
a61af66fc99e Initial load
duke
parents:
diff changeset
396 void do_monitor_enter();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 void do_monitor_exit();
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // Eagerly create phie throughout the state, to cope with back edges.
a61af66fc99e Initial load
duke
parents:
diff changeset
400 void ensure_phis_everywhere();
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // Merge the current mapping into the basic block starting at bci
a61af66fc99e Initial load
duke
parents:
diff changeset
403 void merge( int target_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Same as plain merge, except that it allocates a new path number.
a61af66fc99e Initial load
duke
parents:
diff changeset
405 void merge_new_path( int target_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // Merge the current mapping into an exception handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
407 void merge_exception(int target_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // Helper: Merge the current mapping into the given basic block
a61af66fc99e Initial load
duke
parents:
diff changeset
409 void merge_common(Block* target, int pnum);
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Helper functions for merging individual cells.
a61af66fc99e Initial load
duke
parents:
diff changeset
411 PhiNode *ensure_phi( int idx, bool nocreate = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
412 PhiNode *ensure_memory_phi(int idx, bool nocreate = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // Helper to merge the current memory state into the given basic block
a61af66fc99e Initial load
duke
parents:
diff changeset
414 void merge_memory_edges(MergeMemNode* n, int pnum, bool nophi);
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Parse this bytecode, and alter the Parsers JVM->Node mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
417 void do_one_bytecode();
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // helper function to generate array store check
a61af66fc99e Initial load
duke
parents:
diff changeset
420 void array_store_check();
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // Helper function to generate array load
a61af66fc99e Initial load
duke
parents:
diff changeset
422 void array_load(BasicType etype);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // Helper function to generate array store
a61af66fc99e Initial load
duke
parents:
diff changeset
424 void array_store(BasicType etype);
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // Helper function to compute array addressing
a61af66fc99e Initial load
duke
parents:
diff changeset
426 Node* array_addressing(BasicType type, int vals, const Type* *result2=NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Pass current map to exits
a61af66fc99e Initial load
duke
parents:
diff changeset
429 void return_current(Node* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // Register finalizers on return from Object.<init>
a61af66fc99e Initial load
duke
parents:
diff changeset
432 void call_register_finalizer();
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // Insert a compiler safepoint into the graph
a61af66fc99e Initial load
duke
parents:
diff changeset
435 void add_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // Insert a compiler safepoint into the graph, if there is a back-branch.
a61af66fc99e Initial load
duke
parents:
diff changeset
438 void maybe_add_safepoint(int target_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 if (UseLoopSafepoints && target_bci <= bci()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 add_safepoint();
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1157
diff changeset
444 // Return true if the parser should add a loop predicate
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1157
diff changeset
445 bool should_add_predicate(int target_bci);
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1157
diff changeset
446 // Insert a loop predicate into the graph
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1157
diff changeset
447 void add_predicate();
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1157
diff changeset
448
0
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Note: Intrinsic generation routines may be found in library_call.cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // Helper function to setup Ideal Call nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
452 void do_call();
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // Helper function to uncommon-trap or bailout for non-compilable call-sites
a61af66fc99e Initial load
duke
parents:
diff changeset
455 bool can_not_compile_call_site(ciMethod *dest_method, ciInstanceKlass *klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Helper function to identify inlining potential at call-site
a61af66fc99e Initial load
duke
parents:
diff changeset
458 ciMethod* optimize_inlining(ciMethod* caller, int bci, ciInstanceKlass* klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
459 ciMethod *dest_method, const TypeOopPtr* receiver_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Helper function to setup for type-profile based inlining
a61af66fc99e Initial load
duke
parents:
diff changeset
462 bool prepare_type_profile_inline(ciInstanceKlass* prof_klass, ciMethod* prof_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Helper functions for type checking bytecodes:
a61af66fc99e Initial load
duke
parents:
diff changeset
465 void do_checkcast();
a61af66fc99e Initial load
duke
parents:
diff changeset
466 void do_instanceof();
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // Helper functions for shifting & arithmetic
a61af66fc99e Initial load
duke
parents:
diff changeset
469 void modf();
a61af66fc99e Initial load
duke
parents:
diff changeset
470 void modd();
a61af66fc99e Initial load
duke
parents:
diff changeset
471 void l2f();
a61af66fc99e Initial load
duke
parents:
diff changeset
472
a61af66fc99e Initial load
duke
parents:
diff changeset
473 void do_irem();
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // implementation of _get* and _put* bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
476 void do_getstatic() { do_field_access(true, false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 void do_getfield () { do_field_access(true, true); }
a61af66fc99e Initial load
duke
parents:
diff changeset
478 void do_putstatic() { do_field_access(false, false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
479 void do_putfield () { do_field_access(false, true); }
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // common code for making initial checks and forming addresses
a61af66fc99e Initial load
duke
parents:
diff changeset
482 void do_field_access(bool is_get, bool is_field);
a61af66fc99e Initial load
duke
parents:
diff changeset
483 bool static_field_ok_in_clinit(ciField *field, ciMethod *method);
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // common code for actually performing the load or store
a61af66fc99e Initial load
duke
parents:
diff changeset
486 void do_get_xxx(const TypePtr* obj_type, Node* obj, ciField* field, bool is_field);
a61af66fc99e Initial load
duke
parents:
diff changeset
487 void do_put_xxx(const TypePtr* obj_type, Node* obj, ciField* field, bool is_field);
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // loading from a constant field or the constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // returns false if push failed (non-perm field constants only, not ldcs)
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 844
diff changeset
491 bool push_constant(ciConstant con, bool require_constant = false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // implementation of object creation bytecodes
1645
3941674cc7fa 6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents: 1552
diff changeset
494 void emit_guard_for_new(ciInstanceKlass* klass);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
495 void do_new();
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void do_newarray(BasicType elemtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
497 void do_anewarray();
a61af66fc99e Initial load
duke
parents:
diff changeset
498 void do_multianewarray();
730
9c6be3edf0dc 6589834: deoptimization problem with -XX:+DeoptimizeALot
cfang
parents: 605
diff changeset
499 Node* expand_multianewarray(ciArrayKlass* array_klass, Node* *lengths, int ndimensions, int nargs);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
500
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // implementation of jsr/ret
a61af66fc99e Initial load
duke
parents:
diff changeset
502 void do_jsr();
a61af66fc99e Initial load
duke
parents:
diff changeset
503 void do_ret();
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 float dynamic_branch_prediction(float &cnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 float branch_prediction(float &cnt, BoolTest::mask btest, int target_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
507 bool seems_never_taken(float prob);
1746
4b29a725c43c 6912064: type profiles need to be exploited more for dynamic language support
jrose
parents: 1645
diff changeset
508 bool seems_stable_comparison(BoolTest::mask btest, Node* c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
509
248
18aab3cdd513 6726504: handle do_ifxxx calls in parser more uniformly
rasbold
parents: 196
diff changeset
510 void do_ifnull(BoolTest::mask btest, Node* c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
511 void do_if(BoolTest::mask btest, Node* c);
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1157
diff changeset
512 int repush_if_args();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
513 void adjust_map_after_if(BoolTest::mask btest, Node* c, float prob,
a61af66fc99e Initial load
duke
parents:
diff changeset
514 Block* path, Block* other_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
515 IfNode* jump_if_fork_int(Node* a, Node* b, BoolTest::mask mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
516 Node* jump_if_join(Node* iffalse, Node* iftrue);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 void jump_if_true_fork(IfNode *ifNode, int dest_bci_if_true, int prof_table_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
518 void jump_if_false_fork(IfNode *ifNode, int dest_bci_if_false, int prof_table_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 void jump_if_always_fork(int dest_bci_if_true, int prof_table_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 friend class SwitchRange;
a61af66fc99e Initial load
duke
parents:
diff changeset
522 void do_tableswitch();
a61af66fc99e Initial load
duke
parents:
diff changeset
523 void do_lookupswitch();
a61af66fc99e Initial load
duke
parents:
diff changeset
524 void jump_switch_ranges(Node* a, SwitchRange* lo, SwitchRange* hi, int depth = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 bool create_jump_tables(Node* a, SwitchRange* lo, SwitchRange* hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // helper functions for methodData style profiling
a61af66fc99e Initial load
duke
parents:
diff changeset
528 void test_counter_against_threshold(Node* cnt, int limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
529 void increment_and_test_invocation_counter(int limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
530 void test_for_osr_md_counter_at(ciMethodData* md, ciProfileData* data, ByteSize offset, int limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
531 Node* method_data_addressing(ciMethodData* md, ciProfileData* data, ByteSize offset, Node* idx = NULL, uint stride = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
532 void increment_md_counter_at(ciMethodData* md, ciProfileData* data, ByteSize offset, Node* idx = NULL, uint stride = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 void set_md_flag_at(ciMethodData* md, ciProfileData* data, int flag_constant);
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 void profile_method_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
536 void profile_taken_branch(int target_bci, bool force_update = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
537 void profile_not_taken_branch(bool force_update = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
538 void profile_call(Node* receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 void profile_generic_call();
a61af66fc99e Initial load
duke
parents:
diff changeset
540 void profile_receiver_type(Node* receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 void profile_ret(int target_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
542 void profile_null_checkcast();
a61af66fc99e Initial load
duke
parents:
diff changeset
543 void profile_switch_case(int table_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // helper function for call statistics
a61af66fc99e Initial load
duke
parents:
diff changeset
546 void count_compiled_calls(bool at_method_entry, bool is_inline) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 Node_Notes* make_node_notes(Node_Notes* caller_nn);
a61af66fc99e Initial load
duke
parents:
diff changeset
549
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // Helper functions for handling normal and abnormal exits.
a61af66fc99e Initial load
duke
parents:
diff changeset
551 void build_exits();
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // Fix up all exceptional control flow exiting a single bytecode.
a61af66fc99e Initial load
duke
parents:
diff changeset
554 void do_exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
555
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // Fix up all exiting control flow at the end of the parse.
a61af66fc99e Initial load
duke
parents:
diff changeset
557 void do_exits();
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // Add Catch/CatchProjs
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // The call is either a Java call or the VM's rethrow stub
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void catch_call_exceptions(ciExceptionHandlerStream&);
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // Handle all exceptions thrown by the inlined method.
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // Also handles exceptions for individual bytecodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 void catch_inline_exceptions(SafePointNode* ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // Merge the given map into correct exceptional exit state.
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // Assumes that there is no applicable local handler.
a61af66fc99e Initial load
duke
parents:
diff changeset
569 void throw_to_exit(SafePointNode* ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
572 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // Handle PrintOpto, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
574 void show_parse_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
575 void dump_map_adr_mem() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
576 static void print_statistics(); // Print some performance counters
a61af66fc99e Initial load
duke
parents:
diff changeset
577 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
578 void dump_bci(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
579 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
580 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
581
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1746
diff changeset
582 #endif // SHARE_VM_OPTO_PARSE_HPP