[PATCH] Split ssa-dom-thread-2.c into separate files/tests
* 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. From-SVN: r228821
This commit is contained in:
parent
cb62081c07
commit
bb1125df53
8 changed files with 185 additions and 117 deletions
|
@ -1,5 +1,16 @@
|
|||
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.
|
||||
|
||||
|
|
|
@ -1,117 +0,0 @@
|
|||
/* { 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"} } */
|
21
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2a.c
Normal file
21
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2a.c
Normal file
|
@ -0,0 +1,21 @@
|
|||
/* { 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"} } */
|
30
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2b.c
Normal file
30
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2b.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* { 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"} } */
|
32
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2c.c
Normal file
32
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2c.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
/* { 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"} } */
|
29
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2d.c
Normal file
29
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2d.c
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* { 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"} } */
|
28
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2e.c
Normal file
28
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2e.c
Normal file
|
@ -0,0 +1,28 @@
|
|||
/* { 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"} } */
|
34
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2f.c
Normal file
34
gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2f.c
Normal file
|
@ -0,0 +1,34 @@
|
|||
/* { 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"} } */
|
Loading…
Add table
Reference in a new issue