emit-rtl.c (set_unique_reg_note): Don't create REG_EQUAL or REG_EQUIV notes for ASM_O...
authorJakub Jelinek <jakub@redhat.com>
Tue, 30 Oct 2001 12:41:45 +0000 (13:41 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 30 Oct 2001 12:41:45 +0000 (13:41 +0100)
* emit-rtl.c (set_unique_reg_note): Don't create REG_EQUAL or
REG_EQUIV notes for ASM_OPERANDS.  Return the new note (if any).
* rtl.h (set_unique_reg_note): Change return value.
* gcse.c (try_replace_reg): Use set_unique_reg_note.
* cse.c (cse_insn): Likewise.
* expr.c (emit_move_insn): Likewise.
* explow.c (force_reg): Likewise.
* local-alloc (update_equiv_regs): Likewise.
* loop.c (move_moveables, load_mems): Likewise.
* reload (find_reloads): Likewise.

* gcc.dg/20011029-2.c: New test.

From-SVN: r46636

gcc/ChangeLog
gcc/cse.c
gcc/emit-rtl.c
gcc/explow.c
gcc/expr.c
gcc/gcse.c
gcc/local-alloc.c
gcc/loop.c
gcc/reload.c
gcc/rtl.h
gcc/testsuite/ChangeLog

index dabf4f7ecc48075c71acb9b97f4ae3ebbc5e8d7a..94976b36047385c2ed40f515180d666c54e06014 100644 (file)
@@ -1,3 +1,16 @@
+2001-10-30  Jakub Jelinek  <jakub@redhat.com>
+
+       * emit-rtl.c (set_unique_reg_note): Don't create REG_EQUAL or
+       REG_EQUIV notes for ASM_OPERANDS.  Return the new note (if any).
+       * rtl.h (set_unique_reg_note): Change return value.
+       * gcse.c (try_replace_reg): Use set_unique_reg_note.
+       * cse.c (cse_insn): Likewise.
+       * expr.c (emit_move_insn): Likewise.
+       * explow.c (force_reg): Likewise.
+       * local-alloc (update_equiv_regs): Likewise.
+       * loop.c (move_moveables, load_mems): Likewise.
+       * reload (find_reloads): Likewise.
+
 2001-10-30  Paolo Bonzini  <bonzini@gnu.org>
 
        Localization fixes.
index cbeae55f72fb7ff9f08bf4360d50390fbe9ac35c..ad6c62030fe33ba9716d94335675b4d8c3ce6358 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5648,18 +5648,12 @@ cse_insn (insn, libcall_insn)
                && GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
                && GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF))
        {
-         tem = find_reg_note (insn, REG_EQUAL, NULL_RTX);
-
          /* Make sure that the rtx is not shared with any other insn.  */
          src_const = copy_rtx (src_const);
 
          /* Record the actual constant value in a REG_EQUAL note, making
             a new one if one does not already exist.  */
-         if (tem)
-           XEXP (tem, 0) = src_const;
-         else
-           REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL,
-                                                 src_const, REG_NOTES (insn));
+         set_unique_reg_note (insn, REG_EQUAL, src_const);
 
           /* If storing a constant value in a register that
             previously held the constant value 0,
index 008ceaadcbaa31dee4431dfa472f3548a4de9e82..992d6049781028304fc5d5b92bd8d40fa3b0def6 100644 (file)
@@ -3960,7 +3960,7 @@ force_next_line_note ()
 /* Place a note of KIND on insn INSN with DATUM as the datum. If a
    note of this type already exists, remove it first.  */
 
-void
+rtx
 set_unique_reg_note (insn, kind, datum)
      rtx insn;
      enum reg_note kind;
@@ -3968,11 +3968,20 @@ set_unique_reg_note (insn, kind, datum)
 {
   rtx note = find_reg_note (insn, kind, NULL_RTX);
 
-  /* First remove the note if there already is one.  */
+  /* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
+     It serves no useful purpose and breaks eliminate_regs.  */
+  if ((kind == REG_EQUAL || kind == REG_EQUIV)
+      && GET_CODE (datum) == ASM_OPERANDS)
+    return NULL_RTX;
+
   if (note)
-    remove_note (insn, note);
+    {
+      XEXP (note, 0) = datum;
+      return note;
+    }
 
   REG_NOTES (insn) = gen_rtx_EXPR_LIST (kind, datum, REG_NOTES (insn));
+  return REG_NOTES (insn);
 }
 \f
 /* Return an indication of which type of insn should have X as a body.
index d0735aab78a3fd54175fdfafc8eeaae1cd2ec317..940a8395191b7c7cbb66855affe1aad9613cd643 100644 (file)
@@ -743,14 +743,7 @@ force_reg (mode, x)
   if (CONSTANT_P (x)
       && (set = single_set (insn)) != 0
       && SET_DEST (set) == temp)
-    {
-      rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
-
-      if (note)
-       XEXP (note, 0) = x;
-      else
-       REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, x, REG_NOTES (insn));
-    }
+    set_unique_reg_note (insn, REG_EQUAL, x);
   return temp;
 }
 
index b5c5989991fdebe79e246a73b40be96ef36401a1..bf7ec926d7ea5904e1a942f90e84fca1228ccc88 100644 (file)
@@ -2774,8 +2774,7 @@ emit_move_insn (x, y)
   last_insn = emit_move_insn_1 (x, y);
 
   if (y_cst && GET_CODE (x) == REG)
-    REG_NOTES (last_insn)
-      = gen_rtx_EXPR_LIST (REG_EQUAL, y_cst, REG_NOTES (last_insn));
+    set_unique_reg_note (last_insn, REG_EQUAL, y_cst);
 
   return last_insn;
 }
index a91cfd6836ea2b8823527afca53ed41cccf357fc..0bd96e02e4e5f2199c7c1091731d51125e6ed81f 100644 (file)
@@ -3929,8 +3929,7 @@ try_replace_reg (from, to, insn)
   /* If we've failed to do replacement, have a single SET, and don't already
      have a note, add a REG_EQUAL note to not lose information.  */
   if (!success && note == 0 && set != 0)
-    note = REG_NOTES (insn)
-      = gen_rtx_EXPR_LIST (REG_EQUAL, src, REG_NOTES (insn));
+    note = set_unique_reg_note (insn, REG_EQUAL, src);
 
   /* If there is already a NOTE, update the expression in it with our
      replacement.  */
index 9945b45d14b130aa18e9b2a5883b40383bbc13ac..7cee3f5e4569cb8673715b155f61051ea6ef2757 100644 (file)
@@ -927,13 +927,9 @@ update_equiv_regs ()
 
          /* cse sometimes generates function invariants, but doesn't put a
             REG_EQUAL note on the insn.  Since this note would be redundant,
-            there's no point creating it earlier than here.  Don't do this
-            for ASM_OPERANDS since eliminate_regs doesn't support it and
-            it serves no useful purpose.  */
-         if (! note && ! rtx_varies_p (src, 0)
-             && GET_CODE (src) != ASM_OPERANDS)
-           REG_NOTES (insn)
-             = note = gen_rtx_EXPR_LIST (REG_EQUAL, src, REG_NOTES (insn));
+            there's no point creating it earlier than here.  */
+         if (! note && ! rtx_varies_p (src, 0))
+           note = set_unique_reg_note (insn, REG_EQUAL, src);
 
          /* Don't bother considering a REG_EQUAL note containing an EXPR_LIST
             since it represents a function call */
index baaa74b59ab9c32d594286d5030c09af8f609bb1..8b2f8daf01374086f71ee55bace27bb4ed684751 100644 (file)
@@ -1831,9 +1831,9 @@ move_movables (loop, movables, threshold, insn_count)
 
                  i1 = loop_insn_hoist (loop, seq);
                  if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
-                   REG_NOTES (i1)
-                     = gen_rtx_EXPR_LIST (m->is_equiv ? REG_EQUIV : REG_EQUAL,
-                                          m->set_src, REG_NOTES (i1));
+                   set_unique_reg_note (i1,
+                                        m->is_equiv ? REG_EQUIV : REG_EQUAL,
+                                        m->set_src);
 
                  if (loop_dump_stream)
                    fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
@@ -1991,10 +1991,8 @@ move_movables (loop, movables, threshold, insn_count)
 
                          i1 = loop_insn_hoist (loop, seq);
                          if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
-                           REG_NOTES (i1)
-                             = gen_rtx_EXPR_LIST ((m->is_equiv ? REG_EQUIV
-                                                   : REG_EQUAL),
-                                                  m->set_src, REG_NOTES (i1));
+                           set_unique_reg_note (i1, m->is_equiv ? REG_EQUIV
+                                                    : REG_EQUAL, m->set_src);
                        }
                      else
                        i1 = loop_insn_hoist (loop, PATTERN (p));
@@ -9136,9 +9134,7 @@ load_mems (loop)
            }
 
          if (const_equiv)
-           REG_NOTES (set) = gen_rtx_EXPR_LIST (REG_EQUAL,
-                                                copy_rtx (const_equiv->loc),
-                                                REG_NOTES (set));
+           set_unique_reg_note (set, REG_EQUAL, copy_rtx (const_equiv->loc));
 
          if (written)
            {
index 2e8c93fbe98b3beac80d966867531e6d94af1eda..9ed9cd09948ea1d80c68fbd603076070b7a5270c 100644 (file)
@@ -2666,9 +2666,9 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
              && GET_CODE (reg) == REG
              && (GET_MODE_SIZE (GET_MODE (reg))
                  >= GET_MODE_SIZE (GET_MODE (op))))
-           REG_NOTES (emit_insn_before (gen_rtx_USE (VOIDmode, reg), insn))
-             = gen_rtx_EXPR_LIST (REG_EQUAL,
-                                  reg_equiv_memory_loc[REGNO (reg)], NULL_RTX);
+           set_unique_reg_note (emit_insn_before (gen_rtx_USE (VOIDmode, reg),
+                                                  insn),
+                                REG_EQUAL, reg_equiv_memory_loc[REGNO (reg)]);
 
          substed_operand[i] = recog_data.operand[i] = op;
        }
index 1985f98ea4b7adccfbed43b17745331afe10244e..db1e913be4419e4308396bcd491bddfc2658717b 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1409,7 +1409,7 @@ extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
                                                       unsigned int));
 
 /* In emit-rtl.c  */
-extern void set_unique_reg_note         PARAMS ((rtx, enum reg_note, rtx));
+extern rtx set_unique_reg_note         PARAMS ((rtx, enum reg_note, rtx));
 
 /* Functions in rtlanal.c */
 
index 2556eb47f285823d6721501df2990f7e598f1024..d8f07d99732df0d7b345d5cec61c957f2b532184 100644 (file)
@@ -1,3 +1,7 @@
+2001-10-30  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/20011029-2.c: New test.
+
 Mon Oct 29 21:19:53 2001  Nicola Pero  <n.pero@mi.flashnet.it>
 
        * objc/execute/class_self-1.m: New test.