comparison src/share/vm/opto/memnode.hpp @ 23054:55d07ec5bde4

8036851: volatile double accesses are not explicitly atomic in C2 Summary: The C2 structure is adapted to distinguish between volatile and non-volatile double accesses. Reviewed-by: twisti, kvn Contributed-by: Tobias Hartmann <tobias.hartmann@oracle.com>
author anoll
date Tue, 06 May 2014 09:17:57 +0200
parents e7b3d177adda
children c1c199dde5c9
comparison
equal deleted inserted replaced
23053:8c3941f2020c 23054:55d07ec5bde4
334 : LoadNode(c, mem, adr, at, tl, mo), _require_atomic_access(require_atomic_access) {} 334 : LoadNode(c, mem, adr, at, tl, mo), _require_atomic_access(require_atomic_access) {}
335 virtual int Opcode() const; 335 virtual int Opcode() const;
336 virtual uint ideal_reg() const { return Op_RegL; } 336 virtual uint ideal_reg() const { return Op_RegL; }
337 virtual int store_Opcode() const { return Op_StoreL; } 337 virtual int store_Opcode() const { return Op_StoreL; }
338 virtual BasicType memory_type() const { return T_LONG; } 338 virtual BasicType memory_type() const { return T_LONG; }
339 bool require_atomic_access() { return _require_atomic_access; } 339 bool require_atomic_access() const { return _require_atomic_access; }
340 static LoadLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, 340 static LoadLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type,
341 const Type* rt, MemOrd mo); 341 const Type* rt, MemOrd mo);
342 #ifndef PRODUCT 342 #ifndef PRODUCT
343 virtual void dump_spec(outputStream *st) const { 343 virtual void dump_spec(outputStream *st) const {
344 LoadNode::dump_spec(st); 344 LoadNode::dump_spec(st);
369 }; 369 };
370 370
371 //------------------------------LoadDNode-------------------------------------- 371 //------------------------------LoadDNode--------------------------------------
372 // Load a double (64 bits) from memory 372 // Load a double (64 bits) from memory
373 class LoadDNode : public LoadNode { 373 class LoadDNode : public LoadNode {
374 public: 374 virtual uint hash() const { return LoadNode::hash() + _require_atomic_access; }
375 LoadDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, MemOrd mo) 375 virtual uint cmp( const Node &n ) const {
376 : LoadNode(c, mem, adr, at, t, mo) {} 376 return _require_atomic_access == ((LoadDNode&)n)._require_atomic_access
377 && LoadNode::cmp(n);
378 }
379 virtual uint size_of() const { return sizeof(*this); }
380 const bool _require_atomic_access; // is piecewise load forbidden?
381
382 public:
383 LoadDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t,
384 MemOrd mo, bool require_atomic_access = false)
385 : LoadNode(c, mem, adr, at, t, mo), _require_atomic_access(require_atomic_access) {}
377 virtual int Opcode() const; 386 virtual int Opcode() const;
378 virtual uint ideal_reg() const { return Op_RegD; } 387 virtual uint ideal_reg() const { return Op_RegD; }
379 virtual int store_Opcode() const { return Op_StoreD; } 388 virtual int store_Opcode() const { return Op_StoreD; }
380 virtual BasicType memory_type() const { return T_DOUBLE; } 389 virtual BasicType memory_type() const { return T_DOUBLE; }
390 bool require_atomic_access() const { return _require_atomic_access; }
391 static LoadDNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type,
392 const Type* rt, MemOrd mo);
393 #ifndef PRODUCT
394 virtual void dump_spec(outputStream *st) const {
395 LoadNode::dump_spec(st);
396 if (_require_atomic_access) st->print(" Atomic!");
397 }
398 #endif
381 }; 399 };
382 400
383 //------------------------------LoadD_unalignedNode---------------------------- 401 //------------------------------LoadD_unalignedNode----------------------------
384 // Load a double from unaligned memory 402 // Load a double from unaligned memory
385 class LoadD_unalignedNode : public LoadDNode { 403 class LoadD_unalignedNode : public LoadDNode {
580 public: 598 public:
581 StoreLNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo, bool require_atomic_access = false) 599 StoreLNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo, bool require_atomic_access = false)
582 : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {} 600 : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {}
583 virtual int Opcode() const; 601 virtual int Opcode() const;
584 virtual BasicType memory_type() const { return T_LONG; } 602 virtual BasicType memory_type() const { return T_LONG; }
585 bool require_atomic_access() { return _require_atomic_access; } 603 bool require_atomic_access() const { return _require_atomic_access; }
586 static StoreLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo); 604 static StoreLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo);
587 #ifndef PRODUCT 605 #ifndef PRODUCT
588 virtual void dump_spec(outputStream *st) const { 606 virtual void dump_spec(outputStream *st) const {
589 StoreNode::dump_spec(st); 607 StoreNode::dump_spec(st);
590 if (_require_atomic_access) st->print(" Atomic!"); 608 if (_require_atomic_access) st->print(" Atomic!");
603 }; 621 };
604 622
605 //------------------------------StoreDNode------------------------------------- 623 //------------------------------StoreDNode-------------------------------------
606 // Store double to memory 624 // Store double to memory
607 class StoreDNode : public StoreNode { 625 class StoreDNode : public StoreNode {
608 public: 626 virtual uint hash() const { return StoreNode::hash() + _require_atomic_access; }
609 StoreDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) 627 virtual uint cmp( const Node &n ) const {
610 : StoreNode(c, mem, adr, at, val, mo) {} 628 return _require_atomic_access == ((StoreDNode&)n)._require_atomic_access
629 && StoreNode::cmp(n);
630 }
631 virtual uint size_of() const { return sizeof(*this); }
632 const bool _require_atomic_access; // is piecewise store forbidden?
633 public:
634 StoreDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val,
635 MemOrd mo, bool require_atomic_access = false)
636 : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {}
611 virtual int Opcode() const; 637 virtual int Opcode() const;
612 virtual BasicType memory_type() const { return T_DOUBLE; } 638 virtual BasicType memory_type() const { return T_DOUBLE; }
639 bool require_atomic_access() const { return _require_atomic_access; }
640 static StoreDNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo);
641 #ifndef PRODUCT
642 virtual void dump_spec(outputStream *st) const {
643 StoreNode::dump_spec(st);
644 if (_require_atomic_access) st->print(" Atomic!");
645 }
646 #endif
647
613 }; 648 };
614 649
615 //------------------------------StorePNode------------------------------------- 650 //------------------------------StorePNode-------------------------------------
616 // Store pointer to memory 651 // Store pointer to memory
617 class StorePNode : public StoreNode { 652 class StorePNode : public StoreNode {