[Bug target/61578] [4.9 regression] Code size increase for ARM thumb compared to 4.8.x when compiling with -Os
vmakarov at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Sep 24 20:38:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61578
--- Comment #30 from Vladimir Makarov <vmakarov at gcc dot gnu.org> ---
(In reply to Dominik Vogt from comment #29)
> I think I understand what's going on:
>
> Consider the patched code in match_reloads():
>
> + = (ins[1] < 0 && REG_P (in_rtx)
> + && (int) REGNO (in_rtx) < lra_new_regno_start
> + && find_regno_note (curr_insn, REG_DEAD, REGNO (in_rtx))
> + ? lra_create_new_reg (inmode, in_rtx, goal_class, "")
> + : lra_create_new_reg_with_unique_value (outmode, out_rtx,
> + goal_class, ""));
>
> (1) This code normally makes a unique copy of the register in in_rtx, but if
> the register is marked as REG_DEAD in the curr_insn, it just makes a copy of
> the register using lra_create_new_reg(), with the same .val and .offset in
> the reg_info structure.
>
> (2) Further down in match_reloads, new insns are generated and stored in
> *before and *after. However, the new "after" insn still references the old
> register. In other words, in step (1) the code has made the assumption that
> the old register is no longer used, then generates an insn that uses it
> after it was marked as REG_DEAD.
>
> (3) Based on the bogus decision in (1), the condition in lra-lives.c decides
> that the two registers are identical copies and can be mapped to the same
> hard register:
>
> + && (((src_regno >= FIRST_PSEUDO_REGISTER
> + && (! sparseset_bit_p (pseudos_live, src_regno)
> + || (dst_regno >= FIRST_PSEUDO_REGISTER
> + && lra_reg_val_equal_p (src_regno,
> + lra_reg_info[dst_regno].val,
> +
> lra_reg_info[dst_regno].offset))
Sorry for breaking s390 port and thanks for the analysis. I'll try to fix it
on this week.
More information about the Gcc-bugs
mailing list