MIPS: 2'nd pass of ira, causes weird register allocation for 2-op mult
Vladimir Makarov
vmakarov@redhat.com
Thu May 31 02:36:00 GMT 2012
On 05/30/2012 10:27 PM, Klaus Pedersen wrote:
> Thanks for the pointer,
>
> On Wed, May 30, 2012 at 2:40 AM, Vladimir Makarov<vmakarov@redhat.com> wrote:
>> Here is an extract from my article from GCC Summit 2004 proceedings.
>>
>> It is interesting to note that the pass also implicitly does code
>> selection. Regclass works in two passes. On the first pass, it
>> defines the preferred and alternative classes without taking the
>> possible classes of other operands into account.
> I had a problem similar to Richard, I simply couldn't figure out what
> the second pass tried to do. I ended up single stepping and
> printf'fing. I still didn't get much clearer on what was going on.
>
2nd pass was a part of the old RA for long time for a reason.
>
>> For example, an
>> instruction with two operand pseudo-registers exists in two variants;
>> one accepting classes {\em A} and {\em B}, and other one accepting
>> {\em C} and {\em D}. On the first pass, the algorithm does not see
>> that the variant with classes {\em A} and {\em D} will be more costly
>> because it will require the generation of additional move
>> instructions. On the second pass, the algorithm will take it into
>> account. As a result the preferred or alternative class of a
>> pseudo-register could change. This means two passes are not enough to
>> find the preferred and alternative classes accurately; but it is a
>> good approximation.
> On my MIPS target (1000's of files) I never saw that second pass gives
> better code (for practical reasons - smaller size!). I will try to redo
> and sumerize these results on a clean 4.7 and with the simple fixes
> later today.
The effect of 2nd pass may be target depended. The problem with RA
being most target dependent code is that one code is trying to work well
for all targets.
> If I change the ACC_REGS penalty from 6 to 3 in mips_move_to_gpr_cost()
> I get some improvement. MIPS1 need the accumulator for all mult
> and div operations, so there are no point in this penalty that makes the
> ACC more expensive than FP and memory.
>
> My question is - if the first pass gives you a valid hard register -
> shouldn't that be the default if second gives you something bad like
> NO_REGS? It is not that you can generate better code if you have been
> forced to reload from memory.
>
The only problem is how to know that the 2nd pass makes worse choice.
The 2nd pass should give not a worse choice. It is not true now for
MIPS. We will try to fix it.
>> I just run SPECInt2000 on x86 (-O2) without and with 2nd pass for today
>> trunk.
> I would love to redo the test on MIPS, but SPECInt is hardly suitable for
> embedded, even if source was available.
>
I guess the run will take forever. So please, don't bother with this at
least untill your problem will be fixed.
>> 2nd pass permits to reduce code size 1.36% in average, requires 0.2% more
>> compilation time, and
>> improves performance by 2.6%.
There is a simple solution for your problem which I mentioned in my
email. Unfortunately, it slows down x86 compiler by 0.5% which I
believe is big. So I'll search another solution.
Thanks for reporting this problem and sorry for a long wait.
More information about the Gcc
mailing list