Allow autoinc in jumps, but only when using reload.
authorBernd Schmidt <bernds_cb1@t-online.de>
Wed, 27 Nov 2019 03:31:24 +0000 (03:31 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Wed, 27 Nov 2019 03:31:24 +0000 (03:31 +0000)
* auto-inc-dec.c (merge_in_block): Allow autoinc in jumps unless
LRA is enabled.
* combine.c (can_combine_p): Disallow autoinc in jumps unless LRA is
disabled.

From-SVN: r278756

gcc/ChangeLog
gcc/auto-inc-dec.c
gcc/combine.c

index ecade7ba155d031b210a99967ab6f6df00f7469a..358602d744e85d1fbfcd48bcabee1a0e23d17969 100644 (file)
@@ -1,3 +1,10 @@
+2019-11-27  Bernd Schmidt  <bernds_cb1@t-online.de>
+
+       * auto-inc-dec.c (merge_in_block): Allow autoinc in jumps unless
+       LRA is enabled.
+       * combine.c (can_combine_p): Disallow autoinc in jumps unless LRA is
+       disabled.
+
 2019-11-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/92664
index bdb6efab5202710910c14c0897616f3ead531169..1b224cc9777395a5fd9ecb2135031bf01b584f43 100644 (file)
@@ -1441,10 +1441,9 @@ merge_in_block (int max_reg, basic_block bb)
          continue;
        }
 
-      /* This continue is deliberate.  We do not want the uses of the
-        jump put into reg_next_use because it is not considered safe to
-        combine a preincrement with a jump.  */
-      if (JUMP_P (insn))
+      /* Reload should handle auto-inc within a jump correctly, while LRA
+        is known to have issues with autoinc.  */
+      if (JUMP_P (insn) && targetm.lra_p ())
        continue;
 
       if (dump_file)
index 2e21459f50461f5d30268d90f66b9b15ed26c42b..3fbd84fcb808b8e0d2d07cfc4d7423030f50b25f 100644 (file)
@@ -2117,12 +2117,16 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED,
 
   /* If INSN contains an autoincrement or autodecrement, make sure that
      register is not used between there and I3, and not already used in
-     I3 either.  Neither must it be used in PRED or SUCC, if they exist.  */
+     I3 either.  Neither must it be used in PRED or SUCC, if they exist.
+     Also insist that I3 not be a jump if using LRA; if it were one
+     and the incremented register were spilled, we would lose.
+     Reload handles this correctly.  */
 
   if (AUTO_INC_DEC)
     for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
       if (REG_NOTE_KIND (link) == REG_INC
-         && (reg_used_between_p (XEXP (link, 0), insn, i3)
+         && ((JUMP_P (i3) && targetm.lra_p ())
+             || reg_used_between_p (XEXP (link, 0), insn, i3)
              || (pred != NULL_RTX
                  && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
              || (pred2 != NULL_RTX