6920293: OptimizeStringConcat causing core dumps
Reviewed-by: kvn, twisti
This commit is contained in:
parent
22ce62f2d1
commit
c1be36be1b
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 1999-2009 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 1999-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -730,11 +730,12 @@ void os::print_context(outputStream *st, void *context) {
|
|||||||
st->print(", RSI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSI]);
|
st->print(", RSI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RSI]);
|
||||||
st->print(", RDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDI]);
|
st->print(", RDI=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_RDI]);
|
||||||
st->cr();
|
st->cr();
|
||||||
st->print(", R8=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R8]);
|
st->print( "R8=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R8]);
|
||||||
st->print(", R9=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R9]);
|
st->print(", R9=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R9]);
|
||||||
st->print(", R10=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R10]);
|
st->print(", R10=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R10]);
|
||||||
st->print(", R11=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R11]);
|
st->print(", R11=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R11]);
|
||||||
st->print(", R12=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R12]);
|
st->cr();
|
||||||
|
st->print( "R12=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R12]);
|
||||||
st->print(", R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]);
|
st->print(", R13=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R13]);
|
||||||
st->print(", R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]);
|
st->print(", R14=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R14]);
|
||||||
st->print(", R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]);
|
st->print(", R15=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_R15]);
|
||||||
|
@ -2010,7 +2010,10 @@ address nmethod::continuation_for_implicit_exception(address pc) {
|
|||||||
print_pcs();
|
print_pcs();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
guarantee(cont_offset != 0, "unhandled implicit exception in compiled code");
|
if (cont_offset == 0) {
|
||||||
|
// Let the normal error handling report the exception
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return instructions_begin() + cont_offset;
|
return instructions_begin() + cont_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright 2009-2010 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -1073,7 +1073,7 @@ void PhaseStringOpts::int_getChars(GraphKit& kit, Node* arg, Node* char_array, N
|
|||||||
kit.set_control(head);
|
kit.set_control(head);
|
||||||
kit.set_memory(mem, char_adr_idx);
|
kit.set_memory(mem, char_adr_idx);
|
||||||
|
|
||||||
Node* q = __ DivI(kit.null(), i_phi, __ intcon(10));
|
Node* q = __ DivI(NULL, i_phi, __ intcon(10));
|
||||||
Node* r = __ SubI(i_phi, __ AddI(__ LShiftI(q, __ intcon(3)),
|
Node* r = __ SubI(i_phi, __ AddI(__ LShiftI(q, __ intcon(3)),
|
||||||
__ LShiftI(q, __ intcon(1))));
|
__ LShiftI(q, __ intcon(1))));
|
||||||
Node* m1 = __ SubI(charPos, __ intcon(1));
|
Node* m1 = __ SubI(charPos, __ intcon(1));
|
||||||
@ -1270,14 +1270,15 @@ void PhaseStringOpts::replace_string_concat(StringConcat* sc) {
|
|||||||
// length = length + (s.count - s.offset);
|
// length = length + (s.count - s.offset);
|
||||||
RegionNode *r = new (C, 3) RegionNode(3);
|
RegionNode *r = new (C, 3) RegionNode(3);
|
||||||
kit.gvn().set_type(r, Type::CONTROL);
|
kit.gvn().set_type(r, Type::CONTROL);
|
||||||
Node *phi = new (C, 3) PhiNode(r, type->join(TypeInstPtr::NOTNULL));
|
Node *phi = new (C, 3) PhiNode(r, type);
|
||||||
kit.gvn().set_type(phi, phi->bottom_type());
|
kit.gvn().set_type(phi, phi->bottom_type());
|
||||||
Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne);
|
Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne);
|
||||||
IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN);
|
IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN);
|
||||||
Node* notnull = __ IfTrue(iff);
|
Node* notnull = __ IfTrue(iff);
|
||||||
Node* isnull = __ IfFalse(iff);
|
Node* isnull = __ IfFalse(iff);
|
||||||
|
kit.set_control(notnull); // set control for the cast_not_null
|
||||||
r->init_req(1, notnull);
|
r->init_req(1, notnull);
|
||||||
phi->init_req(1, arg);
|
phi->init_req(1, kit.cast_not_null(arg, false));
|
||||||
r->init_req(2, isnull);
|
r->init_req(2, isnull);
|
||||||
phi->init_req(2, null_string);
|
phi->init_req(2, null_string);
|
||||||
kit.set_control(r);
|
kit.set_control(r);
|
||||||
|
@ -607,7 +607,9 @@ address SharedRuntime::continuation_for_implicit_exception(JavaThread* thread,
|
|||||||
_implicit_null_throws++;
|
_implicit_null_throws++;
|
||||||
#endif
|
#endif
|
||||||
target_pc = nm->continuation_for_implicit_exception(pc);
|
target_pc = nm->continuation_for_implicit_exception(pc);
|
||||||
guarantee(target_pc != 0, "must have a continuation point");
|
// If there's an unexpected fault, target_pc might be NULL,
|
||||||
|
// in which case we want to fall through into the normal
|
||||||
|
// error handling code.
|
||||||
}
|
}
|
||||||
|
|
||||||
break; // fall through
|
break; // fall through
|
||||||
@ -621,14 +623,15 @@ address SharedRuntime::continuation_for_implicit_exception(JavaThread* thread,
|
|||||||
_implicit_div0_throws++;
|
_implicit_div0_throws++;
|
||||||
#endif
|
#endif
|
||||||
target_pc = nm->continuation_for_implicit_exception(pc);
|
target_pc = nm->continuation_for_implicit_exception(pc);
|
||||||
guarantee(target_pc != 0, "must have a continuation point");
|
// If there's an unexpected fault, target_pc might be NULL,
|
||||||
|
// in which case we want to fall through into the normal
|
||||||
|
// error handling code.
|
||||||
break; // fall through
|
break; // fall through
|
||||||
}
|
}
|
||||||
|
|
||||||
default: ShouldNotReachHere();
|
default: ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
|
|
||||||
guarantee(target_pc != NULL, "must have computed destination PC for implicit exception");
|
|
||||||
assert(exception_kind == IMPLICIT_NULL || exception_kind == IMPLICIT_DIVIDE_BY_ZERO, "wrong implicit exception kind");
|
assert(exception_kind == IMPLICIT_NULL || exception_kind == IMPLICIT_DIVIDE_BY_ZERO, "wrong implicit exception kind");
|
||||||
|
|
||||||
// for AbortVMOnException flag
|
// for AbortVMOnException flag
|
||||||
|
Loading…
x
Reference in New Issue
Block a user