Uros Bizjak <ubiz...@gmail.com> writes:
> On Wed, Apr 30, 2025 at 11:31 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>>
>> On Wed, Apr 30, 2025 at 7:37 PM Uros Bizjak <ubiz...@gmail.com> wrote:
>> >
>> > On Tue, Apr 29, 2025 at 11:40 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>> > >
>> > > AREG, DREG, CREG and AD_REGS are kept in ix86_class_likely_spilled_p to
>> > > avoid the following regressions with
>> > >
>> > > $ make check RUNTESTFLAGS="--target_board='unix{-m32,}'"
>> > >
>> > > FAIL: gcc.dg/pr105911.c (internal compiler error: in 
>> > > lra_split_hard_reg_for, at lra-assigns.cc:1863)
>> > > FAIL: gcc.dg/pr105911.c (test for excess errors)
>> > > FAIL: gcc.target/i386/avx512vl-stv-rotatedi-1.c scan-assembler-times 
>> > > vpro[lr]q 29
>> > > FAIL: gcc.target/i386/bt-7.c scan-assembler-not and[lq][ \t]
>> > > FAIL: gcc.target/i386/naked-4.c scan-assembler-not %[re]bp
>> > > FAIL: gcc.target/i386/pr107548-1.c scan-assembler-not addl
>> > > FAIL: gcc.target/i386/pr107548-1.c scan-assembler-times \tv?movd\t 3
>> > > FAIL: gcc.target/i386/pr107548-1.c scan-assembler-times v?paddd 6
>> > > FAIL: gcc.target/i386/pr107548-2.c scan-assembler-not \taddq\t
>> > > FAIL: gcc.target/i386/pr107548-2.c scan-assembler-times v?paddq 2
>> > > FAIL: gcc.target/i386/pr119171-1.c (test for excess errors)
>> > > FAIL: gcc.target/i386/pr57189.c scan-assembler-not movaps
>> > > FAIL: gcc.target/i386/pr57189.c scan-assembler-not movaps
>> > > FAIL: gcc.target/i386/pr78904-1b.c scan-assembler [ \t]andb
>> > > FAIL: gcc.target/i386/pr78904-1b.c scan-assembler [ \t]orb
>> > > FAIL: gcc.target/i386/pr78904-7b.c scan-assembler-not movzbl
>> > > FAIL: gcc.target/i386/pr78904-7b.c scan-assembler [ \t]orb
>> > > FAIL: gcc.target/i386/pr91188-2c.c scan-assembler [ \t]andw
>> > >
>> > > Tested with glibc master branch at
>> > >
>> > > commit ccdb68e829a31e4cda8339ea0d2dc3e51fb81ba5
>> > > Author: Samuel Thibault <samuel.thiba...@ens-lyon.org>
>> > > Date:   Sun Mar 2 15:16:45 2025 +0100
>> > >
>> > >     htl: move pthread_once into libc
>> > >
>> > > and built Linux kernel 6.13.5 on x86-64.
>> > >
>> > >         PR target/119083
>> > >         * config/i386/i386.cc (ix86_class_likely_spilled_p): Remove CREG
>> > >         and BREG.
>> >
>> > The commit message doesn't reflect what the patch does.
>> >
>> > OTOH, this is a very delicate part of the compiler. You are risking RA
>> > failures, the risk/benefit ratio is very high, so I wouldn't touch it
>> > without clear benefits. Do you have a concrete example where declaring
>> > BREG as spilled hurts?
>> >
>>
>> I can find a testcase to show the improvement.  But I am not sure if
>> it is what you were asking for.  ix86_class_likely_spilled_p was
>> CLASS_LIKELY_SPILLED_P which was added by
>>
>> commit f5316dfe88b8d1b8d3012c1f75349edf2ba1bdde
>> Author: Michael Meissner <meiss...@gcc.gnu.org>
>> Date:   Thu Sep 8 17:59:18 1994 +0000
>>
>>     Add support for -mreg-alloc=<xxx>
>>
>> This option is long gone and there is no test in GCC testsuite to show
>> that BX should be in ix86_class_likely_spilled_p.  On x86-64, BX is just
>> another callee-saved register, not different from R12.  On i386, BX is
>> used as the PIC register.  But today RA may pick a different register if
>> PLT isn't involved.  This patch gives RA a little bit more freedom.
>
> In the past *decades* CLASS_LIKELY_SPILLED_P was repurposed to signal
> the compiler that some extra care is needed with listed classes. On
> i386 and x86_64 these include single register classes that represent
> "architectural" registers (registers with assigned role). The compiler
> does take care to not extend life times of CLASS_LIKELY_SPILLED_P
> classes too much to avoid reload failures in cases where instruction
> with C_L_S_P class (e.g. shifts with %cl register) is emitted between
> unrelated register def and use.
>
> Registers in these classes won't disappear from the pool of available
> registers and RA can still use them, but with some extra care. So,
> without clear and noticeable benefits, single register classes remain
> declared as CLASS_LIKELY_SPILLED_P to avoid possible reload failures.

I agree with what you say.  But even so, part of me thinks it might be
interesting to see how much breakage there would be if we stopped using
likely-spilled for requirements that the RA can see for itself (through
constraints).  As the commits quoted show, this is an ancient mechanism
and a lot of received wisdom dates from reload and pre-IRA RA.

I would expect IRA to handle the situation better (e.g. because it
replaces scratches with new pseudos, so that it can allocate scratches
directly rather than leaving it to reload/LRA).  And I would expect
LRA to avoid fatal spill failures in cases that reload couldn't.

Thanks,
Richard

Reply via email to