]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: [multiple changes]
authorMatthias Klose <doko@ubuntu.com>
Fri, 19 Apr 2013 12:00:36 +0000 (12:00 +0000)
committerMatthias Klose <doko@gcc.gnu.org>
Fri, 19 Apr 2013 12:00:36 +0000 (12:00 +0000)
2013-04-19  Matthias Klose  <doko@ubuntu.com>

        PR middle-end/56848
        Re-apply
        2013-04-01  Andrey Belevantsev  <abel@ispras.ru>

        Backport from mainline
        2013-02-25  Andrey Belevantsev  <abel@ispras.ru>
        Alexander Monakov  <amonakov@ispras.ru>

        PR middle-end/56077
        * sched-deps.c (sched_analyze_insn): When reg_pending_barrier,
        flush pending lists also on non-jumps.  Adjust comment.

        Backport from 4.8:
        2012-08-27  Maxim Kuvyrkov  <maxim@codesourcery.com>

        * sched-deps.c (add_dependence_list_and_free): Simplify.
        (flush_pending_list_and_free): Fix a hack that was fixing a hack.  Free
        lists when add_dependence_list_and_free doesn't free them.

From-SVN: r198089

gcc/ChangeLog
gcc/sched-deps.c

index 713ececa0a83b808f6c776eef6c7d8b69ee90cb5..c187e19f895f2f4b95402ee35a7b5fef6144c8e0 100644 (file)
@@ -1,3 +1,24 @@
+2013-04-19  Matthias Klose  <doko@ubuntu.com>
+
+       PR middle-end/56848
+       Re-apply
+       2013-04-01  Andrey Belevantsev  <abel@ispras.ru>
+
+       Backport from mainline
+       2013-02-25  Andrey Belevantsev  <abel@ispras.ru>
+       Alexander Monakov  <amonakov@ispras.ru>
+
+       PR middle-end/56077
+       * sched-deps.c (sched_analyze_insn): When reg_pending_barrier,
+       flush pending lists also on non-jumps.  Adjust comment.
+
+       Backport from 4.8:
+       2012-08-27  Maxim Kuvyrkov  <maxim@codesourcery.com>
+
+       * sched-deps.c (add_dependence_list_and_free): Simplify.
+       (flush_pending_list_and_free): Fix a hack that was fixing a hack.  Free
+       lists when add_dependence_list_and_free doesn't free them.
+
 2013-04-19  Marek Polacek  <polacek@redhat.com>
 
        Backport from mainline
index 33a6996fe4fca2b7bbfde0aaf187b23d94f051f0..e4aa5200241ee0a83f6b4a0ba1476b6f7c58f3d4 100644 (file)
@@ -1563,24 +1563,15 @@ static void
 add_dependence_list_and_free (struct deps_desc *deps, rtx insn, rtx *listp,
                               int uncond, enum reg_note dep_type)
 {
-  rtx list, next;
+  add_dependence_list (insn, *listp, uncond, dep_type);
 
   /* We don't want to short-circuit dependencies involving debug
      insns, because they may cause actual dependencies to be
      disregarded.  */
   if (deps->readonly || DEBUG_INSN_P (insn))
-    {
-      add_dependence_list (insn, *listp, uncond, dep_type);
-      return;
-    }
+    return;
 
-  for (list = *listp, *listp = NULL; list ; list = next)
-    {
-      next = XEXP (list, 1);
-      if (uncond || ! sched_insns_conditions_mutex_p (insn, XEXP (list, 0)))
-       add_dependence (insn, XEXP (list, 0), dep_type);
-      free_INSN_LIST_node (list);
-    }
+  free_INSN_LIST_list (listp);
 }
 
 /* Remove all occurences of INSN from LIST.  Return the number of
@@ -1764,6 +1755,15 @@ flush_pending_lists (struct deps_desc *deps, rtx insn, int for_read,
   add_dependence_list_and_free (deps, insn, &deps->pending_jump_insns, 1,
                                REG_DEP_ANTI);
 
+  if (DEBUG_INSN_P (insn))
+    {
+      if (for_write)
+       free_INSN_LIST_list (&deps->pending_read_insns);
+      free_INSN_LIST_list (&deps->pending_write_insns);
+      free_INSN_LIST_list (&deps->last_pending_memory_flush);
+      free_INSN_LIST_list (&deps->pending_jump_insns);
+    }
+
   if (!deps->readonly)
     {
       free_EXPR_LIST_list (&deps->pending_write_mems);
@@ -3262,9 +3262,9 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx insn)
             SET_REGNO_REG_SET (&deps->reg_last_in_use, i);
           }
 
-      /* Flush pending lists on jumps, but not on speculative checks.  */
-      if (JUMP_P (insn) && !(sel_sched_p ()
-                             && sel_insn_is_speculation_check (insn)))
+      /* Don't flush pending lists on speculative checks for
+        selective scheduling.  */
+      if (!sel_sched_p () || !sel_insn_is_speculation_check (insn))
        flush_pending_lists (deps, insn, true, true);
 
       reg_pending_barrier = NOT_A_BARRIER;