]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/34773 (miscompilation of vfprintf_r)
authorHans-Peter Nilsson <hp@axis.com>
Fri, 1 Feb 2008 21:28:46 +0000 (21:28 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Fri, 1 Feb 2008 21:28:46 +0000 (21:28 +0000)
PR rtl-optimization/34773
* reg-notes.def (EQUAL): Mention significance of combination of
REG_EQUAL and REG_RETVAL.
* fwprop.c (try_fwprop_subst): Don't add REG_EQUAL to an
insn that has a REG_RETVAL.

From-SVN: r132053

gcc/ChangeLog
gcc/fwprop.c
gcc/reg-notes.def

index 35f0e75eed240783f341876ef88f84e78f70e17c..8bf727f6f4109d47cda8e63914c7c5ea7982dd90 100644 (file)
@@ -1,3 +1,11 @@
+2008-02-01  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR rtl-optimization/34773
+       * reg-notes.def (EQUAL): Mention significance of combination of
+       REG_EQUAL and REG_RETVAL.
+       * fwprop.c (try_fwprop_subst): Don't add REG_EQUAL to an
+       insn that has a REG_RETVAL.
+
 2008-02-01  Roger Sayle  <roger@eyesopen.com>
 
        PR bootstrap/33781
index 6bc9c674a7657e6598c29f7314fea64b11d3f0f5..1e0327230bbf631c720f4f4afa91466b9ab69c91 100644 (file)
@@ -729,9 +729,12 @@ try_fwprop_subst (struct df_ref *use, rtx *loc, rtx new, rtx def_insn, bool set_
     {
       cancel_changes (0);
 
-      /* Can also record a simplified value in a REG_EQUAL note, making a
-        new one if one does not already exist.  */
-      if (set_reg_equal)
+      /* Can also record a simplified value in a REG_EQUAL note,
+        making a new one if one does not already exist.
+        Don't do this if the insn has a REG_RETVAL note, because the
+        combined presence means that the REG_EQUAL note refers to the
+        (full) contents of the libcall value.  */
+      if (set_reg_equal && !find_reg_note (insn, REG_RETVAL, NULL_RTX))
        {
          if (dump_file)
            fprintf (dump_file, " Setting REG_EQUAL note\n");
index 36953242e29857d3017a2511b80442270ee93f31..eaf04168f5fa3320964ea6f27febf81c6974eca0 100644 (file)
@@ -52,7 +52,9 @@ REG_NOTE (EQUIV)
 
 /* Like REG_EQUIV except that the destination is only momentarily
    equal to the specified rtx.  Therefore, it cannot be used for
-   substitution; but it can be used for cse.  */
+   substitution; but it can be used for cse.  Together with a
+   REG_RETVAL note, it means that the insn sets the full contents of
+   the libcall value.  */
 REG_NOTE (EQUAL)
 
 /* This insn copies the return-value of a library call out of the hard