Suggested by Richard Henderson and Richard Kenner:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 Jul 2001 19:44:42 +0000 (19:44 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 Jul 2001 19:44:42 +0000 (19:44 +0000)
* combine.c (recog_for_combine): Use the fake recog
only if instruction does not match.
* rtl.h (NOOP_MOVE_INSN_CODE): New.
* rtlanal.c (noop_move_p): Always return 1 for NOOP_MOVE_INSN_CODE.

* combine.c (try_combine): Discover noop jump as direct jump.

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

gcc/ChangeLog
gcc/combine.c
gcc/rtl.h
gcc/rtlanal.c

index b887349..1c84286 100644 (file)
@@ -1,3 +1,13 @@
+Sun Jul 29 21:38:45 CEST 2001  Jan Hubicka  <jh@suse.cz>
+
+       Suggested by Richard Henderson and Richard Kenner:
+       * combine.c (recog_for_combine): Use the fake recog
+       only if instruction does not match.
+       * rtl.h (NOOP_MOVE_INSN_CODE): New.
+       * rtlanal.c (noop_move_p): Always return 1 for NOOP_MOVE_INSN_CODE.
+
+       * combine.c (try_combine): Discover noop jump as direct jump.
+
 2001-07-29  Daniel Berlin  <dan@cgsoftware.com>
 
        * df.c (df_rd_global_compute): Add successors to worklist, not
index 657a929..4ece85a 100644 (file)
@@ -2763,7 +2763,10 @@ try_combine (i3, i2, i1, new_direct_jump_p)
        BARRIER following it since it may have initially been a
        conditional jump.  It may also be the last nonnote insn.  */
 
-    if (GET_CODE (newpat) == RETURN || any_uncondjump_p (i3))
+    if (GET_CODE (newpat) == RETURN || any_uncondjump_p (i3)
+       || (GET_CODE (newpat) == SET
+           && SET_SRC (newpat) == pc_rtx
+           && SET_DEST (newpat) == pc_rtx))
       {
        *new_direct_jump_p = 1;
 
@@ -9600,12 +9603,7 @@ recog_for_combine (pnewpat, insn, pnotes)
   old_notes = REG_NOTES (insn);
   REG_NOTES (insn) = 0;
 
-  /* Is the result of combination a valid instruction?
-     Recognize all noop sets, these will be killed by followup pass.  */
-  if (GET_CODE (pat) == SET && set_noop_p (pat))
-    insn_code_number = INT_MAX;
-  else
-    insn_code_number = recog (pat, insn, &num_clobbers_to_add);
+  insn_code_number = recog (pat, insn, &num_clobbers_to_add);
 
   /* If it isn't, there is the possibility that we previously had an insn
      that clobbered some register as a side effect, but the combined
@@ -9630,13 +9628,13 @@ recog_for_combine (pnewpat, insn, pnotes)
       if (pos == 1)
        pat = XVECEXP (pat, 0, 0);
 
-      /* Recognize all noop sets, these will be killed by followup pass.  */
-      if (GET_CODE (pat) == SET && set_noop_p (pat))
-       insn_code_number = INT_MAX;
-      else
-        insn_code_number = recog (pat, insn, &num_clobbers_to_add);
+      insn_code_number = recog (pat, insn, &num_clobbers_to_add);
     }
 
+  /* Recognize all noop sets, these will be killed by followup pass.  */
+  if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
+    insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
+
   REG_NOTES (insn) = old_notes;
 
   /* If we had any clobbers to add, make a new pattern than contains
index e7fdc98..da454c2 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -35,6 +35,10 @@ struct function;
 union tree_node;
 #endif
 
+/* Value used by some passes to "recognize" noop moves as valid instructions.
+ */
+#define NOOP_MOVE_INSN_CODE    INT_MAX
+
 /* Register Transfer Language EXPRESSIONS CODES */
 
 #define RTX_CODE       enum rtx_code
index c9152ab..92220f6 100644 (file)
@@ -1030,6 +1030,9 @@ noop_move_p (insn)
 {
   rtx pat = PATTERN (insn);
 
+  if (INSN_CODE (insn) == NOOP_MOVE_INSN_CODE)
+    return 1;
+
   /* Insns carrying these notes are useful later on.  */
   if (find_reg_note (insn, REG_EQUAL, NULL_RTX))
     return 0;