1565 // (Folds up the 2nd indirection in aClassConstant.getModifiers().)
1566 assert(this->Opcode() == Op_LoadI, "must load an int from _modifier_flags");
1567 return TypeInt::make(klass->modifier_flags());
1568 }
1569 if (tkls->offset() == in_bytes(Klass::access_flags_offset())) {
1570 // The field is Klass::_access_flags. Return its (constant) value.
1571 // (Folds up the 2nd indirection in Reflection.getClassAccessFlags(aClassConstant).)
1572 assert(this->Opcode() == Op_LoadI, "must load an int from _access_flags");
1573 return TypeInt::make(klass->access_flags());
1574 }
1575 if (tkls->offset() == in_bytes(Klass::layout_helper_offset())) {
1576 // The field is Klass::_layout_helper. Return its constant value if known.
1577 assert(this->Opcode() == Op_LoadI, "must load an int from _layout_helper");
1578 return TypeInt::make(klass->layout_helper());
1579 }
1580
1581 // No match.
1582 return NULL;
1583 }
1584
1585 static bool is_mismatched_access(ciConstant con, BasicType loadbt) {
1586 BasicType conbt = con.basic_type();
1587 assert(conbt != T_NARROWOOP, "sanity");
1588 if (loadbt == T_NARROWOOP || loadbt == T_ARRAY) {
1589 loadbt = T_OBJECT;
1590 }
1591 return (conbt != loadbt);
1592 }
1593
1594 // Try to constant-fold a stable array element.
1595 static const Type* fold_stable_ary_elem(const TypeAryPtr* ary, int off, BasicType loadbt) {
1596 assert(ary->const_oop(), "array should be constant");
1597 assert(ary->is_stable(), "array should be stable");
1598
1599 // Decode the results of GraphKit::array_element_address.
1600 ciArray* aobj = ary->const_oop()->as_array();
1601 ciConstant con = aobj->element_value_by_offset(off);
1602 if (con.basic_type() != T_ILLEGAL && !is_mismatched_access(con, loadbt) && !con.is_null_or_zero()) {
1603 const Type* con_type = Type::make_from_constant(con);
1604 if (con_type != NULL) {
1605 if (con_type->isa_aryptr()) {
1606 // Join with the array element type, in case it is also stable.
1607 int dim = ary->stable_dimension();
1608 con_type = con_type->is_aryptr()->cast_to_stable(true, dim-1);
1609 }
1610 if (loadbt == T_NARROWOOP && con_type->isa_oopptr()) {
1611 con_type = con_type->make_narrowoop();
1612 }
1613 #ifndef PRODUCT
1614 if (TraceIterativeGVN) {
1615 tty->print("FoldStableValues: array element [off=%d]: con_type=", off);
1616 con_type->dump(); tty->cr();
1617 }
1618 #endif //PRODUCT
1619 return con_type;
1620 }
1621 }
1622 return NULL;
|
1565 // (Folds up the 2nd indirection in aClassConstant.getModifiers().)
1566 assert(this->Opcode() == Op_LoadI, "must load an int from _modifier_flags");
1567 return TypeInt::make(klass->modifier_flags());
1568 }
1569 if (tkls->offset() == in_bytes(Klass::access_flags_offset())) {
1570 // The field is Klass::_access_flags. Return its (constant) value.
1571 // (Folds up the 2nd indirection in Reflection.getClassAccessFlags(aClassConstant).)
1572 assert(this->Opcode() == Op_LoadI, "must load an int from _access_flags");
1573 return TypeInt::make(klass->access_flags());
1574 }
1575 if (tkls->offset() == in_bytes(Klass::layout_helper_offset())) {
1576 // The field is Klass::_layout_helper. Return its constant value if known.
1577 assert(this->Opcode() == Op_LoadI, "must load an int from _layout_helper");
1578 return TypeInt::make(klass->layout_helper());
1579 }
1580
1581 // No match.
1582 return NULL;
1583 }
1584
1585 #ifdef ASSERT
1586 static bool is_mismatched_access(ciConstant con, BasicType loadbt) {
1587 BasicType conbt = con.basic_type();
1588 assert(conbt != T_NARROWOOP, "sanity");
1589 if (loadbt == T_NARROWOOP || loadbt == T_ARRAY) {
1590 loadbt = T_OBJECT;
1591 }
1592 if (loadbt == T_BOOLEAN) {
1593 loadbt = T_BYTE;
1594 }
1595 if (conbt == T_BOOLEAN) {
1596 conbt = T_BYTE;
1597 }
1598 return (conbt != loadbt);
1599 }
1600 #endif // ASSERT
1601
1602 // Try to constant-fold a stable array element.
1603 static const Type* fold_stable_ary_elem(const TypeAryPtr* ary, int off, BasicType loadbt) {
1604 assert(ary->const_oop(), "array should be constant");
1605 assert(ary->is_stable(), "array should be stable");
1606
1607 // Decode the results of GraphKit::array_element_address.
1608 ciArray* aobj = ary->const_oop()->as_array();
1609 ciConstant con = aobj->element_value_by_offset(off);
1610 if (con.basic_type() != T_ILLEGAL && !con.is_null_or_zero()) {
1611 assert(!is_mismatched_access(con, loadbt),
1612 "conbt=%s; loadbt=%s", type2name(con.basic_type()), type2name(loadbt));
1613 const Type* con_type = Type::make_from_constant(con);
1614 if (con_type != NULL) {
1615 if (con_type->isa_aryptr()) {
1616 // Join with the array element type, in case it is also stable.
1617 int dim = ary->stable_dimension();
1618 con_type = con_type->is_aryptr()->cast_to_stable(true, dim-1);
1619 }
1620 if (loadbt == T_NARROWOOP && con_type->isa_oopptr()) {
1621 con_type = con_type->make_narrowoop();
1622 }
1623 #ifndef PRODUCT
1624 if (TraceIterativeGVN) {
1625 tty->print("FoldStableValues: array element [off=%d]: con_type=", off);
1626 con_type->dump(); tty->cr();
1627 }
1628 #endif //PRODUCT
1629 return con_type;
1630 }
1631 }
1632 return NULL;
|