re PR target/79404 (h8300: ICE at gcc/ira.c:5541 whilst building libgcc)
authorJeff Law <law@redhat.com>
Tue, 14 Feb 2017 16:44:33 +0000 (09:44 -0700)
committerJeff Law <law@gcc.gnu.org>
Tue, 14 Feb 2017 16:44:33 +0000 (09:44 -0700)
PR target/79404
* ira-costs.c (scan_one_insn): Initialize register move costs
for pseudos seen in USE/CLOBBER insns.

From-SVN: r245436

gcc/ChangeLog
gcc/ira-costs.c

index 3c376aee683fa81c85b9c1fa0a97c324747a258d..bd6fdb48012648fd3e75ea2cb26f3ccf299381dd 100644 (file)
@@ -4,6 +4,10 @@
 
 2017-02-14 Jeff Law  <law@redhat.com>
 
+       PR target/79404
+       * ira-costs.c (scan_one_insn): Initialize register move costs
+       for pseudos seen in USE/CLOBBER insns.
+
        PR tree-optimization/79095
        * tree-vrp.c (extract_range_from_binary_expr_1): For EXACT_DIV_EXPR,
        if the numerator has the range ~[0,0] make the resultant range ~[0,0].
index c561db6a3897d2b41315f3e430e329dcd754ca8e..1737430145611cdae1e2a07ca38f224dfe44599d 100644 (file)
@@ -1438,9 +1438,25 @@ scan_one_insn (rtx_insn *insn)
     return insn;
 
   pat_code = GET_CODE (PATTERN (insn));
-  if (pat_code == USE || pat_code == CLOBBER || pat_code == ASM_INPUT)
+  if (pat_code == ASM_INPUT)
     return insn;
 
+  /* If INSN is a USE/CLOBBER of a pseudo in a mode M then go ahead
+     and initialize the register move costs of mode M.
+
+     The pseudo may be related to another pseudo via a copy (implicit or
+     explicit) and if there are no mode M uses/sets of the original
+     pseudo, then we may leave the register move costs uninitialized for
+     mode M. */
+  if (pat_code == USE || pat_code == CLOBBER)
+    {
+      rtx x = XEXP (PATTERN (insn), 0);
+      if (GET_CODE (x) == REG
+         && REGNO (x) >= FIRST_PSEUDO_REGISTER)
+        ira_init_register_move_cost_if_necessary (GET_MODE (x));
+      return insn;
+    }
+
   counted_mem = false;
   set = single_set (insn);
   extract_insn (insn);