< prev index next >
src/share/vm/opto/ifnode.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) 2000, 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) 2000, 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.
*** 1599,1613 ****
}
// no progress
return this;
}
- //------------------------------dump_spec--------------------------------------
#ifndef PRODUCT
void IfNode::dump_spec(outputStream *st) const {
st->print("P=%f, C=%f",_prob,_fcnt);
}
#endif
//------------------------------idealize_test----------------------------------
// Try to canonicalize tests better. Peek at the Cmp/Bool/If sequence and
// come up with a canonical sequence. Bools getting 'eq', 'gt' and 'ge' forms
--- 1599,1643 ----
}
// no progress
return this;
}
#ifndef PRODUCT
+ //---------------------------------rel-----------------------------------------
+ // An IfProjNode's related node set consists of its input (an IfNode) including
+ // the IfNode's condition, plus all of its outputs at level 1. In compact mode,
+ // the restrictions for IfNode apply (see IfNode::rel).
+ void IfProjNode::rel(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact) const {
+ Node* ifNode = this->in(0);
+ in_rel->append(ifNode);
+ if (compact) {
+ ifNode->collect_nodes(in_rel, 3, false, true);
+ } else {
+ ifNode->collect_nodes_in_all_data(in_rel, false);
+ }
+ this->collect_nodes(out_rel, -1, false, false);
+ }
+
+ //------------------------------dump_spec--------------------------------------
void IfNode::dump_spec(outputStream *st) const {
st->print("P=%f, C=%f",_prob,_fcnt);
}
+
+ //---------------------------------rel-----------------------------------------
+ // For an IfNode, the set of related output nodes is just the output nodes till
+ // depth 2, i.e, the IfTrue/IfFalse projection nodes plus the nodes they refer.
+ // The related input nodes contain no control nodes, but all data nodes
+ // pertaining to the condition. In compact mode, the input nodes are collected
+ // up to a depth of 3.
+ void IfNode::rel(GrowableArray <Node *> *in_rel, GrowableArray <Node *> *out_rel, bool compact) const {
+ if (compact) {
+ this->collect_nodes(in_rel, 3, false, true);
+ } else {
+ this->collect_nodes_in_all_data(in_rel, false);
+ }
+ this->collect_nodes(out_rel, -2, false, false);
+ }
#endif
//------------------------------idealize_test----------------------------------
// Try to canonicalize tests better. Peek at the Cmp/Bool/If sequence and
// come up with a canonical sequence. Bools getting 'eq', 'gt' and 'ge' forms
< prev index next >