RFR(M): 8220376: C2: Int >0 not recognized as !=0 for div by 0 check

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Mon Nov 18 22:56:47 UTC 2019


> Webrev: http://cr.openjdk.java.net/~phedlin/tr8220376/

Looks good, Patric.

Best regards,
Vladimir Ivanov

PS: some cleanup suggestions (feel free to ignore them if you don't agree):

src/hotspot/share/opto/ifnode.cpp:

+//   \r1
+//  r2\  eqT  eqF  neT  neF  ltT  ltF  leT  leF  gtT  gtF  geT  geF
+//  eq    t    f    f    t    f    -    -    f    f    -    -    f
+//  ne    f    t    t    f    t    -    -    t    t    -    -    t
+//  lt    f    -    -    f    t    f    -    f    f    -    f    t
+//  le    t    -    -    t    t    -    t    f    f    t    -    t
+//  gt    f    -    -    f    f    -    f    t    t    f    -    f
+//  ge    t    -    -    t    f    t    -    t    t    -    t    f
+//
+Node* IfNode::simple_subsuming(PhaseIterGVN* igvn) {
+  // Table encoding: N/A (na), True-branch (tb), False-branch (fb).
+  static enum { na, tb, fb } s_subsume_map[6][12] = {
+  /*rel: eq+T eq+F ne+T ne+F lt+T lt+F le+T le+F gt+T gt+F ge+T ge+F*/
+  /*eq*/{ tb,  fb,  fb,  tb,  fb,  na,  na,  fb,  fb,  na,  na,  fb },
+  /*ne*/{ fb,  tb,  tb,  fb,  tb,  na,  na,  tb,  tb,  na,  na,  tb },
+  /*lt*/{ fb,  na,  na,  fb,  tb,  fb,  na,  fb,  fb,  na,  fb,  tb },
+  /*le*/{ tb,  na,  na,  tb,  tb,  na,  tb,  fb,  fb,  tb,  na,  tb },
+  /*gt*/{ fb,  na,  na,  fb,  fb,  na,  fb,  tb,  tb,  fb,  na,  fb },
+  /*ge*/{ tb,  na,  na,  tb,  fb,  tb,  na,  tb,  tb,  na,  tb,  fb }};

IMO you can dump the table from the comment: it mostly duplicates the 
code. (Probably, you can use a different name for "N/A" or just refer to 
it in numeric form (0?) to preserve clean structure of the table from 
the comment.)

======================================

+  if (is_If() && (cmp = in(1)->in(1))->Opcode() == Op_CmpP) {
+    if (cmp->in(2) != NULL && // make sure cmp is not already dead
+        cmp->in(2)->bottom_type() == TypePtr::NULL_PTR) {

Merge nested ifs?

======================================

Looks like extracting the following code into a helper function (along 
with the enum and the table) can improve readability.

+  int drel = subsuming_bool_test_encode(dom->in(1));
+  int trel = subsuming_bool_test_encode(bol);
+  int bout = pre->is_IfFalse() ? 1 : 0;
+
+  if (drel < 0 || trel < 0) {
+    return NULL;
+  }
+  int br = s_subsume_map[trel][2*drel+bout];
+  if (br == na) {
+    return NULL;
+  }

New function can return intcon(0/1) or bol(or NULL?) and the caller 
decides whether the update is needed.

> On 12/11/2019 15:16, Patric Hedlin wrote:
>> Dear all,
>>
>> I would like to ask for help to review the following change/update:
>>
>> Issue:  https://bugs.openjdk.java.net/browse/JDK-8220376
>> Webrev: http://cr.openjdk.java.net/~phedlin/tr8220376/
>>
>> 8220376: C2: Int >0 not recognized as !=0 for div by 0 check
>>
>>     Adding a simple subsumption test to IfNode::Ideal to enable a local
>>     short-circuit for (obviously) redundant if-nodes.
>>
>> Testing: hs-tier1-4, hs-precheckin-comp
>>
>>
>> Best regards,
>> Patric
>>
> 


More information about the hotspot-compiler-dev mailing list