Home | History | Annotate | Download | only in compiler

Lines Matching refs:node

11 #include "src/compiler/node-properties.h"
53 // returned by node #263 cannot be observed ...
58 // eliminated. This optimization should work for any offset and input node, of
138 const ZoneSet<Node*>& to_remove_const() { return to_remove_; }
140 void Visit(Node* node);
143 static bool IsEffectful(Node* node);
144 void VisitEffectfulNode(Node* node);
145 UnobservablesSet RecomputeUseIntersection(Node* node);
146 UnobservablesSet RecomputeSet(Node* node, UnobservablesSet uses);
147 static bool CannotObserveStoreField(Node* node);
149 void MarkForRevisit(Node* node);
150 bool HasBeenVisited(Node* node);
159 ZoneSet<Node*>& to_remove() { return to_remove_; }
164 ZoneStack<Node*> revisit_;
166 // Maps node IDs to UnobservableNodeSets.
168 ZoneSet<Node*> to_remove_;
204 Node* next = revisit_.top();
214 for (Node* node : all.reachable) {
215 if (node->op()->opcode() == IrOpcode::kStoreField) {
216 DCHECK_EXTRA(HasBeenVisited(node), "#%d:%s", node->id(),
217 node->op()->mnemonic());
223 void RedundantStoreFinder::MarkForRevisit(Node* node) {
224 DCHECK_LT(node->id(), in_revisit_.size());
225 if (!in_revisit_[node->id()]) {
226 revisit_.push(node);
227 in_revisit_[node->id()] = true;
231 bool RedundantStoreFinder::HasBeenVisited(Node* node) {
232 return !unobservable_for_id(node->id()).IsUnvisited();
242 for (Node* node : finder.to_remove_const()) {
244 PrintF("StoreStoreElimination::Run: Eliminating node #%d:%s\n",
245 node->id(), node->op()->mnemonic());
247 Node* previous_effect = NodeProperties::GetEffectInput(node);
248 NodeProperties::ReplaceUses(node, nullptr, previous_effect, nullptr,
250 node->Kill();
254 bool RedundantStoreFinder::IsEffectful(Node* node) {
255 return (node->op()->EffectInputCount() >= 1);
258 // Recompute unobservables-set for a node. Will also mark superfluous nodes
261 UnobservablesSet RedundantStoreFinder::RecomputeSet(Node* node,
263 switch (node->op()->opcode()) {
265 Node* stored_to = node->InputAt(0);
266 FieldAccess access = OpParameter<FieldAccess>(node->op());
273 TRACE(" #%d is StoreField[+%d,%s](#%d), unobservable", node->id(),
276 to_remove().insert(node);
282 node->id(), offset,
288 node->id(), offset,
296 node->id(), offset,
306 Node* loaded_from = node->InputAt(0);
307 FieldAccess access = OpParameter<FieldAccess>(node->op());
313 node->id(), offset,
321 if (CannotObserveStoreField(node)) {
322 TRACE(" #%d:%s can observe nothing, set stays unchanged", node->id(),
323 node->op()->mnemonic());
327 node->id(), node->op()->mnemonic());
335 bool RedundantStoreFinder::CannotObserveStoreField(Node* node) {
336 return node->opcode() == IrOpcode::kCheckedLoad ||
337 node->opcode() == IrOpcode::kLoadElement ||
338 node->opcode() == IrOpcode::kLoad ||
339 node->opcode() == IrOpcode::kStore ||
340 node->opcode() == IrOpcode::kEffectPhi ||
341 node->opcode() == IrOpcode::kStoreElement ||
342 node->opcode() == IrOpcode::kCheckedStore ||
343 node->opcode() == IrOpcode::kUnsafePointerAdd ||
344 node->opcode() == IrOpcode::kRetain;
358 void RedundantStoreFinder::Visit(Node* node) {
364 if (!HasBeenVisited(node)) {
365 for (int i = 0; i < node->op()->ControlInputCount(); i++) {
366 Node* control_input = NodeProperties::GetControlInput(node, i);
373 bool isEffectful = (node->op()->EffectInputCount() >= 1);
375 VisitEffectfulNode(node);
376 DCHECK(HasBeenVisited(node));
379 if (!HasBeenVisited(node)) {
381 unobservable_for_id(node->id()) = unobservables_visited_empty_;
385 void RedundantStoreFinder::VisitEffectfulNode(Node* node) {
386 if (HasBeenVisited(node)) {
387 TRACE("- Revisiting: #%d:%s", node->id(), node->op()->mnemonic());
389 UnobservablesSet after_set = RecomputeUseIntersection(node);
390 UnobservablesSet before_set = RecomputeSet(node, after_set);
393 UnobservablesSet stored_for_node = unobservable_for_id(node->id());
401 unobservable_for_id(node->id()) = before_set;
404 for (int i = 0; i < node->op()->EffectInputCount(); i++) {
405 Node* input = NodeProperties::GetEffectInput(node, i);
414 // return it. This function only works if {node} has an effect use.
417 UnobservablesSet RedundantStoreFinder::RecomputeUseIntersection(Node* node) {
425 for (Edge edge : node->use_edges()) {
431 Node* use = edge.from();
446 auto opcode = node->op()->opcode();
455 "for #%d:%s", node->id(), node->op()->mnemonic());