Skip to content

Commit a81b301

Browse files
authored
Update (2023.10.25)
32674: LA port of 8315966: Relativize initial_sp in interpreter frames
1 parent 8516cb0 commit a81b301

7 files changed

+33
-30
lines changed

src/hotspot/cpu/loongarch/continuationFreezeThaw_loongarch.inline.hpp

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,25 +128,17 @@ void FreezeBase::adjust_interpreted_frame_unextended_sp(frame& f) {
128128
}
129129
}
130130

131-
static inline void relativize_one(intptr_t* const vfp, intptr_t* const hfp, int offset) {
132-
assert(*(hfp + offset) == *(vfp + offset), "");
133-
intptr_t* addr = hfp + offset;
134-
intptr_t value = *(intptr_t**)addr - vfp;
135-
*addr = value;
136-
}
137-
138131
inline void FreezeBase::relativize_interpreted_frame_metadata(const frame& f, const frame& hf) {
139-
intptr_t* vfp = f.fp();
140-
intptr_t* hfp = hf.fp();
141-
assert(hfp == hf.unextended_sp() + (f.fp() - f.unextended_sp()), "");
132+
assert(hf.fp() == hf.unextended_sp() + (f.fp() - f.unextended_sp()), "");
142133
assert((f.at(frame::interpreter_frame_last_sp_offset) != 0)
143134
|| (f.unextended_sp() == f.sp()), "");
144-
assert(f.fp() > (intptr_t*)f.at(frame::interpreter_frame_initial_sp_offset), "");
135+
assert(f.fp() > (intptr_t*)f.at_relative(frame::interpreter_frame_initial_sp_offset), "");
145136

146137
// Make sure that last_sp is already relativized.
147138
assert((intptr_t*)hf.at_relative(frame::interpreter_frame_last_sp_offset) == hf.unextended_sp(), "");
148139

149-
relativize_one(vfp, hfp, frame::interpreter_frame_initial_sp_offset); // == block_top == block_bottom
140+
// Make sure that monitor_block_top is already relativized.
141+
assert(hf.at_absolute(frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, "");
150142

151143
assert((hf.fp() - hf.unextended_sp()) == (f.fp() - f.unextended_sp()), "");
152144
assert(hf.unextended_sp() == (intptr_t*)hf.at(frame::interpreter_frame_last_sp_offset), "");
@@ -269,18 +261,12 @@ inline void ThawBase::patch_pd(frame& f, const frame& caller) {
269261
patch_callee_link(caller, caller.fp());
270262
}
271263

272-
static inline void derelativize_one(intptr_t* const fp, int offset) {
273-
intptr_t* addr = fp + offset;
274-
*addr = (intptr_t)(fp + *addr);
275-
}
276-
277264
inline void ThawBase::derelativize_interpreted_frame_metadata(const frame& hf, const frame& f) {
278-
intptr_t* vfp = f.fp();
279-
280265
// Make sure that last_sp is kept relativized.
281266
assert((intptr_t*)f.at_relative(frame::interpreter_frame_last_sp_offset) == f.unextended_sp(), "");
282267

283-
derelativize_one(vfp, frame::interpreter_frame_initial_sp_offset);
268+
// Make sure that monitor_block_top is still relativized.
269+
assert(f.at_absolute(frame::interpreter_frame_monitor_block_top_offset) <= frame::interpreter_frame_initial_sp_offset, "");
284270
}
285271

286272
#endif // CPU_LOONGARCH_CONTINUATIONFREEZETHAW_LOONGARCH_INLINE_HPP

src/hotspot/cpu/loongarch/continuationHelper_loongarch.inline.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ inline intptr_t* ContinuationHelper::InterpretedFrame::frame_top(const frame& f,
122122
// interpreter_frame_last_sp_offset, points to unextended_sp includes arguments in the frame
123123
// interpreter_frame_initial_sp_offset excludes expression stack slots
124124
int expression_stack_sz = expression_stack_size(f, mask);
125-
intptr_t* res = *(intptr_t**)f.addr_at(frame::interpreter_frame_initial_sp_offset) - expression_stack_sz;
125+
intptr_t* res = (intptr_t*)f.at_relative(frame::interpreter_frame_initial_sp_offset) - expression_stack_sz;
126126
assert(res == (intptr_t*)f.interpreter_frame_monitor_end() - expression_stack_sz, "");
127127
assert(res >= f.unextended_sp(),
128128
"res: " INTPTR_FORMAT " initial_sp: " INTPTR_FORMAT " last_sp: " INTPTR_FORMAT " unextended_sp: " INTPTR_FORMAT " expression_stack_size: %d",

src/hotspot/cpu/loongarch/frame_loongarch.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,15 +315,18 @@ BasicObjectLock* frame::interpreter_frame_monitor_begin() const {
315315
}
316316

317317
BasicObjectLock* frame::interpreter_frame_monitor_end() const {
318-
BasicObjectLock* result = (BasicObjectLock*) at(interpreter_frame_monitor_block_top_offset);
318+
BasicObjectLock* result = (BasicObjectLock*) at_relative(interpreter_frame_monitor_block_top_offset);
319319
// make sure the pointer points inside the frame
320320
assert(sp() <= (intptr_t*) result, "monitor end should be above the stack pointer");
321321
assert((intptr_t*) result < fp(), "monitor end should be strictly below the frame pointer");
322322
return result;
323323
}
324324

325325
void frame::interpreter_frame_set_monitor_end(BasicObjectLock* value) {
326-
*((BasicObjectLock**)addr_at(interpreter_frame_monitor_block_top_offset)) = value;
326+
assert(is_interpreted_frame(), "interpreted frame expected");
327+
// set relativized monitor_block_top
328+
ptr_at_put(interpreter_frame_monitor_block_top_offset, (intptr_t*)value - fp());
329+
assert(at_absolute(interpreter_frame_monitor_block_top_offset) <= interpreter_frame_monitor_block_top_offset, "");
327330
}
328331

329332
// Used by template based interpreter deoptimization

src/hotspot/cpu/loongarch/interp_masm_loongarch.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
156156
void push(TosState state); // transition state -> vtos
157157

158158
void empty_expression_stack() {
159-
ld_d(SP, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
159+
ld_d(AT, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
160+
alsl_d(SP, AT, FP, LogBytesPerWord-1);
160161
// null last_sp until next java call
161162
st_d(R0, FP, frame::interpreter_frame_last_sp_offset * wordSize);
162163
}

src/hotspot/cpu/loongarch/interp_masm_loongarch_64.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,7 @@ void InterpreterMacroAssembler::remove_activation(TosState state,
730730
bind(restart);
731731
// points to current entry, starting with top-most entry
732732
ld_d(monitor_reg, monitor_block_top);
733+
alsl_d(monitor_reg, monitor_reg, FP, LogBytesPerWord-1);
733734
// points to word before bottom of monitor block, should be callee-saved
734735
addi_d(TSR, FP, frame::interpreter_frame_initial_sp_offset * wordSize);
735736
b(entry);

src/hotspot/cpu/loongarch/templateInterpreterGenerator_loongarch.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -503,9 +503,11 @@ address TemplateInterpreterGenerator::generate_StackOverflowError_handler() {
503503
#ifdef ASSERT
504504
{
505505
Label L;
506-
__ addi_d(T1, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
507-
__ sub_d(T1, T1, SP); // T1 = maximal sp for current fp
508-
__ bge(T1, R0, L); // check if frame is complete
506+
__ ld_d(T1, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
507+
__ alsl_d(T1, T1, FP, LogBytesPerWord-1);
508+
// maximal sp for current fp (stack grows negative)
509+
// check if frame is complete
510+
__ bge(T1, SP, L);
509511
__ stop("interpreter frame not set up");
510512
__ bind(L);
511513
}
@@ -867,7 +869,9 @@ void TemplateInterpreterGenerator::lock_method(void) {
867869
}
868870
// add space for monitor & lock
869871
__ addi_d(SP, SP, (-1) * entry_size); // add space for a monitor entry
870-
__ st_d(SP, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
872+
__ sub_d(AT, SP, FP);
873+
__ srai_d(AT, AT, Interpreter::logStackElementSize);
874+
__ st_d(AT, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
871875
// set new monitor block top
872876
__ st_d(T0, Address(SP, BasicObjectLock::obj_offset())); // store object
873877

@@ -929,7 +933,8 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
929933
} else {
930934
__ st_d(BCP, FP, (-++i) * wordSize); // set bcp
931935
}
932-
__ st_d(SP, FP, (-++i) * wordSize); // reserve word for pointer to expression stack bottom
936+
__ li(AT, frame::interpreter_frame_initial_sp_offset);
937+
__ st_d(AT, FP, (-++i) * wordSize); // reserve word for pointer to expression stack bottom
933938
assert(i == frame_size, "i should be equal to frame_size");
934939
}
935940

@@ -1150,6 +1155,7 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
11501155
{
11511156
Label L;
11521157
__ ld_d(AT, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
1158+
__ alsl_d(AT, AT, FP, LogBytesPerWord-1);
11531159
__ beq(AT, SP, L);
11541160
__ stop("broken stack frame setup in interpreter in asm");
11551161
__ bind(L);
@@ -1744,6 +1750,7 @@ address TemplateInterpreterGenerator::generate_normal_entry(bool synchronized) {
17441750
{
17451751
Label L;
17461752
__ ld_d(AT, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
1753+
__ alsl_d(AT, AT, FP, LogBytesPerWord-1);
17471754
__ beq(AT, SP, L);
17481755
__ stop("broken stack frame setup in interpreter in native");
17491756
__ bind(L);

src/hotspot/cpu/loongarch/templateTable_loongarch_64.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3946,6 +3946,7 @@ void TemplateTable::monitorenter() {
39463946
{
39473947
Label entry, loop, exit, next;
39483948
__ ld_d(T2, monitor_block_top);
3949+
__ alsl_d(T2, T2, FP, LogBytesPerWord-1);
39493950
__ addi_d(T3, FP, frame::interpreter_frame_initial_sp_offset * wordSize);
39503951
__ b(entry);
39513952

@@ -3971,9 +3972,12 @@ void TemplateTable::monitorenter() {
39713972
Label entry, loop;
39723973
// 1. compute new pointers // SP: old expression stack top
39733974
__ ld_d(monitor_reg, monitor_block_top);
3975+
__ alsl_d(monitor_reg, monitor_reg, FP, LogBytesPerWord-1);
39743976
__ addi_d(SP, SP, -entry_size);
39753977
__ addi_d(monitor_reg, monitor_reg, -entry_size);
3976-
__ st_d(monitor_reg, monitor_block_top);
3978+
__ sub_d(AT, monitor_reg, FP);
3979+
__ srai_d(AT, AT, Interpreter::logStackElementSize);
3980+
__ st_d(AT, monitor_block_top);
39773981
__ move(T3, SP);
39783982
__ b(entry);
39793983

@@ -4020,6 +4024,7 @@ void TemplateTable::monitorexit() {
40204024
{
40214025
Label entry, loop;
40224026
__ ld_d(monitor_top, FP, frame::interpreter_frame_monitor_block_top_offset * wordSize);
4027+
__ alsl_d(monitor_top, monitor_top, FP, LogBytesPerWord-1);
40234028
__ addi_d(monitor_bot, FP, frame::interpreter_frame_initial_sp_offset * wordSize);
40244029
__ b(entry);
40254030

0 commit comments

Comments
 (0)