[PATCH PR92926]Fix wrong code caused by ctor node translation unit wide sharing

Jakub Jelinek jakub@redhat.com
Thu Jan 9 08:59:00 GMT 2020


On Thu, Jan 09, 2020 at 02:20:23PM +0800, Bin.Cheng wrote:
> > On December 20, 2019 2:13:47 AM GMT+01:00, "Bin.Cheng" <amker.cheng@gmail.com> wrote:
> > >On Fri, Dec 13, 2019 at 11:26 AM bin.cheng
> > ><bin.cheng@linux.alibaba.com> wrote:
> > >>
> > >> Hi,
> > >>
> > >> As reported in PR92926, constant ctor is shared translation unit wide
> > >because of constexpr_call_table,
> > >> however, during gimplify, the shared ctor could be modified.  This
> > >patch fixes the issue by unsharing
> > >> it before modification in gimplify.  A test is reduced from cppcoro
> > >library and added.
> > >>
> > >> Bootstrap and test ongoing.  Not sure if this is the correct fix
> > >though, any comments?
> > >Ping.  Any comment?
> >
> > Looks reasonable to me.
> Given PR92926 is marked as duplicate of PR93143, I updated test case
> of the patch.
> 
> Thanks,
> bin
> 
> 2019-12-13  Bin Cheng  <bin.linux@linux.alibaba.com>
> 
>         PR tree-optimization/93143
>         * gimplify.c (gimplify_init_constructor): Unshare ctor node before
>         clearing.
> 
> gcc/testsuite
> 2019-12-13  Bin Cheng  <bin.linux@linux.alibaba.com>
> 
>         PR tree-optimization/93143
>         * g++.dg/pr93143.C: New test.

Isn't the right spot to fix this somewhere in cp_gimplify_expr?
I mean, the way gimplification works, we unshare_body first and then
gimplify, which is destructive for the GENERIC it is gimplifying.  The
reason why this testcase FAILs is that the gimplification hook after
the unshare_body emits I guess a CONSTRUCTOR multiple times, readding there
the sharing.  Unsharing in gimplify_init_constructor means that for non-C++
or even for C++ when it doesn't trigger the problematic case we unshare the
second time and waste compile time memory.

	Jakub



More information about the Gcc-patches mailing list