Mercurial > hg > graal-compiler
comparison src/share/vm/c1/c1_LIRAssembler.cpp @ 1819:f02a8bbe6ed4
6986046: C1 valuestack cleanup
Summary: fixes an historical oddity in C1 with inlining where all of the expression stacks are kept in the topmost ValueStack instead of being in their respective ValueStacks.
Reviewed-by: never
Contributed-by: Christian Wimmer <cwimmer@uci.edu>
author | roland |
---|---|
date | Tue, 29 Dec 2009 19:08:54 +0100 |
parents | d5d065957597 |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1817:c40600e85311 | 1819:f02a8bbe6ed4 |
---|---|
33 } | 33 } |
34 patch->install(_masm, patch_code, obj, info); | 34 patch->install(_masm, patch_code, obj, info); |
35 append_patching_stub(patch); | 35 append_patching_stub(patch); |
36 | 36 |
37 #ifdef ASSERT | 37 #ifdef ASSERT |
38 Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->bci()); | 38 Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->stack()->bci()); |
39 if (patch->id() == PatchingStub::access_field_id) { | 39 if (patch->id() == PatchingStub::access_field_id) { |
40 switch (code) { | 40 switch (code) { |
41 case Bytecodes::_putstatic: | 41 case Bytecodes::_putstatic: |
42 case Bytecodes::_getstatic: | 42 case Bytecodes::_getstatic: |
43 case Bytecodes::_putfield: | 43 case Bytecodes::_putfield: |
219 X86_ONLY(assert(_masm->rsp_offset() == 0, "frame size should be fixed")); | 219 X86_ONLY(assert(_masm->rsp_offset() == 0, "frame size should be fixed")); |
220 | 220 |
221 #ifndef PRODUCT | 221 #ifndef PRODUCT |
222 if (CommentedAssembly) { | 222 if (CommentedAssembly) { |
223 stringStream st; | 223 stringStream st; |
224 st.print_cr(" block B%d [%d, %d]", block->block_id(), block->bci(), block->end()->bci()); | 224 st.print_cr(" block B%d [%d, %d]", block->block_id(), block->bci(), block->end()->printable_bci()); |
225 _masm->block_comment(st.as_string()); | 225 _masm->block_comment(st.as_string()); |
226 } | 226 } |
227 #endif | 227 #endif |
228 | 228 |
229 emit_lir_list(block->lir()); | 229 emit_lir_list(block->lir()); |
310 } | 310 } |
311 | 311 |
312 static ValueStack* debug_info(Instruction* ins) { | 312 static ValueStack* debug_info(Instruction* ins) { |
313 StateSplit* ss = ins->as_StateSplit(); | 313 StateSplit* ss = ins->as_StateSplit(); |
314 if (ss != NULL) return ss->state(); | 314 if (ss != NULL) return ss->state(); |
315 return ins->lock_stack(); | 315 return ins->state_before(); |
316 } | 316 } |
317 | 317 |
318 void LIR_Assembler::process_debug_info(LIR_Op* op) { | 318 void LIR_Assembler::process_debug_info(LIR_Op* op) { |
319 Instruction* src = op->source(); | 319 Instruction* src = op->source(); |
320 if (src == NULL) return; | 320 if (src == NULL) return; |
325 } | 325 } |
326 ValueStack* vstack = debug_info(src); | 326 ValueStack* vstack = debug_info(src); |
327 if (vstack == NULL) return; | 327 if (vstack == NULL) return; |
328 if (_pending_non_safepoint != NULL) { | 328 if (_pending_non_safepoint != NULL) { |
329 // Got some old debug info. Get rid of it. | 329 // Got some old debug info. Get rid of it. |
330 if (_pending_non_safepoint->bci() == src->bci() && | 330 if (debug_info(_pending_non_safepoint) == vstack) { |
331 debug_info(_pending_non_safepoint) == vstack) { | |
332 _pending_non_safepoint_offset = pc_offset; | 331 _pending_non_safepoint_offset = pc_offset; |
333 return; | 332 return; |
334 } | 333 } |
335 if (_pending_non_safepoint_offset < pc_offset) { | 334 if (_pending_non_safepoint_offset < pc_offset) { |
336 record_non_safepoint_debug_info(); | 335 record_non_safepoint_debug_info(); |
356 if (t == NULL) return NULL; | 355 if (t == NULL) return NULL; |
357 for (;;) { | 356 for (;;) { |
358 ValueStack* tc = t->caller_state(); | 357 ValueStack* tc = t->caller_state(); |
359 if (tc == NULL) return s; | 358 if (tc == NULL) return s; |
360 t = tc; | 359 t = tc; |
361 bci_result = s->scope()->caller_bci(); | 360 bci_result = tc->bci(); |
362 s = s->caller_state(); | 361 s = s->caller_state(); |
363 } | 362 } |
364 } | 363 } |
365 | 364 |
366 void LIR_Assembler::record_non_safepoint_debug_info() { | 365 void LIR_Assembler::record_non_safepoint_debug_info() { |
367 int pc_offset = _pending_non_safepoint_offset; | 366 int pc_offset = _pending_non_safepoint_offset; |
368 ValueStack* vstack = debug_info(_pending_non_safepoint); | 367 ValueStack* vstack = debug_info(_pending_non_safepoint); |
369 int bci = _pending_non_safepoint->bci(); | 368 int bci = vstack->bci(); |
370 | 369 |
371 DebugInformationRecorder* debug_info = compilation()->debug_info_recorder(); | 370 DebugInformationRecorder* debug_info = compilation()->debug_info_recorder(); |
372 assert(debug_info->recording_non_safepoints(), "sanity"); | 371 assert(debug_info->recording_non_safepoints(), "sanity"); |
373 | 372 |
374 debug_info->add_non_safepoint(pc_offset); | 373 debug_info->add_non_safepoint(pc_offset); |
378 int s_bci = bci; | 377 int s_bci = bci; |
379 ValueStack* s = nth_oldest(vstack, n, s_bci); | 378 ValueStack* s = nth_oldest(vstack, n, s_bci); |
380 if (s == NULL) break; | 379 if (s == NULL) break; |
381 IRScope* scope = s->scope(); | 380 IRScope* scope = s->scope(); |
382 //Always pass false for reexecute since these ScopeDescs are never used for deopt | 381 //Always pass false for reexecute since these ScopeDescs are never used for deopt |
383 debug_info->describe_scope(pc_offset, scope->method(), s_bci, false/*reexecute*/); | 382 debug_info->describe_scope(pc_offset, scope->method(), s->bci(), false/*reexecute*/); |
384 } | 383 } |
385 | 384 |
386 debug_info->end_non_safepoint(pc_offset); | 385 debug_info->end_non_safepoint(pc_offset); |
387 } | 386 } |
388 | 387 |