2015-10-14 Jeff Law <law@redhat.com>
+ * gcc.dg/tree-ssa/ssa-dom-thread-2.c: Deleted. The six functions
+ contained within have their own file/test now.
+ * gcc.dg/tree-ssa/ssa-dom-thread-2a.c: New test extracted from
+ ssa-dom-thread-2.c. Tighten expected output slightly and comment
+ expectations a bit more.
+ * gcc.dg/tree-ssa/ssa-dom-thread-2b.c: Likewise.
+ * gcc.dg/tree-ssa/ssa-dom-thread-2c.c: Likewise.
+ * gcc.dg/tree-ssa/ssa-dom-thread-2d.c: Likewise.
+ * gcc.dg/tree-ssa/ssa-dom-thread-2e.c: Likewise.
+ * gcc.dg/tree-ssa/ssa-dom-thread-2f.c: Likewise.
+
PR testsuite/67959
* gcc.dg/tree-ssa/ssa-thread-13.c: Avoid bitfield assumptions.
+++ /dev/null
-/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats" } */
-
-void foo();
-void bla();
-void bar();
-
-/* In the following two cases, we should be able to thread edge through
- the loop header. */
-
-void thread_entry_through_header (void)
-{
- int i;
-
- for (i = 0; i < 170; i++)
- bla ();
-}
-
-void thread_latch_through_header (void)
-{
- int i = 0;
- int first = 1;
-
- do
- {
- if (first)
- foo ();
-
- first = 0;
- bla ();
- } while (i++ < 100);
-}
-
-/* This is a TODO -- it is correct to thread both entry and latch edge through
- the header, but we do not handle this case yet. */
-
-void dont_thread_1 (void)
-{
- int i = 0;
- int first = 1;
-
- do
- {
- if (first)
- foo ();
- else
- bar ();
-
- first = 0;
- bla ();
- } while (i++ < 100);
-}
-
-/* Avoid threading in the following two cases, to prevent creating subloops. */
-
-void dont_thread_2 (int first)
-{
- int i = 0;
-
- do
- {
- if (first)
- foo ();
- else
- bar ();
-
- first = 0;
- bla ();
- } while (i++ < 100);
-}
-
-void dont_thread_3 (int nfirst)
-{
- int i = 0;
- int first = 0;
-
- do
- {
- if (first)
- foo ();
- else
- bar ();
-
- first = nfirst;
- bla ();
- } while (i++ < 100);
-}
-
-/* Avoid threading in this case, in order to avoid creating loop with
- multiple entries. */
-
-void dont_thread_4 (int a, int nfirst)
-{
- int i = 0;
- int first;
-
- if (a)
- first = 0;
- else
- first = 1;
-
- do
- {
- if (first)
- foo ();
- else
- bar ();
-
- first = nfirst;
- bla ();
- } while (i++ < 100);
-}
-
-/* { dg-final { scan-tree-dump-times "Jumps threaded: 1" 1 "vrp1"} } */
-/* { dg-final { scan-tree-dump-times "Jumps threaded: 2" 0 "vrp1"} } */
-/* { dg-final { scan-tree-dump-times "Jumps threaded: 1" 0 "dom1"} } */
-/* { dg-final { scan-tree-dump-times "Jumps threaded: 2" 1 "dom1"} } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats" } */
+
+void bla();
+
+/* In the following case, we should be able to thread edge through
+ the loop header. */
+
+void thread_entry_through_header (void)
+{
+ int i;
+
+ for (i = 0; i < 170; i++)
+ bla ();
+}
+
+/* There's a single jump thread that should be handled by the VRP
+ jump threading pass. */
+/* { dg-final { scan-tree-dump-times "Jumps threaded: 1" 1 "vrp1"} } */
+/* { dg-final { scan-tree-dump-times "Jumps threaded: 2" 0 "vrp1"} } */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "dom1"} } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats" } */
+
+void foo();
+void bla();
+
+/* In the following case, we should be able to thread edge through
+ the loop header. */
+
+void thread_latch_through_header (void)
+{
+ int i = 0;
+ int first = 1;
+
+ do
+ {
+ if (first)
+ foo ();
+
+ first = 0;
+ bla ();
+ } while (i++ < 100);
+}
+
+/* Threading the latch to a later point in the loop is safe in this
+ case. And we want to thread through the header as well. These
+ are both caught by threading in DOM. */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "vrp1"} } */
+/* { dg-final { scan-tree-dump-times "Jumps threaded: 1" 0 "dom1"} } */
+/* { dg-final { scan-tree-dump-times "Jumps threaded: 2" 1 "dom1"} } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats" } */
+
+void foo();
+void bla();
+void bar();
+
+/* This is a TODO -- it is correct to thread both entry and latch edge through
+ the header, but we do not handle this case yet. */
+
+void dont_thread_1 (void)
+{
+ int i = 0;
+ int first = 1;
+
+ do
+ {
+ if (first)
+ foo ();
+ else
+ bar ();
+
+ first = 0;
+ bla ();
+ } while (i++ < 100);
+}
+
+/* In this case we can thread if and only if we thread through the
+ header and around the latch. If one is done without the other, then
+ we create an irreducible CFG. */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "vrp1"} } */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "dom1"} } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats" } */
+
+void foo();
+void bla();
+void bar();
+
+/* Avoid threading in the following case, to prevent creating subloops. */
+
+void dont_thread_2 (int first)
+{
+ int i = 0;
+
+ do
+ {
+ if (first)
+ foo ();
+ else
+ bar ();
+
+ first = 0;
+ bla ();
+ } while (i++ < 100);
+}
+
+/* Peeling off the first iteration would make threading through
+ the loop latch safe, but we don't do that currently. */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "vrp1"} } */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "dom1"} } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats" } */
+
+void foo();
+void bla();
+void bar();
+
+void dont_thread_3 (int nfirst)
+{
+ int i = 0;
+ int first = 0;
+
+ do
+ {
+ if (first)
+ foo ();
+ else
+ bar ();
+
+ first = nfirst;
+ bla ();
+ } while (i++ < 100);
+}
+
+/* Threading through the loop header is not safe here. Peeling off
+ the first iteration then unswitching the loop would be safe. */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "vrp1"} } */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "dom1"} } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1-stats -fdump-tree-dom1-stats" } */
+
+void foo();
+void bla();
+void bar();
+
+/* Avoid threading in this case, in order to avoid creating loop with
+ multiple entries. */
+
+void dont_thread_4 (int a, int nfirst)
+{
+ int i = 0;
+ int first;
+
+ if (a)
+ first = 0;
+ else
+ first = 1;
+
+ do
+ {
+ if (first)
+ foo ();
+ else
+ bar ();
+
+ first = nfirst;
+ bla ();
+ } while (i++ < 100);
+}
+
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "vrp1"} } */
+/* { dg-final { scan-tree-dump-not "Jumps threaded" "dom1"} } */