< prev index next >

src/hotspot/share/opto/memnode.hpp

Print this page

1279 };
1280 
1281 // Ordering within the same CPU.  Used to order unsafe memory references
1282 // inside the compiler when we lack alias info.  Not needed "outside" the
1283 // compiler because the CPU does all the ordering for us.
1284 class MemBarCPUOrderNode: public MemBarNode {
1285 public:
1286   MemBarCPUOrderNode(Compile* C, int alias_idx, Node* precedent)
1287     : MemBarNode(C, alias_idx, precedent) {}
1288   virtual int Opcode() const;
1289   virtual uint ideal_reg() const { return 0; } // not matched in the AD file
1290 };
1291 
1292 class OnSpinWaitNode: public MemBarNode {
1293 public:
1294   OnSpinWaitNode(Compile* C, int alias_idx, Node* precedent)
1295     : MemBarNode(C, alias_idx, precedent) {}
1296   virtual int Opcode() const;
1297 };
1298 
1299 //------------------------------BlackholeNode----------------------------
1300 // Blackhole all arguments. This node would survive through the compiler
1301 // the effects on its arguments, and would be finally matched to nothing.
1302 class BlackholeNode : public MemBarNode {
1303 public:
1304   BlackholeNode(Compile* C, int alias_idx, Node* precedent)
1305     : MemBarNode(C, alias_idx, precedent) {}
1306   virtual int   Opcode() const;
1307   virtual uint ideal_reg() const { return 0; } // not matched in the AD file
1308   const RegMask &in_RegMask(uint idx) const {
1309     // Fake the incoming arguments mask for blackholes: accept all registers
1310     // and all stack slots. This would avoid any redundant register moves
1311     // for blackhole inputs.
1312     return RegMask::All;
1313   }
1314 #ifndef PRODUCT
1315   virtual void format(PhaseRegAlloc* ra, outputStream* st) const;
1316 #endif
1317 };
1318 
1319 // Isolation of object setup after an AllocateNode and before next safepoint.
1320 // (See comment in memnode.cpp near InitializeNode::InitializeNode for semantics.)
1321 class InitializeNode: public MemBarNode {
1322   friend class AllocateNode;
1323 
1324   enum {
1325     Incomplete    = 0,
1326     Complete      = 1,
1327     WithArraycopy = 2
1328   };
1329   int _is_complete;
1330 
1331   bool _does_not_escape;
1332 
1333 public:
1334   enum {
1335     Control    = TypeFunc::Control,
1336     Memory     = TypeFunc::Memory,     // MergeMem for states affected by this op
1337     RawAddress = TypeFunc::Parms+0,    // the newly-allocated raw address
1338     RawStores  = TypeFunc::Parms+1     // zero or more stores (or TOP)

1279 };
1280 
1281 // Ordering within the same CPU.  Used to order unsafe memory references
1282 // inside the compiler when we lack alias info.  Not needed "outside" the
1283 // compiler because the CPU does all the ordering for us.
1284 class MemBarCPUOrderNode: public MemBarNode {
1285 public:
1286   MemBarCPUOrderNode(Compile* C, int alias_idx, Node* precedent)
1287     : MemBarNode(C, alias_idx, precedent) {}
1288   virtual int Opcode() const;
1289   virtual uint ideal_reg() const { return 0; } // not matched in the AD file
1290 };
1291 
1292 class OnSpinWaitNode: public MemBarNode {
1293 public:
1294   OnSpinWaitNode(Compile* C, int alias_idx, Node* precedent)
1295     : MemBarNode(C, alias_idx, precedent) {}
1296   virtual int Opcode() const;
1297 };
1298 




















1299 // Isolation of object setup after an AllocateNode and before next safepoint.
1300 // (See comment in memnode.cpp near InitializeNode::InitializeNode for semantics.)
1301 class InitializeNode: public MemBarNode {
1302   friend class AllocateNode;
1303 
1304   enum {
1305     Incomplete    = 0,
1306     Complete      = 1,
1307     WithArraycopy = 2
1308   };
1309   int _is_complete;
1310 
1311   bool _does_not_escape;
1312 
1313 public:
1314   enum {
1315     Control    = TypeFunc::Control,
1316     Memory     = TypeFunc::Memory,     // MergeMem for states affected by this op
1317     RawAddress = TypeFunc::Parms+0,    // the newly-allocated raw address
1318     RawStores  = TypeFunc::Parms+1     // zero or more stores (or TOP)
< prev index next >