70 : Node(c0,c1,c2,c3,c4) { |
70 : Node(c0,c1,c2,c3,c4) { |
71 init_class_id(Class_Mem); |
71 init_class_id(Class_Mem); |
72 debug_only(_adr_type=at; adr_type();) |
72 debug_only(_adr_type=at; adr_type();) |
73 } |
73 } |
74 |
74 |
|
75 virtual Node* find_previous_arraycopy(PhaseTransform* phase, Node* ld_alloc, Node*& mem, bool can_see_stored_value) const { return NULL; } |
|
76 |
75 public: |
77 public: |
76 // Helpers for the optimizer. Documented in memnode.cpp. |
78 // Helpers for the optimizer. Documented in memnode.cpp. |
77 static bool detect_ptr_independence(Node* p1, AllocateNode* a1, |
79 static bool detect_ptr_independence(Node* p1, AllocateNode* a1, |
78 Node* p2, AllocateNode* a2, |
80 Node* p2, AllocateNode* a2, |
79 PhaseTransform* phase); |
81 PhaseTransform* phase); |
122 Node* find_previous_store(PhaseTransform* phase); |
124 Node* find_previous_store(PhaseTransform* phase); |
123 |
125 |
124 // Can this node (load or store) accurately see a stored value in |
126 // Can this node (load or store) accurately see a stored value in |
125 // the given memory state? (The state may or may not be in(Memory).) |
127 // the given memory state? (The state may or may not be in(Memory).) |
126 Node* can_see_stored_value(Node* st, PhaseTransform* phase) const; |
128 Node* can_see_stored_value(Node* st, PhaseTransform* phase) const; |
|
129 Node* can_see_arraycopy_value(Node* st, PhaseTransform* phase) const; |
127 |
130 |
128 #ifndef PRODUCT |
131 #ifndef PRODUCT |
129 static void dump_adr_type(const Node* mem, const TypePtr* adr_type, outputStream *st); |
132 static void dump_adr_type(const Node* mem, const TypePtr* adr_type, outputStream *st); |
130 virtual void dump_spec(outputStream *st) const; |
133 virtual void dump_spec(outputStream *st) const; |
131 #endif |
134 #endif |
145 virtual uint cmp(const Node &n) const; |
148 virtual uint cmp(const Node &n) const; |
146 virtual uint size_of() const; // Size is bigger |
149 virtual uint size_of() const; // Size is bigger |
147 // Should LoadNode::Ideal() attempt to remove control edges? |
150 // Should LoadNode::Ideal() attempt to remove control edges? |
148 virtual bool can_remove_control() const; |
151 virtual bool can_remove_control() const; |
149 const Type* const _type; // What kind of value is loaded? |
152 const Type* const _type; // What kind of value is loaded? |
|
153 |
|
154 virtual Node* find_previous_arraycopy(PhaseTransform* phase, Node* ld_alloc, Node*& mem, bool can_see_stored_value) const; |
150 public: |
155 public: |
151 |
156 |
152 LoadNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt, MemOrd mo) |
157 LoadNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt, MemOrd mo) |
153 : MemNode(c,mem,adr,at), _type(rt), _mo(mo) { |
158 : MemNode(c,mem,adr,at), _type(rt), _mo(mo) { |
154 init_class_id(Class_Load); |
159 init_class_id(Class_Load); |