[PATCH, PR 10474] Shedule pass_cprop_hardreg before pass_thread_prologue_and_epilogue

Richard Biener richard.guenther@gmail.com
Fri Apr 19 11:34:00 GMT 2013


On Fri, Apr 19, 2013 at 1:08 AM, Martin Jambor <mjambor@suse.cz> wrote:
> Hi,
>
> On Fri, Apr 19, 2013 at 12:37:58AM +0200, Steven Bosscher wrote:
>> On Fri, Apr 19, 2013 at 12:09 AM, Martin Jambor wrote:
>> > I also have not tried scheduling the hard register copy propagation
>> > pass twice and measuring the impact on compile times.  Any suggestion
>> > what might be a good testcase for that?
>>
>> I think a better question is when this would be useful in the first
>> place, and why. In other words: If you propagate hardregs before
>> shrink wrapping, what could be a source of new opportunities after
>> shrink wrapping?
>
> Yes, we also did that and neither I nor Honza could think of any
> potential problems there.  And of course, I'd also measure how many
> statements the second run of the pass changed.  I'll probably do that
> tomorrow anyway.
>
>>
>>
>> The only things I can think of, given the current pass order, are:
>>
>> * different basic block order due to shrink wrapping
>>  regcprop's effectiveness depends on the order of the basic blocks
>> (unfortunately)
>>
>> * different basic block contents due to head/tail merging (pass_jump2)
>>  Head/tail merging extends some basic blocks and shortens others. The
>> elongated basic blocks may present new opportunities (regcprop is a
>> local pass).
>>
>> * different basic block contents due to dead store elimination (pass_dse2)
>>  A removed dead store may also make an address calculation redundant,
>> changing the regcprop value chains.
>>
>> * different basic block contents due to peephole2
>>  A peephole2 may present new regcprop opportunities, peephole2 misses
>> the context to avoid trivial copies.
>>
>>
>> On the other hand, running regcprop earlier also helps some other
>> passes. For example, I think regcprop before jump2 may result in more
>> successful head/tail merging attempts by making more input operands
>> match, but it could hurt if_after_reload by extending live times of
>> registers.
>>
>>
>> But wouldn't it be better to avoid these argument-register pseudos
>> being assigned to callee-saved registers? Perhaps splitting the live
>> range of the pseudos before the first call on each path will do the
>> trick, and let IRA pick the right registers for you instead.
>
> First, where can I have a look how a live range is split?  ;-)

Insert a copy and adjust all dominated uses:

 (set (new-pseudo old-pseudo))

... adjust downstream uses of old-pseudo to use new-pseudo ...

> But second, if such a call is in a loop (or accessible by more than
> one path), I wouldn't it be wrong to do that?  To avoid that, I
> suppose I might end up doing another shrink-wrapping-like search for
> the right edge for prologue and actually coming up with a very similar
> result to the propagation and shrink-wrapping preparation.  But I'm
> willing to try.

I suppose splitting life-ranges in general before argument setup might
make sense - I see hardreg copyprop as a hack around limitations
in register allocation.  Note that life-range splitting is undone by
regular copy propagation.

ISTR IRA splits life-ranges in loop code, so there must be already
some helpers that could be used.  Vlad?

Thanks,
Richard.

> Thanks a lot,
>
> Martin
>



More information about the Gcc-patches mailing list