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

--- Comment #5 from Thomas Preud'homme <thopre01 at gcc dot gnu.org> ---
(In reply to Wilco from comment #4)
> Clearly rematerialization isn't working correctly. Immediates and constant
> addresses like this should never be spilled (using MOV/MOVK could increase
> codesize, but with -Os you should use the literal pool anyway). Check
> legitimate_constant_p returns true, see
> https://gcc.gnu.org/ml/gcc-patches/2017-08/msg00052.html for how it's done
> on AArch64.

By the time LRA happens, this is what LRA sees of the address computation:

(insn 321 6 322 2 (set (reg:SI 274)
        (unspec:SI [
                (symbol_ref:SI ("__stack_chk_guard") [flags 0xc0] <var_decl
0x7f689803a2d0 __stack_chk_guard>)
            ] UNSPEC_PIC_SYM)) "test_arm_sp_fpic.c":41 181
{pic_load_addr_32bit}
     (expr_list:REG_EQUIV (unspec:SI [
                (symbol_ref:SI ("__stack_chk_guard") [flags 0xc0] <var_decl
0x7f689803a2d0 __stack_chk_guard>)
            ] UNSPEC_PIC_SYM)
        (nil)))
(insn 322 321 11 2 (set (reg/f:SI 175)
        (mem:SI (plus:SI (reg:SI 176)
                (reg:SI 274)) [0  S4 A32])) "test_arm_sp_fpic.c":41 876
{*thumb2_movsi_insn}
     (expr_list:REG_DEAD (reg:SI 274)
        (expr_list:REG_DEAD (reg:SI 176)
            (expr_list:REG_EQUIV (symbol_ref:SI ("__stack_chk_guard") [flags
0xc0] <var_decl 0x7f689803a2d0 __stack_chk_guard>)
                (nil)))))

It is this 175 which is spilled because LRA sees it doesn't have a register of
the right class to allocate that pseudo. Because it's a MEM it doesn't see it
as a constant expression and thus does not rematerialize it.

Reply via email to