< prev index next >

src/share/vm/opto/subnode.cpp

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, 2014, 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.
*** 496,505 **** --- 496,536 ---- // And optimizations like those for (X + Y) - X fail if overflow happens. Node *CmpNode::Identity( PhaseTransform *phase ) { return this; } + #ifndef PRODUCT + //------------------------------rel-------------------------------------------- + // Related nodes of comparison nodes include all data inputs (until hitting a + // control boundary) as well as all outputs until and including control nodes + // as well as their projections. In compact mode, data inputs till depth 1 and + // all outputs till depth 1 are considered. + void CmpNode::rel(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const { + if (compact) { + this->collect_nodes(in_rel, 1, false, true); + this->collect_nodes(out_rel, -1, false, false); + } else { + this->collect_nodes_in_all_data(in_rel, false); + this->collect_nodes_out_all_ctrl_boundary(out_rel); + // Now, find all control nodes in out_rel, and include their projections + // and projection targets (if any) in the result. + GrowableArray<Node*> proj(Compile::current()->unique()); + for (GrowableArrayIterator<Node*> it = out_rel->begin(); it != out_rel->end(); ++it) { + Node* n = *it; + if (n->is_CFG() && !n->is_Proj()) { + // Assume projections and projection targets are found at levels 1 and 2. + n->collect_nodes(&proj, -2, false, false); + for (GrowableArrayIterator<Node*> p = proj.begin(); p != proj.end(); ++p) { + out_rel->append_if_missing(*p); + } + proj.clear(); + } + } + } + } + #endif + //============================================================================= //------------------------------cmp-------------------------------------------- // Simplify a CmpI (compare 2 integers) node, based on local information. // If both inputs are constants, compare them. const Type *CmpINode::sub( const Type *t1, const Type *t2 ) const {
*** 1394,1414 **** // based on local information. If the input is constant, do it. const Type *BoolNode::Value( PhaseTransform *phase ) const { return _test.cc2logical( phase->type( in(1) ) ); } //------------------------------dump_spec-------------------------------------- // Dump special per-node info - #ifndef PRODUCT void BoolNode::dump_spec(outputStream *st) const { st->print("["); _test.dump_on(st); st->print("]"); } #endif ! //------------------------------is_counted_loop_exit_test-------------------------------------- // Returns true if node is used by a counted loop node. bool BoolNode::is_counted_loop_exit_test() { for( DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++ ) { Node* use = fast_out(i); if (use->is_CountedLoopEnd()) { --- 1425,1459 ---- // based on local information. If the input is constant, do it. const Type *BoolNode::Value( PhaseTransform *phase ) const { return _test.cc2logical( phase->type( in(1) ) ); } + #ifndef PRODUCT //------------------------------dump_spec-------------------------------------- // Dump special per-node info void BoolNode::dump_spec(outputStream *st) const { st->print("["); _test.dump_on(st); st->print("]"); } + + //---------------------------------rel----------------------------------------- + // A BoolNode's related nodes are all of its data inputs, and all of its + // outputs until control nodes are hit, which are included. In compact + // representation, inputs till level 3 and immediate outputs are included. + void BoolNode::rel(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const { + if (compact) { + this->collect_nodes(in_rel, 3, false, true); + this->collect_nodes(out_rel, -1, false, false); + } else { + this->collect_nodes_in_all_data(in_rel, false); + this->collect_nodes_out_all_ctrl_boundary(out_rel); + } + } #endif ! //----------------------is_counted_loop_exit_test------------------------------ // Returns true if node is used by a counted loop node. bool BoolNode::is_counted_loop_exit_test() { for( DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++ ) { Node* use = fast_out(i); if (use->is_CountedLoopEnd()) {
< prev index next >