Mercurial > hg > graal-jvmci-8
comparison src/share/vm/interpreter/invocationCounter.cpp @ 1783:d5d065957597
6953144: Tiered compilation
Summary: Infrastructure for tiered compilation support (interpreter + c1 + c2) for 32 and 64 bit. Simple tiered policy implementation.
Reviewed-by: kvn, never, phh, twisti
author | iveresov |
---|---|
date | Fri, 03 Sep 2010 17:51:07 -0700 |
parents | c18cbe5936b8 |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1782:f353275af40e | 1783:d5d065957597 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
38 // been executed | 38 // been executed |
39 set_state(wait_for_compile); | 39 set_state(wait_for_compile); |
40 } | 40 } |
41 | 41 |
42 void InvocationCounter::set_carry() { | 42 void InvocationCounter::set_carry() { |
43 _counter |= carry_mask; | 43 set_carry_flag(); |
44 | |
45 // The carry bit now indicates that this counter had achieved a very | 44 // The carry bit now indicates that this counter had achieved a very |
46 // large value. Now reduce the value, so that the method can be | 45 // large value. Now reduce the value, so that the method can be |
47 // executed many more times before re-entering the VM. | 46 // executed many more times before re-entering the VM. |
48 int old_count = count(); | 47 int old_count = count(); |
49 int new_count = MIN2(old_count, (int) (CompileThreshold / 2)); | 48 int new_count = MIN2(old_count, (int) (CompileThreshold / 2)); |
50 // prevent from going to zero, to distinguish from never-executed methods | 49 // prevent from going to zero, to distinguish from never-executed methods |
51 if (new_count == 0) new_count = 1; | 50 if (new_count == 0) new_count = 1; |
52 if (old_count != new_count) set(state(), new_count); | 51 if (old_count != new_count) set(state(), new_count); |
53 } | 52 } |
54 | |
55 | 53 |
56 void InvocationCounter::set_state(State state) { | 54 void InvocationCounter::set_state(State state) { |
57 assert(0 <= state && state < number_of_states, "illegal state"); | 55 assert(0 <= state && state < number_of_states, "illegal state"); |
58 int init = _init[state]; | 56 int init = _init[state]; |
59 // prevent from going to zero, to distinguish from never-executed methods | 57 // prevent from going to zero, to distinguish from never-executed methods |
79 int InvocationCounter::_init [InvocationCounter::number_of_states]; | 77 int InvocationCounter::_init [InvocationCounter::number_of_states]; |
80 InvocationCounter::Action InvocationCounter::_action[InvocationCounter::number_of_states]; | 78 InvocationCounter::Action InvocationCounter::_action[InvocationCounter::number_of_states]; |
81 int InvocationCounter::InterpreterInvocationLimit; | 79 int InvocationCounter::InterpreterInvocationLimit; |
82 int InvocationCounter::InterpreterBackwardBranchLimit; | 80 int InvocationCounter::InterpreterBackwardBranchLimit; |
83 int InvocationCounter::InterpreterProfileLimit; | 81 int InvocationCounter::InterpreterProfileLimit; |
84 | |
85 // Tier1 limits | |
86 int InvocationCounter::Tier1InvocationLimit; | |
87 int InvocationCounter::Tier1BackEdgeLimit; | |
88 | |
89 | 82 |
90 | 83 |
91 const char* InvocationCounter::state_as_string(State state) { | 84 const char* InvocationCounter::state_as_string(State state) { |
92 switch (state) { | 85 switch (state) { |
93 case wait_for_nothing : return "wait_for_nothing"; | 86 case wait_for_nothing : return "wait_for_nothing"; |
144 def(wait_for_compile, 0, dummy_invocation_counter_overflow); | 137 def(wait_for_compile, 0, dummy_invocation_counter_overflow); |
145 } | 138 } |
146 | 139 |
147 InterpreterInvocationLimit = CompileThreshold << number_of_noncount_bits; | 140 InterpreterInvocationLimit = CompileThreshold << number_of_noncount_bits; |
148 InterpreterProfileLimit = ((CompileThreshold * InterpreterProfilePercentage) / 100)<< number_of_noncount_bits; | 141 InterpreterProfileLimit = ((CompileThreshold * InterpreterProfilePercentage) / 100)<< number_of_noncount_bits; |
149 Tier1InvocationLimit = Tier2CompileThreshold << number_of_noncount_bits; | |
150 Tier1BackEdgeLimit = Tier2BackEdgeThreshold << number_of_noncount_bits; | |
151 | 142 |
152 // When methodData is collected, the backward branch limit is compared against a | 143 // When methodData is collected, the backward branch limit is compared against a |
153 // methodData counter, rather than an InvocationCounter. In the former case, we | 144 // methodData counter, rather than an InvocationCounter. In the former case, we |
154 // don't need the shift by number_of_noncount_bits, but we do need to adjust | 145 // don't need the shift by number_of_noncount_bits, but we do need to adjust |
155 // the factor by which we scale the threshold. | 146 // the factor by which we scale the threshold. |