]> gcc.gnu.org Git - gcc.git/commitdiff
re PR middle-end/50632 (FAIL: gcc.dg/pr50132.c)
authorRichard Henderson <rth@redhat.com>
Thu, 6 Oct 2011 22:22:11 +0000 (15:22 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 6 Oct 2011 22:22:11 +0000 (15:22 -0700)
PR 50632

        * combine-stack-adjust.c (maybe_move_args_size_note): Add after
        parameter; use it to decide whether to merge two notes.
        (combine_stack_adjustments_for_block): Use maybe_move_args_size_note
        for the deallocation case as well.

From-SVN: r179637

gcc/ChangeLog
gcc/combine-stack-adj.c

index 16ef45abb0cc15bccfe6ae45dddcaacbaf11fea9..2af56eb47f22160d5f570a09fb9f555f9aed75d4 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-06  Richard Henderson  <rth@redhat.com>
+
+       * combine-stack-adjust.c (maybe_move_args_size_note): Add after
+       parameter; use it to decide whether to merge two notes.
+       (combine_stack_adjustments_for_block): Use maybe_move_args_size_note
+       for the deallocation case as well.
+
 2011-10-06  Anatoly Sokolov  <aesok@post.ru>
 
        * system.h (OUTPUT_ADDR_CONST_EXTRA): Poison.
index bca078442f7c304c65b461ccc46600872959769d..3cffd662f9294a456a10eb25e985d02bc53a312b 100644 (file)
@@ -296,10 +296,11 @@ record_stack_refs (rtx *xp, void *data)
   return 0;
 }
 
-/* If INSN has a REG_ARGS_SIZE note, move it to LAST.  */
+/* If INSN has a REG_ARGS_SIZE note, move it to LAST.
+   AFTER is true iff LAST follows INSN in the instruction stream.  */
 
 static void
-maybe_move_args_size_note (rtx last, rtx insn)
+maybe_move_args_size_note (rtx last, rtx insn, bool after)
 {
   rtx note, last_note;
 
@@ -309,7 +310,12 @@ maybe_move_args_size_note (rtx last, rtx insn)
 
   last_note = find_reg_note (last, REG_ARGS_SIZE, NULL_RTX);
   if (last_note)
-    XEXP (last_note, 0) = XEXP (note, 0);
+    {
+      /* The ARGS_SIZE notes are *not* cumulative.  They represent an
+        absolute value, and the "most recent" note wins.  */
+      if (!after)
+        XEXP (last_note, 0) = XEXP (note, 0);
+    }
   else
     add_reg_note (last, REG_ARGS_SIZE, XEXP (note, 0));
 }
@@ -385,7 +391,7 @@ combine_stack_adjustments_for_block (basic_block bb)
                                                  last_sp_adjust + this_adjust,
                                                  this_adjust))
                    {
-                     maybe_move_args_size_note (last_sp_set, insn);
+                     maybe_move_args_size_note (last_sp_set, insn, false);
 
                      /* It worked!  */
                      delete_insn (insn);
@@ -403,6 +409,8 @@ combine_stack_adjustments_for_block (basic_block bb)
                                                  last_sp_adjust + this_adjust,
                                                  -last_sp_adjust))
                    {
+                     maybe_move_args_size_note (insn, last_sp_set, true);
+
                      /* It worked!  */
                      delete_insn (last_sp_set);
                      last_sp_set = insn;
This page took 0.091953 seconds and 5 git commands to generate.