RFR(S): 8243670: Unexpected test result caused by C2 MergeMemNode::Ideal
Yangfei (Felix)
felix.yang at huawei.com
Tue Jun 30 12:35:07 UTC 2020
Hi again,
Updated webrev: http://cr.openjdk.java.net/~fyang/8243670/webrev.03/
Tier1-3 tested with fastdebug build both on aarch64-linux-gnu & x86_64-linux-gnu.
Newly added test case fail without the fix and pass otherwise.
Please take another look.
Thanks,
Felix
> -----Original Message-----
> From: Yangfei (Felix)
> Sent: Tuesday, June 30, 2020 4:00 PM
> To: 'Roland Westrelin' <rwestrel at redhat.com>; Tobias Hartmann
> <tobias.hartmann at oracle.com>; hotspot-compiler-dev at openjdk.java.net
> Cc: guoge (A) <guoge1 at huawei.com>; zhouyong (V)
> <zhouyong44 at huawei.com>
> Subject: RE: RFR(S): 8243670: Unexpected test result caused by C2
> MergeMemNode::Ideal
>
> Hi,
>
> > -----Original Message-----
> > From: Roland Westrelin [mailto:rwestrel at redhat.com]
> > Sent: Tuesday, June 30, 2020 3:52 PM
> > To: Yangfei (Felix) <felix.yang at huawei.com>; Tobias Hartmann
> > <tobias.hartmann at oracle.com>; hotspot-compiler-dev at openjdk.java.net
> > Cc: guoge (A) <guoge1 at huawei.com>; zhouyong (V)
> > <zhouyong44 at huawei.com>
> > Subject: RE: RFR(S): 8243670: Unexpected test result caused by C2
> > MergeMemNode::Ideal
> >
> >
> > > I added some extra code to check if we still have a chance to
> > > replace equivalent phis in MergeMemNode::Ideal.
> >
> > Is this a reliable way of finding a missed transformation opportunity?
> > Could it be that MergeMemNode::Ideal() runs before PhiNode::Identity()
> > has had a chance to run? that is the merge mem is first in the IGVN
> > queue
>
> Yes, I have just confirmed that.
> The follow logic in MergeMemNode::Ideal() could catch phis with the same
> input before PhiNode::Identity() had a change to do.
>
> 4608 // replace equivalent phis (unfortunately, they do not GVN together)
> 4609 if (new_mem != NULL && new_mem != new_base &&
> 4610 new_mem->req() == phi_len && new_mem->in(0) == phi_reg) {
> 4611 if (new_mem->is_Phi()) {
> 4612 PhiNode* phi_mem = new_mem->as_Phi();
> 4613 for (uint i = 1; i < phi_len; i++) {
> 4614 if (phi_base->in(i) != phi_mem->in(i)) {
> 4615 phi_mem = NULL;
> 4616 break;
> 4617 }
> 4618 }
> 4619 if (phi_mem != NULL) {
> 4620 // equivalent phi nodes; revert to the def
> 4621 new_mem = new_base;
> 4622 }
> 4623 }
> 4624 }
>
> So I think I will propose a new patch with this logic removed. It should be
> useless with our fix in PhiNode::Identity().
>
> > and the Phi is next so the merge mem would first fail to optimize,
> > then the Phi would optimize, cause the merge mem to be enqueued again
> > and this time be properly optimized.
>
More information about the hotspot-compiler-dev
mailing list