[PATCH] Fix invalid redundant extension elimination for rl78 port
authorNick Clifton <nickc@redhat.com>
Tue, 24 Nov 2015 05:11:15 +0000 (05:11 +0000)
committerJeff Law <law@gcc.gnu.org>
Tue, 24 Nov 2015 05:11:15 +0000 (22:11 -0700)
* ree.c (add_removable_extension): Avoid mis-optimizing cases where
the source/dest of the target extension require a different number of
hard registers.
(combine_set_extension): Remove #if 0 code.

Co-Authored-By: Jeff Law <law@redhat.com>
From-SVN: r230785

gcc/ChangeLog
gcc/ree.c

index 0338c753ef4a35b90056d5ef56dd2f65aa764641..e770638354df281dd734adaf0793c610c431fec7 100644 (file)
@@ -1,3 +1,11 @@
+2015-11-23  Nick Clifton  <nickc@redhat.com>
+           Jeff Law  <law@redhat.com>
+
+       * ree.c (add_removable_extension): Avoid mis-optimizing cases where
+       the source/dest of the target extension require a different number of
+       hard registers.
+       (combine_set_extension): Remove #if 0 code.
+
 2015-11-23  Aditya Kumar  <aditya.k7@samsung.com>
            Sebastian Pop  <s.pop@samsung.com>
 
index b8436f25995550f6edd97f0c8370c19586ab04ac..f3b79e0886d8c3624c7bac50c52ef04e4b31ce7f 100644 (file)
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -332,16 +332,6 @@ combine_set_extension (ext_cand *cand, rtx_insn *curr_insn, rtx *orig_set)
   else
     new_reg = gen_rtx_REG (cand->mode, REGNO (SET_DEST (*orig_set)));
 
-#if 0
-  /* Rethinking test.  Temporarily disabled.  */
-  /* We're going to be widening the result of DEF_INSN, ensure that doing so
-     doesn't change the number of hard registers needed for the result.  */
-  if (HARD_REGNO_NREGS (REGNO (new_reg), cand->mode)
-      != HARD_REGNO_NREGS (REGNO (SET_DEST (*orig_set)),
-                          GET_MODE (SET_DEST (*orig_set))))
-       return false;
-#endif
-
   /* Merge constants by directly moving the constant into the register under
      some conditions.  Recall that RTL constants are sign-extended.  */
   if (GET_CODE (orig_src) == CONST_INT
@@ -1080,6 +1070,18 @@ add_removable_extension (const_rtx expr, rtx_insn *insn,
              }
          }
 
+      /* Fourth, if the extended version occupies more registers than the
+        original and the source of the extension is the same hard register
+        as the destination of the extension, then we can not eliminate
+        the extension without deep analysis, so just punt.
+
+        We allow this when the registers are different because the
+        code in combine_reaching_defs will handle that case correctly.  */
+      if ((HARD_REGNO_NREGS (REGNO (dest), mode)
+          != HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)))
+         && REGNO (dest) == REGNO (reg))
+       return;
+
       /* Then add the candidate to the list and insert the reaching definitions
          into the definition map.  */
       ext_cand e = {expr, code, mode, insn};