< prev index next >
src/share/vm/opto/library_call.cpp
Print this page
*** 2644,2657 ****
// so there's no problems making a strong assert about mixing users
// of safe & unsafe memory.
if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder);
if (!is_store) {
MemNode::MemOrd mo = is_volatile ? MemNode::acquire : MemNode::unordered;
// To be valid, unsafe loads may depend on other conditions than
// the one that guards them: pin the Load node
! Node* p = make_load(control(), adr, value_type, type, adr_type, mo, LoadNode::Pinned, is_volatile);
// load value
switch (type) {
case T_BOOLEAN:
case T_CHAR:
case T_BYTE:
--- 2644,2669 ----
// so there's no problems making a strong assert about mixing users
// of safe & unsafe memory.
if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder);
if (!is_store) {
+ Node* p = NULL;
+ // Try to constant fold a load from a constant field
+ ciField* field = alias_type->field();
+ if (heap_base_oop != top() &&
+ field != NULL && field->is_constant() && field->layout_type() == type) {
+ // final or stable field
+ const Type* con_type = Type::make_constant(alias_type->field(), heap_base_oop);
+ if (con_type != NULL) {
+ p = makecon(con_type);
+ }
+ }
+ if (p == NULL) {
MemNode::MemOrd mo = is_volatile ? MemNode::acquire : MemNode::unordered;
// To be valid, unsafe loads may depend on other conditions than
// the one that guards them: pin the Load node
! p = make_load(control(), adr, value_type, type, adr_type, mo, LoadNode::Pinned, is_volatile);
// load value
switch (type) {
case T_BOOLEAN:
case T_CHAR:
case T_BYTE:
*** 2673,2682 ****
--- 2685,2695 ----
break;
default:
fatal(err_msg_res("unexpected type %d: %s", type, type2name(type)));
break;
}
+ }
// The load node has the control of the preceding MemBarCPUOrder. All
// following nodes will have the control of the MemBarCPUOrder inserted at
// the end of this method. So, pushing the load onto the stack at a later
// point is fine.
set_result(p);
< prev index next >