]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2015-09-25 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Sep 2015 21:06:08 +0000 (21:06 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 25 Sep 2015 21:06:08 +0000 (21:06 +0000)
PR target/61578
* lra-constarints.c (match_reload): Check presence of the input pseudo
in the output pseudo.

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

gcc/ChangeLog
gcc/lra-constraints.c

index f102313372ef9975acccf5ac723cccf29ce3f590..56206f468b34a8fee208d84109f443dd269640f7 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-25  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/61578
+       * lra-constarints.c (match_reload): Check presence of the input pseudo
+       in the output pseudo.
+
 2015-09-25  Tobias Burnus  <burnus@net-b.de>
 
        * doc/invoke.texi (-fsanitize): Minor wording tweak.
index fc8e43d66d98ee998f8fac68fd5f98a52d780265..c6afa7a94f5e4db6045b2efc4463fc0ac4c67526 100644 (file)
@@ -945,6 +945,12 @@ match_reload (signed char out, signed char *ins, enum reg_class goal_class,
        = (ins[1] < 0 && REG_P (in_rtx)
           && (int) REGNO (in_rtx) < lra_new_regno_start
           && find_regno_note (curr_insn, REG_DEAD, REGNO (in_rtx))
+          /* We can not use the same value if the pseudo is mentioned
+             in the output, e.g. as an address part in memory,
+             becuase output reload will actually extend the pseudo
+             liveness.  We don't care about eliminable hard regs here
+             as we are interesting only in pseudos.  */
+          && (out < 0 || regno_use_in (REGNO (in_rtx), out_rtx) == NULL_RTX)
           ? lra_create_new_reg (inmode, in_rtx, goal_class, "")
           : lra_create_new_reg_with_unique_value (outmode, out_rtx,
                                                   goal_class, ""));