src/share/vm/opto/memnode.cpp

Print this page
rev 10271 : 8147844: new method j.l.Runtime.onSpinWait() and the corresponding x86 hotspot instrinsic
Summary: adds c1 & c2 x86 intrinsics for j.l.Runtime.onSpinWait() that utilize the PAUSE instruction
Reviewed-by: iveresov, kvn, vlivanov
Contributed-by: Ivan Krylov <ivan@azul.com>, Yuri Gaevsky <ygaevsky@azul.com>


2883     init_req(TypeFunc::Parms, precedent);
2884 }
2885 
2886 //------------------------------cmp--------------------------------------------
2887 uint MemBarNode::hash() const { return NO_HASH; }
2888 uint MemBarNode::cmp( const Node &n ) const {
2889   return (&n == this);          // Always fail except on self
2890 }
2891 
2892 //------------------------------make-------------------------------------------
2893 MemBarNode* MemBarNode::make(Compile* C, int opcode, int atp, Node* pn) {
2894   switch (opcode) {
2895   case Op_MemBarAcquire:     return new MemBarAcquireNode(C, atp, pn);
2896   case Op_LoadFence:         return new LoadFenceNode(C, atp, pn);
2897   case Op_MemBarRelease:     return new MemBarReleaseNode(C, atp, pn);
2898   case Op_StoreFence:        return new StoreFenceNode(C, atp, pn);
2899   case Op_MemBarAcquireLock: return new MemBarAcquireLockNode(C, atp, pn);
2900   case Op_MemBarReleaseLock: return new MemBarReleaseLockNode(C, atp, pn);
2901   case Op_MemBarVolatile:    return new MemBarVolatileNode(C, atp, pn);
2902   case Op_MemBarCPUOrder:    return new MemBarCPUOrderNode(C, atp, pn);

2903   case Op_Initialize:        return new InitializeNode(C, atp, pn);
2904   case Op_MemBarStoreStore:  return new MemBarStoreStoreNode(C, atp, pn);
2905   default: ShouldNotReachHere(); return NULL;
2906   }
2907 }
2908 
2909 //------------------------------Ideal------------------------------------------
2910 // Return a node which is more "ideal" than the current node.  Strip out
2911 // control copies
2912 Node *MemBarNode::Ideal(PhaseGVN *phase, bool can_reshape) {
2913   if (remove_dead_region(phase, can_reshape)) return this;
2914   // Don't bother trying to transform a dead node
2915   if (in(0) && in(0)->is_top()) {
2916     return NULL;
2917   }
2918 
2919   bool progress = false;
2920   // Eliminate volatile MemBars for scalar replaced objects.
2921   if (can_reshape && req() == (Precedent+1)) {
2922     bool eliminate = false;




2883     init_req(TypeFunc::Parms, precedent);
2884 }
2885 
2886 //------------------------------cmp--------------------------------------------
2887 uint MemBarNode::hash() const { return NO_HASH; }
2888 uint MemBarNode::cmp( const Node &n ) const {
2889   return (&n == this);          // Always fail except on self
2890 }
2891 
2892 //------------------------------make-------------------------------------------
2893 MemBarNode* MemBarNode::make(Compile* C, int opcode, int atp, Node* pn) {
2894   switch (opcode) {
2895   case Op_MemBarAcquire:     return new MemBarAcquireNode(C, atp, pn);
2896   case Op_LoadFence:         return new LoadFenceNode(C, atp, pn);
2897   case Op_MemBarRelease:     return new MemBarReleaseNode(C, atp, pn);
2898   case Op_StoreFence:        return new StoreFenceNode(C, atp, pn);
2899   case Op_MemBarAcquireLock: return new MemBarAcquireLockNode(C, atp, pn);
2900   case Op_MemBarReleaseLock: return new MemBarReleaseLockNode(C, atp, pn);
2901   case Op_MemBarVolatile:    return new MemBarVolatileNode(C, atp, pn);
2902   case Op_MemBarCPUOrder:    return new MemBarCPUOrderNode(C, atp, pn);
2903   case Op_OnSpinWait:        return new OnSpinWaitNode(C, atp, pn);
2904   case Op_Initialize:        return new InitializeNode(C, atp, pn);
2905   case Op_MemBarStoreStore:  return new MemBarStoreStoreNode(C, atp, pn);
2906   default: ShouldNotReachHere(); return NULL;
2907   }
2908 }
2909 
2910 //------------------------------Ideal------------------------------------------
2911 // Return a node which is more "ideal" than the current node.  Strip out
2912 // control copies
2913 Node *MemBarNode::Ideal(PhaseGVN *phase, bool can_reshape) {
2914   if (remove_dead_region(phase, can_reshape)) return this;
2915   // Don't bother trying to transform a dead node
2916   if (in(0) && in(0)->is_top()) {
2917     return NULL;
2918   }
2919 
2920   bool progress = false;
2921   // Eliminate volatile MemBars for scalar replaced objects.
2922   if (can_reshape && req() == (Precedent+1)) {
2923     bool eliminate = false;