8031994: java/lang/Character/CheckProp test times out
Reviewed-by: iveresov, roland
This commit is contained in:
parent
baadb75921
commit
0915147727
@ -872,21 +872,19 @@ void LIRGenerator::do_Convert(Convert* x) {
|
||||
|
||||
|
||||
void LIRGenerator::do_NewInstance(NewInstance* x) {
|
||||
print_if_not_loaded(x);
|
||||
|
||||
// This instruction can be deoptimized in the slow path : use
|
||||
// O0 as result register.
|
||||
const LIR_Opr reg = result_register_for(x->type());
|
||||
#ifndef PRODUCT
|
||||
if (PrintNotLoaded && !x->klass()->is_loaded()) {
|
||||
tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci());
|
||||
}
|
||||
#endif
|
||||
|
||||
CodeEmitInfo* info = state_for(x, x->state());
|
||||
LIR_Opr tmp1 = FrameMap::G1_oop_opr;
|
||||
LIR_Opr tmp2 = FrameMap::G3_oop_opr;
|
||||
LIR_Opr tmp3 = FrameMap::G4_oop_opr;
|
||||
LIR_Opr tmp4 = FrameMap::O1_oop_opr;
|
||||
LIR_Opr klass_reg = FrameMap::G5_metadata_opr;
|
||||
new_instance(reg, x->klass(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
|
||||
new_instance(reg, x->klass(), x->is_unresolved(), tmp1, tmp2, tmp3, tmp4, klass_reg, info);
|
||||
LIR_Opr result = rlock_result(x);
|
||||
__ move(reg, result);
|
||||
}
|
||||
|
@ -1085,14 +1085,11 @@ void LIRGenerator::do_Convert(Convert* x) {
|
||||
|
||||
|
||||
void LIRGenerator::do_NewInstance(NewInstance* x) {
|
||||
#ifndef PRODUCT
|
||||
if (PrintNotLoaded && !x->klass()->is_loaded()) {
|
||||
tty->print_cr(" ###class not loaded at new bci %d", x->printable_bci());
|
||||
}
|
||||
#endif
|
||||
print_if_not_loaded(x);
|
||||
|
||||
CodeEmitInfo* info = state_for(x, x->state());
|
||||
LIR_Opr reg = result_register_for(x->type());
|
||||
new_instance(reg, x->klass(),
|
||||
new_instance(reg, x->klass(), x->is_unresolved(),
|
||||
FrameMap::rcx_oop_opr,
|
||||
FrameMap::rdi_oop_opr,
|
||||
FrameMap::rsi_oop_opr,
|
||||
|
@ -2054,7 +2054,7 @@ void GraphBuilder::new_instance(int klass_index) {
|
||||
bool will_link;
|
||||
ciKlass* klass = stream()->get_klass(will_link);
|
||||
assert(klass->is_instance_klass(), "must be an instance klass");
|
||||
NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before);
|
||||
NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before, stream()->is_unresolved_klass());
|
||||
_memory->new_instance(new_instance);
|
||||
apush(append_split(new_instance));
|
||||
}
|
||||
|
@ -1291,16 +1291,18 @@ LEAF(Invoke, StateSplit)
|
||||
LEAF(NewInstance, StateSplit)
|
||||
private:
|
||||
ciInstanceKlass* _klass;
|
||||
bool _is_unresolved;
|
||||
|
||||
public:
|
||||
// creation
|
||||
NewInstance(ciInstanceKlass* klass, ValueStack* state_before)
|
||||
NewInstance(ciInstanceKlass* klass, ValueStack* state_before, bool is_unresolved)
|
||||
: StateSplit(instanceType, state_before)
|
||||
, _klass(klass)
|
||||
, _klass(klass), _is_unresolved(is_unresolved)
|
||||
{}
|
||||
|
||||
// accessors
|
||||
ciInstanceKlass* klass() const { return _klass; }
|
||||
bool is_unresolved() const { return _is_unresolved; }
|
||||
|
||||
virtual bool needs_exception_state() const { return false; }
|
||||
|
||||
|
@ -466,8 +466,11 @@ CodeEmitInfo* LIRGenerator::state_for(Instruction* x) {
|
||||
}
|
||||
|
||||
|
||||
void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info) {
|
||||
if (!obj->is_loaded() || PatchALot) {
|
||||
void LIRGenerator::klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve) {
|
||||
/* C2 relies on constant pool entries being resolved (ciTypeFlow), so if TieredCompilation
|
||||
* is active and the class hasn't yet been resolved we need to emit a patch that resolves
|
||||
* the class. */
|
||||
if ((TieredCompilation && need_resolve) || !obj->is_loaded() || PatchALot) {
|
||||
assert(info != NULL, "info must be set if class is not loaded");
|
||||
__ klass2reg_patch(NULL, r, info);
|
||||
} else {
|
||||
@ -660,9 +663,18 @@ void LIRGenerator::monitor_exit(LIR_Opr object, LIR_Opr lock, LIR_Opr new_hdr, L
|
||||
__ unlock_object(hdr, object, lock, scratch, slow_path);
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
void LIRGenerator::print_if_not_loaded(const NewInstance* new_instance) {
|
||||
if (PrintNotLoaded && !new_instance->klass()->is_loaded()) {
|
||||
tty->print_cr(" ###class not loaded at new bci %d", new_instance->printable_bci());
|
||||
} else if (PrintNotLoaded && (TieredCompilation && new_instance->is_unresolved())) {
|
||||
tty->print_cr(" ###class not resolved at new bci %d", new_instance->printable_bci());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) {
|
||||
klass2reg_with_patching(klass_reg, klass, info);
|
||||
void LIRGenerator::new_instance(LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info) {
|
||||
klass2reg_with_patching(klass_reg, klass, info, is_unresolved);
|
||||
// If klass is not loaded we do not know if the klass has finalizers:
|
||||
if (UseFastNewInstance && klass->is_loaded()
|
||||
&& !Klass::layout_helper_needs_slow_path(klass->layout_helper())) {
|
||||
|
@ -169,6 +169,8 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
|
||||
return this;
|
||||
}
|
||||
|
||||
void print_if_not_loaded(const NewInstance* new_instance) PRODUCT_RETURN;
|
||||
|
||||
#ifdef ASSERT
|
||||
LIR_List* lir(const char * file, int line) const {
|
||||
_lir->set_file_and_line(file, line);
|
||||
@ -307,7 +309,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
|
||||
|
||||
void store_stack_parameter (LIR_Opr opr, ByteSize offset_from_sp_in_bytes);
|
||||
|
||||
void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info);
|
||||
void klass2reg_with_patching(LIR_Opr r, ciMetadata* obj, CodeEmitInfo* info, bool need_resolve = false);
|
||||
|
||||
// this loads the length and compares against the index
|
||||
void array_range_check (LIR_Opr array, LIR_Opr index, CodeEmitInfo* null_check_info, CodeEmitInfo* range_check_info);
|
||||
@ -325,7 +327,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
|
||||
void monitor_enter (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no, CodeEmitInfo* info_for_exception, CodeEmitInfo* info);
|
||||
void monitor_exit (LIR_Opr object, LIR_Opr lock, LIR_Opr hdr, LIR_Opr scratch, int monitor_no);
|
||||
|
||||
void new_instance (LIR_Opr dst, ciInstanceKlass* klass, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info);
|
||||
void new_instance (LIR_Opr dst, ciInstanceKlass* klass, bool is_unresolved, LIR_Opr scratch1, LIR_Opr scratch2, LIR_Opr scratch3, LIR_Opr scratch4, LIR_Opr klass_reg, CodeEmitInfo* info);
|
||||
|
||||
// machine dependent
|
||||
void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info);
|
||||
|
Loading…
Reference in New Issue
Block a user