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

Reply via email to