This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch/committed] PR middle-end/65233 make walk-ssa_copies handle empty PHIs


On Wed, Mar 4, 2015 at 1:41 PM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Wed, Mar 4, 2015 at 6:27 AM, Jeff Law <law@redhat.com> wrote:
>> On 03/02/15 01:38, Richard Biener wrote:
>>>
>>> On Mon, Mar 2, 2015 at 6:34 AM, Aldy Hernandez <aldyh@redhat.com> wrote:
>>>>
>>>> As I mention in the PR...
>>>>
>>>> What's happening here is that the ipa_polymorphic_call_context
>>>> constructor
>>>> is calling walk_ssa_copies on a PHI node that has no arguments.  This
>>>> happens because finalize_jump_threads eventually removes some PHI
>>>> arguments
>>>> as it's redirecting some edges, leaving a PHI with no arguments:
>>>>
>>>> SR.33_23 = PHI <>
>>>>
>>>> This should get cleaned up later, but the IPA polymorphic code gets
>>>> called
>>>> during the actual CFG clean-up, and walk_ssa_copies cannot handle an
>>>> empty
>>>> PHI.
>>>>
>>>> Approved by Honza.
>>>>
>>>> Fully tested on x86-64 Linux and verified that the patch fixes the ICE on
>>>> an
>>>> x86-64 Linux cross aarch64-linux-gnu cc1plus.
>>>>
>>>> Committed to mainline.
>>>
>>>
>>> I think the real issue is that the walking code is executed via fold_stmt
>>> when
>>> called with an API that tells you not to walk SSA use-def chains.
>>
>> ?  We have something that tells us not to walk the chains?  I don't see it
>> in an API for fold_stmt.  How is the ipa-polymorphic code supposed to know
>> when it can't follow the chains?
>
> It gets passed the valueize callback now which returns NULL_TREE for
> SSA names we can't follow.

Btw, for match-and-simplify I had to use that as default for fold_stmt
_exactly_ because of the call to fold_stmt from replace_uses_by
via merge-blocks from cfgcleanup.  This is because replace-uses-by
doesn't have all uses replaced before it folds the stmt!

We also have the "weaker" in-place flag.

>> The restrictions on what we can do while we're in the inconsistent state
>> prior to updating the ssa graph aren't defined anywhere and I doubt anyone
>> really knows what they are.  That's obviously concerning.
>>
>> We might consider trying to narrow the window in which these inconsistencies
>> are allowed.  To do that I think we need to split cfgcleanup into two
>> distinct parts.  First is unreachable block removal (which is needed so that
>> we can compute the dominators).  Second is everything else.
>>
>> The order of operations would be something like
>>
>> remove unreachable blocks
>> ssa graph update
>> rest of cfg_cleanup
>>
>> That just feels too intrusive to try at this stage though.
>
> Well, not folding statements from cfg-cleanup would be better.
>
> I'll have a look at the testcase in the PR and will come back with a
> suggestion on what to do for GCC 5.

I'd say that the devirtualization code is quite a heavy thing do to from
fold_stmt.  Yes - it want's to catch all cases if a stmt is modified
(after which passes should fold it).

So I am testing the following on x86_64 (verified it fixes the testcase
with a aarch64 cross).

Richard.

2015-03-04  Richard Biener  <rguenther@suse.de>

        PR middle-end/65233
        * ipa-polymorphic-call.c: Include tree-ssa-operands.h and
        tree-into-ssa.h.
        (walk_ssa_copies): Revert last chage.  Instead do not walk
        SSA names registered for SSA update.

Attachment: fix-pr65233
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]