8031994: java/lang/Character/CheckProp test times out
Reviewed-by: iveresov, roland
--- a/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Tue Jun 03 18:24:38 2014 -0700
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Wed Jun 04 10:01:28 2014 +0200
@@ -872,21 +872,19 @@
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);
}
--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Tue Jun 03 18:24:38 2014 -0700
+++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Jun 04 10:01:28 2014 +0200
@@ -1085,14 +1085,11 @@
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,
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Tue Jun 03 18:24:38 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jun 04 10:01:28 2014 +0200
@@ -2054,7 +2054,7 @@
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));
}
--- a/hotspot/src/share/vm/c1/c1_Instruction.hpp Tue Jun 03 18:24:38 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp Wed Jun 04 10:01:28 2014 +0200
@@ -1291,16 +1291,18 @@
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; }
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Tue Jun 03 18:24:38 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jun 04 10:01:28 2014 +0200
@@ -466,8 +466,11 @@
}
-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 @@
__ unlock_object(hdr, object, lock, scratch, slow_path);
}
-
-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);
+#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, 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())) {
--- a/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Tue Jun 03 18:24:38 2014 -0700
+++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.hpp Wed Jun 04 10:01:28 2014 +0200
@@ -169,6 +169,8 @@
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 @@
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 @@
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);