Mercurial > hg > graal-compiler
comparison src/share/vm/c1/c1_LIRGenerator.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 | 87b64980e2f1 |
children | 80c9354976b0 |
comparison
equal
deleted
inserted
replaced
1817:c40600e85311 | 1819:f02a8bbe6ed4 |
---|---|
384 } | 384 } |
385 } | 385 } |
386 | 386 |
387 | 387 |
388 CodeEmitInfo* LIRGenerator::state_for(Instruction* x, ValueStack* state, bool ignore_xhandler) { | 388 CodeEmitInfo* LIRGenerator::state_for(Instruction* x, ValueStack* state, bool ignore_xhandler) { |
389 int index; | 389 assert(state != NULL, "state must be defined"); |
390 Value value; | 390 |
391 for_each_stack_value(state, index, value) { | |
392 assert(value->subst() == value, "missed substition"); | |
393 if (!value->is_pinned() && value->as_Constant() == NULL && value->as_Local() == NULL) { | |
394 walk(value); | |
395 assert(value->operand()->is_valid(), "must be evaluated now"); | |
396 } | |
397 } | |
398 ValueStack* s = state; | 391 ValueStack* s = state; |
399 int bci = x->bci(); | |
400 for_each_state(s) { | 392 for_each_state(s) { |
393 if (s->kind() == ValueStack::EmptyExceptionState) { | |
394 assert(s->stack_size() == 0 && s->locals_size() == 0 && (s->locks_size() == 0 || s->locks_size() == 1), "state must be empty"); | |
395 continue; | |
396 } | |
397 | |
398 int index; | |
399 Value value; | |
400 for_each_stack_value(s, index, value) { | |
401 assert(value->subst() == value, "missed substitution"); | |
402 if (!value->is_pinned() && value->as_Constant() == NULL && value->as_Local() == NULL) { | |
403 walk(value); | |
404 assert(value->operand()->is_valid(), "must be evaluated now"); | |
405 } | |
406 } | |
407 | |
408 int bci = s->bci(); | |
401 IRScope* scope = s->scope(); | 409 IRScope* scope = s->scope(); |
402 ciMethod* method = scope->method(); | 410 ciMethod* method = scope->method(); |
403 | 411 |
404 MethodLivenessResult liveness = method->liveness_at_bci(bci); | 412 MethodLivenessResult liveness = method->liveness_at_bci(bci); |
405 if (bci == SynchronizationEntryBCI) { | 413 if (bci == SynchronizationEntryBCI) { |
426 // NULL out this local so that linear scan can assume that all non-NULL values are live. | 434 // NULL out this local so that linear scan can assume that all non-NULL values are live. |
427 s->invalidate_local(index); | 435 s->invalidate_local(index); |
428 } | 436 } |
429 } | 437 } |
430 } | 438 } |
431 bci = scope->caller_bci(); | 439 } |
432 } | 440 |
433 | 441 return new CodeEmitInfo(state, ignore_xhandler ? NULL : x->exception_handlers()); |
434 return new CodeEmitInfo(x->bci(), state, ignore_xhandler ? NULL : x->exception_handlers()); | |
435 } | 442 } |
436 | 443 |
437 | 444 |
438 CodeEmitInfo* LIRGenerator::state_for(Instruction* x) { | 445 CodeEmitInfo* LIRGenerator::state_for(Instruction* x) { |
439 return state_for(x, x->lock_stack()); | 446 return state_for(x, x->exception_state()); |
440 } | 447 } |
441 | 448 |
442 | 449 |
443 void LIRGenerator::jobject2reg_with_patching(LIR_Opr r, ciObject* obj, CodeEmitInfo* info) { | 450 void LIRGenerator::jobject2reg_with_patching(LIR_Opr r, ciObject* obj, CodeEmitInfo* info) { |
444 if (!obj->is_loaded() || PatchALot) { | 451 if (!obj->is_loaded() || PatchALot) { |
898 | 905 |
899 ValueStack* sux_state = sux->state(); | 906 ValueStack* sux_state = sux->state(); |
900 Value sux_value; | 907 Value sux_value; |
901 int index; | 908 int index; |
902 | 909 |
910 assert(cur_state->scope() == sux_state->scope(), "not matching"); | |
911 assert(cur_state->locals_size() == sux_state->locals_size(), "not matching"); | |
912 assert(cur_state->stack_size() == sux_state->stack_size(), "not matching"); | |
913 | |
903 for_each_stack_value(sux_state, index, sux_value) { | 914 for_each_stack_value(sux_state, index, sux_value) { |
904 move_to_phi(&resolver, cur_state->stack_at(index), sux_value); | 915 move_to_phi(&resolver, cur_state->stack_at(index), sux_value); |
905 } | |
906 | |
907 // Inlining may cause the local state not to match up, so walk up | |
908 // the caller state until we get to the same scope as the | |
909 // successor and then start processing from there. | |
910 while (cur_state->scope() != sux_state->scope()) { | |
911 cur_state = cur_state->caller_state(); | |
912 assert(cur_state != NULL, "scopes don't match up"); | |
913 } | 916 } |
914 | 917 |
915 for_each_local_value(sux_state, index, sux_value) { | 918 for_each_local_value(sux_state, index, sux_value) { |
916 move_to_phi(&resolver, cur_state->local_at(index), sux_value); | 919 move_to_phi(&resolver, cur_state->local_at(index), sux_value); |
917 } | 920 } |
1021 } | 1024 } |
1022 | 1025 |
1023 | 1026 |
1024 // Code for a constant is generated lazily unless the constant is frequently used and can't be inlined. | 1027 // Code for a constant is generated lazily unless the constant is frequently used and can't be inlined. |
1025 void LIRGenerator::do_Constant(Constant* x) { | 1028 void LIRGenerator::do_Constant(Constant* x) { |
1026 if (x->state() != NULL) { | 1029 if (x->state_before() != NULL) { |
1027 // Any constant with a ValueStack requires patching so emit the patch here | 1030 // Any constant with a ValueStack requires patching so emit the patch here |
1028 LIR_Opr reg = rlock_result(x); | 1031 LIR_Opr reg = rlock_result(x); |
1029 CodeEmitInfo* info = state_for(x, x->state()); | 1032 CodeEmitInfo* info = state_for(x, x->state_before()); |
1030 __ oop2reg_patch(NULL, reg, info); | 1033 __ oop2reg_patch(NULL, reg, info); |
1031 } else if (x->use_count() > 1 && !can_inline_as_constant(x)) { | 1034 } else if (x->use_count() > 1 && !can_inline_as_constant(x)) { |
1032 if (!x->is_pinned()) { | 1035 if (!x->is_pinned()) { |
1033 // unpinned constants are handled specially so that they can be | 1036 // unpinned constants are handled specially so that they can be |
1034 // put into registers when they are used multiple times within a | 1037 // put into registers when they are used multiple times within a |
1100 LIR_Opr result = rlock_result(x); | 1103 LIR_Opr result = rlock_result(x); |
1101 | 1104 |
1102 // need to perform the null check on the rcvr | 1105 // need to perform the null check on the rcvr |
1103 CodeEmitInfo* info = NULL; | 1106 CodeEmitInfo* info = NULL; |
1104 if (x->needs_null_check()) { | 1107 if (x->needs_null_check()) { |
1105 info = state_for(x, x->state()->copy_locks()); | 1108 info = state_for(x); |
1106 } | 1109 } |
1107 __ move(new LIR_Address(rcvr.result(), oopDesc::klass_offset_in_bytes(), T_OBJECT), result, info); | 1110 __ move(new LIR_Address(rcvr.result(), oopDesc::klass_offset_in_bytes(), T_OBJECT), result, info); |
1108 __ move(new LIR_Address(result, Klass::java_mirror_offset_in_bytes() + | 1111 __ move(new LIR_Address(result, Klass::java_mirror_offset_in_bytes() + |
1109 klassOopDesc::klass_part_offset_in_bytes(), T_OBJECT), result); | 1112 klassOopDesc::klass_part_offset_in_bytes(), T_OBJECT), result); |
1110 } | 1113 } |
1479 assert(x->explicit_null_check() == NULL, "can't fold null check into patching field access"); | 1482 assert(x->explicit_null_check() == NULL, "can't fold null check into patching field access"); |
1480 info = state_for(x, x->state_before()); | 1483 info = state_for(x, x->state_before()); |
1481 } else if (x->needs_null_check()) { | 1484 } else if (x->needs_null_check()) { |
1482 NullCheck* nc = x->explicit_null_check(); | 1485 NullCheck* nc = x->explicit_null_check(); |
1483 if (nc == NULL) { | 1486 if (nc == NULL) { |
1484 info = state_for(x, x->lock_stack()); | 1487 info = state_for(x); |
1485 } else { | 1488 } else { |
1486 info = state_for(nc); | 1489 info = state_for(nc); |
1487 } | 1490 } |
1488 } | 1491 } |
1489 | 1492 |
1507 value.load_for_store(field_type); | 1510 value.load_for_store(field_type); |
1508 } | 1511 } |
1509 | 1512 |
1510 set_no_result(x); | 1513 set_no_result(x); |
1511 | 1514 |
1515 #ifndef PRODUCT | |
1512 if (PrintNotLoaded && needs_patching) { | 1516 if (PrintNotLoaded && needs_patching) { |
1513 tty->print_cr(" ###class not loaded at store_%s bci %d", | 1517 tty->print_cr(" ###class not loaded at store_%s bci %d", |
1514 x->is_static() ? "static" : "field", x->bci()); | 1518 x->is_static() ? "static" : "field", x->printable_bci()); |
1515 } | 1519 } |
1520 #endif | |
1516 | 1521 |
1517 if (x->needs_null_check() && | 1522 if (x->needs_null_check() && |
1518 (needs_patching || | 1523 (needs_patching || |
1519 MacroAssembler::needs_explicit_null_check(x->offset()))) { | 1524 MacroAssembler::needs_explicit_null_check(x->offset()))) { |
1520 // emit an explicit null check because the offset is too large | 1525 // emit an explicit null check because the offset is too large |
1573 assert(x->explicit_null_check() == NULL, "can't fold null check into patching field access"); | 1578 assert(x->explicit_null_check() == NULL, "can't fold null check into patching field access"); |
1574 info = state_for(x, x->state_before()); | 1579 info = state_for(x, x->state_before()); |
1575 } else if (x->needs_null_check()) { | 1580 } else if (x->needs_null_check()) { |
1576 NullCheck* nc = x->explicit_null_check(); | 1581 NullCheck* nc = x->explicit_null_check(); |
1577 if (nc == NULL) { | 1582 if (nc == NULL) { |
1578 info = state_for(x, x->lock_stack()); | 1583 info = state_for(x); |
1579 } else { | 1584 } else { |
1580 info = state_for(nc); | 1585 info = state_for(nc); |
1581 } | 1586 } |
1582 } | 1587 } |
1583 | 1588 |
1584 LIRItem object(x->obj(), this); | 1589 LIRItem object(x->obj(), this); |
1585 | 1590 |
1586 object.load_item(); | 1591 object.load_item(); |
1587 | 1592 |
1593 #ifndef PRODUCT | |
1588 if (PrintNotLoaded && needs_patching) { | 1594 if (PrintNotLoaded && needs_patching) { |
1589 tty->print_cr(" ###class not loaded at load_%s bci %d", | 1595 tty->print_cr(" ###class not loaded at load_%s bci %d", |
1590 x->is_static() ? "static" : "field", x->bci()); | 1596 x->is_static() ? "static" : "field", x->printable_bci()); |
1591 } | 1597 } |
1598 #endif | |
1592 | 1599 |
1593 if (x->needs_null_check() && | 1600 if (x->needs_null_check() && |
1594 (needs_patching || | 1601 (needs_patching || |
1595 MacroAssembler::needs_explicit_null_check(x->offset()))) { | 1602 MacroAssembler::needs_explicit_null_check(x->offset()))) { |
1596 // emit an explicit null check because the offset is too large | 1603 // emit an explicit null check because the offset is too large |
1779 // Use a copy of the CodeEmitInfo because debug information is | 1786 // Use a copy of the CodeEmitInfo because debug information is |
1780 // different for null_check and throw. | 1787 // different for null_check and throw. |
1781 if (GenerateCompilerNullChecks && | 1788 if (GenerateCompilerNullChecks && |
1782 (x->exception()->as_NewInstance() == NULL && x->exception()->as_ExceptionObject() == NULL)) { | 1789 (x->exception()->as_NewInstance() == NULL && x->exception()->as_ExceptionObject() == NULL)) { |
1783 // if the exception object wasn't created using new then it might be null. | 1790 // if the exception object wasn't created using new then it might be null. |
1784 __ null_check(exception_opr, new CodeEmitInfo(info, true)); | 1791 __ null_check(exception_opr, new CodeEmitInfo(info, x->state()->copy(ValueStack::ExceptionState, x->state()->bci()))); |
1785 } | 1792 } |
1786 | 1793 |
1787 if (compilation()->env()->jvmti_can_post_on_exceptions()) { | 1794 if (compilation()->env()->jvmti_can_post_on_exceptions()) { |
1788 // we need to go through the exception lookup path to get JVMTI | 1795 // we need to go through the exception lookup path to get JVMTI |
1789 // notification done | 1796 // notification done |
2125 move_to_phi(x->state()); | 2132 move_to_phi(x->state()); |
2126 | 2133 |
2127 int lo_key = x->lo_key(); | 2134 int lo_key = x->lo_key(); |
2128 int hi_key = x->hi_key(); | 2135 int hi_key = x->hi_key(); |
2129 int len = x->length(); | 2136 int len = x->length(); |
2130 CodeEmitInfo* info = state_for(x, x->state()); | |
2131 LIR_Opr value = tag.result(); | 2137 LIR_Opr value = tag.result(); |
2132 if (UseTableRanges) { | 2138 if (UseTableRanges) { |
2133 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); | 2139 do_SwitchRanges(create_lookup_ranges(x), value, x->default_sux()); |
2134 } else { | 2140 } else { |
2135 for (int i = 0; i < len; i++) { | 2141 for (int i = 0; i < len; i++) { |
2184 if (x->is_safepoint()) { | 2190 if (x->is_safepoint()) { |
2185 ValueStack* state = x->state_before() ? x->state_before() : x->state(); | 2191 ValueStack* state = x->state_before() ? x->state_before() : x->state(); |
2186 | 2192 |
2187 // increment backedge counter if needed | 2193 // increment backedge counter if needed |
2188 CodeEmitInfo* info = state_for(x, state); | 2194 CodeEmitInfo* info = state_for(x, state); |
2189 increment_backedge_counter(info, info->bci()); | 2195 increment_backedge_counter(info, info->stack()->bci()); |
2190 CodeEmitInfo* safepoint_info = state_for(x, state); | 2196 CodeEmitInfo* safepoint_info = state_for(x, state); |
2191 __ safepoint(safepoint_poll_register(), safepoint_info); | 2197 __ safepoint(safepoint_poll_register(), safepoint_info); |
2192 } | 2198 } |
2193 | 2199 |
2194 // Gotos can be folded Ifs, handle this case. | 2200 // Gotos can be folded Ifs, handle this case. |
2291 | 2297 |
2292 if (method()->is_synchronized() && GenerateSynchronizationCode) { | 2298 if (method()->is_synchronized() && GenerateSynchronizationCode) { |
2293 LIR_Opr lock = new_register(T_INT); | 2299 LIR_Opr lock = new_register(T_INT); |
2294 __ load_stack_address_monitor(0, lock); | 2300 __ load_stack_address_monitor(0, lock); |
2295 | 2301 |
2296 CodeEmitInfo* info = new CodeEmitInfo(SynchronizationEntryBCI, scope()->start()->state(), NULL); | 2302 CodeEmitInfo* info = new CodeEmitInfo(scope()->start()->state()->copy(ValueStack::StateBefore, SynchronizationEntryBCI), NULL); |
2297 CodeStub* slow_path = new MonitorEnterStub(obj, lock, info); | 2303 CodeStub* slow_path = new MonitorEnterStub(obj, lock, info); |
2298 | 2304 |
2299 // receiver is guaranteed non-NULL so don't need CodeEmitInfo | 2305 // receiver is guaranteed non-NULL so don't need CodeEmitInfo |
2300 __ lock_object(syncTempOpr(), obj, lock, new_register(T_OBJECT), slow_path, NULL); | 2306 __ lock_object(syncTempOpr(), obj, lock, new_register(T_OBJECT), slow_path, NULL); |
2301 } | 2307 } |
2302 } | 2308 } |
2303 | 2309 |
2304 // increment invocation counters if needed | 2310 // increment invocation counters if needed |
2305 if (!method()->is_accessor()) { // Accessors do not have MDOs, so no counting. | 2311 if (!method()->is_accessor()) { // Accessors do not have MDOs, so no counting. |
2306 CodeEmitInfo* info = new CodeEmitInfo(InvocationEntryBci, scope()->start()->state(), NULL); | 2312 CodeEmitInfo* info = new CodeEmitInfo(scope()->start()->state(), NULL); |
2307 increment_invocation_counter(info); | 2313 increment_invocation_counter(info); |
2308 } | 2314 } |
2309 | 2315 |
2310 // all blocks with a successor must end with an unconditional jump | 2316 // all blocks with a successor must end with an unconditional jump |
2311 // to the successor even if they are consecutive | 2317 // to the successor even if they are consecutive |
2461 __ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info); | 2467 __ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info); |
2462 } | 2468 } |
2463 break; | 2469 break; |
2464 case Bytecodes::_invokedynamic: { | 2470 case Bytecodes::_invokedynamic: { |
2465 ciBytecodeStream bcs(x->scope()->method()); | 2471 ciBytecodeStream bcs(x->scope()->method()); |
2466 bcs.force_bci(x->bci()); | 2472 bcs.force_bci(x->state()->bci()); |
2467 assert(bcs.cur_bc() == Bytecodes::_invokedynamic, "wrong stream"); | 2473 assert(bcs.cur_bc() == Bytecodes::_invokedynamic, "wrong stream"); |
2468 ciCPCache* cpcache = bcs.get_cpcache(); | 2474 ciCPCache* cpcache = bcs.get_cpcache(); |
2469 | 2475 |
2470 // Get CallSite offset from constant pool cache pointer. | 2476 // Get CallSite offset from constant pool cache pointer. |
2471 int index = bcs.get_method_index(); | 2477 int index = bcs.get_method_index(); |