Mercurial > hg > graal-compiler
comparison src/share/vm/opto/callnode.hpp @ 65:99269dbf4ba8
6674588: (Escape Analysis) Improve Escape Analysis code
Summary: Current EA code has several problems which have to be fixed.
Reviewed-by: jrose, sgoldman
author | kvn |
---|---|
date | Fri, 14 Mar 2008 15:26:33 -0700 |
parents | eac007780a58 |
children | 2a9af0b9cb1c |
comparison
equal
deleted
inserted
replaced
64:b8f5ba577b02 | 65:99269dbf4ba8 |
---|---|
386 // for JVM states during parsing, intrinsic expansion, etc. | 386 // for JVM states during parsing, intrinsic expansion, etc. |
387 SafePointNode* next_exception() const; | 387 SafePointNode* next_exception() const; |
388 void set_next_exception(SafePointNode* n); | 388 void set_next_exception(SafePointNode* n); |
389 bool has_exceptions() const { return next_exception() != NULL; } | 389 bool has_exceptions() const { return next_exception() != NULL; } |
390 | 390 |
391 // Does this node have a use of n other than in debug information? | |
392 virtual bool has_non_debug_use(Node *n) {return false; } | |
393 | |
391 // Standard Node stuff | 394 // Standard Node stuff |
392 virtual int Opcode() const; | 395 virtual int Opcode() const; |
393 virtual bool pinned() const { return true; } | 396 virtual bool pinned() const { return true; } |
394 virtual const Type *Value( PhaseTransform *phase ) const; | 397 virtual const Type *Value( PhaseTransform *phase ) const; |
395 virtual const Type *bottom_type() const { return Type::CONTROL; } | 398 virtual const Type *bottom_type() const { return Type::CONTROL; } |
455 class CallNode : public SafePointNode { | 458 class CallNode : public SafePointNode { |
456 public: | 459 public: |
457 const TypeFunc *_tf; // Function type | 460 const TypeFunc *_tf; // Function type |
458 address _entry_point; // Address of method being called | 461 address _entry_point; // Address of method being called |
459 float _cnt; // Estimate of number of times called | 462 float _cnt; // Estimate of number of times called |
460 PointsToNode::EscapeState _escape_state; | |
461 | 463 |
462 CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type) | 464 CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type) |
463 : SafePointNode(tf->domain()->cnt(), NULL, adr_type), | 465 : SafePointNode(tf->domain()->cnt(), NULL, adr_type), |
464 _tf(tf), | 466 _tf(tf), |
465 _entry_point(addr), | 467 _entry_point(addr), |
466 _cnt(COUNT_UNKNOWN) | 468 _cnt(COUNT_UNKNOWN) |
467 { | 469 { |
468 init_class_id(Class_Call); | 470 init_class_id(Class_Call); |
469 init_flags(Flag_is_Call); | 471 init_flags(Flag_is_Call); |
470 _escape_state = PointsToNode::UnknownEscape; | |
471 } | 472 } |
472 | 473 |
473 const TypeFunc* tf() const { return _tf; } | 474 const TypeFunc* tf() const { return _tf; } |
474 const address entry_point() const { return _entry_point; } | 475 const address entry_point() const { return _entry_point; } |
475 const float cnt() const { return _cnt; } | 476 const float cnt() const { return _cnt; } |
491 virtual bool guaranteed_safepoint() { return true; } | 492 virtual bool guaranteed_safepoint() { return true; } |
492 // For macro nodes, the JVMState gets modified during expansion, so when cloning | 493 // For macro nodes, the JVMState gets modified during expansion, so when cloning |
493 // the node the JVMState must be cloned. | 494 // the node the JVMState must be cloned. |
494 virtual void clone_jvms() { } // default is not to clone | 495 virtual void clone_jvms() { } // default is not to clone |
495 | 496 |
497 // Returns true if the call may modify n | |
498 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase); | |
499 // Does this node have a use of n other than in debug information? | |
500 virtual bool has_non_debug_use(Node *n); | |
501 // Returns the unique CheckCastPP of a call | |
502 // or result projection is there are several CheckCastPP | |
503 // or returns NULL if there is no one. | |
504 Node *result_cast(); | |
505 | |
496 virtual uint match_edge(uint idx) const; | 506 virtual uint match_edge(uint idx) const; |
497 | 507 |
498 #ifndef PRODUCT | 508 #ifndef PRODUCT |
499 virtual void dump_req() const; | 509 virtual void dump_req() const; |
500 virtual void dump_spec(outputStream *st) const; | 510 virtual void dump_spec(outputStream *st) const; |
687 } | 697 } |
688 virtual int Opcode() const; | 698 virtual int Opcode() const; |
689 virtual uint ideal_reg() const { return Op_RegP; } | 699 virtual uint ideal_reg() const { return Op_RegP; } |
690 virtual bool guaranteed_safepoint() { return false; } | 700 virtual bool guaranteed_safepoint() { return false; } |
691 | 701 |
702 // allocations do not modify their arguments | |
703 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase) { return false;} | |
704 | |
692 // Pattern-match a possible usage of AllocateNode. | 705 // Pattern-match a possible usage of AllocateNode. |
693 // Return null if no allocation is recognized. | 706 // Return null if no allocation is recognized. |
694 // The operand is the pointer produced by the (possible) allocation. | 707 // The operand is the pointer produced by the (possible) allocation. |
695 // It must be a projection of the Allocate or its subsequent CastPP. | 708 // It must be a projection of the Allocate or its subsequent CastPP. |
696 // (Note: This function is defined in file graphKit.cpp, near | 709 // (Note: This function is defined in file graphKit.cpp, near |
798 virtual uint size_of() const { return sizeof(*this); } | 811 virtual uint size_of() const { return sizeof(*this); } |
799 | 812 |
800 bool is_eliminated() {return _eliminate; } | 813 bool is_eliminated() {return _eliminate; } |
801 // mark node as eliminated and update the counter if there is one | 814 // mark node as eliminated and update the counter if there is one |
802 void set_eliminated(); | 815 void set_eliminated(); |
816 | |
817 // locking does not modify its arguments | |
818 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase){ return false;} | |
803 | 819 |
804 #ifndef PRODUCT | 820 #ifndef PRODUCT |
805 void create_lock_counter(JVMState* s); | 821 void create_lock_counter(JVMState* s); |
806 NamedCounter* counter() const { return _counter; } | 822 NamedCounter* counter() const { return _counter; } |
807 #endif | 823 #endif |