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];