PR target/48273
authoramonakov <amonakov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2011 11:49:43 +0000 (11:49 +0000)
committeramonakov <amonakov@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2011 11:49:43 +0000 (11:49 +0000)
* cfgloop.h (loop_has_exit_edges): New helper.
* sel-sched-ir.c (init_global_and_expr_for_insn): Make CALLs
non-clonable.
* sel-sched.c (sel_setup_region_sched_flags): Don't pipeline loops
that have no exit edges.

testsuite:
* g++.dg/opt/pr48273.C: New.

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

gcc/ChangeLog
gcc/cfgloop.h
gcc/sel-sched-ir.c
gcc/sel-sched.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr48273.C [new file with mode: 0644]

index b357ba7..523c3b7 100644 (file)
@@ -1,5 +1,14 @@
 2011-04-08  Alexander Monakov  <amonakov@ispras.ru>
 
+       PR target/48273
+       * cfgloop.h (loop_has_exit_edges): New helper.
+       * sel-sched-ir.c (init_global_and_expr_for_insn): Make CALLs
+       non-clonable.
+       * sel-sched.c (sel_setup_region_sched_flags): Don't pipeline loops
+       that have no exit edges.
+
+2011-04-08  Alexander Monakov  <amonakov@ispras.ru>
+
        PR rtl-optimization/48442
        * sel-sched.c (init_seqno): Remove number_of_insns argument.  Update
        all callers.  Adjust assert.
index f7bb134..0ff44de 100644 (file)
@@ -443,6 +443,14 @@ loop_outer (const struct loop *loop)
   return VEC_index (loop_p, loop->superloops, n - 1);
 }
 
+/* Returns true if LOOP has at least one exit edge.  */
+
+static inline bool
+loop_has_exit_edges (const struct loop *loop)
+{
+  return loop->exits->next->e != NULL;
+}
+
 /* Returns the list of loops in current_loops.  */
 
 static inline VEC (loop_p, gc) *
index 67484dd..95c1431 100644 (file)
@@ -2905,6 +2905,7 @@ init_global_and_expr_for_insn (insn_t insn)
       if (CANT_MOVE (insn)
           || INSN_ASM_P (insn)
           || SCHED_GROUP_P (insn)
+         || CALL_P (insn)
           /* Exception handling insns are always unique.  */
           || (cfun->can_throw_non_call_exceptions && can_throw_internal (insn))
           /* TRAP_IF though have an INSN code is control_flow_insn_p ().  */
index 0e8173b..fb1a026 100644 (file)
@@ -6781,7 +6781,8 @@ sel_setup_region_sched_flags (void)
   bookkeeping_p = 1;
   pipelining_p = (bookkeeping_p
                   && (flag_sel_sched_pipelining != 0)
-                 && current_loop_nest != NULL);
+                 && current_loop_nest != NULL
+                 && loop_has_exit_edges (current_loop_nest));
   max_insns_to_rename = PARAM_VALUE (PARAM_SELSCHED_INSNS_TO_RENAME);
   max_ws = MAX_WS;
 }
index e311e80..96c224f 100644 (file)
@@ -1,5 +1,10 @@
 2011-04-08  Alexander Monakov  <amonakov@ispras.ru>
 
+       PR target/48273
+       * g++.dg/opt/pr48273.C: New.
+
+2011-04-08  Alexander Monakov  <amonakov@ispras.ru>
+
        PR rtl-optimization/48442
        * gcc.dg/pr48442.c: New.
 
diff --git a/gcc/testsuite/g++.dg/opt/pr48273.C b/gcc/testsuite/g++.dg/opt/pr48273.C
new file mode 100644 (file)
index 0000000..4c5108b
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-do compile { target x86_64-*-* } }
+// { dg-options "-fschedule-insns2 -fsel-sched-pipelining -fselective-scheduling2 -funroll-all-loops -march=core2" }
+
+void bar ();
+
+void foo ()
+{
+  for (;;)
+    bar ();
+}