Bugfix for PR118591
This bug occurs only with '-Os' option.
The function 'inherit_reload_reg ()' have a wrong condition:
--------------------------------------------------------------------------------
static bool
inherit_reload_reg (bool def_p, int original_regno,
enum reg_class cl, rtx_insn *insn, rtx next_usage_insns)
{
if (optimize_function_for_size_p (cfun))
------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return false;
--------------------------------------------------------------------------------
It's wrong because we heed an inheritance and we need to undoing it after
unsuccessful pass.
I applied the following patch:
--------------------------------------------------------------------------------
diff --git a/gcc/lra-constraints.cc b/gcc/lra-constraints.cc
index 7dbc7fe1e00..af2d2793159 100644
--- a/gcc/lra-constraints.cc
+++ b/gcc/lra-constraints.cc
@@ -5884,7 +5884,11 @@ inherit_reload_reg (bool def_p, int original_regno,
enum reg_class cl, rtx_insn *insn, rtx next_usage_insns)
{
if (optimize_function_for_size_p (cfun))
- return false;
+ {
+ if (lra_dump_file != NULL)
+ fprintf (lra_dump_file,
+ " <<<<<< inheritance for -Os <<<<<<<<<\n");
+ }
--------------------------------------------------------------------------------
Debug output from patched gcc:
----------------------- Fragment from t.c.323r.reload --------------------------
********** Inheritance #1: **********
EBB 2
EBB 5
EBB 3
<<<<<< inheritance for -Os <<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Use smallest class of LD_REGS and GENERAL_REGS
Creating newreg=59 from oldreg=43, assigning class LD_REGS to inheritance
r59
Original reg change 43->59 (bb3):
58: r59:SI=r57:SI
Add original<-inheritance after:
60: r43:SI=r59:SI
Inheritance reuse change 43->59 (bb3):
59: r58:SI=r59:SI
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<< inheritance for -Os <<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Use smallest class of ALL_REGS and GENERAL_REGS
Creating newreg=60 from oldreg=43, assigning class ALL_REGS to
inheritance r60
Original reg change 43->60 (bb3):
56: r56:QI=r60:SI#0
Add inheritance<-original before:
61: r60:SI=r43:SI
Inheritance reuse change 43->60 (bb3):
57: r57:SI=r60:SI
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<< inheritance for -Os <<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Use smallest class of ALL_REGS and GENERAL_REGS
Creating newreg=61 from oldreg=43, assigning class ALL_REGS to
inheritance r61
Original reg change 43->61 (bb3):
55: r55:QI=r61:SI#1
Add inheritance<-original before:
62: r61:SI=r43:SI
Inheritance reuse change 43->61 (bb3):
61: r60:SI=r61:SI
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<< inheritance for -Os <<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Use smallest class of ALL_REGS and GENERAL_REGS
Creating newreg=62 from oldreg=43, assigning class ALL_REGS to
inheritance r62
Original reg change 43->62 (bb3):
54: r54:QI=r62:SI#2
Add inheritance<-original before:
63: r62:SI=r43:SI
Inheritance reuse change 43->62 (bb3):
62: r61:SI=r62:SI
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<< inheritance for -Os <<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Use smallest class of ALL_REGS and GENERAL_REGS
Creating newreg=63 from oldreg=43, assigning class ALL_REGS to
inheritance r63
Original reg change 43->63 (bb3):
53: r53:QI=r63:SI#3
Add inheritance<-original before:
64: r63:SI=r43:SI
Inheritance reuse change 43->63 (bb3):
63: r62:SI=r63:SI
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EBB 4
********** Pseudo live ranges #1: **********
BB 4
Insn 43: point = 0, n_alt = -1
[...]
Assign 24 to reload r56 (freq=2000)
Reassigning non-reload pseudos
Assign 24 to r43 (freq=3000)
********** Undoing inheritance #1: **********
Inherit 5 out of 5 (100.00%)
********** Local #2: **********
[...]
--------------------------------------------------------------------------------
So, we need 'Inheritance' and we need 'Undoing inheritance'.
The patch:
PR rtl-optimization/118591
gcc/
* lra-constraints.cc (inherit_reload_reg): Do inheritance for any
optimization.
diff --git a/gcc/lra-constraints.cc b/gcc/lra-constraints.cc
index 7dbc7fe1e00..bfdab4adc34 100644
--- a/gcc/lra-constraints.cc
+++ b/gcc/lra-constraints.cc
@@ -5883,8 +5883,6 @@ static bool
inherit_reload_reg (bool def_p, int original_regno,
enum reg_class cl, rtx_insn *insn, rtx next_usage_insns)
{
- if (optimize_function_for_size_p (cfun))
- return false;
enum reg_class rclass = lra_get_allocno_class (original_regno);
rtx original_reg = regno_reg_rtx[original_regno];