Skip to content

Commit cc86113

Browse files
committed
8255271: Avoid generating duplicate interpreter entries for subword types
Reviewed-by: iklam, coleenp
1 parent 5ec1b80 commit cc86113

File tree

5 files changed

+48
-43
lines changed

5 files changed

+48
-43
lines changed

src/hotspot/share/asm/codeBuffer.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,6 @@ int CodeBuffer::locator(address addr) const {
257257
return -1;
258258
}
259259

260-
address CodeBuffer::locator_address(int locator) const {
261-
if (locator < 0) return NULL;
262-
address start = code_section(locator_sect(locator))->start();
263-
return start + locator_pos(locator);
264-
}
265260

266261
bool CodeBuffer::is_backward_branch(Label& L) {
267262
return L.is_bound() && insts_end() <= locator_address(L.loc());

src/hotspot/share/asm/codeBuffer.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,11 @@ class CodeBuffer: public StackObj {
556556
static int locator_sect(int locator) { return locator & sect_mask; }
557557
static int locator(int pos, int sect) { return (pos << sect_bits) | sect; }
558558
int locator(address addr) const;
559-
address locator_address(int locator) const;
559+
address locator_address(int locator) const {
560+
if (locator < 0) return NULL;
561+
address start = code_section(locator_sect(locator))->start();
562+
return start + locator_pos(locator);
563+
}
560564

561565
// Heuristic for pre-packing the taken/not-taken bit of a predicted branch.
562566
bool is_backward_branch(Label& L);

src/hotspot/share/interpreter/templateInterpreter.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,19 @@ EntryPoint::EntryPoint(address bentry, address zentry, address centry, address s
104104
_entry[vtos] = ventry;
105105
}
106106

107+
EntryPoint::EntryPoint(address aentry, address ientry, address lentry, address fentry, address dentry, address ventry) {
108+
assert(number_of_states == 10, "check the code below");
109+
_entry[btos] = ientry;
110+
_entry[ztos] = ientry;
111+
_entry[ctos] = ientry;
112+
_entry[stos] = ientry;
113+
_entry[atos] = aentry;
114+
_entry[itos] = ientry;
115+
_entry[ltos] = lentry;
116+
_entry[ftos] = fentry;
117+
_entry[dtos] = dentry;
118+
_entry[vtos] = ventry;
119+
}
107120

108121
void EntryPoint::set_entry(TosState state, address entry) {
109122
assert(0 <= state && state < number_of_states, "state out of bounds");

src/hotspot/share/interpreter/templateInterpreter.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ class EntryPoint {
4848
// Construction
4949
EntryPoint();
5050
EntryPoint(address bentry, address zentry, address centry, address sentry, address aentry, address ientry, address lentry, address fentry, address dentry, address ventry);
51-
51+
// Will use the ientry for each of [bzcs]entry
52+
EntryPoint(address aentry, address ientry, address lentry, address fentry, address dentry, address ventry);
5253
// Attributes
5354
address entry(TosState state) const; // return target address for a given tosca state
5455
void set_entry(TosState state, address entry); // set target address for a given tosca state

src/hotspot/share/interpreter/templateInterpreterGenerator.cpp

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,6 @@ void TemplateInterpreterGenerator::generate_all() {
6868
CodeletMark cm(_masm, "bytecode tracing support");
6969
Interpreter::_trace_code =
7070
EntryPoint(
71-
generate_trace_code(btos),
72-
generate_trace_code(ztos),
73-
generate_trace_code(ctos),
74-
generate_trace_code(stos),
7571
generate_trace_code(atos),
7672
generate_trace_code(itos),
7773
generate_trace_code(ltos),
@@ -83,50 +79,54 @@ void TemplateInterpreterGenerator::generate_all() {
8379
#endif // !PRODUCT
8480

8581
{ CodeletMark cm(_masm, "return entry points");
86-
const int index_size = sizeof(u2);
8782
Interpreter::_return_entry[0] = EntryPoint();
8883
for (int i = 1; i < Interpreter::number_of_return_entries; i++) {
89-
address return_itos = generate_return_entry_for(itos, i, index_size);
9084
Interpreter::_return_entry[i] =
9185
EntryPoint(
92-
return_itos,
93-
return_itos,
94-
return_itos,
95-
return_itos,
96-
generate_return_entry_for(atos, i, index_size),
97-
return_itos,
98-
generate_return_entry_for(ltos, i, index_size),
99-
generate_return_entry_for(ftos, i, index_size),
100-
generate_return_entry_for(dtos, i, index_size),
101-
generate_return_entry_for(vtos, i, index_size)
86+
generate_return_entry_for(atos, i, sizeof(u2)),
87+
generate_return_entry_for(itos, i, sizeof(u2)),
88+
generate_return_entry_for(ltos, i, sizeof(u2)),
89+
generate_return_entry_for(ftos, i, sizeof(u2)),
90+
generate_return_entry_for(dtos, i, sizeof(u2)),
91+
generate_return_entry_for(vtos, i, sizeof(u2))
10292
);
10393
}
10494
}
10595

10696
{ CodeletMark cm(_masm, "invoke return entry points");
107-
// These states are in order specified in TosState, except btos/ztos/ctos/stos are
108-
// really the same as itos since there is no top of stack optimization for these types
109-
const TosState states[] = {itos, itos, itos, itos, itos, ltos, ftos, dtos, atos, vtos, ilgl};
97+
// These states are in order specified in TosState, except btos/ztos/ctos/stos which
98+
// are the same as itos since there is no top of stack optimization for these types
99+
const TosState states[] = {ilgl, ilgl, ilgl, ilgl, itos, ltos, ftos, dtos, atos, vtos, ilgl};
110100
const int invoke_length = Bytecodes::length_for(Bytecodes::_invokestatic);
111101
const int invokeinterface_length = Bytecodes::length_for(Bytecodes::_invokeinterface);
112102
const int invokedynamic_length = Bytecodes::length_for(Bytecodes::_invokedynamic);
113103

114-
for (int i = 0; i < Interpreter::number_of_return_addrs; i++) {
104+
assert(invoke_length >= 0 && invoke_length < Interpreter::number_of_return_entries, "invariant");
105+
assert(invokeinterface_length >= 0 && invokeinterface_length < Interpreter::number_of_return_entries, "invariant");
106+
107+
for (int i = itos; i < Interpreter::number_of_return_addrs; i++) {
115108
TosState state = states[i];
116109
assert(state != ilgl, "states array is wrong above");
117-
Interpreter::_invoke_return_entry[i] = generate_return_entry_for(state, invoke_length, sizeof(u2));
118-
Interpreter::_invokeinterface_return_entry[i] = generate_return_entry_for(state, invokeinterface_length, sizeof(u2));
119-
Interpreter::_invokedynamic_return_entry[i] = generate_return_entry_for(state, invokedynamic_length, sizeof(u4));
110+
111+
// Reuse generated entry points
112+
Interpreter::_invoke_return_entry[i] = Interpreter::_return_entry[invoke_length].entry(state);
113+
Interpreter::_invokeinterface_return_entry[i] = Interpreter::_return_entry[invokeinterface_length].entry(state);
114+
115+
Interpreter::_invokedynamic_return_entry[i] = generate_return_entry_for(state, invokedynamic_length, sizeof(u4));
116+
}
117+
118+
// set itos entry points for btos/ztos/ctos/stos
119+
for (int i = 0; i < itos; i++) {
120+
Interpreter::_invoke_return_entry[i] = Interpreter::_invoke_return_entry[itos];
121+
Interpreter::_invokeinterface_return_entry[i] = Interpreter::_invokeinterface_return_entry[itos];
122+
Interpreter::_invokedynamic_return_entry[i] = Interpreter::_invokedynamic_return_entry[itos];
120123
}
121124
}
122125

123126
{ CodeletMark cm(_masm, "earlyret entry points");
127+
address earlyret_entry_itos = generate_earlyret_entry_for(itos);
124128
Interpreter::_earlyret_entry =
125129
EntryPoint(
126-
generate_earlyret_entry_for(btos),
127-
generate_earlyret_entry_for(ztos),
128-
generate_earlyret_entry_for(ctos),
129-
generate_earlyret_entry_for(stos),
130130
generate_earlyret_entry_for(atos),
131131
generate_earlyret_entry_for(itos),
132132
generate_earlyret_entry_for(ltos),
@@ -153,10 +153,6 @@ void TemplateInterpreterGenerator::generate_all() {
153153
{ CodeletMark cm(_masm, "safepoint entry points");
154154
Interpreter::_safept_entry =
155155
EntryPoint(
156-
generate_safept_entry_for(btos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
157-
generate_safept_entry_for(ztos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
158-
generate_safept_entry_for(ctos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
159-
generate_safept_entry_for(stos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
160156
generate_safept_entry_for(atos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
161157
generate_safept_entry_for(itos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
162158
generate_safept_entry_for(ltos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)),
@@ -242,12 +238,8 @@ void TemplateInterpreterGenerator::generate_all() {
242238
address deopt_itos = generate_deopt_entry_for(itos, i);
243239
Interpreter::_deopt_entry[i] =
244240
EntryPoint(
245-
deopt_itos, /* btos */
246-
deopt_itos, /* ztos */
247-
deopt_itos, /* ctos */
248-
deopt_itos, /* stos */
249241
generate_deopt_entry_for(atos, i),
250-
deopt_itos, /* itos */
242+
generate_deopt_entry_for(itos, i),
251243
generate_deopt_entry_for(ltos, i),
252244
generate_deopt_entry_for(ftos, i),
253245
generate_deopt_entry_for(dtos, i),

0 commit comments

Comments
 (0)