This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH 0/9] separate shrink-wrapping
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: Bernd Schmidt <bschmidt at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org, dje dot gcc at gmail dot com
- Date: Mon, 4 Jul 2016 03:57:26 -0500
- Subject: Re: [PATCH 0/9] separate shrink-wrapping
- Authentication-results: sourceware.org; auth=none
- References: <email@example.com> <firstname.lastname@example.org> <20160608151645.GA13163@gate.crashing.org> <email@example.com> <20160608172608.GC13163@gate.crashing.org> <firstname.lastname@example.org> <20160629231610.GE17458@gate.crashing.org>
On Wed, Jun 29, 2016 at 06:16:10PM -0500, Segher Boessenkool wrote:
> On Thu, Jun 30, 2016 at 01:03:17AM +0200, Bernd Schmidt wrote:
> > On 06/08/2016 07:26 PM, Segher Boessenkool wrote:
> > >One thing I should try is put a USE of the saved registers at such
> > >exits, maybe that helps those passes that now delete frame restores
> > >to not do that.
> > Have you had a chance to try this?
> Not yet. I have tried to get dwarf2cfi not to complain when one path
> entering a block has a restore and some other patch doesn't (and mark
> the register as unavailable). That works great in most cases but it
> seems sometimes this also then happens for exception handlers, which
> is disastrous of course (and horrendous to debug).
> The USE thing should be much easier, I might have results tomorrow,
> if not, next week.
Not so easy actually; but I have results now.
Putting USEs of all separately shrink-wrapped variables at each "strange"
exit (i.e. those blocks that have no successors) helps regrename (makes
the first regrename patch unnecessary), but not any of the other patches
(which makes sense if you look at what they do). It does not help the
problem the second regrename patch is for though (the patch that disables
regrename altogether if separate shrink-wrapping is used).
So the problem shows up on PowerPC with hash_map_rand on -m32. This is
a huge testcase, and randomised; sometimes it works, more often it corrupts
various data structures.
I tracked it down to regrename renaming one variable (r9, the first choice
for allocation) to some non-volatile register. This however is a register
that is not separately shrink-wrapped! So it seems the problem could
happen always, they just rarely do (one in a million or so testcases, and
almost nobody uses regrename anyway).
If at all blocks without successors I put a USE of every register that
*could* be separately shrink-wrapped, the problem goes away. I do not
yet know why exactly; I don't understand what regrename does very well.
Doing this requires yet another hook (I hardcoded the PowerPC requirements
for now, adding hooks is painful, probably as it should be ;-) ). It
feels wrong anyway. I'll have to dig even deeper to find out if this
can or cannot happen without this patch series.