提交 f43232b8 编写于 作者: V vlivanov

8036667: "assert(adr->is_AddP() && adr->in(AddPNode::Offset)->is_Con())...

8036667: "assert(adr->is_AddP() && adr->in(AddPNode::Offset)->is_Con()) failed: offset is a constant" with FoldStableValues on
Reviewed-by: kvn
上级 4610664c
...@@ -1593,9 +1593,9 @@ LoadNode::load_array_final_field(const TypeKlassPtr *tkls, ...@@ -1593,9 +1593,9 @@ LoadNode::load_array_final_field(const TypeKlassPtr *tkls,
// Try to constant-fold a stable array element. // Try to constant-fold a stable array element.
static const Type* fold_stable_ary_elem(const TypeAryPtr* ary, int off, BasicType loadbt) { static const Type* fold_stable_ary_elem(const TypeAryPtr* ary, int off, BasicType loadbt) {
assert(ary->const_oop(), "array should be constant");
assert(ary->is_stable(), "array should be stable"); assert(ary->is_stable(), "array should be stable");
if (ary->const_oop() != NULL) {
// Decode the results of GraphKit::array_element_address. // Decode the results of GraphKit::array_element_address.
ciArray* aobj = ary->const_oop()->as_array(); ciArray* aobj = ary->const_oop()->as_array();
ciConstant con = aobj->element_value_by_offset(off); ciConstant con = aobj->element_value_by_offset(off);
...@@ -1620,8 +1620,6 @@ static const Type* fold_stable_ary_elem(const TypeAryPtr* ary, int off, BasicTyp ...@@ -1620,8 +1620,6 @@ static const Type* fold_stable_ary_elem(const TypeAryPtr* ary, int off, BasicTyp
return con_type; return con_type;
} }
} }
}
return NULL; return NULL;
} }
...@@ -1641,7 +1639,7 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const { ...@@ -1641,7 +1639,7 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const {
// Try to guess loaded type from pointer type // Try to guess loaded type from pointer type
if (tp->isa_aryptr()) { if (tp->isa_aryptr()) {
const TypeAryPtr* ary = tp->is_aryptr(); const TypeAryPtr* ary = tp->is_aryptr();
const Type *t = ary->elem(); const Type* t = ary->elem();
// Determine whether the reference is beyond the header or not, by comparing // Determine whether the reference is beyond the header or not, by comparing
// the offset against the offset of the start of the array's data. // the offset against the offset of the start of the array's data.
...@@ -1653,10 +1651,9 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const { ...@@ -1653,10 +1651,9 @@ const Type *LoadNode::Value( PhaseTransform *phase ) const {
const bool off_beyond_header = ((uint)off >= (uint)min_base_off); const bool off_beyond_header = ((uint)off >= (uint)min_base_off);
// Try to constant-fold a stable array element. // Try to constant-fold a stable array element.
if (FoldStableValues && ary->is_stable()) { if (FoldStableValues && ary->is_stable() && ary->const_oop() != NULL) {
// Make sure the reference is not into the header // Make sure the reference is not into the header and the offset is constant
if (off_beyond_header && off != Type::OffsetBot) { if (off_beyond_header && adr->is_AddP() && off != Type::OffsetBot) {
assert(adr->is_AddP() && adr->in(AddPNode::Offset)->is_Con(), "offset is a constant");
const Type* con_type = fold_stable_ary_elem(ary, off, memory_type()); const Type* con_type = fold_stable_ary_elem(ary, off, memory_type());
if (con_type != NULL) { if (con_type != NULL) {
return con_type; return con_type;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册