re PR bootstrap/88157 (ICE when building libgo encoding/gob.lo starting with r266385)
authorVladimir Makarov <vmakarov@redhat.com>
Fri, 23 Nov 2018 22:00:43 +0000 (22:00 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Fri, 23 Nov 2018 22:00:43 +0000 (22:00 +0000)
2018-11-23  Vladimir Makarov  <vmakarov@redhat.com>

PR bootstrap/88157
* ira-costs.c (record_operand_costs): Use bigger hard reg class if
its mode does not fit to the original class.

From-SVN: r266422

gcc/ChangeLog
gcc/ira-costs.c

index c377aa534ddf0fc4df71b7d55a63f4d671972098..b0b85bac352e6e41f02f45a2795d4a5dd3ad9185 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-23  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR bootstrap/88157
+       * ira-costs.c (record_operand_costs): Use bigger hard reg class if
+       its mode does not fit to the original class.
+
 2018-11-23  Martin Sebor  <msebor@redhat.com>
 
        PR tree-optimization/87756
index 6c1d9ddde5627ecbca54f26093c98ffb3cc9d92f..cfda4322bc35ede37582f5a0479e55ace730bc43 100644 (file)
@@ -1319,6 +1319,13 @@ record_operand_costs (rtx_insn *insn, enum reg_class *pref)
          bool dead_p = find_regno_note (insn, REG_DEAD, REGNO (src));
 
          hard_reg_class = REGNO_REG_CLASS (other_regno);
+         /* Target code may return any cost for mode which does not
+            fit the the hard reg class (e.g. DImode for AREG on
+            i386).  Check this and use a bigger class to get the
+            right cost.  */
+         if (! ira_hard_reg_in_set_p (other_regno, mode,
+                                      reg_class_contents[hard_reg_class]))
+           hard_reg_class = ira_pressure_class_translate[hard_reg_class];
          i = regno == (int) REGNO (src) ? 1 : 0;
          for (k = cost_classes_ptr->num - 1; k >= 0; k--)
            {