annotate src/share/vm/opto/parse1.cpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents 5698813d45eb
children 6f3fd5150b67
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6268
diff changeset
2 * Copyright (c) 1997, 2012, 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: 1377
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1377
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: 1377
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: 1609
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
26 #include "compiler/compileLog.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
27 #include "interpreter/linkResolver.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6268
diff changeset
28 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
29 #include "opto/addnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
30 #include "opto/idealGraphPrinter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
31 #include "opto/locknode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
32 #include "opto/memnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
33 #include "opto/parse.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
34 #include "opto/rootnode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
35 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
36 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
37 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
38 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1609
diff changeset
39 #include "utilities/copy.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // Static array so we can figure out which bytecodes stop us from compiling
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // the most. Some of the non-static variables are needed in bytecodeInfo.cpp
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // and eventually should be encapsulated in a proper class (gri 8/18/98).
a61af66fc99e Initial load
duke
parents:
diff changeset
44
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
45 int nodes_created = 0;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
46 int methods_parsed = 0;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
47 int methods_seen = 0;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
48 int blocks_parsed = 0;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
49 int blocks_seen = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
50
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
51 int explicit_null_checks_inserted = 0;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
52 int explicit_null_checks_elided = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53 int all_null_checks_found = 0, implicit_null_checks = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 int implicit_null_throws = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 int reclaim_idx = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 int reclaim_in = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 int reclaim_node = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
61 bool Parse::BytecodeParseHistogram::_initialized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 uint Parse::BytecodeParseHistogram::_bytecodes_parsed [Bytecodes::number_of_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
63 uint Parse::BytecodeParseHistogram::_nodes_constructed[Bytecodes::number_of_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
64 uint Parse::BytecodeParseHistogram::_nodes_transformed[Bytecodes::number_of_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
65 uint Parse::BytecodeParseHistogram::_new_values [Bytecodes::number_of_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
66 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 //------------------------------print_statistics-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
69 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void Parse::print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 tty->print_cr("--- Compiler Statistics ---");
a61af66fc99e Initial load
duke
parents:
diff changeset
72 tty->print("Methods seen: %d Methods parsed: %d", methods_seen, methods_parsed);
a61af66fc99e Initial load
duke
parents:
diff changeset
73 tty->print(" Nodes created: %d", nodes_created);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
75 if (methods_seen != methods_parsed)
a61af66fc99e Initial load
duke
parents:
diff changeset
76 tty->print_cr("Reasons for parse failures (NOT cumulative):");
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
77 tty->print_cr("Blocks parsed: %d Blocks seen: %d", blocks_parsed, blocks_seen);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 if( explicit_null_checks_inserted )
a61af66fc99e Initial load
duke
parents:
diff changeset
80 tty->print_cr("%d original NULL checks - %d elided (%2d%%); optimizer leaves %d,", explicit_null_checks_inserted, explicit_null_checks_elided, (100*explicit_null_checks_elided)/explicit_null_checks_inserted, all_null_checks_found);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 if( all_null_checks_found )
a61af66fc99e Initial load
duke
parents:
diff changeset
82 tty->print_cr("%d made implicit (%2d%%)", implicit_null_checks,
a61af66fc99e Initial load
duke
parents:
diff changeset
83 (100*implicit_null_checks)/all_null_checks_found);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 if( implicit_null_throws )
a61af66fc99e Initial load
duke
parents:
diff changeset
85 tty->print_cr("%d implicit null exceptions at runtime",
a61af66fc99e Initial load
duke
parents:
diff changeset
86 implicit_null_throws);
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 if( PrintParseStatistics && BytecodeParseHistogram::initialized() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 BytecodeParseHistogram::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 //------------------------------ON STACK REPLACEMENT---------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // Construct a node which can be used to get incoming state for
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // on stack replacement.
a61af66fc99e Initial load
duke
parents:
diff changeset
98 Node *Parse::fetch_interpreter_state(int index,
a61af66fc99e Initial load
duke
parents:
diff changeset
99 BasicType bt,
a61af66fc99e Initial load
duke
parents:
diff changeset
100 Node *local_addrs,
a61af66fc99e Initial load
duke
parents:
diff changeset
101 Node *local_addrs_base) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 Node *mem = memory(Compile::AliasIdxRaw);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 Node *adr = basic_plus_adr( local_addrs_base, local_addrs, -index*wordSize );
1609
4311f23817fd 6959430: Make sure raw loads have control edge
kvn
parents: 1552
diff changeset
104 Node *ctl = control();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // Very similar to LoadNode::make, except we handle un-aligned longs and
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // doubles on Sparc. Intel can handle them just fine directly.
a61af66fc99e Initial load
duke
parents:
diff changeset
108 Node *l;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 switch( bt ) { // Signature is flattened
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
110 case T_INT: l = new (C) LoadINode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break;
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
111 case T_FLOAT: l = new (C) LoadFNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break;
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
112 case T_ADDRESS: l = new (C) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM ); break;
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
113 case T_OBJECT: l = new (C) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM ); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
114 case T_LONG:
a61af66fc99e Initial load
duke
parents:
diff changeset
115 case T_DOUBLE: {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Since arguments are in reverse order, the argument address 'adr'
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // refers to the back half of the long/double. Recompute adr.
a61af66fc99e Initial load
duke
parents:
diff changeset
118 adr = basic_plus_adr( local_addrs_base, local_addrs, -(index+1)*wordSize );
a61af66fc99e Initial load
duke
parents:
diff changeset
119 if( Matcher::misaligned_doubles_ok ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
120 l = (bt == T_DOUBLE)
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
121 ? (Node*)new (C) LoadDNode( ctl, mem, adr, TypeRawPtr::BOTTOM )
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
122 : (Node*)new (C) LoadLNode( ctl, mem, adr, TypeRawPtr::BOTTOM );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 l = (bt == T_DOUBLE)
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
125 ? (Node*)new (C) LoadD_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM )
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
126 : (Node*)new (C) LoadL_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return _gvn.transform(l);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Helper routine to prevent the interpreter from handing
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // unexpected typestate to an OSR method.
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // The Node l is a value newly dug out of the interpreter frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // The type is the type predicted by ciTypeFlow. Note that it is
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // not a general type, but can only come from Type::get_typeflow_type.
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // The safepoint is a map which will feed an uncommon trap.
a61af66fc99e Initial load
duke
parents:
diff changeset
141 Node* Parse::check_interpreter_type(Node* l, const Type* type,
a61af66fc99e Initial load
duke
parents:
diff changeset
142 SafePointNode* &bad_type_exit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 const TypeOopPtr* tp = type->isa_oopptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // TypeFlow may assert null-ness if a type appears unloaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
147 if (type == TypePtr::NULL_PTR ||
a61af66fc99e Initial load
duke
parents:
diff changeset
148 (tp != NULL && !tp->klass()->is_loaded())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Value must be null, not a real oop.
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
150 Node* chk = _gvn.transform( new (C) CmpPNode(l, null()) );
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
151 Node* tst = _gvn.transform( new (C) BoolNode(chk, BoolTest::eq) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
152 IfNode* iff = create_and_map_if(control(), tst, PROB_MAX, COUNT_UNKNOWN);
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
153 set_control(_gvn.transform( new (C) IfTrueNode(iff) ));
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
154 Node* bad_type = _gvn.transform( new (C) IfFalseNode(iff) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
155 bad_type_exit->control()->add_req(bad_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 l = null();
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // Typeflow can also cut off paths from the CFG, based on
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // types which appear unloaded, or call sites which appear unlinked.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // When paths are cut off, values at later merge points can rise
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // toward more specific classes. Make sure these specific classes
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // are still in effect.
a61af66fc99e Initial load
duke
parents:
diff changeset
164 if (tp != NULL && tp->klass() != C->env()->Object_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // TypeFlow asserted a specific object type. Value must have that type.
a61af66fc99e Initial load
duke
parents:
diff changeset
166 Node* bad_type_ctrl = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 l = gen_checkcast(l, makecon(TypeKlassPtr::make(tp->klass())), &bad_type_ctrl);
a61af66fc99e Initial load
duke
parents:
diff changeset
168 bad_type_exit->control()->add_req(bad_type_ctrl);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 BasicType bt_l = _gvn.type(l)->basic_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
172 BasicType bt_t = type->basic_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
173 assert(_gvn.type(l)->higher_equal(type), "must constrain OSR typestate");
a61af66fc99e Initial load
duke
parents:
diff changeset
174 return l;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // Helper routine which sets up elements of the initial parser map when
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // performing a parse for on stack replacement. Add values into map.
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // The only parameter contains the address of a interpreter arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void Parse::load_interpreter_state(Node* osr_buf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
181 int index;
a61af66fc99e Initial load
duke
parents:
diff changeset
182 int max_locals = jvms()->loc_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
183 int max_stack = jvms()->stk_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Mismatch between method and jvms can occur since map briefly held
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // an OSR entry state (which takes up one RawPtr word).
a61af66fc99e Initial load
duke
parents:
diff changeset
188 assert(max_locals == method()->max_locals(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
189 assert(max_stack >= method()->max_stack(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
190 assert((int)jvms()->endoff() == TypeFunc::Parms + max_locals + max_stack, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
191 assert((int)jvms()->endoff() == (int)map()->req(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Find the start block.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 Block* osr_block = start_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
195 assert(osr_block->start() == osr_bci(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // Set initial BCI.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 set_parse_bci(osr_block->start());
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // Set initial stack depth.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 set_sp(osr_block->start_sp());
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // Check bailouts. We currently do not perform on stack replacement
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // of loops in catch blocks or loops which branch with a non-empty stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
205 if (sp() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 C->record_method_not_compilable("OSR starts with non-empty stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
207 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // Do not OSR inside finally clauses:
a61af66fc99e Initial load
duke
parents:
diff changeset
210 if (osr_block->has_trap_at(osr_block->start())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 C->record_method_not_compilable("OSR starts with an immediate trap");
a61af66fc99e Initial load
duke
parents:
diff changeset
212 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Commute monitors from interpreter frame to compiler frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
216 assert(jvms()->monitor_depth() == 0, "should be no active locks at beginning of osr");
a61af66fc99e Initial load
duke
parents:
diff changeset
217 int mcnt = osr_block->flow()->monitor_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 Node *monitors_addr = basic_plus_adr(osr_buf, osr_buf, (max_locals+mcnt*2-1)*wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 for (index = 0; index < mcnt; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Make a BoxLockNode for the monitor.
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
221 Node *box = _gvn.transform(new (C) BoxLockNode(next_monitor()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Displaced headers and locked objects are interleaved in the
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // temp OSR buffer. We only copy the locked objects out here.
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Fetch the locked object from the OSR temp buffer and copy to our fastlock node.
a61af66fc99e Initial load
duke
parents:
diff changeset
227 Node *lock_object = fetch_interpreter_state(index*2, T_OBJECT, monitors_addr, osr_buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Try and copy the displaced header to the BoxNode
a61af66fc99e Initial load
duke
parents:
diff changeset
229 Node *displaced_hdr = fetch_interpreter_state((index*2) + 1, T_ADDRESS, monitors_addr, osr_buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231
a61af66fc99e Initial load
duke
parents:
diff changeset
232 store_to_memory(control(), box, displaced_hdr, T_ADDRESS, Compile::AliasIdxRaw);
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // Build a bogus FastLockNode (no code will be generated) and push the
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // monitor into our debug info.
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
236 const FastLockNode *flock = _gvn.transform(new (C) FastLockNode( 0, lock_object, box ))->as_FastLock();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
237 map()->push_monitor(flock);
a61af66fc99e Initial load
duke
parents:
diff changeset
238
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // If the lock is our method synchronization lock, tuck it away in
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // _sync_lock for return and rethrow exit paths.
a61af66fc99e Initial load
duke
parents:
diff changeset
241 if (index == 0 && method()->is_synchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
242 _synch_lock = flock;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245
991
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 844
diff changeset
246 // Use the raw liveness computation to make sure that unexpected
3a2aa26bdc58 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 844
diff changeset
247 // values don't propagate into the OSR frame.
1070
87b2fdd4bf98 6892079: live value must not be garbage failure after fix for 6854812
never
parents: 991
diff changeset
248 MethodLivenessResult live_locals = method()->liveness_at_bci(osr_bci());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 if (!live_locals.is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // Degenerate or breakpointed method.
a61af66fc99e Initial load
duke
parents:
diff changeset
251 C->record_method_not_compilable("OSR in empty or breakpointed method");
a61af66fc99e Initial load
duke
parents:
diff changeset
252 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // Extract the needed locals from the interpreter frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
256 Node *locals_addr = basic_plus_adr(osr_buf, osr_buf, (max_locals-1)*wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // find all the locals that the interpreter thinks contain live oops
a61af66fc99e Initial load
duke
parents:
diff changeset
259 const BitMap live_oops = method()->live_local_oops_at_bci(osr_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
260 for (index = 0; index < max_locals; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (!live_locals.at(index)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 const Type *type = osr_block->local_type_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 if (type->isa_oopptr() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // 6403625: Verify that the interpreter oopMap thinks that the oop is live
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // else we might load a stale oop if the MethodLiveness disagrees with the
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // result of the interpreter. If the interpreter says it is dead we agree
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // by making the value go to top.
a61af66fc99e Initial load
duke
parents:
diff changeset
274 //
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 if (!live_oops.at(index)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (C->log() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 C->log()->elem("OSR_mismatch local_index='%d'",index);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 set_local(index, null());
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // and ignore it for the loads
a61af66fc99e Initial load
duke
parents:
diff changeset
282 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // Filter out TOP, HALF, and BOTTOM. (Cf. ensure_phi.)
a61af66fc99e Initial load
duke
parents:
diff changeset
287 if (type == Type::TOP || type == Type::HALF) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // If the type falls to bottom, then this must be a local that
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // is mixing ints and oops or some such. Forcing it to top
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // makes it go dead.
a61af66fc99e Initial load
duke
parents:
diff changeset
293 if (type == Type::BOTTOM) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Construct code to access the appropriate local.
1377
ef74d6d1ac1e 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 1344
diff changeset
297 BasicType bt = type->basic_type();
ef74d6d1ac1e 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 1344
diff changeset
298 if (type == TypePtr::NULL_PTR) {
ef74d6d1ac1e 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 1344
diff changeset
299 // Ptr types are mixed together with T_ADDRESS but NULL is
ef74d6d1ac1e 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 1344
diff changeset
300 // really for T_OBJECT types so correct it.
ef74d6d1ac1e 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 1344
diff changeset
301 bt = T_OBJECT;
ef74d6d1ac1e 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 1344
diff changeset
302 }
ef74d6d1ac1e 6938026: C2 compiler fails in Node::rematerialize()const
never
parents: 1344
diff changeset
303 Node *value = fetch_interpreter_state(index, bt, locals_addr, osr_buf);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
304 set_local(index, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Extract the needed stack entries from the interpreter frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
308 for (index = 0; index < sp(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 const Type *type = osr_block->stack_type_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 if (type != Type::TOP) {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Currently the compiler bails out when attempting to on stack replace
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // at a bci with a non-empty stack. We should not reach here.
a61af66fc99e Initial load
duke
parents:
diff changeset
313 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // End the OSR migration
a61af66fc99e Initial load
duke
parents:
diff changeset
318 make_runtime_call(RC_LEAF, OptoRuntime::osr_end_Type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
319 CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_end),
a61af66fc99e Initial load
duke
parents:
diff changeset
320 "OSR_migration_end", TypeRawPtr::BOTTOM,
a61af66fc99e Initial load
duke
parents:
diff changeset
321 osr_buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Now that the interpreter state is loaded, make sure it will match
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // at execution time what the compiler is expecting now:
a61af66fc99e Initial load
duke
parents:
diff changeset
325 SafePointNode* bad_type_exit = clone_map();
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
326 bad_type_exit->set_control(new (C) RegionNode(1));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
327
1278
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
328 assert(osr_block->flow()->jsrs()->size() == 0, "should be no jsrs live at osr point");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
329 for (index = 0; index < max_locals; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
330 if (stopped()) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 Node* l = local(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
332 if (l->is_top()) continue; // nothing here
a61af66fc99e Initial load
duke
parents:
diff changeset
333 const Type *type = osr_block->local_type_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
334 if (type->isa_oopptr() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 if (!live_oops.at(index)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // skip type check for dead oops
a61af66fc99e Initial load
duke
parents:
diff changeset
337 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
1281
7d236a9688c5 6930398: fix for return address locals in OSR entries uses wrong test
never
parents: 1278
diff changeset
340 if (osr_block->flow()->local_type_at(index)->is_return_address()) {
1278
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
341 // In our current system it's illegal for jsr addresses to be
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
342 // live into an OSR entry point because the compiler performs
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
343 // inlining of jsrs. ciTypeFlow has a bailout that detect this
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
344 // case and aborts the compile if addresses are live into an OSR
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
345 // entry point. Because of that we can assume that any address
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
346 // locals at the OSR entry point are dead. Method liveness
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
347 // isn't precise enought to figure out that they are dead in all
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
348 // cases so simply skip checking address locals all
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
349 // together. Any type check is guaranteed to fail since the
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
350 // interpreter type is the result of a load which might have any
da9559b49b84 6915557: assert(_gvn.type(l)->higher_equal(type),"must constrain OSR typestate") with debug build
never
parents: 1264
diff changeset
351 // value and the expected type is a constant.
1070
87b2fdd4bf98 6892079: live value must not be garbage failure after fix for 6854812
never
parents: 991
diff changeset
352 continue;
87b2fdd4bf98 6892079: live value must not be garbage failure after fix for 6854812
never
parents: 991
diff changeset
353 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
354 set_local(index, check_interpreter_type(l, type, bad_type_exit));
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 for (index = 0; index < sp(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if (stopped()) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 Node* l = stack(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 if (l->is_top()) continue; // nothing here
a61af66fc99e Initial load
duke
parents:
diff changeset
361 const Type *type = osr_block->stack_type_at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
362 set_stack(index, check_interpreter_type(l, type, bad_type_exit));
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 if (bad_type_exit->control()->req() > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // Build an uncommon trap here, if any inputs can be unexpected.
a61af66fc99e Initial load
duke
parents:
diff changeset
367 bad_type_exit->set_control(_gvn.transform( bad_type_exit->control() ));
a61af66fc99e Initial load
duke
parents:
diff changeset
368 record_for_igvn(bad_type_exit->control());
a61af66fc99e Initial load
duke
parents:
diff changeset
369 SafePointNode* types_are_good = map();
a61af66fc99e Initial load
duke
parents:
diff changeset
370 set_map(bad_type_exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // The unexpected type happens because a new edge is active
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // in the CFG, which typeflow had previously ignored.
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // E.g., Object x = coldAtFirst() && notReached()? "str": new Integer(123).
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // This x will be typed as Integer if notReached is not yet linked.
6824
f13867c41f73 7199742: A lot of C2 OSR compilations of the same method's bci
kvn
parents: 6804
diff changeset
375 // It could also happen due to a problem in ciTypeFlow analysis.
f13867c41f73 7199742: A lot of C2 OSR compilations of the same method's bci
kvn
parents: 6804
diff changeset
376 uncommon_trap(Deoptimization::Reason_constraint,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
377 Deoptimization::Action_reinterpret);
a61af66fc99e Initial load
duke
parents:
diff changeset
378 set_map(types_are_good);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 //------------------------------Parse------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // Main parser constructor.
a61af66fc99e Initial load
duke
parents:
diff changeset
384 Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
a61af66fc99e Initial load
duke
parents:
diff changeset
385 : _exits(caller)
a61af66fc99e Initial load
duke
parents:
diff changeset
386 {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Init some variables
a61af66fc99e Initial load
duke
parents:
diff changeset
388 _caller = caller;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 _method = parse_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 _expected_uses = expected_uses;
a61af66fc99e Initial load
duke
parents:
diff changeset
391 _depth = 1 + (caller->has_method() ? caller->depth() : 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
392 _wrote_final = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
393 _entry_bci = InvocationEntryBci;
a61af66fc99e Initial load
duke
parents:
diff changeset
394 _tf = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
395 _block = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 debug_only(_block_count = -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
397 debug_only(_blocks = (Block*)-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (PrintCompilation || PrintOpto) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Make sure I have an inline tree, so I can print messages about it.
a61af66fc99e Initial load
duke
parents:
diff changeset
401 JVMState* ilt_caller = is_osr_parse() ? caller->caller() : caller;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 4790
diff changeset
402 InlineTree::find_subtree_from_root(C->ilt(), ilt_caller, parse_method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404 _max_switch_depth = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
405 _est_switch_depth = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
406 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 _tf = TypeFunc::make(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
409 _iter.reset_to_method(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
410 _flow = method()->get_flow_analysis();
a61af66fc99e Initial load
duke
parents:
diff changeset
411 if (_flow->failing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
412 C->record_method_not_compilable_all_tiers(_flow->failure_reason());
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
415 #ifndef PRODUCT
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
416 if (_flow->has_irreducible_entry()) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
417 C->set_parsed_irreducible_loop(true);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
418 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
419 #endif
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
420
0
a61af66fc99e Initial load
duke
parents:
diff changeset
421 if (_expected_uses <= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 _prof_factor = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
423 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
424 float prof_total = parse_method->interpreter_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
425 if (prof_total <= _expected_uses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
426 _prof_factor = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
427 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 _prof_factor = _expected_uses / prof_total;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 CompileLog* log = C->log();
a61af66fc99e Initial load
duke
parents:
diff changeset
433 if (log != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 log->begin_head("parse method='%d' uses='%g'",
a61af66fc99e Initial load
duke
parents:
diff changeset
435 log->identify(parse_method), expected_uses);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 if (depth() == 1 && C->is_osr_compilation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
437 log->print(" osr_bci='%d'", C->entry_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 log->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
440 log->end_head();
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // Accumulate deoptimization counts.
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // (The range_check and store_check counts are checked elsewhere.)
a61af66fc99e Initial load
duke
parents:
diff changeset
445 ciMethodData* md = method()->method_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
446 for (uint reason = 0; reason < md->trap_reason_limit(); reason++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 uint md_count = md->trap_count(reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 if (md_count != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 if (md_count == md->trap_count_limit())
a61af66fc99e Initial load
duke
parents:
diff changeset
450 md_count += md->overflow_trap_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
451 uint total_count = C->trap_count(reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
452 uint old_count = total_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
453 total_count += md_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // Saturate the add if it overflows.
a61af66fc99e Initial load
duke
parents:
diff changeset
455 if (total_count < old_count || total_count < md_count)
a61af66fc99e Initial load
duke
parents:
diff changeset
456 total_count = (uint)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
457 C->set_trap_count(reason, total_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 if (log != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
459 log->elem("observe trap='%s' count='%d' total='%d'",
a61af66fc99e Initial load
duke
parents:
diff changeset
460 Deoptimization::trap_reason_name(reason),
a61af66fc99e Initial load
duke
parents:
diff changeset
461 md_count, total_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Accumulate total sum of decompilations, also.
a61af66fc99e Initial load
duke
parents:
diff changeset
465 C->set_decompile_count(C->decompile_count() + md->decompile_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 _count_invocations = C->do_count_invocations();
a61af66fc99e Initial load
duke
parents:
diff changeset
468 _method_data_update = C->do_method_data_update();
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 if (log != NULL && method()->has_exception_handlers()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
471 log->elem("observe that='has_exception_handlers'");
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 assert(method()->can_be_compiled(), "Can not parse this method, cutout earlier");
a61af66fc99e Initial load
duke
parents:
diff changeset
475 assert(method()->has_balanced_monitors(), "Can not parse unbalanced monitors, cutout earlier");
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // Always register dependence if JVMTI is enabled, because
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // either breakpoint setting or hotswapping of methods may
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // cause deoptimization.
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 726
diff changeset
480 if (C->env()->jvmti_can_hotswap_or_post_breakpoint()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
481 C->dependencies()->assert_evol_method(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
482 }
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 methods_seen++;
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // Do some special top-level things.
a61af66fc99e Initial load
duke
parents:
diff changeset
487 if (depth() == 1 && C->is_osr_compilation()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 _entry_bci = C->entry_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
489 _flow = method()->get_osr_flow_analysis(osr_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
490 if (_flow->failing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
491 C->record_method_not_compilable(_flow->failure_reason());
a61af66fc99e Initial load
duke
parents:
diff changeset
492 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
493 if (PrintOpto && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 tty->print_cr("OSR @%d type flow bailout: %s", _entry_bci, _flow->failure_reason());
a61af66fc99e Initial load
duke
parents:
diff changeset
495 if (Verbose) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6268
diff changeset
496 method()->print();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
497 method()->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
498 _flow->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
503 _tf = C->tf(); // the OSR entry type is different
a61af66fc99e Initial load
duke
parents:
diff changeset
504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
507 if (depth() == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 assert(C->is_osr_compilation() == this->is_osr_parse(), "OSR in sync");
a61af66fc99e Initial load
duke
parents:
diff changeset
509 if (C->tf() != tf()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
510 MutexLockerEx ml(Compile_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
511 assert(C->env()->system_dictionary_modification_counter_changed(),
a61af66fc99e Initial load
duke
parents:
diff changeset
512 "Must invalidate if TypeFuncs differ");
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
515 assert(!this->is_osr_parse(), "no recursive OSR");
a61af66fc99e Initial load
duke
parents:
diff changeset
516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
517 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 methods_parsed++;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // add method size here to guarantee that inlined methods are added too
a61af66fc99e Initial load
duke
parents:
diff changeset
522 if (TimeCompiler)
a61af66fc99e Initial load
duke
parents:
diff changeset
523 _total_bytes_compiled += method()->code_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 show_parse_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
526 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 if (failing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 if (log) log->done("parse");
a61af66fc99e Initial load
duke
parents:
diff changeset
530 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 gvn().set_type(root(), root()->bottom_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
534 gvn().transform(top());
a61af66fc99e Initial load
duke
parents:
diff changeset
535
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // Import the results of the ciTypeFlow.
a61af66fc99e Initial load
duke
parents:
diff changeset
537 init_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // Merge point for all normal exits
a61af66fc99e Initial load
duke
parents:
diff changeset
540 build_exits();
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // Setup the initial JVM state map.
a61af66fc99e Initial load
duke
parents:
diff changeset
543 SafePointNode* entry_map = create_entry_map();
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // Check for bailouts during map initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if (failing() || entry_map == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
547 if (log) log->done("parse");
a61af66fc99e Initial load
duke
parents:
diff changeset
548 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 Node_Notes* caller_nn = C->default_node_notes();
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // Collect debug info for inlined calls unless -XX:-DebugInlinedCalls.
a61af66fc99e Initial load
duke
parents:
diff changeset
553 if (DebugInlinedCalls || depth() == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 C->set_default_node_notes(make_node_notes(caller_nn));
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 if (is_osr_parse()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 Node* osr_buf = entry_map->in(TypeFunc::Parms+0);
a61af66fc99e Initial load
duke
parents:
diff changeset
559 entry_map->set_req(TypeFunc::Parms+0, top());
a61af66fc99e Initial load
duke
parents:
diff changeset
560 set_map(entry_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
561 load_interpreter_state(osr_buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
562 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 set_map(entry_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
564 do_method_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // Check for bailouts during method entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
568 if (failing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (log) log->done("parse");
a61af66fc99e Initial load
duke
parents:
diff changeset
570 C->set_default_node_notes(caller_nn);
a61af66fc99e Initial load
duke
parents:
diff changeset
571 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 entry_map = map(); // capture any changes performed by method setup code
a61af66fc99e Initial load
duke
parents:
diff changeset
575 assert(jvms()->endoff() == map()->req(), "map matches JVMS layout");
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // We begin parsing as if we have just encountered a jump to the
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // method entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
579 Block* entry_block = start_block();
a61af66fc99e Initial load
duke
parents:
diff changeset
580 assert(entry_block->start() == (is_osr_parse() ? osr_bci() : 0), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
581 set_map_clone(entry_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
582 merge_common(entry_block, entry_block->next_path_num());
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
585 BytecodeParseHistogram *parse_histogram_obj = new (C->env()->arena()) BytecodeParseHistogram(this, C);
a61af66fc99e Initial load
duke
parents:
diff changeset
586 set_parse_histogram( parse_histogram_obj );
a61af66fc99e Initial load
duke
parents:
diff changeset
587 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // Parse all the basic blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
590 do_all_blocks();
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 C->set_default_node_notes(caller_nn);
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // Check for bailouts during conversion to graph
a61af66fc99e Initial load
duke
parents:
diff changeset
595 if (failing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 if (log) log->done("parse");
a61af66fc99e Initial load
duke
parents:
diff changeset
597 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // Fix up all exiting control flow.
a61af66fc99e Initial load
duke
parents:
diff changeset
601 set_map(entry_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 do_exits();
a61af66fc99e Initial load
duke
parents:
diff changeset
603
7196
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 7194
diff changeset
604 if (log) log->done("parse nodes='%d' live='%d' memory='%d'",
2aff40cb4703 7092905: C2: Keep track of the number of dead nodes
bharadwaj
parents: 7194
diff changeset
605 C->unique(), C->live_nodes(), C->node_arena()->used());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
606 }
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 //---------------------------do_all_blocks-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
609 void Parse::do_all_blocks() {
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
610 bool has_irreducible = flow()->has_irreducible_entry();
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
611
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
612 // Walk over all blocks in Reverse Post-Order.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
613 while (true) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
614 bool progress = false;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
615 for (int rpo = 0; rpo < block_count(); rpo++) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
616 Block* block = rpo_at(rpo);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
617
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
618 if (block->is_parsed()) continue;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
619
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
620 if (!block->is_merged()) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
621 // Dead block, no state reaches this block
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
622 continue;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
623 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
624
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
625 // Prepare to parse this block.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
626 load_state_from(block);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
627
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
628 if (stopped()) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
629 // Block is dead.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
630 continue;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
631 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
632
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
633 blocks_parsed++;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
634
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
635 progress = true;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
636 if (block->is_loop_head() || block->is_handler() || has_irreducible && !block->is_ready()) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
637 // Not all preds have been parsed. We must build phis everywhere.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
638 // (Note that dead locals do not get phis built, ever.)
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
639 ensure_phis_everywhere();
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
640
2383
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
641 if (block->is_SEL_head() &&
3345
bad7ecd0b6ed 5091921: Sign flip issues in loop optimizer
kvn
parents: 2426
diff changeset
642 (UseLoopPredicate || LoopLimitCheck)) {
2383
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
643 // Add predicate to single entry (not irreducible) loop head.
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
644 assert(!block->has_merged_backedge(), "only entry paths should be merged for now");
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
645 // Need correct bci for predicate.
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
646 // It is fine to set it here since do_one_block() will set it anyway.
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
647 set_parse_bci(block->start());
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
648 add_predicate();
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
649 // Add new region for back branches.
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
650 int edges = block->pred_count() - block->preds_parsed() + 1; // +1 for original region
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
651 RegionNode *r = new (C) RegionNode(edges+1);
2383
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
652 _gvn.set_type(r, Type::CONTROL);
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
653 record_for_igvn(r);
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
654 r->init_req(edges, control());
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
655 set_control(r);
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
656 // Add new phis.
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
657 ensure_phis_everywhere();
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
658 }
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
659
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
660 // Leave behind an undisturbed copy of the map, for future merges.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
661 set_map(clone_map());
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
662 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
664 if (control()->is_Region() && !block->is_loop_head() && !has_irreducible && !block->is_handler()) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
665 // In the absence of irreducible loops, the Region and Phis
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
666 // associated with a merge that doesn't involve a backedge can
605
98cb887364d3 6810672: Comment typos
twisti
parents: 367
diff changeset
667 // be simplified now since the RPO parsing order guarantees
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
668 // that any path which was supposed to reach here has already
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
669 // been parsed or must be dead.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
670 Node* c = control();
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
671 Node* result = _gvn.transform_no_reclaim(control());
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
672 if (c != result && TraceOptoParse) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
673 tty->print_cr("Block #%d replace %d with %d", block->rpo(), c->_idx, result->_idx);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
674 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
675 if (result != top()) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
676 record_for_igvn(result);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
677 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
678 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
679
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
680 // Parse the block.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
681 do_one_block();
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
682
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
683 // Check for bailouts.
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
684 if (failing()) return;
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
685 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
686
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
687 // with irreducible loops multiple passes might be necessary to parse everything
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
688 if (!has_irreducible || !progress) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
689 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
690 }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
691 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
693 blocks_seen += block_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
694
a61af66fc99e Initial load
duke
parents:
diff changeset
695 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // Make sure there are no half-processed blocks remaining.
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // Every remaining unprocessed block is dead and may be ignored now.
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
698 for (int rpo = 0; rpo < block_count(); rpo++) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
699 Block* block = rpo_at(rpo);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
700 if (!block->is_parsed()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 if (TraceOptoParse) {
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
702 tty->print_cr("Skipped dead block %d at bci:%d", rpo, block->start());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
703 }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
704 assert(!block->is_merged(), "no half-processed blocks");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
707 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 //-------------------------------build_exits----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // Build normal and exceptional exit merge points.
a61af66fc99e Initial load
duke
parents:
diff changeset
712 void Parse::build_exits() {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // make a clone of caller to prevent sharing of side-effects
a61af66fc99e Initial load
duke
parents:
diff changeset
714 _exits.set_map(_exits.clone_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
715 _exits.clean_stack(_exits.sp());
a61af66fc99e Initial load
duke
parents:
diff changeset
716 _exits.sync_jvms();
a61af66fc99e Initial load
duke
parents:
diff changeset
717
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
718 RegionNode* region = new (C) RegionNode(1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
719 record_for_igvn(region);
a61af66fc99e Initial load
duke
parents:
diff changeset
720 gvn().set_type_bottom(region);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 _exits.set_control(region);
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // Note: iophi and memphi are not transformed until do_exits.
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
724 Node* iophi = new (C) PhiNode(region, Type::ABIO);
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
725 Node* memphi = new (C) PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
726 _exits.set_i_o(iophi);
a61af66fc99e Initial load
duke
parents:
diff changeset
727 _exits.set_all_memory(memphi);
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 // Add a return value to the exit state. (Do not push it yet.)
a61af66fc99e Initial load
duke
parents:
diff changeset
730 if (tf()->range()->cnt() > TypeFunc::Parms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
731 const Type* ret_type = tf()->range()->field_at(TypeFunc::Parms);
a61af66fc99e Initial load
duke
parents:
diff changeset
732 // Don't "bind" an unloaded return klass to the ret_phi. If the klass
a61af66fc99e Initial load
duke
parents:
diff changeset
733 // becomes loaded during the subsequent parsing, the loaded and unloaded
a61af66fc99e Initial load
duke
parents:
diff changeset
734 // types will not join when we transform and push in do_exits().
a61af66fc99e Initial load
duke
parents:
diff changeset
735 const TypeOopPtr* ret_oop_type = ret_type->isa_oopptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
736 if (ret_oop_type && !ret_oop_type->klass()->is_loaded()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
737 ret_type = TypeOopPtr::BOTTOM;
a61af66fc99e Initial load
duke
parents:
diff changeset
738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
739 int ret_size = type2size[ret_type->basic_type()];
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
740 Node* ret_phi = new (C) PhiNode(region, ret_type);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
741 _exits.ensure_stack(ret_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
742 assert((int)(tf()->range()->cnt() - TypeFunc::Parms) == ret_size, "good tf range");
a61af66fc99e Initial load
duke
parents:
diff changeset
743 assert(method()->return_type()->size() == ret_size, "tf agrees w/ method");
a61af66fc99e Initial load
duke
parents:
diff changeset
744 _exits.set_argument(0, ret_phi); // here is where the parser finds it
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // Note: ret_phi is not yet pushed, until do_exits.
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750 //----------------------------build_start_state-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
751 // Construct a state which contains only the incoming arguments from an
a61af66fc99e Initial load
duke
parents:
diff changeset
752 // unknown caller. The method & bci will be NULL & InvocationEntryBci.
a61af66fc99e Initial load
duke
parents:
diff changeset
753 JVMState* Compile::build_start_state(StartNode* start, const TypeFunc* tf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 int arg_size = tf->domain()->cnt();
a61af66fc99e Initial load
duke
parents:
diff changeset
755 int max_size = MAX2(arg_size, (int)tf->range()->cnt());
a61af66fc99e Initial load
duke
parents:
diff changeset
756 JVMState* jvms = new (this) JVMState(max_size - TypeFunc::Parms);
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
757 SafePointNode* map = new (this) SafePointNode(max_size, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
758 record_for_igvn(map);
a61af66fc99e Initial load
duke
parents:
diff changeset
759 assert(arg_size == TypeFunc::Parms + (is_osr_compilation() ? 1 : method()->arg_size()), "correct arg_size");
a61af66fc99e Initial load
duke
parents:
diff changeset
760 Node_Notes* old_nn = default_node_notes();
a61af66fc99e Initial load
duke
parents:
diff changeset
761 if (old_nn != NULL && has_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
762 Node_Notes* entry_nn = old_nn->clone(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
763 JVMState* entry_jvms = new(this) JVMState(method(), old_nn->jvms());
a61af66fc99e Initial load
duke
parents:
diff changeset
764 entry_jvms->set_offsets(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
765 entry_jvms->set_bci(entry_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
766 entry_nn->set_jvms(entry_jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
767 set_default_node_notes(entry_nn);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
769 uint i;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 for (i = 0; i < (uint)arg_size; i++) {
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
771 Node* parm = initial_gvn()->transform(new (this) ParmNode(start, i));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
772 map->init_req(i, parm);
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // Record all these guys for later GVN.
a61af66fc99e Initial load
duke
parents:
diff changeset
774 record_for_igvn(parm);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776 for (; i < map->req(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
777 map->init_req(i, top());
a61af66fc99e Initial load
duke
parents:
diff changeset
778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
779 assert(jvms->argoff() == TypeFunc::Parms, "parser gets arguments here");
a61af66fc99e Initial load
duke
parents:
diff changeset
780 set_default_node_notes(old_nn);
a61af66fc99e Initial load
duke
parents:
diff changeset
781 map->set_jvms(jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
782 jvms->set_map(map);
a61af66fc99e Initial load
duke
parents:
diff changeset
783 return jvms;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 //-----------------------------make_node_notes---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
787 Node_Notes* Parse::make_node_notes(Node_Notes* caller_nn) {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 if (caller_nn == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
789 Node_Notes* nn = caller_nn->clone(C);
a61af66fc99e Initial load
duke
parents:
diff changeset
790 JVMState* caller_jvms = nn->jvms();
a61af66fc99e Initial load
duke
parents:
diff changeset
791 JVMState* jvms = new (C) JVMState(method(), caller_jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
792 jvms->set_offsets(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
793 jvms->set_bci(_entry_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
794 nn->set_jvms(jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
795 return nn;
a61af66fc99e Initial load
duke
parents:
diff changeset
796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
797
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 //--------------------------return_values--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
800 void Compile::return_values(JVMState* jvms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
801 GraphKit kit(jvms);
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
802 Node* ret = new (this) ReturnNode(TypeFunc::Parms,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
803 kit.control(),
a61af66fc99e Initial load
duke
parents:
diff changeset
804 kit.i_o(),
a61af66fc99e Initial load
duke
parents:
diff changeset
805 kit.reset_memory(),
a61af66fc99e Initial load
duke
parents:
diff changeset
806 kit.frameptr(),
a61af66fc99e Initial load
duke
parents:
diff changeset
807 kit.returnadr());
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // Add zero or 1 return values
a61af66fc99e Initial load
duke
parents:
diff changeset
809 int ret_size = tf()->range()->cnt() - TypeFunc::Parms;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 if (ret_size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 kit.inc_sp(-ret_size); // pop the return value(s)
a61af66fc99e Initial load
duke
parents:
diff changeset
812 kit.sync_jvms();
a61af66fc99e Initial load
duke
parents:
diff changeset
813 ret->add_req(kit.argument(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // Note: The second dummy edge is not needed by a ReturnNode.
a61af66fc99e Initial load
duke
parents:
diff changeset
815 }
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // bind it to root
a61af66fc99e Initial load
duke
parents:
diff changeset
817 root()->add_req(ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
818 record_for_igvn(ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
819 initial_gvn()->transform_no_reclaim(ret);
a61af66fc99e Initial load
duke
parents:
diff changeset
820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 //------------------------rethrow_exceptions-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // Bind all exception states in the list into a single RethrowNode.
a61af66fc99e Initial load
duke
parents:
diff changeset
824 void Compile::rethrow_exceptions(JVMState* jvms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
825 GraphKit kit(jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
826 if (!kit.has_exceptions()) return; // nothing to generate
a61af66fc99e Initial load
duke
parents:
diff changeset
827 // Load my combined exception state into the kit, with all phis transformed:
a61af66fc99e Initial load
duke
parents:
diff changeset
828 SafePointNode* ex_map = kit.combine_and_pop_all_exception_states();
a61af66fc99e Initial load
duke
parents:
diff changeset
829 Node* ex_oop = kit.use_exception_state(ex_map);
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
830 RethrowNode* exit = new (this) RethrowNode(kit.control(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
831 kit.i_o(), kit.reset_memory(),
a61af66fc99e Initial load
duke
parents:
diff changeset
832 kit.frameptr(), kit.returnadr(),
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // like a return but with exception input
a61af66fc99e Initial load
duke
parents:
diff changeset
834 ex_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // bind to root
a61af66fc99e Initial load
duke
parents:
diff changeset
836 root()->add_req(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 record_for_igvn(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 initial_gvn()->transform_no_reclaim(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 //---------------------------do_exceptions-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // Process exceptions arising from the current bytecode.
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // Send caught exceptions to the proper handler within this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // Unhandled exceptions feed into _exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
845 void Parse::do_exceptions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
846 if (!has_exceptions()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
847
a61af66fc99e Initial load
duke
parents:
diff changeset
848 if (failing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // Pop them all off and throw them away.
a61af66fc99e Initial load
duke
parents:
diff changeset
850 while (pop_exception_state() != NULL) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
851 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853
a61af66fc99e Initial load
duke
parents:
diff changeset
854 PreserveJVMState pjvms(this, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 SafePointNode* ex_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
857 while ((ex_map = pop_exception_state()) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
858 if (!method()->has_exception_handlers()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // Common case: Transfer control outward.
a61af66fc99e Initial load
duke
parents:
diff changeset
860 // Doing it this early allows the exceptions to common up
a61af66fc99e Initial load
duke
parents:
diff changeset
861 // even between adjacent method calls.
a61af66fc99e Initial load
duke
parents:
diff changeset
862 throw_to_exit(ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
863 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
864 // Have to look at the exception first.
a61af66fc99e Initial load
duke
parents:
diff changeset
865 assert(stopped(), "catch_inline_exceptions trashes the map");
a61af66fc99e Initial load
duke
parents:
diff changeset
866 catch_inline_exceptions(ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
867 stop_and_kill_map(); // we used up this exception state; kill it
a61af66fc99e Initial load
duke
parents:
diff changeset
868 }
a61af66fc99e Initial load
duke
parents:
diff changeset
869 }
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 // We now return to our regularly scheduled program:
a61af66fc99e Initial load
duke
parents:
diff changeset
872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 //---------------------------throw_to_exit-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
875 // Merge the given map into an exception exit from this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // The exception exit will handle any unlocking of receiver.
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // The ex_oop must be saved within the ex_map, unlike merge_exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
878 void Parse::throw_to_exit(SafePointNode* ex_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // Pop the JVMS to (a copy of) the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
880 GraphKit caller;
a61af66fc99e Initial load
duke
parents:
diff changeset
881 caller.set_map_clone(_caller->map());
a61af66fc99e Initial load
duke
parents:
diff changeset
882 caller.set_bci(_caller->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
883 caller.set_sp(_caller->sp());
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // Copy out the standard machine state:
a61af66fc99e Initial load
duke
parents:
diff changeset
885 for (uint i = 0; i < TypeFunc::Parms; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 caller.map()->set_req(i, ex_map->in(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
887 }
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // ...and the exception:
a61af66fc99e Initial load
duke
parents:
diff changeset
889 Node* ex_oop = saved_ex_oop(ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 SafePointNode* caller_ex_map = caller.make_exception_state(ex_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // Finally, collect the new exception state in my exits:
a61af66fc99e Initial load
duke
parents:
diff changeset
892 _exits.add_exception_state(caller_ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
893 }
a61af66fc99e Initial load
duke
parents:
diff changeset
894
a61af66fc99e Initial load
duke
parents:
diff changeset
895 //------------------------------do_exits---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
896 void Parse::do_exits() {
a61af66fc99e Initial load
duke
parents:
diff changeset
897 set_parse_bci(InvocationEntryBci);
a61af66fc99e Initial load
duke
parents:
diff changeset
898
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // Now peephole on the return bits
a61af66fc99e Initial load
duke
parents:
diff changeset
900 Node* region = _exits.control();
a61af66fc99e Initial load
duke
parents:
diff changeset
901 _exits.set_control(gvn().transform(region));
a61af66fc99e Initial load
duke
parents:
diff changeset
902
a61af66fc99e Initial load
duke
parents:
diff changeset
903 Node* iophi = _exits.i_o();
a61af66fc99e Initial load
duke
parents:
diff changeset
904 _exits.set_i_o(gvn().transform(iophi));
a61af66fc99e Initial load
duke
parents:
diff changeset
905
a61af66fc99e Initial load
duke
parents:
diff changeset
906 if (wrote_final()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // This method (which must be a constructor by the rules of Java)
a61af66fc99e Initial load
duke
parents:
diff changeset
908 // wrote a final. The effects of all initializations must be
a61af66fc99e Initial load
duke
parents:
diff changeset
909 // committed to memory before any code after the constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // publishes the reference to the newly constructor object.
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // Rather than wait for the publication, we simply block the
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // writes here. Rather than put a barrier on only those writes
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // which are required to complete, we force all writes to complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
914 //
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // "All bets are off" unless the first publication occurs after a
a61af66fc99e Initial load
duke
parents:
diff changeset
916 // normal return from the constructor. We do not attempt to detect
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // such unusual early publications. But no barrier is needed on
a61af66fc99e Initial load
duke
parents:
diff changeset
918 // exceptional returns, since they cannot publish normally.
a61af66fc99e Initial load
duke
parents:
diff changeset
919 //
a61af66fc99e Initial load
duke
parents:
diff changeset
920 _exits.insert_mem_bar(Op_MemBarRelease);
a61af66fc99e Initial load
duke
parents:
diff changeset
921 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
922 if (PrintOpto && (Verbose || WizardMode)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
923 method()->print_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
924 tty->print_cr(" writes finals and needs a memory barrier");
a61af66fc99e Initial load
duke
parents:
diff changeset
925 }
a61af66fc99e Initial load
duke
parents:
diff changeset
926 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 for (MergeMemStream mms(_exits.merged_memory()); mms.next_non_empty(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // transform each slice of the original memphi:
a61af66fc99e Initial load
duke
parents:
diff changeset
931 mms.set_memory(_gvn.transform(mms.memory()));
a61af66fc99e Initial load
duke
parents:
diff changeset
932 }
a61af66fc99e Initial load
duke
parents:
diff changeset
933
a61af66fc99e Initial load
duke
parents:
diff changeset
934 if (tf()->range()->cnt() > TypeFunc::Parms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
935 const Type* ret_type = tf()->range()->field_at(TypeFunc::Parms);
a61af66fc99e Initial load
duke
parents:
diff changeset
936 Node* ret_phi = _gvn.transform( _exits.argument(0) );
a61af66fc99e Initial load
duke
parents:
diff changeset
937 assert(_exits.control()->is_top() || !_gvn.type(ret_phi)->empty(), "return value must be well defined");
a61af66fc99e Initial load
duke
parents:
diff changeset
938 _exits.push_node(ret_type->basic_type(), ret_phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // Note: Logic for creating and optimizing the ReturnNode is in Compile.
a61af66fc99e Initial load
duke
parents:
diff changeset
942
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // Unlock along the exceptional paths.
a61af66fc99e Initial load
duke
parents:
diff changeset
944 // This is done late so that we can common up equivalent exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // (e.g., null checks) arising from multiple points within this method.
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // See GraphKit::add_exception_state, which performs the commoning.
a61af66fc99e Initial load
duke
parents:
diff changeset
947 bool do_synch = method()->is_synchronized() && GenerateSynchronizationCode;
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 // record exit from a method if compiled while Dtrace is turned on.
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 726
diff changeset
950 if (do_synch || C->env()->dtrace_method_probes()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // First move the exception list out of _exits:
a61af66fc99e Initial load
duke
parents:
diff changeset
952 GraphKit kit(_exits.transfer_exceptions_into_jvms());
a61af66fc99e Initial load
duke
parents:
diff changeset
953 SafePointNode* normal_map = kit.map(); // keep this guy safe
a61af66fc99e Initial load
duke
parents:
diff changeset
954 // Now re-collect the exceptions into _exits:
a61af66fc99e Initial load
duke
parents:
diff changeset
955 SafePointNode* ex_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
956 while ((ex_map = kit.pop_exception_state()) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
957 Node* ex_oop = kit.use_exception_state(ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // Force the exiting JVM state to have this method at InvocationEntryBci.
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // The exiting JVM state is otherwise a copy of the calling JVMS.
a61af66fc99e Initial load
duke
parents:
diff changeset
960 JVMState* caller = kit.jvms();
a61af66fc99e Initial load
duke
parents:
diff changeset
961 JVMState* ex_jvms = caller->clone_shallow(C);
a61af66fc99e Initial load
duke
parents:
diff changeset
962 ex_jvms->set_map(kit.clone_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
963 ex_jvms->map()->set_jvms(ex_jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
964 ex_jvms->set_bci( InvocationEntryBci);
a61af66fc99e Initial load
duke
parents:
diff changeset
965 kit.set_jvms(ex_jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
966 if (do_synch) {
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // Add on the synchronized-method box/object combo
a61af66fc99e Initial load
duke
parents:
diff changeset
968 kit.map()->push_monitor(_synch_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // Unlock!
a61af66fc99e Initial load
duke
parents:
diff changeset
970 kit.shared_unlock(_synch_lock->box_node(), _synch_lock->obj_node());
a61af66fc99e Initial load
duke
parents:
diff changeset
971 }
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 726
diff changeset
972 if (C->env()->dtrace_method_probes()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
973 kit.make_dtrace_method_exit(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // Done with exception-path processing.
a61af66fc99e Initial load
duke
parents:
diff changeset
976 ex_map = kit.make_exception_state(ex_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
977 assert(ex_jvms->same_calls_as(ex_map->jvms()), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // Pop the last vestige of this method:
a61af66fc99e Initial load
duke
parents:
diff changeset
979 ex_map->set_jvms(caller->clone_shallow(C));
a61af66fc99e Initial load
duke
parents:
diff changeset
980 ex_map->jvms()->set_map(ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
981 _exits.push_exception_state(ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983 assert(_exits.map() == normal_map, "keep the same return state");
a61af66fc99e Initial load
duke
parents:
diff changeset
984 }
a61af66fc99e Initial load
duke
parents:
diff changeset
985
a61af66fc99e Initial load
duke
parents:
diff changeset
986 {
a61af66fc99e Initial load
duke
parents:
diff changeset
987 // Capture very early exceptions (receiver null checks) from caller JVMS
a61af66fc99e Initial load
duke
parents:
diff changeset
988 GraphKit caller(_caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
989 SafePointNode* ex_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
990 while ((ex_map = caller.pop_exception_state()) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
991 _exits.add_exception_state(ex_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
992 }
a61af66fc99e Initial load
duke
parents:
diff changeset
993 }
a61af66fc99e Initial load
duke
parents:
diff changeset
994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 //-----------------------------create_entry_map-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // Initialize our parser map to contain the types at method entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
998 // For OSR, the map contains a single RawPtr parameter.
a61af66fc99e Initial load
duke
parents:
diff changeset
999 // Initial monitor locking for sync. methods is performed by do_method_entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 SafePointNode* Parse::create_entry_map() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 // Check for really stupid bail-out cases.
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 uint len = TypeFunc::Parms + method()->max_locals() + method()->max_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 if (len >= 32760) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 C->record_method_not_compilable_all_tiers("too many local variables");
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1007
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 // If this is an inlined method, we may have to do a receiver null check.
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 if (_caller->has_method() && is_normal_parse() && !method()->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 GraphKit kit(_caller);
7194
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6843
diff changeset
1011 kit.null_check_receiver_before_call(method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 _caller = kit.transfer_exceptions_into_jvms();
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 if (kit.stopped()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 _exits.add_exception_states_from(_caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 _exits.set_jvms(_caller);
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 assert(method() != NULL, "parser must have a method");
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 // Create an initial safepoint to hold JVM state during parsing
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 JVMState* jvms = new (C) JVMState(method(), _caller->has_method() ? _caller : NULL);
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
1024 set_map(new (C) SafePointNode(len, jvms));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 jvms->set_map(map());
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 record_for_igvn(map());
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 assert(jvms->endoff() == len, "correct jvms sizing");
a61af66fc99e Initial load
duke
parents:
diff changeset
1028
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 SafePointNode* inmap = _caller->map();
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 assert(inmap != NULL, "must have inmap");
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 uint i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1033
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 // Pass thru the predefined input parameters.
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 for (i = 0; i < TypeFunc::Parms; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 map()->init_req(i, inmap->in(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 if (depth() == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 assert(map()->memory()->Opcode() == Op_Parm, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 // Insert the memory aliasing node
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 set_all_memory(reset_memory());
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 assert(merged_memory(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1045
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 // Now add the locals which are initially bound to arguments:
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 uint arg_size = tf()->domain()->cnt();
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 ensure_stack(arg_size - TypeFunc::Parms); // OSR methods have funny args
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 for (i = TypeFunc::Parms; i < arg_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 map()->init_req(i, inmap->argument(_caller, i - TypeFunc::Parms));
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 // Clear out the rest of the map (locals and stack)
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 for (i = arg_size; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 map()->init_req(i, top());
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 SafePointNode* entry_map = stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 return entry_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 //-----------------------------do_method_entry--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // Emit any code needed in the pseudo-block before BCI zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // The main thing to do is lock the receiver of a synchronized method.
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 void Parse::do_method_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 set_parse_bci(InvocationEntryBci); // Pseudo-BCP
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 set_sp(0); // Java Stack Pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 NOT_PRODUCT( count_compiled_calls(true/*at_method_entry*/, false/*is_inline*/); )
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 726
diff changeset
1071 if (C->env()->dtrace_method_probes()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 make_dtrace_method_entry(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // If the method is synchronized, we need to construct a lock node, attach
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // it to the Start node, and pin it there.
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 if (method()->is_synchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Insert a FastLockNode right after the Start which takes as arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // the current thread pointer, the "this" pointer & the address of the
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 // stack slot pair used for the lock. The "this" pointer is a projection
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 // off the start node, but the locking spot has to be constructed by
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 // creating a ConLNode of 0, and boxing it with a BoxLockNode. The BoxLockNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 // becomes the second argument to the FastLockNode call. The
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 // FastLockNode becomes the new control parent to pin it to the start.
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // Setup Object Pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 Node *lock_obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 if(method()->is_static()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 ciInstance* mirror = _method->holder()->java_mirror();
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 const TypeInstPtr *t_lock = TypeInstPtr::make(mirror);
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 lock_obj = makecon(t_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 } else { // Else pass the "this" pointer,
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 lock_obj = local(0); // which is Parm0 from StartNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // Clear out dead values from the debug info.
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 kill_dead_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // Build the FastLockNode
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 _synch_lock = shared_lock(lock_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 if (depth() == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 increment_and_test_invocation_counter(Tier2CompileThreshold);
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 //------------------------------init_blocks------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // Initialize our parser map to contain the types/monitors at method entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 void Parse::init_blocks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 // Create the blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 _block_count = flow()->block_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 _blocks = NEW_RESOURCE_ARRAY(Block, _block_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 Copy::zero_to_bytes(_blocks, sizeof(Block)*_block_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1113
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1114 int rpo;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1115
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 // Initialize the structs.
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1117 for (rpo = 0; rpo < block_count(); rpo++) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1118 Block* block = rpo_at(rpo);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1119 block->init_node(this, rpo);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1121
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 // Collect predecessor and successor information.
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1123 for (rpo = 0; rpo < block_count(); rpo++) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1124 Block* block = rpo_at(rpo);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 block->init_graph(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 //-------------------------------init_node-------------------------------------
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1130 void Parse::Block::init_node(Parse* outer, int rpo) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1131 _flow = outer->flow()->rpo_at(rpo);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 _pred_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 _preds_parsed = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 _count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 assert(pred_count() == 0 && preds_parsed() == 0, "sanity");
2383
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1136 assert(!(is_merged() || is_parsed() || is_handler() || has_merged_backedge()), "sanity");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 assert(_live_locals.size() == 0, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 // entry point has additional predecessor
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 if (flow()->is_start()) _pred_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 assert(flow()->is_start() == (this == outer->start_block()), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1143
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 //-------------------------------init_graph------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 void Parse::Block::init_graph(Parse* outer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 // Create the successor list for this parser block.
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 GrowableArray<ciTypeFlow::Block*>* tfs = flow()->successors();
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 GrowableArray<ciTypeFlow::Block*>* tfe = flow()->exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 int ns = tfs->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 int ne = tfe->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 _num_successors = ns;
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 _all_successors = ns+ne;
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 _successors = (ns+ne == 0) ? NULL : NEW_RESOURCE_ARRAY(Block*, ns+ne);
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 int p = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 for (int i = 0; i < ns+ne; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 ciTypeFlow::Block* tf2 = (i < ns) ? tfs->at(i) : tfe->at(i-ns);
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1157 Block* block2 = outer->rpo_at(tf2->rpo());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 _successors[i] = block2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1159
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // Accumulate pred info for the other block, too.
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 if (i < ns) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 block2->_pred_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 block2->_is_handler = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1166
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 // A block's successors must be distinguishable by BCI.
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // That is, no bytecode is allowed to branch to two different
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // clones of the same code location.
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 for (int j = 0; j < i; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 Block* block1 = _successors[j];
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 if (block1 == block2) continue; // duplicates are OK
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 assert(block1->start() != block2->start(), "successors have unique bcis");
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1178
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 // Note: We never call next_path_num along exception paths, so they
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // never get processed as "ready". Also, the input phis of exception
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 // handlers get specially processed, so that
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1183
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 //---------------------------successor_for_bci---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 Parse::Block* Parse::Block::successor_for_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 for (int i = 0; i < all_successors(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 Block* block2 = successor_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 if (block2->start() == bci) return block2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 // We can actually reach here if ciTypeFlow traps out a block
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 // due to an unloaded class, and concurrently with compilation the
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 // class is then loaded, so that a later phase of the parser is
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 // able to see more of the bytecode CFG. Or, the flow pass and
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 // the parser can have a minor difference of opinion about executability
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // of bytecodes. For example, "obj.field = null" is executable even
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // if the field's type is an unloaded class; the flow pass used to
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 // make a trap for such code.
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 //-----------------------------stack_type_at-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 const Type* Parse::Block::stack_type_at(int i) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 return get_type(flow()->stack_type_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1206
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 //-----------------------------local_type_at-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 const Type* Parse::Block::local_type_at(int i) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 // Make dead locals fall to bottom.
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 if (_live_locals.size() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 MethodLivenessResult live_locals = flow()->outer()->method()->liveness_at_bci(start());
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // This bitmap can be zero length if we saw a breakpoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // In such cases, pretend they are all live.
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 ((Block*)this)->_live_locals = live_locals;
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 if (_live_locals.size() > 0 && !_live_locals.at(i))
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 return Type::BOTTOM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1219
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 return get_type(flow()->local_type_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1222
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1225
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 //----------------------------name_for_bc--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 // helper method for BytecodeParseHistogram
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 static const char* name_for_bc(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 return Bytecodes::is_defined(i) ? Bytecodes::name(Bytecodes::cast(i)) : "xxxunusedxxx";
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1231
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 //----------------------------BytecodeParseHistogram------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 Parse::BytecodeParseHistogram::BytecodeParseHistogram(Parse *p, Compile *c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 _parser = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 _compiler = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 if( ! _initialized ) { _initialized = true; reset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1238
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 //----------------------------current_count------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 int Parse::BytecodeParseHistogram::current_count(BPHType bph_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 switch( bph_type ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 case BPH_transforms: { return _parser->gvn().made_progress(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 case BPH_values: { return _parser->gvn().made_new_values(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 default: { ShouldNotReachHere(); return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 //----------------------------initialized--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 bool Parse::BytecodeParseHistogram::initialized() { return _initialized; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1250
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 //----------------------------reset--------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 void Parse::BytecodeParseHistogram::reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 int i = Bytecodes::number_of_codes;
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 while (i-- > 0) { _bytecodes_parsed[i] = 0; _nodes_constructed[i] = 0; _nodes_transformed[i] = 0; _new_values[i] = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1256
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 //----------------------------set_initial_state--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 // Record info when starting to parse one bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 void Parse::BytecodeParseHistogram::set_initial_state( Bytecodes::Code bc ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 if( PrintParseStatistics && !_parser->is_osr_parse() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 _initial_bytecode = bc;
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 _initial_node_count = _compiler->unique();
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 _initial_transforms = current_count(BPH_transforms);
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 _initial_values = current_count(BPH_values);
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 //----------------------------record_change--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 // Record results of parsing one bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 void Parse::BytecodeParseHistogram::record_change() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 if( PrintParseStatistics && !_parser->is_osr_parse() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 ++_bytecodes_parsed[_initial_bytecode];
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 _nodes_constructed [_initial_bytecode] += (_compiler->unique() - _initial_node_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 _nodes_transformed [_initial_bytecode] += (current_count(BPH_transforms) - _initial_transforms);
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 _new_values [_initial_bytecode] += (current_count(BPH_values) - _initial_values);
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1278
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 //----------------------------print--------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 void Parse::BytecodeParseHistogram::print(float cutoff) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 // print profile
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 int total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 for( i = 0; i < Bytecodes::number_of_codes; ++i ) { total += _bytecodes_parsed[i]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 int abs_sum = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 tty->cr(); //0123456789012345678901234567890123456789012345678901234567890123456789
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 tty->print_cr("Histogram of %d parsed bytecodes:", total);
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 if( total == 0 ) { return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 tty->print_cr("absolute: count of compiled bytecodes of this type");
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 tty->print_cr("relative: percentage contribution to compiled nodes");
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 tty->print_cr("nodes : Average number of nodes constructed per bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 tty->print_cr("rnodes : Significance towards total nodes constructed, (nodes*relative)");
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 tty->print_cr("transforms: Average amount of tranform progress per bytecode compiled");
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 tty->print_cr("values : Average number of node values improved per bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 tty->print_cr("name : Bytecode name");
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 tty->print_cr(" absolute relative nodes rnodes transforms values name");
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 while (--i > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 int abs = _bytecodes_parsed[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 float rel = abs * 100.0F / total;
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 float nodes = _bytecodes_parsed[i] == 0 ? 0 : (1.0F * _nodes_constructed[i])/_bytecodes_parsed[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 float rnodes = _bytecodes_parsed[i] == 0 ? 0 : rel * nodes;
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 float xforms = _bytecodes_parsed[i] == 0 ? 0 : (1.0F * _nodes_transformed[i])/_bytecodes_parsed[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 float values = _bytecodes_parsed[i] == 0 ? 0 : (1.0F * _new_values [i])/_bytecodes_parsed[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 if (cutoff <= rel) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 tty->print_cr("%10d %7.2f%% %6.1f %6.2f %6.1f %6.1f %s", abs, rel, nodes, rnodes, xforms, values, name_for_bc(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 abs_sum += abs;
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 float rel_sum = abs_sum * 100.0F / total;
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 tty->print_cr("%10d %7.2f%% (cutoff = %.2f%%)", abs_sum, rel_sum, cutoff);
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1321
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 //----------------------------load_state_from----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 // Load block/map/sp. But not do not touch iter/bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 void Parse::load_state_from(Block* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 set_block(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 // load the block's JVM state:
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 set_map(block->start_map());
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 set_sp( block->start_sp());
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1330
a61af66fc99e Initial load
duke
parents:
diff changeset
1331
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 //-----------------------------record_state------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 void Parse::Block::record_state(Parse* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 assert(!is_merged(), "can only record state once, on 1st inflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 assert(start_sp() == p->sp(), "stack pointer must agree with ciTypeFlow");
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 set_start_map(p->stop());
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1338
a61af66fc99e Initial load
duke
parents:
diff changeset
1339
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 //------------------------------do_one_block-----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 void Parse::do_one_block() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 if (TraceOptoParse) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 Block *b = block();
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 int ns = b->num_successors();
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 int nt = b->all_successors();
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 tty->print("Parsing block #%d at bci [%d,%d), successors: ",
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1348 block()->rpo(), block()->start(), block()->limit());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 for (int i = 0; i < nt; i++) {
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1350 tty->print((( i < ns) ? " %d" : " %d(e)"), b->successor_at(i)->rpo());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1352 if (b->is_loop_head()) tty->print(" lphd");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 tty->print_cr("");
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 assert(block()->is_merged(), "must be merged before being parsed");
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 block()->mark_parsed();
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 ++_blocks_parsed;
a61af66fc99e Initial load
duke
parents:
diff changeset
1359
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 // Set iterator to start of block.
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 iter().reset_to_bci(block()->start());
a61af66fc99e Initial load
duke
parents:
diff changeset
1362
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 CompileLog* log = C->log();
a61af66fc99e Initial load
duke
parents:
diff changeset
1364
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 // Parse bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 while (!stopped() && !failing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 iter().next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1368
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 // Learn the current bci from the iterator:
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 set_parse_bci(iter().cur_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 if (bci() == block()->limit()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 // Do not walk into the next block until directed by do_all_blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 merge(bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 assert(bci() < block()->limit(), "bci still in block");
a61af66fc99e Initial load
duke
parents:
diff changeset
1378
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 if (log != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 // Output an optional context marker, to help place actions
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 // that occur during parsing of this BC. If there is no log
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 // output until the next context string, this context string
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 // will be silently ignored.
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6824
diff changeset
1384 log->set_context("bc code='%d' bci='%d'", (int)bc(), bci());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1386
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 if (block()->has_trap_at(bci())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 // We must respect the flow pass's traps, because it will refuse
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 // to produce successors for trapping blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 int trap_index = block()->flow()->trap_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 assert(trap_index != 0, "trap index must be valid");
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 uncommon_trap(trap_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1395
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 NOT_PRODUCT( parse_histogram()->set_initial_state(bc()); );
a61af66fc99e Initial load
duke
parents:
diff changeset
1397
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 int pre_bc_sp = sp();
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 int inputs, depth;
7194
beebba0acc11 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 6843
diff changeset
1401 bool have_se = !stopped() && compute_stack_effects(inputs, depth);
6268
6c5b7a6becc8 7187454: stack overflow in C2 compiler thread on Solaris x86
kvn
parents: 6266
diff changeset
1402 assert(!have_se || pre_bc_sp >= inputs, err_msg_res("have enough stack to execute this BC: pre_bc_sp=%d, inputs=%d", pre_bc_sp, inputs));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 #endif //ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1404
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 do_one_bytecode();
a61af66fc99e Initial load
duke
parents:
diff changeset
1406
7478
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7196
diff changeset
1407 assert(!have_se || stopped() || failing() || (sp() - pre_bc_sp) == depth,
5698813d45eb 8005418: JSR 292: virtual dispatch bug in 292 impl
twisti
parents: 7196
diff changeset
1408 err_msg_res("incorrect depth prediction: sp=%d, pre_bc_sp=%d, depth=%d", sp(), pre_bc_sp, depth));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1409
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 do_exceptions();
a61af66fc99e Initial load
duke
parents:
diff changeset
1411
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 NOT_PRODUCT( parse_histogram()->record_change(); );
a61af66fc99e Initial load
duke
parents:
diff changeset
1413
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6824
diff changeset
1414 if (log != NULL)
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6824
diff changeset
1415 log->clear_context(); // skip marker if nothing was printed
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1416
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 // Fall into next bytecode. Each bytecode normally has 1 sequential
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 // successor which is typically made ready by visiting this bytecode.
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 // If the successor has several predecessors, then it is a merge
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 // point, starts a new basic block, and is handled like other basic blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1423
a61af66fc99e Initial load
duke
parents:
diff changeset
1424
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 //------------------------------merge------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 void Parse::set_parse_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 set_bci(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 Node_Notes* nn = C->default_node_notes();
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 if (nn == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1430
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 // Collect debug info for inlined calls unless -XX:-DebugInlinedCalls.
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 if (!DebugInlinedCalls && depth() > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1435
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 // Update the JVMS annotation, if present.
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 JVMState* jvms = nn->jvms();
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 if (jvms != NULL && jvms->bci() != bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 // Update the JVMS.
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 jvms = jvms->clone_shallow(C);
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 jvms->set_bci(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 nn->set_jvms(jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1445
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 //------------------------------merge------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 // Merge the current mapping into the basic block starting at bci
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 void Parse::merge(int target_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 Block* target = successor_for_bci(target_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 if (target == NULL) { handle_missing_successor(target_bci); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 assert(!target->is_ready(), "our arrival must be expected");
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 int pnum = target->next_path_num();
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 merge_common(target, pnum);
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1455
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 //-------------------------merge_new_path--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 // Merge the current mapping into the basic block, using a new path
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 void Parse::merge_new_path(int target_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 Block* target = successor_for_bci(target_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 if (target == NULL) { handle_missing_successor(target_bci); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 assert(!target->is_ready(), "new path into frozen graph");
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 int pnum = target->add_new_path();
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 merge_common(target, pnum);
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1465
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 //-------------------------merge_exception-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 // Merge the current mapping into the basic block starting at bci
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 // The ex_oop must be pushed on the stack, unlike throw_to_exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 void Parse::merge_exception(int target_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 assert(sp() == 1, "must have only the throw exception on the stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 Block* target = successor_for_bci(target_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 if (target == NULL) { handle_missing_successor(target_bci); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 assert(target->is_handler(), "exceptions are handled by special blocks");
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 int pnum = target->add_new_path();
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 merge_common(target, pnum);
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1477
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 //--------------------handle_missing_successor---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 void Parse::handle_missing_successor(int target_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 Block* b = block();
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 int trap_bci = b->flow()->has_trap()? b->flow()->trap_bci(): -1;
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1483 tty->print_cr("### Missing successor at bci:%d for block #%d (trap_bci:%d)", target_bci, b->rpo(), trap_bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1487
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 //--------------------------merge_common---------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 void Parse::merge_common(Parse::Block* target, int pnum) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 if (TraceOptoParse) {
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1491 tty->print("Merging state at block #%d bci:%d", target->rpo(), target->start());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1493
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 // Zap extra stack slots to top
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 assert(sp() == target->start_sp(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 clean_stack(sp());
a61af66fc99e Initial load
duke
parents:
diff changeset
1497
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 if (!target->is_merged()) { // No prior mapping at this bci
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 if (TraceOptoParse) { tty->print(" with empty state"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1500
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 // If this path is dead, do not bother capturing it as a merge.
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // It is "as if" we had 1 fewer predecessors from the beginning.
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 if (stopped()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 if (TraceOptoParse) tty->print_cr(", but path is dead and doesn't count");
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1507
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 // Record that a new block has been merged.
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 ++_blocks_merged;
a61af66fc99e Initial load
duke
parents:
diff changeset
1510
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 // Make a region if we know there are multiple or unpredictable inputs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 // (Also, if this is a plain fall-through, we might see another region,
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 // which must not be allowed into this block's map.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 if (pnum > PhiNode::Input // Known multiple inputs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 || target->is_handler() // These have unpredictable inputs.
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1516 || target->is_loop_head() // Known multiple inputs
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 || control()->is_Region()) { // We must hide this guy.
2383
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1518
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1519 int current_bci = bci();
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1520 set_parse_bci(target->start()); // Set target bci
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1521 if (target->is_SEL_head()) {
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1522 DEBUG_ONLY( target->mark_merged_backedge(block()); )
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1523 if (target->start() == 0) {
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1524 // Add loop predicate for the special case when
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1525 // there are backbranches to the method entry.
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1526 add_predicate();
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1527 }
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1528 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 // Add a Region to start the new basic block. Phis will be added
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 // later lazily.
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 int edges = target->pred_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 if (edges < pnum) edges = pnum; // might be a new path!
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
1533 RegionNode *r = new (C) RegionNode(edges+1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 gvn().set_type(r, Type::CONTROL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 record_for_igvn(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 // zap all inputs to NULL for debugging (done in Node(uint) constructor)
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 // for (int j = 1; j < edges+1; j++) { r->init_req(j, NULL); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 r->init_req(pnum, control());
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 set_control(r);
2383
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1540 set_parse_bci(current_bci); // Restore bci
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1542
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 // Convert the existing Parser mapping into a mapping at this bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 store_state_to(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 assert(target->is_merged(), "do not come here twice");
a61af66fc99e Initial load
duke
parents:
diff changeset
1546
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 } else { // Prior mapping at this bci
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 if (TraceOptoParse) { tty->print(" with previous state"); }
2383
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1549 #ifdef ASSERT
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1550 if (target->is_SEL_head()) {
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1551 target->mark_merged_backedge(block());
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1552 }
9dc311b8473e 7008866: Missing loop predicate for loop with multiple entries
kvn
parents: 1972
diff changeset
1553 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 // We must not manufacture more phis if the target is already parsed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 bool nophi = target->is_parsed();
a61af66fc99e Initial load
duke
parents:
diff changeset
1556
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 SafePointNode* newin = map();// Hang on to incoming mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 Block* save_block = block(); // Hang on to incoming block;
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 load_state_from(target); // Get prior mapping
a61af66fc99e Initial load
duke
parents:
diff changeset
1560
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 assert(newin->jvms()->locoff() == jvms()->locoff(), "JVMS layouts agree");
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 assert(newin->jvms()->stkoff() == jvms()->stkoff(), "JVMS layouts agree");
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 assert(newin->jvms()->monoff() == jvms()->monoff(), "JVMS layouts agree");
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 assert(newin->jvms()->endoff() == jvms()->endoff(), "JVMS layouts agree");
a61af66fc99e Initial load
duke
parents:
diff changeset
1565
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 // Iterate over my current mapping and the old mapping.
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 // Where different, insert Phi functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 // Use any existing Phi functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 assert(control()->is_Region(), "must be merging to a region");
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 RegionNode* r = control()->as_Region();
a61af66fc99e Initial load
duke
parents:
diff changeset
1571
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 // Compute where to merge into
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 // Merge incoming control path
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1574 r->init_req(pnum, newin->control());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1575
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 if (pnum == 1) { // Last merge for this Region?
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1577 if (!block()->flow()->is_irreducible_entry()) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1578 Node* result = _gvn.transform_no_reclaim(r);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1579 if (r != result && TraceOptoParse) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1580 tty->print_cr("Block #%d replace %d with %d", block()->rpo(), r->_idx, result->_idx);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1581 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1582 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 record_for_igvn(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1585
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 // Update all the non-control inputs to map:
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 assert(TypeFunc::Parms == newin->jvms()->locoff(), "parser map should contain only youngest jvms");
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1588 bool check_elide_phi = target->is_SEL_backedge(save_block);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 for (uint j = 1; j < newin->req(); j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 Node* m = map()->in(j); // Current state of target.
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 Node* n = newin->in(j); // Incoming change to target state.
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 PhiNode* phi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 if (m->is_Phi() && m->as_Phi()->region() == r)
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 phi = m->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 phi = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 if (m != n) { // Different; must merge
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 switch (j) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 // Frame pointer and Return Address never changes
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 case TypeFunc::FramePtr:// Drop m, use the original value
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 case TypeFunc::ReturnAdr:
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 case TypeFunc::Memory: // Merge inputs to the MergeMem node
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 assert(phi == NULL, "the merge contains phis, not vice versa");
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 merge_memory_edges(n->as_MergeMem(), pnum, nophi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 default: // All normal stuff
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1608 if (phi == NULL) {
4790
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1609 const JVMState* jvms = map()->jvms();
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1610 if (EliminateNestedLocks &&
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1611 jvms->is_mon(j) && jvms->is_monitor_box(j)) {
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1612 // BoxLock nodes are not commoning.
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1613 // Use old BoxLock node as merged box.
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1614 assert(newin->jvms()->is_monitor_box(j), "sanity");
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1615 // This assert also tests that nodes are BoxLock.
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1616 assert(BoxLockNode::same_slot(n, m), "sanity");
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1617 C->gvn_replace_by(n, m);
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1618 } else if (!check_elide_phi || !target->can_elide_SEL_phi(j)) {
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1619 phi = ensure_phi(j, nophi);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1620 }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1621 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 // At this point, n might be top if:
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 // - there is no phi (because TypeFlow detected a conflict), or
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 // - the corresponding control edges is top (a dead incoming path)
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 // It is a bug if we create a phi which sees a garbage value on a live path.
a61af66fc99e Initial load
duke
parents:
diff changeset
1629
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 if (phi != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 assert(n != top() || r->in(pnum) == top(), "live value must not be garbage");
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 assert(phi->region() == r, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 phi->set_req(pnum, n); // Then add 'n' to the merge
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 if (pnum == PhiNode::Input) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 // Last merge for this Phi.
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 // So far, Phis have had a reasonable type from ciTypeFlow.
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 // Now _gvn will join that with the meet of current inputs.
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 // BOTTOM is never permissible here, 'cause pessimistically
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 // Phis of pointers cannot lose the basic pointer type.
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 debug_only(const Type* bt1 = phi->bottom_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 assert(bt1 != Type::BOTTOM, "should not be building conflict phis");
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 map()->set_req(j, _gvn.transform_no_reclaim(phi));
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 debug_only(const Type* bt2 = phi->bottom_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 assert(bt2->higher_equal(bt1), "must be consistent with type-flow");
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 record_for_igvn(phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 } // End of for all values to be merged
a61af66fc99e Initial load
duke
parents:
diff changeset
1649
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 if (pnum == PhiNode::Input &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 !r->in(0)) { // The occasional useless Region
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 assert(control() == r, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 set_control(r->nonnull_req());
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1655
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 // newin has been subsumed into the lazy merge, and is now dead.
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 set_block(save_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
1658
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 stop(); // done with this guy, for now
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1661
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 if (TraceOptoParse) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 tty->print_cr(" on path %d", pnum);
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1665
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 // Done with this parser state.
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 assert(stopped(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1669
a61af66fc99e Initial load
duke
parents:
diff changeset
1670
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 //--------------------------merge_memory_edges---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 void Parse::merge_memory_edges(MergeMemNode* n, int pnum, bool nophi) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 // (nophi means we must not create phis, because we already parsed here)
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 assert(n != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 // Merge the inputs to the MergeMems
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 MergeMemNode* m = merged_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
1677
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 assert(control()->is_Region(), "must be merging to a region");
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 RegionNode* r = control()->as_Region();
a61af66fc99e Initial load
duke
parents:
diff changeset
1680
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 PhiNode* base = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 MergeMemNode* remerge = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 for (MergeMemStream mms(m, n); mms.next_non_empty2(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 Node *p = mms.force_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 Node *q = mms.memory2();
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 if (mms.is_empty() && nophi) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 // Trouble: No new splits allowed after a loop body is parsed.
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 // Instead, wire the new split into a MergeMem on the backedge.
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 // The optimizer will sort it out, slicing the phi.
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 if (remerge == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 assert(base != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 assert(base->in(0) != NULL, "should not be xformed away");
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 remerge = MergeMemNode::make(C, base->in(pnum));
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 gvn().set_type(remerge, Type::MEMORY);
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 base->set_req(pnum, remerge);
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 remerge->set_memory_at(mms.alias_idx(), q);
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 assert(!q->is_MergeMem(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 PhiNode* phi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 if (p != q) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 phi = ensure_memory_phi(mms.alias_idx(), nophi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 if (p->is_Phi() && p->as_Phi()->region() == r)
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 phi = p->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 phi = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 // Insert q into local phi
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 if (phi != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 assert(phi->region() == r, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 p = phi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 phi->set_req(pnum, q);
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 if (mms.at_base_memory()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 base = phi; // delay transforming it
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 } else if (pnum == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 record_for_igvn(phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 p = _gvn.transform_no_reclaim(phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 mms.set_memory(p);// store back through the iterator
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 // Transform base last, in case we must fiddle with remerging.
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 if (base != NULL && pnum == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 record_for_igvn(base);
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 m->set_base_memory( _gvn.transform_no_reclaim(base) );
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1730
a61af66fc99e Initial load
duke
parents:
diff changeset
1731
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 //------------------------ensure_phis_everywhere-------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 void Parse::ensure_phis_everywhere() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 ensure_phi(TypeFunc::I_O);
a61af66fc99e Initial load
duke
parents:
diff changeset
1735
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 // Ensure a phi on all currently known memories.
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 for (MergeMemStream mms(merged_memory()); mms.next_non_empty(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 ensure_memory_phi(mms.alias_idx());
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 debug_only(mms.set_memory()); // keep the iterator happy
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1741
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 // Note: This is our only chance to create phis for memory slices.
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 // If we miss a slice that crops up later, it will have to be
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 // merged into the base-memory phi that we are building here.
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 // Later, the optimizer will comb out the knot, and build separate
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 // phi-loops for each memory slice that matters.
a61af66fc99e Initial load
duke
parents:
diff changeset
1747
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 // Monitors must nest nicely and not get confused amongst themselves.
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 // Phi-ify everything up to the monitors, though.
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 uint monoff = map()->jvms()->monoff();
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 uint nof_monitors = map()->jvms()->nof_monitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
1752
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 assert(TypeFunc::Parms == map()->jvms()->locoff(), "parser map should contain only youngest jvms");
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1754 bool check_elide_phi = block()->is_SEL_head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 for (uint i = TypeFunc::Parms; i < monoff; i++) {
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1756 if (!check_elide_phi || !block()->can_elide_SEL_phi(i)) {
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1757 ensure_phi(i);
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1758 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
1760
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 // Even monitors need Phis, though they are well-structured.
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 // This is true for OSR methods, and also for the rare cases where
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 // a monitor object is the subject of a replace_in_map operation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 // See bugs 4426707 and 5043395.
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 for (uint m = 0; m < nof_monitors; m++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 ensure_phi(map()->jvms()->monitor_obj_offset(m));
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1769
a61af66fc99e Initial load
duke
parents:
diff changeset
1770
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 //-----------------------------add_new_path------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 // Add a previously unaccounted predecessor to this block.
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 int Parse::Block::add_new_path() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 // If there is no map, return the lowest unused path number.
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 if (!is_merged()) return pred_count()+1; // there will be a map shortly
a61af66fc99e Initial load
duke
parents:
diff changeset
1776
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 SafePointNode* map = start_map();
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 if (!map->control()->is_Region())
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 return pred_count()+1; // there may be a region some day
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 RegionNode* r = map->control()->as_Region();
a61af66fc99e Initial load
duke
parents:
diff changeset
1781
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 // Add new path to the region.
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 uint pnum = r->req();
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 r->add_req(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1785
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 for (uint i = 1; i < map->req(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 Node* n = map->in(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 if (i == TypeFunc::Memory) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 // Ensure a phi on all currently known memories.
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 for (MergeMemStream mms(n->as_MergeMem()); mms.next_non_empty(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 Node* phi = mms.memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 if (phi->is_Phi() && phi->as_Phi()->region() == r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 assert(phi->req() == pnum, "must be same size as region");
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 phi->add_req(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 if (n->is_Phi() && n->as_Phi()->region() == r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 assert(n->req() == pnum, "must be same size as region");
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 n->add_req(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1804
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 return pnum;
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1807
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 //------------------------------ensure_phi-------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 // Turn the idx'th entry of the current map into a Phi
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 PhiNode *Parse::ensure_phi(int idx, bool nocreate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 SafePointNode* map = this->map();
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 Node* region = map->control();
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 assert(region->is_Region(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1814
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 Node* o = map->in(idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 assert(o != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1817
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 if (o == top()) return NULL; // TOP always merges into TOP
a61af66fc99e Initial load
duke
parents:
diff changeset
1819
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 if (o->is_Phi() && o->as_Phi()->region() == region) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 return o->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1823
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 // Now use a Phi here for merging
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 assert(!nocreate, "Cannot build a phi for a block already parsed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 const JVMState* jvms = map->jvms();
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 const Type* t;
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 if (jvms->is_loc(idx)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 t = block()->local_type_at(idx - jvms->locoff());
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 } else if (jvms->is_stk(idx)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 t = block()->stack_type_at(idx - jvms->stkoff());
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 } else if (jvms->is_mon(idx)) {
4790
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1833 assert(!jvms->is_monitor_box(idx), "no phis for boxes");
b0ff910edfc9 7128355: assert(!nocreate) failed: Cannot build a phi for a block already parsed
kvn
parents: 4777
diff changeset
1834 t = TypeInstPtr::BOTTOM; // this is sufficient for a lock object
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 } else if ((uint)idx < TypeFunc::Parms) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 t = o->bottom_type(); // Type::RETURN_ADDRESS or such-like.
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 assert(false, "no type information for this phi");
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1840
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 // If the type falls to bottom, then this must be a local that
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 // is mixing ints and oops or some such. Forcing it to top
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 // makes it go dead.
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 if (t == Type::BOTTOM) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 map->set_req(idx, top());
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1848
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 // Do not create phis for top either.
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 // A top on a non-null control flow must be an unused even after the.phi.
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 if (t == Type::TOP || t == Type::HALF) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 map->set_req(idx, top());
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1855
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 PhiNode* phi = PhiNode::make(region, o, t);
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 gvn().set_type(phi, t);
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
1858 if (C->do_escape_analysis()) record_for_igvn(phi);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 map->set_req(idx, phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 return phi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1862
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 //--------------------------ensure_memory_phi----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 // Turn the idx'th slice of the current memory into a Phi
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 PhiNode *Parse::ensure_memory_phi(int idx, bool nocreate) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 MergeMemNode* mem = merged_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 Node* region = control();
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 assert(region->is_Region(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1869
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 Node *o = (idx == Compile::AliasIdxBot)? mem->base_memory(): mem->memory_at(idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 assert(o != NULL && o != top(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1872
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 PhiNode* phi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 if (o->is_Phi() && o->as_Phi()->region() == region) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 phi = o->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 if (phi == mem->base_memory() && idx >= Compile::AliasIdxRaw) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 // clone the shared base memory phi to make a new memory split
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 assert(!nocreate, "Cannot build a phi for a block already parsed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 const Type* t = phi->bottom_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 const TypePtr* adr_type = C->get_adr_type(idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 phi = phi->slice_memory(adr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 gvn().set_type(phi, t);
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 return phi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1886
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 // Now use a Phi here for merging
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 assert(!nocreate, "Cannot build a phi for a block already parsed.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 const Type* t = o->bottom_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 const TypePtr* adr_type = C->get_adr_type(idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 phi = PhiNode::make(region, o, t, adr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 gvn().set_type(phi, t);
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 if (idx == Compile::AliasIdxBot)
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 mem->set_base_memory(phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 else
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 mem->set_memory_at(idx, phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 return phi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1899
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 //------------------------------call_register_finalizer-----------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 // Check the klass of the receiver and call register_finalizer if the
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 // class need finalization.
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 void Parse::call_register_finalizer() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 Node* receiver = local(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 assert(receiver != NULL && receiver->bottom_type()->isa_instptr() != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 "must have non-null instance type");
a61af66fc99e Initial load
duke
parents:
diff changeset
1907
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 const TypeInstPtr *tinst = receiver->bottom_type()->isa_instptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 if (tinst != NULL && tinst->klass()->is_loaded() && !tinst->klass_is_exact()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 // The type isn't known exactly so see if CHA tells us anything.
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 ciInstanceKlass* ik = tinst->klass()->as_instance_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 if (!Dependencies::has_finalizable_subclass(ik)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 // No finalizable subclasses so skip the dynamic check.
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 C->dependencies()->assert_has_no_finalizable_subclasses(ik);
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1918
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 // Insert a dynamic test for whether the instance needs
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 // finalization. In general this will fold up since the concrete
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 // class is often visible so the access flags are constant.
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 Node* klass_addr = basic_plus_adr( receiver, receiver, oopDesc::klass_offset_in_bytes() );
164
c436414a719e 6703890: Compressed Oops: add LoadNKlass node to generate narrow oops (32-bits) compare instructions
kvn
parents: 38
diff changeset
1923 Node* klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), klass_addr, TypeInstPtr::KLASS) );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1924
4762
069ab3f976d3 7118863: Move sizeof(klassOopDesc) into the *Klass::*_offset_in_bytes() functions
stefank
parents: 3345
diff changeset
1925 Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::access_flags_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 Node* access_flags = make_load(NULL, access_flags_addr, TypeInt::INT, T_INT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1927
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
1928 Node* mask = _gvn.transform(new (C) AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER)));
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
1929 Node* check = _gvn.transform(new (C) CmpINode(mask, intcon(0)));
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
1930 Node* test = _gvn.transform(new (C) BoolNode(check, BoolTest::ne));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1931
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 IfNode* iff = create_and_map_if(control(), test, PROB_MAX, COUNT_UNKNOWN);
a61af66fc99e Initial load
duke
parents:
diff changeset
1933
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
1934 RegionNode* result_rgn = new (C) RegionNode(3);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 record_for_igvn(result_rgn);
a61af66fc99e Initial load
duke
parents:
diff changeset
1936
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
1937 Node *skip_register = _gvn.transform(new (C) IfFalseNode(iff));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 result_rgn->init_req(1, skip_register);
a61af66fc99e Initial load
duke
parents:
diff changeset
1939
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
1940 Node *needs_register = _gvn.transform(new (C) IfTrueNode(iff));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 set_control(needs_register);
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 if (stopped()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 // There is no slow path.
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 result_rgn->init_req(2, top());
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 Node *call = make_runtime_call(RC_NO_LEAF,
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 OptoRuntime::register_finalizer_Type(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 OptoRuntime::register_finalizer_Java(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 NULL, TypePtr::BOTTOM,
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 make_slow_call_ex(call, env()->Throwable_klass(), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1952
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 Node* fast_io = call->in(TypeFunc::I_O);
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 Node* fast_mem = call->in(TypeFunc::Memory);
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 // These two phis are pre-filled with copies of of the fast IO and Memory
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 Node* io_phi = PhiNode::make(result_rgn, fast_io, Type::ABIO);
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 Node* mem_phi = PhiNode::make(result_rgn, fast_mem, Type::MEMORY, TypePtr::BOTTOM);
a61af66fc99e Initial load
duke
parents:
diff changeset
1958
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 result_rgn->init_req(2, control());
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 io_phi ->init_req(2, i_o());
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 mem_phi ->init_req(2, reset_memory());
a61af66fc99e Initial load
duke
parents:
diff changeset
1962
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 set_all_memory( _gvn.transform(mem_phi) );
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 set_i_o( _gvn.transform(io_phi) );
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1966
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 set_control( _gvn.transform(result_rgn) );
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1969
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 //------------------------------return_current---------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 // Append current _map to _exit_return
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 void Parse::return_current(Node* value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 if (RegisterFinalizersAtInit &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 method()->intrinsic_id() == vmIntrinsics::_Object_init) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 call_register_finalizer();
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1977
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 // Do not set_parse_bci, so that return goo is credited to the return insn.
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 set_bci(InvocationEntryBci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 if (method()->is_synchronized() && GenerateSynchronizationCode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 shared_unlock(_synch_lock->box_node(), _synch_lock->obj_node());
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 }
780
c96bf21b756f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 726
diff changeset
1983 if (C->env()->dtrace_method_probes()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 make_dtrace_method_exit(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 SafePointNode* exit_return = _exits.map();
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 exit_return->in( TypeFunc::Control )->add_req( control() );
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 exit_return->in( TypeFunc::I_O )->add_req( i_o () );
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 Node *mem = exit_return->in( TypeFunc::Memory );
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 for (MergeMemStream mms(mem->as_MergeMem(), merged_memory()); mms.next_non_empty2(); ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 if (mms.is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 // get a copy of the base memory, and patch just this one input
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 const TypePtr* adr_type = mms.adr_type(C);
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 Node* phi = mms.force_memory()->as_Phi()->slice_memory(adr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 assert(phi->as_Phi()->region() == mms.base_memory()->in(0), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 gvn().set_type_bottom(phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 phi->del_req(phi->req()-1); // prepare to re-patch
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 mms.set_memory(phi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 mms.memory()->add_req(mms.memory2());
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2002
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 // frame pointer is always same, already captured
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 if (value != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 // If returning oops to an interface-return, there is a silent free
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 // cast from oop to interface allowed by the Verifier. Make it explicit
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 // here.
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 Node* phi = _exits.argument(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 const TypeInstPtr *tr = phi->bottom_type()->isa_instptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 if( tr && tr->klass()->is_loaded() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 tr->klass()->is_interface() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 const TypeInstPtr *tp = value->bottom_type()->isa_instptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 if (tp && tp->klass()->is_loaded() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 !tp->klass()->is_interface()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 // sharpen the type eagerly; this eases certain assert checking
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 if (tp->higher_equal(TypeInstPtr::NOTNULL))
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 tr = tr->join(TypeInstPtr::NOTNULL)->is_instptr();
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
2018 value = _gvn.transform(new (C) CheckCastPPNode(0,value,tr));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 phi->add_req(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2023
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 stop_and_kill_map(); // This CFG path dies here
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2026
a61af66fc99e Initial load
duke
parents:
diff changeset
2027
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 //------------------------------add_safepoint----------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 void Parse::add_safepoint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 // See if we can avoid this safepoint. No need for a SafePoint immediately
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 // after a Call (except Leaf Call) or another SafePoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 Node *proj = control();
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 bool add_poll_param = SafePointNode::needs_polling_address_input();
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 uint parms = add_poll_param ? TypeFunc::Parms+1 : TypeFunc::Parms;
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 if( proj->is_Proj() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 Node *n0 = proj->in(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 if( n0->is_Catch() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 n0 = n0->in(0)->in(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 assert( n0->is_Call(), "expect a call here" );
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 if( n0->is_Call() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 if( n0->as_Call()->guaranteed_safepoint() )
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 } else if( n0->is_SafePoint() && n0->req() >= parms ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2048
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 // Clear out dead values from the debug info.
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 kill_dead_locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
2051
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 // Clone the JVM State
6804
e626685e9f6c 7193318: C2: remove number of inputs requirement from Node's new operator
kvn
parents: 6725
diff changeset
2053 SafePointNode *sfpnt = new (C) SafePointNode(parms, NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2054
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 // Capture memory state BEFORE a SafePoint. Since we can block at a
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 // SafePoint we need our GC state to be safe; i.e. we need all our current
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 // write barriers (card marks) to not float down after the SafePoint so we
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 // must read raw memory. Likewise we need all oop stores to match the card
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 // marks. If deopt can happen, we need ALL stores (we need the correct JVM
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // state on a deopt).
a61af66fc99e Initial load
duke
parents:
diff changeset
2061
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 // We do not need to WRITE the memory state after a SafePoint. The control
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 // edge will keep card-marks and oop-stores from floating up from below a
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 // SafePoint and our true dependency added here will keep them from floating
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // down below a SafePoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
2066
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 // Clone the current memory state
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 Node* mem = MergeMemNode::make(C, map()->memory());
a61af66fc99e Initial load
duke
parents:
diff changeset
2069
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 mem = _gvn.transform(mem);
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 // Pass control through the safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 sfpnt->init_req(TypeFunc::Control , control());
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // Fix edges normally used by a call
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 sfpnt->init_req(TypeFunc::I_O , top() );
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 sfpnt->init_req(TypeFunc::Memory , mem );
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 sfpnt->init_req(TypeFunc::ReturnAdr, top() );
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 sfpnt->init_req(TypeFunc::FramePtr , top() );
a61af66fc99e Initial load
duke
parents:
diff changeset
2079
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 // Create a node for the polling address
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 if( add_poll_param ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 Node *polladr = ConPNode::make(C, (address)os::get_polling_page());
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 sfpnt->init_req(TypeFunc::Parms+0, _gvn.transform(polladr));
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2085
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 // Fix up the JVM State edges
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 add_safepoint_edges(sfpnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 Node *transformed_sfpnt = _gvn.transform(sfpnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 set_control(transformed_sfpnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2090
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 // Provide an edge from root to safepoint. This makes the safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 // appear useful until the parse has completed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 if( OptoRemoveUseless && transformed_sfpnt->is_SafePoint() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 assert(C->root() != NULL, "Expect parse is still valid");
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 C->root()->add_prec(transformed_sfpnt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2098
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 //------------------------show_parse_info--------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 void Parse::show_parse_info() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 InlineTree* ilt = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 if (C->ilt() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 JVMState* caller_jvms = is_osr_parse() ? caller()->caller() : caller();
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 ilt = InlineTree::find_subtree_from_root(C->ilt(), caller_jvms, method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 if (PrintCompilation && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 if (depth() == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 if( ilt->count_inlines() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 tty->print(" __inlined %d (%d bytes)", ilt->count_inlines(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 ilt->count_inline_bcs());
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 if (method()->is_synchronized()) tty->print("s");
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 if (method()->has_exception_handlers()) tty->print("!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 // Check this is not the final compiled version
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 if (C->trap_can_recompile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 tty->print("-");
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 method()->print_short_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 if (is_osr_parse()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 tty->print(" @ %d", osr_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 tty->print(" (%d bytes)",method()->code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 if (ilt->count_inlines()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 tty->print(" __inlined %d (%d bytes)", ilt->count_inlines(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 ilt->count_inline_bcs());
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 if (PrintOpto && (depth() == 1 || PrintOptoInlining)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 // Print that we succeeded; suppress this message on the first osr parse.
a61af66fc99e Initial load
duke
parents:
diff changeset
2137
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 if (method()->is_synchronized()) tty->print("s");
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 if (method()->has_exception_handlers()) tty->print("!");
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 // Check this is not the final compiled version
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 if (C->trap_can_recompile() && depth() == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 tty->print("-");
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 if( depth() != 1 ) { tty->print(" "); } // missing compile count
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 for (int i = 1; i < depth(); ++i) { tty->print(" "); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 method()->print_short_name();
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 if (is_osr_parse()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 tty->print(" @ %d", osr_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 if (ilt->caller_bci() != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 tty->print(" @ %d", ilt->caller_bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 tty->print(" (%d bytes)",method()->code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 if (ilt->count_inlines()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 tty->print(" __inlined %d (%d bytes)", ilt->count_inlines(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 ilt->count_inline_bcs());
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2163
a61af66fc99e Initial load
duke
parents:
diff changeset
2164
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 //------------------------------dump-------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 // Dump information associated with the bytecodes of current _method
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 void Parse::dump() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 if( method() != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 // Iterate over bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 ciBytecodeStream iter(method());
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 for( Bytecodes::Code bc = iter.next(); bc != ciBytecodeStream::EOBC() ; bc = iter.next() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 dump_bci( iter.cur_bci() );
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2177
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 // Dump information associated with a byte code index, 'bci'
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 void Parse::dump_bci(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 // Output info on merge-points, cloning, and within _jsr..._ret
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 // NYI
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 tty->print(" bci:%d", bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2184
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 #endif