< prev index next >
src/share/vm/opto/node.hpp
Print this page
rev 8739 : 8004073: Implement C2 Ideal node specific dump() method
Summary: add Node::dump_rel() to dump a node and its related nodes (the notion of "related" depends on the node at hand); add Node::dump_comp() to dump a node in compact representation; add Node::dump_rel_comp() to dump a node and its related nodes in compact representation; add the required machinery; extend some C2 IR nodes with compact and related dumping
Reviewed-by:
*** 1,7 ****
/*
! * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 1036,1052 ****
public:
#ifndef PRODUCT
Node* find(int idx) const; // Search the graph for the given idx.
Node* find_ctrl(int idx) const; // Search control ancestors for the given idx.
void dump() const { dump("\n"); } // Print this node.
! void dump(const char* suffix, outputStream *st = tty) const;// Print this node.
void dump(int depth) const; // Print this node, recursively to depth d
void dump_ctrl(int depth) const; // Print control nodes, to depth d
virtual void dump_req(outputStream *st = tty) const; // Print required-edge info
virtual void dump_prec(outputStream *st = tty) const; // Print precedence-edge info
virtual void dump_out(outputStream *st = tty) const; // Print the output edge info
virtual void dump_spec(outputStream *st) const {}; // Print per-node info
void verify_edges(Unique_Node_List &visited); // Verify bi-directional edges
void verify() const; // Check Def-Use info for my subgraph
static void verify_recur(const Node *n, int verify_depth, VectorSet &old_space, VectorSet &new_space);
// This call defines a class-unique string used to identify class instances
--- 1036,1083 ----
public:
#ifndef PRODUCT
Node* find(int idx) const; // Search the graph for the given idx.
Node* find_ctrl(int idx) const; // Search control ancestors for the given idx.
void dump() const { dump("\n"); } // Print this node.
! void dump(const char* suffix, bool mark = false, outputStream *st = tty) const; // Print this node.
void dump(int depth) const; // Print this node, recursively to depth d
void dump_ctrl(int depth) const; // Print control nodes, to depth d
+ void dump_comp() const; // Print this node in compact representation.
+ // Print this node in compact representation.
+ void dump_comp(const char* suffix, outputStream *st = tty) const;
virtual void dump_req(outputStream *st = tty) const; // Print required-edge info
virtual void dump_prec(outputStream *st = tty) const; // Print precedence-edge info
virtual void dump_out(outputStream *st = tty) const; // Print the output edge info
virtual void dump_spec(outputStream *st) const {}; // Print per-node info
+ // Print compact per-node info
+ virtual void dump_comp_spec(outputStream *st) const { dump_spec(st); }
+ void dump_rel() const; // Print related nodes (depends on node at hand).
+ // Print related nodes up to given depths for input and output nodes.
+ void dump_rel(uint d_in, uint d_out) const;
+ void dump_rel_comp() const; // Print related nodes in compact representation.
+ // Collect related nodes.
+ virtual void rel(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const;
+ // Collect nodes starting from this node, explicitly including/excluding control and data links.
+ void collect_nodes(GrowableArray<Node*> *ns, int d, bool ctrl, bool data) const;
+
+ // Node collectors, to be used in implementations of Node::rel().
+ // Collect the entire data input graph. Include control inputs if requested.
+ void collect_nodes_in_all_data(GrowableArray<Node*> *ns, bool ctrl) const;
+ // Collect the entire control input graph. Include data inputs if requested.
+ void collect_nodes_in_all_ctrl(GrowableArray<Node*> *ns, bool data) const;
+ // Collect the entire output graph until hitting and including control nodes.
+ void collect_nodes_out_all_ctrl_boundary(GrowableArray<Node*> *ns) const;
+ // Collect the entire data input graph, and outputs till level 1.
+ void collect_nodes_in_data_out_1(GrowableArray<Node*> *is, GrowableArray<Node*> *os, bool compact) const {
+ if (compact) {
+ this->collect_nodes(is, 1, false, true);
+ } else {
+ this->collect_nodes_in_all_data(is, false);
+ }
+ this->collect_nodes(os, -1, false, false);
+ }
+
void verify_edges(Unique_Node_List &visited); // Verify bi-directional edges
void verify() const; // Check Def-Use info for my subgraph
static void verify_recur(const Node *n, int verify_depth, VectorSet &old_space, VectorSet &new_space);
// This call defines a class-unique string used to identify class instances
*** 1089,1098 ****
--- 1120,1152 ----
uint _del_tick; // Bumped when a deletion happens..
#endif
#endif
};
+
+ #ifndef PRODUCT
+
+ // Used in debugging code to avoid walking across dead or uninitialized edges.
+ inline bool NotANode(const Node* n) {
+ if (n == NULL) return true;
+ if (((intptr_t)n & 1) != 0) return true; // uninitialized, etc.
+ if (*(address*)n == badAddress) return true; // kill by Node::destruct
+ return false;
+ }
+
+ // This macro provides a common definition of related node retrieval for all
+ // "arithmetic" nodes, which have no common superclass. The data input trees
+ // are relevant (until a control node boundary is hit), and the outgoing edges
+ // till level 1. In compact mode, inputs are collected till level 1 as well.
+ #define REL_IN_DATA_OUT_1 \
+ virtual void rel(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const { \
+ this->collect_nodes_in_data_out_1(in_rel, out_rel, compact); \
+ }
+
+ #endif
+
+
//-----------------------------------------------------------------------------
// Iterators over DU info, and associated Node functions.
#if OPTO_DU_ITERATOR_ASSERT
*** 1616,1624 ****
--- 1670,1679 ----
virtual const Type *Value( PhaseTransform *phase ) const;
virtual const Type *bottom_type() const;
virtual uint ideal_reg() const;
#ifndef PRODUCT
virtual void dump_spec(outputStream *st) const;
+ virtual void dump_comp_spec(outputStream *st) const;
#endif
};
#endif // SHARE_VM_OPTO_NODE_HPP
< prev index next >