OSDN Git Service

* haifa-sched.c (recompute_todo_spec): Simplify and correct the
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Nov 2011 15:58:05 +0000 (15:58 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Nov 2011 15:58:05 +0000 (15:58 +0000)
code checking for a clobber of a condition register when deciding
whether to predicate.

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

gcc/ChangeLog
gcc/haifa-sched.c

index bf5a6a1..9a6765d 100644 (file)
@@ -1,3 +1,9 @@
+2011-11-29  Bernd Schmidt  <bernds@codesourcery.com>
+
+       * haifa-sched.c (recompute_todo_spec): Simplify and correct the
+       code checking for a clobber of a condition register when deciding
+       whether to predicate.
+
 2011-11-29   Diego Novillo  <dnovillo@google.com>
 
        * gimple.c (gimple_call_set_cannot_inline): Move from gimple.h.
index d87a608..4db2313 100644 (file)
@@ -1178,33 +1178,20 @@ recompute_todo_spec (rtx next)
       regno = REGNO (XEXP (cond, 0));
 
       /* Find the last scheduled insn that modifies the condition register.
-        If we have a true dependency on it, it sets it to the correct value,
-        otherwise it must be a later insn scheduled in-between that clobbers
-        the condition.  */
-      FOR_EACH_VEC_ELT_REVERSE (rtx, scheduled_insns, i, prev)
-       {
-         sd_iterator_def sd_it;
-         dep_t dep;
-         HARD_REG_SET t;
-         bool found;
-
-         find_all_hard_reg_sets (prev, &t);
-         if (!TEST_HARD_REG_BIT (t, regno))
-           continue;
+        We can stop looking once we find the insn we depend on through the
+        REG_DEP_CONTROL; if the condition register isn't modified after it,
+        we know that it still has the right value.  */
+      if (QUEUE_INDEX (pro) == QUEUE_SCHEDULED)
+       FOR_EACH_VEC_ELT_REVERSE (rtx, scheduled_insns, i, prev)
+         {
+           HARD_REG_SET t;
 
-         found = false;
-         FOR_EACH_DEP (next, SD_LIST_RES_BACK, sd_it, dep)
-           {
-             if (DEP_PRO (dep) == prev && DEP_TYPE (dep) == REG_DEP_TRUE)
-               {
-                 found = true;
-                 break;
-               }
-           }
-         if (!found)
-           return HARD_DEP;
-         break;
-       }
+           find_all_hard_reg_sets (prev, &t);
+           if (TEST_HARD_REG_BIT (t, regno))
+             return HARD_DEP;
+           if (prev == pro)
+             break;
+         }
       if (ORIG_PAT (next) == NULL_RTX)
        {
          ORIG_PAT (next) = PATTERN (next);