comparison src/share/vm/opto/callnode.hpp @ 4777:e9a5e0a812c8

7125896: Eliminate nested locks Summary: Nested locks elimination done before lock nodes expansion by looking for outer locks of the same object. Reviewed-by: never, twisti
author kvn
date Sat, 07 Jan 2012 13:26:43 -0800
parents 1dc233a8c7fe
children ee138854b3a6
comparison
equal deleted inserted replaced
4776:5da7201222d5 4777:e9a5e0a812c8
838 }; 838 };
839 839
840 //------------------------------AbstractLockNode----------------------------------- 840 //------------------------------AbstractLockNode-----------------------------------
841 class AbstractLockNode: public CallNode { 841 class AbstractLockNode: public CallNode {
842 private: 842 private:
843 bool _eliminate; // indicates this lock can be safely eliminated 843 enum {
844 bool _coarsened; // indicates this lock was coarsened 844 Regular = 0, // Normal lock
845 NonEscObj, // Lock is used for non escaping object
846 Coarsened, // Lock was coarsened
847 Nested // Nested lock
848 } _kind;
845 #ifndef PRODUCT 849 #ifndef PRODUCT
846 NamedCounter* _counter; 850 NamedCounter* _counter;
847 #endif 851 #endif
848 852
849 protected: 853 protected:
856 GrowableArray<AbstractLockNode*> &lock_ops); 860 GrowableArray<AbstractLockNode*> &lock_ops);
857 bool find_unlocks_for_region(const RegionNode* region, LockNode* lock, 861 bool find_unlocks_for_region(const RegionNode* region, LockNode* lock,
858 GrowableArray<AbstractLockNode*> &lock_ops); 862 GrowableArray<AbstractLockNode*> &lock_ops);
859 LockNode *find_matching_lock(UnlockNode* unlock); 863 LockNode *find_matching_lock(UnlockNode* unlock);
860 864
865 // Update the counter to indicate that this lock was eliminated.
866 void set_eliminated_lock_counter() PRODUCT_RETURN;
861 867
862 public: 868 public:
863 AbstractLockNode(const TypeFunc *tf) 869 AbstractLockNode(const TypeFunc *tf)
864 : CallNode(tf, NULL, TypeRawPtr::BOTTOM), 870 : CallNode(tf, NULL, TypeRawPtr::BOTTOM),
865 _coarsened(false), 871 _kind(Regular)
866 _eliminate(false)
867 { 872 {
868 #ifndef PRODUCT 873 #ifndef PRODUCT
869 _counter = NULL; 874 _counter = NULL;
870 #endif 875 #endif
871 } 876 }
872 virtual int Opcode() const = 0; 877 virtual int Opcode() const = 0;
873 Node * obj_node() const {return in(TypeFunc::Parms + 0); } 878 Node * obj_node() const {return in(TypeFunc::Parms + 0); }
874 Node * box_node() const {return in(TypeFunc::Parms + 1); } 879 Node * box_node() const {return in(TypeFunc::Parms + 1); }
875 Node * fastlock_node() const {return in(TypeFunc::Parms + 2); } 880 Node * fastlock_node() const {return in(TypeFunc::Parms + 2); }
881 void set_box_node(Node* box) { set_req(TypeFunc::Parms + 1, box); }
882
876 const Type *sub(const Type *t1, const Type *t2) const { return TypeInt::CC;} 883 const Type *sub(const Type *t1, const Type *t2) const { return TypeInt::CC;}
877 884
878 virtual uint size_of() const { return sizeof(*this); } 885 virtual uint size_of() const { return sizeof(*this); }
879 886
880 bool is_eliminated() {return _eliminate; } 887 bool is_eliminated() const { return (_kind != Regular); }
881 // mark node as eliminated and update the counter if there is one 888 bool is_non_esc_obj() const { return (_kind == NonEscObj); }
882 void set_eliminated(); 889 bool is_coarsened() const { return (_kind == Coarsened); }
883 890 bool is_nested() const { return (_kind == Nested); }
884 bool is_coarsened() { return _coarsened; } 891
885 void set_coarsened() { _coarsened = true; } 892 void set_non_esc_obj() { _kind = NonEscObj; set_eliminated_lock_counter(); }
886 void clear_coarsened() { _coarsened = false; } 893 void set_coarsened() { _kind = Coarsened; set_eliminated_lock_counter(); }
894 void set_nested() { _kind = Nested; set_eliminated_lock_counter(); }
887 895
888 // locking does not modify its arguments 896 // locking does not modify its arguments
889 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase){ return false;} 897 virtual bool may_modify(const TypePtr *addr_t, PhaseTransform *phase){ return false;}
890 898
891 #ifndef PRODUCT 899 #ifndef PRODUCT
892 void create_lock_counter(JVMState* s); 900 void create_lock_counter(JVMState* s);
893 NamedCounter* counter() const { return _counter; } 901 NamedCounter* counter() const { return _counter; }
894 #endif 902 #endif
934 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); 942 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
935 // Expansion modifies the JVMState, so we need to clone it 943 // Expansion modifies the JVMState, so we need to clone it
936 virtual void clone_jvms() { 944 virtual void clone_jvms() {
937 set_jvms(jvms()->clone_deep(Compile::current())); 945 set_jvms(jvms()->clone_deep(Compile::current()));
938 } 946 }
947
948 bool is_nested_lock_region(); // Is this Lock nested?
939 }; 949 };
940 950
941 //------------------------------Unlock--------------------------------------- 951 //------------------------------Unlock---------------------------------------
942 // High-level unlock operation 952 // High-level unlock operation
943 class UnlockNode : public AbstractLockNode { 953 class UnlockNode : public AbstractLockNode {