[PATCH] Fix invalid redundant extension elimination for rl78 port
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Nov 2015 05:11:15 +0000 (05:11 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Nov 2015 05:11:15 +0000 (05:11 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230785 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ree.c

index 0338c75..e770638 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 b8436f2..f3b79e0 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};