<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Dear all,<div class=""><br class=""></div><div class="">please review and sponsor this change.</div><div class="">RFE: <a href="https://bugs.openjdk.java.net/browse/JDK-8004073" class="">https://bugs.openjdk.java.net/browse/JDK-8004073</a></div><div class="">Webrev: <a href="http://cr.openjdk.java.net/~mhaupt/8004073/webrev.00" class="">http://cr.openjdk.java.net/~mhaupt/8004073/webrev.00</a></div><div class=""><br class=""></div><div class=""><div class="">This change extends the dumping facilities of the C2 IR Node hierarchy. Node::dump() is used in debugging sessions to print information about an IR node. The API is extended by these new entry points:</div><div class=""><br class=""></div><div class="">* void Node::dump_comp()</div><div class="">  -> Dump the node in compact form.</div><div class=""><br class=""></div><div class="">* void Node::dump_rel(), void Node::dump_rel_comp()</div><div class="">  -> Dump the node (in compact form) and all nodes related to it. Mark the</div><div class="">     current node in the output.</div><div class=""><br class=""></div><div class="">The notion of "related" nodes is of course a property of the node itself, or rather, of its class. This is configured in this virtual method:</div><div class=""><br class=""></div><div class="">* virtual void Node::rel(GrowableArray<Node*> *in_rel, GrowableArray<Node*> *out_rel, bool compact)</div><div class="">  -> Collect all related nodes. Store the incoming related nodes in the in_rel</div><div class="">     array, and the outgoing related nodes in the out_rel array. In case compact</div><div class="">     representation is desired, possibly collect less nodes.</div><div class=""><br class=""></div><div class="">This method must be overridden by all subclasses of Node that, in their notion of what related nodes are, divert from the default behaviour as specified in the implementation of Node::rel() in the Node class itself. The default is to collect all inputs and outputs till depth 1, including both data and control nodes, ignoring compactness.</div><div class=""><br class=""></div><div class="">There are several auxiliary methods. Node collection is chiefly facilitated by this method:</div><div class=""><br class=""></div><div class="">* void Node::collect_nodes(GrowableArray<Node*> *ns, int d, bool ctrl, bool data)</div><div class="">  -> Collect nodes till depth d (positive: inputs, negative: outputs), including</div><div class="">     *only* control or data nodes (this is controlled by the two bool arguments,</div><div class="">     and setting both to true is nonsensical).</div><div class=""><br class=""></div><div class="">Furthermore, there exist pre-defined collectors for common cases:</div><div class=""><br class=""></div><div class="">* void Node::collect_nodes_in_all_data(GrowableArray<Node*> *ns, bool ctrl)</div><div class="">  -> Collect the entire data input graph. Include control nodes only if</div><div class="">     requested.</div><div class=""><br class=""></div><div class="">* void Node::collect_nodes_in_all_ctrl(GrowableArray<Node*> *ns, bool data)</div><div class="">  -> Collect the entire control input graph. Include data nodes only if</div><div class="">     requested.</div><div class=""><br class=""></div><div class="">* void Node::collect_nodes_out_all_ctrl_boundary(GrowableArray<Node*> *ns)</div><div class="">  -> Collect all output nodes, stopping at control nodes, including these.</div><div class=""><br class=""></div><div class="">* void Node::collect_nodes_in_data_out_1(GrowableArray<Node*> *is, GrowableArray<Node*> *os, bool compact)</div><div class="">  -> Collect the entire data input graph, and outputs till depth 1.</div><div class=""><br class=""></div><div class="">Regarding compact dumping, subclasses of Node should override this virtual method:</div><div class=""><br class=""></div><div class="">* virtual void dump_comp_spec(outputStream *st)</div><div class="">  -> Dump the specifics of a node in compact form. This method is supposed to</div><div class="">     operate in the fashion of Node::dump_spec().</div><div class=""><br class=""></div><div class="">The default behaviour for compact dumping is to dump a node's name and index.</div><div class=""><br class=""></div><div class="">Specific notions of "related" have been added to the following node classes:</div><div class="">* AbsNode and subclasses</div><div class="">* AddNode and subclasses</div><div class="">* AddPNode</div><div class="">* AtanDNode</div><div class="">* BinaryNode</div><div class="">* BoolNode</div><div class="">* CosDNode</div><div class="">* CountBitsNode and subclasses</div><div class="">* Div{D,F,I,L}Node</div><div class="">* ExpDNode</div><div class="">* GotoNode</div><div class="">* HaltNode</div><div class="">* Log{10D,D}Node</div><div class="">* LShift{I,L}Node</div><div class="">* Mod{D,F,I,L}Node</div><div class="">* MulHiLNode</div><div class="">* Mul{D,F,I,L}Node and subclasses</div><div class="">* DivModNode and subclasses</div><div class="">* IfNode</div><div class="">* JumpNode</div><div class="">* SafePointNode and subclasses (may require more detail)</div><div class="">* StartNode and subclass</div><div class="">* NegNode and subclasses</div><div class="">* PowDNode</div><div class="">* IfProjNode and subclasses</div><div class="">* JProjNode and subclass</div><div class="">* ParmNode</div><div class="">* ReductionNode and subclasses</div><div class="">* Round{Double,Float}Node</div><div class="">* RShift{I,L}Node</div><div class="">* SqrtDNode</div><div class="">* SubNode and subclasses</div><div class="">* TanDNode</div><div class="">* AddV{B,D,F,I,L,S,_}Node</div><div class="">* DivV{D,F}Node</div><div class="">* LShiftV{B,I,L,S}Node</div><div class="">* MulV{D,F,I,S}Node</div><div class="">* OrVNode</div><div class="">* RShiftV{B,I,L,S}Node</div><div class="">* SubV{B,D,F,I,L,S}Node</div><div class="">* URShiftV{B,I,L,S}Node</div><div class="">* XorVNode</div><div class="">* URShift{I,L}Node</div></div><div class=""><br class=""></div><div class="">Here is a sample session in LLDB, showing the different dumps for an IfNode:</div><div class=""><br class=""></div><div class="">* thread #28: tid = 0x10d1ce3, 0x000000010353be17 libjvm.dylib`IfNode::Ideal(this=0x0000000104888760, phase=0x000000011cf62368, can_reshape=<unavailable>) + 77 at ifnode.cpp:1297, name = 'Java: C2 CompilerThread0', stop reason = breakpoint 1.1<br class="">    frame #0: 0x000000010353be17 libjvm.dylib`IfNode::Ideal(this=0x0000000104888760, phase=0x000000011cf62368, can_reshape=<unavailable>) + 77 at ifnode.cpp:1297<br class="">   1294<span class="Apple-tab-span" style="white-space:pre">        </span>  if (remove_dead_region(phase, can_reshape))  return this;<br class="">   1295<span class="Apple-tab-span" style="white-space:pre">       </span>  // No Def-Use info?<br class="">   1296<span class="Apple-tab-span" style="white-space:pre">       </span>  if (!can_reshape)  return NULL;<br class="">-> 1297<span class="Apple-tab-span" style="white-space:pre">        </span>  PhaseIterGVN *igvn = phase->is_IterGVN();<br class="">   1298<span class="Apple-tab-span" style="white-space:pre">      </span><br class="">   1299<span class="Apple-tab-span" style="white-space:pre">      </span>  // Don't bother trying to transform a dead if<br class="">   1300<span class="Apple-tab-span" style="white-space:pre">     </span>  if (in(0)->is_top())  return NULL;<br class="">(lldb) expr -- this->dump()<br class=""> 82<span class="Apple-tab-span" style="white-space:pre">    </span>If<span class="Apple-tab-span" style="white-space:pre">  </span>===  61  79  [[ 83  84 ]] P=0.999999, C=-1.000000 !jvms: String::charAt @ bci:27<br class="">(lldb) expr -- this->dump_comp()<br class="">If(82)P=0.999999, C=-1.000000<br class="">(lldb) expr -- this->dump_rel()<br class=""> 10<span class="Apple-tab-span" style="white-space:pre">    </span>Parm<span class="Apple-tab-span" style="white-space:pre">        </span>===  3  [[ 38  38  65  32 ]] Parm0: java/lang/String:NotNull:exact *  Oop:java/lang/String:NotNull:exact * !jvms: String::charAt @ bci:-1<br class=""> 38<span class="Apple-tab-span" style="white-space:pre">     </span>AddP<span class="Apple-tab-span" style="white-space:pre">        </span>=== _  10  10  37  [[ 39 ]]   Oop:java/lang/String:NotNull:exact+12 * [narrow] !jvms: String::charAt @ bci:6<br class=""> 39<span class="Apple-tab-span" style="white-space:pre">    </span>LoadN<span class="Apple-tab-span" style="white-space:pre">       </span>=== _  7  38  [[ 40 ]]  @java/lang/String:exact+12 * [narrow], name=value, idx=4; #narrowoop: char[int:>=0]:exact * !jvms: String::charAt @ bci:6<br class=""> 40<span class="Apple-tab-span" style="white-space:pre">      </span>DecodeN<span class="Apple-tab-span" style="white-space:pre">     </span>=== _  39  [[ 55  42 ]]  #char[int:>=0]:exact * !jvms: String::charAt @ bci:6<br class=""> 37<span class="Apple-tab-span" style="white-space:pre">       </span>ConL<span class="Apple-tab-span" style="white-space:pre">        </span>===  0  [[ 38  56 ]]  #long:12<br class=""> 55<span class="Apple-tab-span" style="white-space:pre"> </span>CastPP<span class="Apple-tab-span" style="white-space:pre">      </span>===  47  40  [[ 56  56  97  97  96  86 ]]  #char[int:>=0]:NotNull:exact * !jvms: String::charAt @ bci:9<br class=""> 56<span class="Apple-tab-span" style="white-space:pre">   </span>AddP<span class="Apple-tab-span" style="white-space:pre">        </span>=== _  55  55  37  [[ 57 ]]  !jvms: String::charAt @ bci:9<br class=""> 7<span class="Apple-tab-span" style="white-space:pre">    </span>Parm<span class="Apple-tab-span" style="white-space:pre">        </span>===  3  [[ 99  98  86  65  57  32  50  39 ]] Memory  Memory: @BotPTR *+bot, idx=Bot; !jvms: String::charAt @ bci:-1<br class=""> 57<span class="Apple-tab-span" style="white-space:pre">        </span>LoadRange<span class="Apple-tab-span" style="white-space:pre">   </span>=== _  7  56  [[ 65  58  78 ]]  @bottom[int:>=0]+12 * [narrow], idx=5; #int:>=0 !jvms: String::charAt @ bci:9<br class=""> 11<span class="Apple-tab-span" style="white-space:pre">        </span>Parm<span class="Apple-tab-span" style="white-space:pre">        </span>===  3  [[ 78  93  65  32  24  32  65  58  86 ]] Parm1: int !jvms: String::charAt @ bci:-1<br class=""> 78<span class="Apple-tab-span" style="white-space:pre"> </span>CmpU<span class="Apple-tab-span" style="white-space:pre">        </span>=== _  11  57  [[ 79 ]]  !jvms: String::charAt @ bci:27<br class=""> 79<span class="Apple-tab-span" style="white-space:pre">        </span>Bool<span class="Apple-tab-span" style="white-space:pre">        </span>=== _  78  [[ 82 ]] [lt] !jvms: String::charAt @ bci:27<br class=""> 82 ><span class="Apple-tab-span" style="white-space:pre">       </span>If<span class="Apple-tab-span" style="white-space:pre">  </span>===  61  79  [[ 83  84 ]] P=0.999999, C=-1.000000 !jvms: String::charAt @ bci:27<br class=""> 83<span class="Apple-tab-span" style="white-space:pre">       </span>IfTrue<span class="Apple-tab-span" style="white-space:pre">      </span>===  82  [[ 99  98 ]] #1 !jvms: String::charAt @ bci:27<br class=""> 84<span class="Apple-tab-span" style="white-space:pre">  </span>IfFalse<span class="Apple-tab-span" style="white-space:pre">     </span>===  82  [[ 86 ]] #0 !jvms: String::charAt @ bci:27<br class=""> 99<span class="Apple-tab-span" style="white-space:pre">        </span>Return<span class="Apple-tab-span" style="white-space:pre">      </span>===  83  6  7  8  9 returns 98  [[ 0 ]] <br class=""> 98<span class="Apple-tab-span" style="white-space:pre">      </span>LoadUS<span class="Apple-tab-span" style="white-space:pre">      </span>===  83  7  96  [[ 99 ]]  @char[int:>=0]:exact+any *, idx=6; #char !jvms: String::charAt @ bci:27<br class=""> 86<span class="Apple-tab-span" style="white-space:pre"> </span>CallStaticJava<span class="Apple-tab-span" style="white-space:pre">      </span>===  84  6  7  8  9 ( 85  1  1  55  11 ) [[ 87 ]] # Static uncommon_trap(reason='range_check' action='make_not_entrant')  void ( int ) C=0.000100 String::charAt @ bci:27 !jvms: String::charAt @ bci:27<br class="">(lldb) expr -- this->dump_rel_comp()<br class="">If(82)P=0.999999, C=-1.000000  Bool(79)[lt]  CmpU(78)  Parm(11)1:int  LoadRange(57) @bottom[int:>=0]+12 * [narrow], idx=5; #int:>=0<br class="">IfTrue(83)[99][98]#1  IfFalse(84)[86]#0  Return(99)  LoadUS(98) @char[int:>=0]:exact+any *, idx=6; #char  CallStaticJava(86)uncommon_trap</div><div class=""><br class=""></div><div class="">Best,</div><div class=""><br class=""></div><div class="">Michael</div><div class=""><br class=""><div apple-content-edited="true" class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px;"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">-- <br class=""><br class=""><a href="http://www.oracle.com/" target="_blank" class=""><img src="http://www.oracle.com/dm/design/images/oracle_sig_logo.gif" alt="Oracle" width="114" height="26" border="0" class=""></a><br class=""><font color="#666666" size="2" face="Verdana, Arial, Helvetica, sans-serif" class="">Dr. Michael Haupt | Principal Member of Technical Staff<br class="">Phone: +49 331 200 7277 | Fax: +49 331 200 7561<br class=""><font color="#FF0000" class="">Oracle</font><span class="Apple-converted-space"> </span>Java Platform Group | LangTools Team<span class="Apple-converted-space"> | Nashorn</span><br class="">Oracle Deutschland B.V. & Co. KG, Schiffbauergasse 14 | 14467 Potsdam, Germany</font><table width="100%" border="0" cellpadding="0" cellspacing="0" class=""><tbody class=""><tr class=""><td width="44" height="0" align="left" valign="top" class=""><a href="http://www.oracle.com/commitment" target="_blank" class=""><img src="http://www.oracle.com/dm/design/corp/misc/green-for-email-sig_0.gif" alt="Green Oracle" width="44" height="28" border="0" align="absbottom" class=""></a></td><td width="100%" align="left" valign="middle" class=""><font color="#47AA42" size="1" face="Verdana, Arial, Helvetica, sans-serif" class=""><font color="#4B7D42" class="">Oracle is committed to developing practices and products that help protect the environment</font></font></td></tr></tbody></table></div></span></div>
</div>
<br class=""></div></body></html>