Mercurial > hg > truffle
comparison src/share/vm/opto/memnode.hpp @ 113:ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv
Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author | coleenp |
---|---|
date | Sun, 13 Apr 2008 17:43:42 -0400 |
parents | 2a9af0b9cb1c |
children | d1a5218d7eaf |
comparison
equal
deleted
inserted
replaced
110:a49a647afe9a | 113:ba764ed4b6f2 |
---|---|
135 : MemNode(c,mem,adr,at), _type(rt) { | 135 : MemNode(c,mem,adr,at), _type(rt) { |
136 init_class_id(Class_Load); | 136 init_class_id(Class_Load); |
137 } | 137 } |
138 | 138 |
139 // Polymorphic factory method: | 139 // Polymorphic factory method: |
140 static LoadNode* make( Compile *C, Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt, BasicType bt ); | 140 static Node* make( PhaseGVN& gvn, Node *c, Node *mem, Node *adr, |
141 const TypePtr* at, const Type *rt, BasicType bt ); | |
141 | 142 |
142 virtual uint hash() const; // Check the type | 143 virtual uint hash() const; // Check the type |
143 | 144 |
144 // Handle algebraic identities here. If we have an identity, return the Node | 145 // Handle algebraic identities here. If we have an identity, return the Node |
145 // we are equivalent to. We look for Load of a Store. | 146 // we are equivalent to. We look for Load of a Store. |
328 // other optimizations). Basically, it's ugly but so is the alternative. | 329 // other optimizations). Basically, it's ugly but so is the alternative. |
329 // See comment in macro.cpp, around line 125 expand_allocate_common(). | 330 // See comment in macro.cpp, around line 125 expand_allocate_common(). |
330 virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; } | 331 virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; } |
331 }; | 332 }; |
332 | 333 |
334 | |
335 //------------------------------LoadNNode-------------------------------------- | |
336 // Load a narrow oop from memory (either object or array) | |
337 class LoadNNode : public LoadNode { | |
338 public: | |
339 LoadNNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const Type* t ) | |
340 : LoadNode(c,mem,adr,at,t) {} | |
341 virtual int Opcode() const; | |
342 virtual uint ideal_reg() const { return Op_RegN; } | |
343 virtual int store_Opcode() const { return Op_StoreN; } | |
344 virtual BasicType memory_type() const { return T_NARROWOOP; } | |
345 // depends_only_on_test is almost always true, and needs to be almost always | |
346 // true to enable key hoisting & commoning optimizations. However, for the | |
347 // special case of RawPtr loads from TLS top & end, the control edge carries | |
348 // the dependence preventing hoisting past a Safepoint instead of the memory | |
349 // edge. (An unfortunate consequence of having Safepoints not set Raw | |
350 // Memory; itself an unfortunate consequence of having Nodes which produce | |
351 // results (new raw memory state) inside of loops preventing all manner of | |
352 // other optimizations). Basically, it's ugly but so is the alternative. | |
353 // See comment in macro.cpp, around line 125 expand_allocate_common(). | |
354 virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; } | |
355 }; | |
356 | |
333 //------------------------------LoadKlassNode---------------------------------- | 357 //------------------------------LoadKlassNode---------------------------------- |
334 // Load a Klass from an object | 358 // Load a Klass from an object |
335 class LoadKlassNode : public LoadPNode { | 359 class LoadKlassNode : public LoadPNode { |
336 public: | 360 public: |
337 LoadKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk = TypeKlassPtr::OBJECT ) | 361 LoadKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk = TypeKlassPtr::OBJECT ) |
374 : MemNode(c,mem,adr,at,val,oop_store) { | 398 : MemNode(c,mem,adr,at,val,oop_store) { |
375 init_class_id(Class_Store); | 399 init_class_id(Class_Store); |
376 } | 400 } |
377 | 401 |
378 // Polymorphic factory method: | 402 // Polymorphic factory method: |
379 static StoreNode* make( Compile *C, Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, BasicType bt ); | 403 static StoreNode* make( PhaseGVN& gvn, Node *c, Node *mem, Node *adr, |
404 const TypePtr* at, Node *val, BasicType bt ); | |
380 | 405 |
381 virtual uint hash() const; // Check the type | 406 virtual uint hash() const; // Check the type |
382 | 407 |
383 // If the store is to Field memory and the pointer is non-null, we can | 408 // If the store is to Field memory and the pointer is non-null, we can |
384 // zero out the control input. | 409 // zero out the control input. |
484 class StorePNode : public StoreNode { | 509 class StorePNode : public StoreNode { |
485 public: | 510 public: |
486 StorePNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} | 511 StorePNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} |
487 virtual int Opcode() const; | 512 virtual int Opcode() const; |
488 virtual BasicType memory_type() const { return T_ADDRESS; } | 513 virtual BasicType memory_type() const { return T_ADDRESS; } |
514 }; | |
515 | |
516 //------------------------------StoreNNode------------------------------------- | |
517 // Store narrow oop to memory | |
518 class StoreNNode : public StoreNode { | |
519 public: | |
520 StoreNNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} | |
521 virtual int Opcode() const; | |
522 virtual BasicType memory_type() const { return T_NARROWOOP; } | |
489 }; | 523 }; |
490 | 524 |
491 //------------------------------StoreCMNode----------------------------------- | 525 //------------------------------StoreCMNode----------------------------------- |
492 // Store card-mark byte to memory for CM | 526 // Store card-mark byte to memory for CM |
493 // The last StoreCM before a SafePoint must be preserved and occur after its "oop" store | 527 // The last StoreCM before a SafePoint must be preserved and occur after its "oop" store |
595 | 629 |
596 //------------------------------CompareAndSwapPNode--------------------------- | 630 //------------------------------CompareAndSwapPNode--------------------------- |
597 class CompareAndSwapPNode : public LoadStoreNode { | 631 class CompareAndSwapPNode : public LoadStoreNode { |
598 public: | 632 public: |
599 CompareAndSwapPNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { } | 633 CompareAndSwapPNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { } |
634 virtual int Opcode() const; | |
635 }; | |
636 | |
637 //------------------------------CompareAndSwapNNode--------------------------- | |
638 class CompareAndSwapNNode : public LoadStoreNode { | |
639 public: | |
640 CompareAndSwapNNode( Node *c, Node *mem, Node *adr, Node *val, Node *ex) : LoadStoreNode(c, mem, adr, val, ex) { } | |
600 virtual int Opcode() const; | 641 virtual int Opcode() const; |
601 }; | 642 }; |
602 | 643 |
603 //------------------------------ClearArray------------------------------------- | 644 //------------------------------ClearArray------------------------------------- |
604 class ClearArrayNode: public Node { | 645 class ClearArrayNode: public Node { |