annotate src/share/vm/runtime/simpleThresholdPolicy.hpp @ 3979:4dfb2df418f2

6484982: G1: process references during evacuation pauses Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate. Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp
author johnc
date Thu, 22 Sep 2011 10:57:37 -0700
parents 43f9d800f276
children 973293defacd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
1 /*
3358
97b64f73103b 7043564: compile warning and copyright fixes
iveresov
parents: 2252
diff changeset
2 * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
4 *
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
7 * published by the Free Software Foundation.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
8 *
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
13 * accompanied this code).
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
14 *
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
18 *
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
21 * questions.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
22 *
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
23 */
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
25 #ifndef SHARE_VM_RUNTIME_SIMPLETHRESHOLDPOLICY_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #define SHARE_VM_RUNTIME_SIMPLETHRESHOLDPOLICY_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "code/nmethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "oops/methodDataOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
32
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
33 class CompileTask;
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
34 class CompileQueue;
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
35
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
36 class SimpleThresholdPolicy : public CompilationPolicy {
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
37 int _c1_count, _c2_count;
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
38
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
39 // Check if the counter is big enough and set carry (effectively infinity).
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
40 inline void set_carry_if_necessary(InvocationCounter *counter);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
41 // Set carry flags in the counters (in methodOop and MDO).
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
42 inline void handle_counter_overflow(methodOop method);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
43 // Call and loop predicates determine whether a transition to a higher compilation
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
44 // level should be performed (pointers to predicate functions are passed to common_TF().
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
45 // Predicates also take compiler load into account.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
46 typedef bool (SimpleThresholdPolicy::*Predicate)(int i, int b, CompLevel cur_level);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
47 bool call_predicate(int i, int b, CompLevel cur_level);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
48 bool loop_predicate(int i, int b, CompLevel cur_level);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
49 // Common transition function. Given a predicate determines if a method should transition to another level.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
50 CompLevel common(Predicate p, methodOop method, CompLevel cur_level);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
51 // Transition functions.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
52 // call_event determines if a method should be compiled at a different
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
53 // level with a regular invocation entry.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
54 CompLevel call_event(methodOop method, CompLevel cur_level);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
55 // loop_event checks if a method should be OSR compiled at a different
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
56 // level.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
57 CompLevel loop_event(methodOop method, CompLevel cur_level);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
58
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
59 protected:
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
60 int c1_count() const { return _c1_count; }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
61 int c2_count() const { return _c2_count; }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
62 void set_c1_count(int x) { _c1_count = x; }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
63 void set_c2_count(int x) { _c2_count = x; }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
64
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
65 enum EventType { CALL, LOOP, COMPILE, REMOVE_FROM_QUEUE, UPDATE_IN_QUEUE, REPROFILE, MAKE_NOT_ENTRANT };
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
66 void print_event(EventType type, methodHandle mh, methodHandle imh, int bci, CompLevel level);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
67 // Print policy-specific information if necessary
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
68 virtual void print_specific(EventType type, methodHandle mh, methodHandle imh, int bci, CompLevel level) { }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
69 // Check if the method can be compiled, change level if necessary
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
70 void compile(methodHandle mh, int bci, CompLevel level, TRAPS);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
71 // Submit a given method for compilation
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
72 virtual void submit_compile(methodHandle mh, int bci, CompLevel level, TRAPS);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
73 // Simple methods are as good being compiled with C1 as C2.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
74 // This function tells if it's such a function.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
75 inline bool is_trivial(methodOop method);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
76
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
77 // Predicate helpers are used by .*_predicate() methods as well as others.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
78 // They check the given counter values, multiplied by the scale against the thresholds.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
79 template<CompLevel level> static inline bool call_predicate_helper(int i, int b, double scale);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
80 template<CompLevel level> static inline bool loop_predicate_helper(int i, int b, double scale);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
81
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
82 // Get a compilation level for a given method.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
83 static CompLevel comp_level(methodOop method) {
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
84 nmethod *nm = method->code();
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
85 if (nm != NULL && nm->is_in_use()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
86 return (CompLevel)nm->comp_level();
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
87 }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
88 return CompLevel_none;
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
89 }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
90 virtual void method_invocation_event(methodHandle method, methodHandle inlinee,
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
91 CompLevel level, nmethod* nm, TRAPS);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
92 virtual void method_back_branch_event(methodHandle method, methodHandle inlinee,
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
93 int bci, CompLevel level, nmethod* nm, TRAPS);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
94 public:
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
95 SimpleThresholdPolicy() : _c1_count(0), _c2_count(0) { }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
96 virtual int compiler_count(CompLevel comp_level) {
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
97 if (is_c1_compile(comp_level)) return c1_count();
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
98 if (is_c2_compile(comp_level)) return c2_count();
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
99 return 0;
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
100 }
3837
43f9d800f276 7066339: Tiered: policy should make consistent decisions about osr levels
iveresov
parents: 3791
diff changeset
101 virtual CompLevel initial_compile_level() { return MIN2((CompLevel)TieredStopAtLevel, CompLevel_initial_compile); }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
102 virtual void do_safepoint_work() { }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
103 virtual void delay_compilation(methodOop method) { }
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
104 virtual void disable_compilation(methodOop method) { }
2252
72d6c57d0658 7017434: Tiered needs to support reprofiling
iveresov
parents: 1972
diff changeset
105 virtual void reprofile(ScopeDesc* trap_scope, bool is_osr);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
106 virtual nmethod* event(methodHandle method, methodHandle inlinee,
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
107 int branch_bci, int bci, CompLevel comp_level, nmethod* nm, TRAPS);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
108 // Select task is called by CompileBroker. We should return a task or NULL.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
109 virtual CompileTask* select_task(CompileQueue* compile_queue);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
110 // Tell the runtime if we think a given method is adequately profiled.
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
111 virtual bool is_mature(methodOop method);
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
112 // Initialize: set compiler thread count
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
113 virtual void initialize();
3791
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
114 virtual bool should_not_inline(ciEnv* env, ciMethod* callee) {
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
115 return (env->comp_level() == CompLevel_limited_profile ||
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
116 env->comp_level() == CompLevel_full_profile) &&
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
117 callee->has_loops();
2c359f27615c 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 3358
diff changeset
118 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents:
diff changeset
119 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
120
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
121 #endif // SHARE_VM_RUNTIME_SIMPLETHRESHOLDPOLICY_HPP