https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102169

--- Comment #2 from Peter Bergner <bergner at gcc dot gnu.org> ---
So we have the following during IRA:

(insn 7 2 8 2 (set (reg:SI 120 [ barD.3297 ])
        (mem/c:SI (plus:DI (unspec:DI [
                        (symbol_ref:DI ("*.LANCHOR0") [flags 0x182])
                        (reg:DI 2 2)
                    ] UNSPEC_TOCREL)
                (const_int 4 [0x4])) [1 barD.3297+0 S4 A32])) "bug.i":5:13 544
{*movsi_internal1}
     (expr_list:REG_EQUIV (mem/c:SI (plus:DI (unspec:DI [
                        (symbol_ref:DI ("*.LANCHOR0") [flags 0x182])
                        (reg:DI 2 2)
                    ] UNSPEC_TOCREL)
                (const_int 4 [0x4])) [1 barD.3297+0 S4 A32])
        (nil)))
(insn 8 7 11 2 (set (mem/c:SI (unspec:DI [
                    (symbol_ref:DI ("*.LANCHOR0") [flags 0x182])
                    (reg:DI 2 2)
                ] UNSPEC_TOCREL) [1 fooD.3296+0 S4 A32])
        (reg:SI 120 [ barD.3297 ])) "bug.i":5:13 544 {*movsi_internal1}
     (expr_list:REG_DEAD (reg:SI 120 [ barD.3297 ])
        (nil)))

...with:

Pass 1 for finding pseudo/allocno costs

    r120: preferred GEN_OR_VSX_REGS, alternative NO_REGS, allocno
GEN_OR_VSX_REGS

  a0(r120,l0) costs: BASE_REGS:0,0 GENERAL_REGS:0,0 FLOAT_REGS:0,0
ALTIVEC_REGS:0,0 VSX_REGS:4000,4000 GEN_OR_FLOAT_REGS:8000,8000 
GEN_OR_VSX_REGS:8000,8000 LINK_REGS:12000,12000 CTR_REGS:12000,12000
LINK_OR_CTR_REGS:12000,12000 SPEC_OR_GEN_REGS:12000,12000 ALL_
REGS:36000,36000 MEM:8000,8000

[snip]
      Allocno a0r120 of GEN_OR_VSX_REGS(93) has 93 avail. regs  0 3-12 14-95,
node:  0 3-12 14-95 (confl regs =  1-2 13 96-110)

[snip]
      Pushing a0(r120,l0)(cost 0)
      Popping a0(r120,l0)  --         assign reg 32
Disposition:
    0:r120 l0    32

Looking at REG_ALLOC_ORDER, f32 is the first register we attempt to use and
since it has the same zero cost as the GPRs, we end up keeping it.

Reply via email to