annotate src/share/vm/opto/c2compiler.cpp @ 1994:6cd6d394f280

7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed()) 7002546: regression on SpecJbb2005 on 7b118 comparing to 7b117 on small heaps Summary: Relaxed assertion checking related to incremental_collection_failed flag to allow for ExplicitGCInvokesConcurrent behaviour where we do not want a failing scavenge to bail to a stop-world collection. Parameterized incremental_collection_will_fail() so we can selectively use, or not use, as appropriate, the statistical prediction at specific use sites. This essentially reverts the scavenge bail-out logic to what it was prior to some recent changes that had inadvertently started using the statistical prediction which can be noisy in the presence of bursty loads. Added some associated verbose non-product debugging messages. Reviewed-by: johnc, tonyp
author ysr
date Tue, 07 Dec 2010 21:55:53 -0800
parents f95d63e2154a
children b92c45f2bc75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
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: 1397
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: 1685
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
26 #include "opto/c2compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
27 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
28 #ifdef TARGET_ARCH_MODEL_x86_32
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
29 # include "adfiles/ad_x86_32.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
30 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
31 #ifdef TARGET_ARCH_MODEL_x86_64
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
32 # include "adfiles/ad_x86_64.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
33 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
34 #ifdef TARGET_ARCH_MODEL_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
35 # include "adfiles/ad_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
36 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
37 #ifdef TARGET_ARCH_MODEL_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
38 # include "adfiles/ad_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1685
diff changeset
39 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 volatile int C2Compiler::_runtimes = uninitialized;
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // register information defined by ADLC
a61af66fc99e Initial load
duke
parents:
diff changeset
45 extern const char register_save_policy[];
a61af66fc99e Initial load
duke
parents:
diff changeset
46 extern const int register_save_type[];
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 const char* C2Compiler::retry_no_subsuming_loads() {
a61af66fc99e Initial load
duke
parents:
diff changeset
49 return "retry without subsuming loads";
a61af66fc99e Initial load
duke
parents:
diff changeset
50 }
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
51 const char* C2Compiler::retry_no_escape_analysis() {
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
52 return "retry without escape analysis";
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
53 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 void C2Compiler::initialize_runtime() {
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Check assumptions used while running ADLC
a61af66fc99e Initial load
duke
parents:
diff changeset
57 Compile::adlc_verification();
a61af66fc99e Initial load
duke
parents:
diff changeset
58 assert(REG_COUNT <= ConcreteRegisterImpl::number_of_registers, "incompatible register counts");
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 for (int i = 0; i < ConcreteRegisterImpl::number_of_registers ; i++ ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 OptoReg::vm2opto[i] = OptoReg::Bad;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 }
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 for( OptoReg::Name i=OptoReg::Name(0); i<OptoReg::Name(REG_COUNT); i = OptoReg::add(i,1) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 VMReg r = OptoReg::as_VMReg(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
66 if (r->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 OptoReg::vm2opto[r->value()] = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 }
a61af66fc99e Initial load
duke
parents:
diff changeset
70
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // Check that runtime and architecture description agree on callee-saved-floats
a61af66fc99e Initial load
duke
parents:
diff changeset
72 bool callee_saved_floats = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 for( OptoReg::Name i=OptoReg::Name(0); i<OptoReg::Name(_last_Mach_Reg); i = OptoReg::add(i,1) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // Is there a callee-saved float or double?
a61af66fc99e Initial load
duke
parents:
diff changeset
75 if( register_save_policy[i] == 'E' /* callee-saved */ &&
a61af66fc99e Initial load
duke
parents:
diff changeset
76 (register_save_type[i] == Op_RegF || register_save_type[i] == Op_RegD) ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 callee_saved_floats = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79 }
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 DEBUG_ONLY( Node::init_NodeProperty(); )
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 Compile::pd_compiler2_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 CompilerThread* thread = CompilerThread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 HandleMark handle_mark(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 OptoRuntime::generate(thread->env());
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 }
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 void C2Compiler::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // This method can only be called once per C2Compiler object
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // The first compiler thread that gets here will initialize the
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // small amount of global state (and runtime stubs) that c2 needs.
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // There is a race possible once at startup and then we're fine
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // Note that this is being called from a compiler thread not the
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // main startup thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 if (_runtimes != initialized) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 initialize_runtimes( initialize_runtime, &_runtimes);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Mark this compiler object as ready to roll
a61af66fc99e Initial load
duke
parents:
diff changeset
110 mark_initialized();
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 void C2Compiler::compile_method(ciEnv* env,
a61af66fc99e Initial load
duke
parents:
diff changeset
114 ciMethod* target,
a61af66fc99e Initial load
duke
parents:
diff changeset
115 int entry_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 if (!is_initialized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
1685
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
119 bool subsume_loads = SubsumeLoads;
818
b109e761e927 6837472: com/sun/jdi/MonitorFrameInfo.java fails with AggressiveOpts in 6u14
kvn
parents: 196
diff changeset
120 bool do_escape_analysis = DoEscapeAnalysis &&
1397
b4776199210f 6943485: JVMTI always on capabilities change code generation too much
never
parents: 844
diff changeset
121 !env->jvmti_can_access_local_variables();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 while (!env->failing()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Attempt to compile while subsuming loads into machine instructions.
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
124 Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
125
1685
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
126
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Check result and retry if appropriate.
a61af66fc99e Initial load
duke
parents:
diff changeset
128 if (C.failure_reason() != NULL) {
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
129 if (C.failure_reason_is(retry_no_subsuming_loads())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 assert(subsume_loads, "must make progress");
a61af66fc99e Initial load
duke
parents:
diff changeset
131 subsume_loads = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 continue; // retry
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
134 if (C.failure_reason_is(retry_no_escape_analysis())) {
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
135 assert(do_escape_analysis, "must make progress");
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
136 do_escape_analysis = false;
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
137 continue; // retry
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
138 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Pass any other failure reason up to the ciEnv.
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // Note that serious, irreversible failures are already logged
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // on the ciEnv via env->record_method_not_compilable().
a61af66fc99e Initial load
duke
parents:
diff changeset
142 env->record_failure(C.failure_reason());
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
1685
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
144 if (StressRecompilation) {
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
145 if (subsume_loads) {
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
146 subsume_loads = false;
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
147 continue; // retry
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
148 }
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
149 if (do_escape_analysis) {
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
150 do_escape_analysis = false;
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
151 continue; // retry
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
152 }
0e35fa8ebccd 6973963: SEGV in ciBlock::start_bci() with EA
kvn
parents: 1552
diff changeset
153 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // No retry; just break the loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
156 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 void C2Compiler::print_timers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // do nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }