src/share/vm/opto/parse1.cpp

Print this page
rev 5661 : 8024921: PPC64 (part 113): Extend Load and Store nodes to know about memory ordering.

*** 104,131 **** Node *ctl = control(); // Very similar to LoadNode::make, except we handle un-aligned longs and // doubles on Sparc. Intel can handle them just fine directly. Node *l; ! switch( bt ) { // Signature is flattened ! case T_INT: l = new (C) LoadINode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break; ! case T_FLOAT: l = new (C) LoadFNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break; ! case T_ADDRESS: l = new (C) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM ); break; ! case T_OBJECT: l = new (C) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM ); break; case T_LONG: case T_DOUBLE: { // Since arguments are in reverse order, the argument address 'adr' // refers to the back half of the long/double. Recompute adr. ! adr = basic_plus_adr( local_addrs_base, local_addrs, -(index+1)*wordSize ); ! if( Matcher::misaligned_doubles_ok ) { l = (bt == T_DOUBLE) ! ? (Node*)new (C) LoadDNode( ctl, mem, adr, TypeRawPtr::BOTTOM ) ! : (Node*)new (C) LoadLNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); } else { l = (bt == T_DOUBLE) ! ? (Node*)new (C) LoadD_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM ) ! : (Node*)new (C) LoadL_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); } break; } default: ShouldNotReachHere(); } --- 104,131 ---- Node *ctl = control(); // Very similar to LoadNode::make, except we handle un-aligned longs and // doubles on Sparc. Intel can handle them just fine directly. Node *l; ! switch (bt) { // Signature is flattened ! case T_INT: l = new (C) LoadINode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInt::INT, LoadNode::unordered); break; ! case T_FLOAT: l = new (C) LoadFNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::FLOAT, LoadNode::unordered); break; ! case T_ADDRESS: l = new (C) LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, LoadNode::unordered); break; ! case T_OBJECT: l = new (C) LoadPNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM, LoadNode::unordered); break; case T_LONG: case T_DOUBLE: { // Since arguments are in reverse order, the argument address 'adr' // refers to the back half of the long/double. Recompute adr. ! adr = basic_plus_adr(local_addrs_base, local_addrs, -(index+1)*wordSize); ! if (Matcher::misaligned_doubles_ok) { l = (bt == T_DOUBLE) ! ? (Node*)new (C) LoadDNode(ctl, mem, adr, TypeRawPtr::BOTTOM, Type::DOUBLE, LoadNode::unordered) ! : (Node*)new (C) LoadLNode(ctl, mem, adr, TypeRawPtr::BOTTOM, TypeLong::LONG, false, LoadNode::unordered); } else { l = (bt == T_DOUBLE) ! ? (Node*)new (C) LoadD_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, LoadNode::unordered) ! : (Node*)new (C) LoadL_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, LoadNode::unordered); } break; } default: ShouldNotReachHere(); }
*** 227,237 **** Node *lock_object = fetch_interpreter_state(index*2, T_OBJECT, monitors_addr, osr_buf); // Try and copy the displaced header to the BoxNode Node *displaced_hdr = fetch_interpreter_state((index*2) + 1, T_ADDRESS, monitors_addr, osr_buf); ! store_to_memory(control(), box, displaced_hdr, T_ADDRESS, Compile::AliasIdxRaw); // Build a bogus FastLockNode (no code will be generated) and push the // monitor into our debug info. const FastLockNode *flock = _gvn.transform(new (C) FastLockNode( 0, lock_object, box ))->as_FastLock(); map()->push_monitor(flock); --- 227,237 ---- Node *lock_object = fetch_interpreter_state(index*2, T_OBJECT, monitors_addr, osr_buf); // Try and copy the displaced header to the BoxNode Node *displaced_hdr = fetch_interpreter_state((index*2) + 1, T_ADDRESS, monitors_addr, osr_buf); ! store_to_memory(control(), box, displaced_hdr, T_ADDRESS, Compile::AliasIdxRaw, false, StoreNode::unordered); // Build a bogus FastLockNode (no code will be generated) and push the // monitor into our debug info. const FastLockNode *flock = _gvn.transform(new (C) FastLockNode( 0, lock_object, box ))->as_FastLock(); map()->push_monitor(flock);
*** 1929,1939 **** // class is often visible so the access flags are constant. Node* klass_addr = basic_plus_adr( receiver, receiver, oopDesc::klass_offset_in_bytes() ); Node* klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), klass_addr, TypeInstPtr::KLASS) ); Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::access_flags_offset())); ! Node* access_flags = make_load(NULL, access_flags_addr, TypeInt::INT, T_INT); Node* mask = _gvn.transform(new (C) AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER))); Node* check = _gvn.transform(new (C) CmpINode(mask, intcon(0))); Node* test = _gvn.transform(new (C) BoolNode(check, BoolTest::ne)); --- 1929,1939 ---- // class is often visible so the access flags are constant. Node* klass_addr = basic_plus_adr( receiver, receiver, oopDesc::klass_offset_in_bytes() ); Node* klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), klass_addr, TypeInstPtr::KLASS) ); Node* access_flags_addr = basic_plus_adr(klass, klass, in_bytes(Klass::access_flags_offset())); ! Node* access_flags = make_load(NULL, access_flags_addr, TypeInt::INT, T_INT, false, LoadNode::unordered); Node* mask = _gvn.transform(new (C) AndINode(access_flags, intcon(JVM_ACC_HAS_FINALIZER))); Node* check = _gvn.transform(new (C) CmpINode(mask, intcon(0))); Node* test = _gvn.transform(new (C) BoolNode(check, BoolTest::ne));