<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 16, 2015 at 5:06 PM, Vladimir Kozlov <span dir="ltr"><<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This is strange. Ideal graph should have CmpN in such case.<br>
See Compile::final_graph_reshaping_impl() case Op_CmpP:<br>
Please, look why CmpP is not converted in your case?<br>
<br>
Thanks,<br>
Vladimir</blockquote><div><br></div><div>Hi Vladimir.<br><br></div><div>The reason CmpN is not generated in the case of aarch64 is the following test in final_graph_reshaping<br><br>           if (Matcher::gen_narrow_oop_implicit_null_checks())<br>            new_in2 = ConNode::make(TypeNarrowOop::NULL_PTR);<br><br></div><div>This test converts the CmpP to CmpN if implicit null checks are being generated.<br><br></div><div>For aarch64 the test above always returns false because Matcher::narrow_oop_use_complex_address() in <a href="http://aarch64.ad">aarch64.ad</a> returns false.<br><br></div><div>The rational behind this seems to be that it is better to generate<br><br>          //    Load_narrow_oop memory, narrow_oop_reg<br>          //    Load [R12 + narrow_oop_reg<<3 + offset], val_reg<br>          //    NullCheck narrow_oop_reg<br><br></div><div>on architectures which support complex addresses (eg x86) and<br></div><div> <br></div><div>          //    Load_narrow_oop memory, narrow_oop_reg<br>          //    decode_not_null narrow_oop_reg, base_reg<br>          //    Load [base_reg + offset], val_reg<br>          //    NullCheck base_reg<br><br></div><div>on architectures which do not (eg aarch64, sparc, ppc).<br><br></div><div>The problem is that this code assumes we are doing a load, whereas in my test case<br></div><div><br>public class decode {<br>
     public static void main(String[] args) {<br>
         if (args[0] != null) {<br>
           System.out.println("not null");<br>
         }<br>
     }<br>
}<br>
<br></div><div>there is no load, it is just doing a check on a null pointer.<br></div><div><br></div><div>All the best,<br></div><div>Ed.<br></div><div><br><br></div></div></div></div>