diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-07 06:05:11 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-07 06:05:11 +0000 |
commit | ebebeee379dd8b985e6877e56bc124041907038b (patch) | |
tree | 32a2ce6c6b8ce5f11172be301cb81225d5d5cbac /gcc/testsuite/gcc.dg | |
parent | 588bbfff28d00a54a71f2d751fb75767b6b1b3cb (diff) | |
download | gcc-ebebeee379dd8b985e6877e56bc124041907038b.tar.gz |
2009-04-07 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk r145646
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@145649 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/gcc.dg')
54 files changed, 589 insertions, 80 deletions
diff --git a/gcc/testsuite/gcc.dg/memcpy-1.c b/gcc/testsuite/gcc.dg/memcpy-1.c index 2b11098b286..cc602423793 100644 --- a/gcc/testsuite/gcc.dg/memcpy-1.c +++ b/gcc/testsuite/gcc.dg/memcpy-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fdump-tree-optimized --param sra-max-structure-size=32" } */ /* PR36598 AVR fail maybe due to cost metrics */ /* { dg-final { scan-tree-dump-times "nasty_local" 0 "optimized" { xfail { "avr-*-*" } } } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/pr19633-1.c b/gcc/testsuite/gcc.dg/pr19633-1.c index 6370ff59b23..c05e46aef64 100644 --- a/gcc/testsuite/gcc.dg/pr19633-1.c +++ b/gcc/testsuite/gcc.dg/pr19633-1.c @@ -1,9 +1,5 @@ /* { dg-do run } */ - -/* The max-aliased-vops setting is a temporary workaround to avoid the - random failures as described in PR 30194. This test case does not - need alias sets bigger than 13 elements. */ -/* { dg-options "-O2 --param max-aliased-vops=15" } */ +/* { dg-options "-O2" } */ extern void abort (void); diff --git a/gcc/testsuite/gcc.dg/pr38984.c b/gcc/testsuite/gcc.dg/pr38984.c index 0ba72739942..11f1e7f211a 100644 --- a/gcc/testsuite/gcc.dg/pr38984.c +++ b/gcc/testsuite/gcc.dg/pr38984.c @@ -10,10 +10,8 @@ int f(int *p) return *p == a; } -/* Currently fails because of PR38985. */ - -/* { dg-final { scan-tree-dump-times " = \\\*p" 2 "optimized" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump-not "return 1" "optimized" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "\\\*p" 2 "optimized" } } */ +/* { dg-final { scan-tree-dump-not "return 1" "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/pragma-isr-trapa2.c b/gcc/testsuite/gcc.dg/pragma-isr-trapa2.c index 7b68185fc03..a1165893be5 100644 --- a/gcc/testsuite/gcc.dg/pragma-isr-trapa2.c +++ b/gcc/testsuite/gcc.dg/pragma-isr-trapa2.c @@ -1,4 +1,6 @@ /* { dg-do compile { target { { sh-*-* sh4*-*-* } && nonpic } } } */ +/* { dg-skip-if "FPU Required" { "sh*-*-*" } { "-m*nofpu*" } { "" } } */ +/* { dg-skip-if "FPU Required" { "sh*-*-*" } { "-m4al*" } { "" } } */ /* { dg-options "-O -m4" } */ extern void foo (); diff --git a/gcc/testsuite/gcc.dg/torture/pr30375.c b/gcc/testsuite/gcc.dg/torture/pr30375.c index ea63f97c98d..435c38f13b8 100644 --- a/gcc/testsuite/gcc.dg/torture/pr30375.c +++ b/gcc/testsuite/gcc.dg/torture/pr30375.c @@ -1,5 +1,4 @@ /* { dg-do run } */ -/* { dg-options "--param max-aliased-vops=0" } */ typedef struct _s { int a; diff --git a/gcc/testsuite/gcc.dg/torture/pr33560.c b/gcc/testsuite/gcc.dg/torture/pr33560.c index 5b2359b3dc0..7eea1e3f601 100644 --- a/gcc/testsuite/gcc.dg/torture/pr33560.c +++ b/gcc/testsuite/gcc.dg/torture/pr33560.c @@ -1,5 +1,4 @@ /* { dg-do run } */ -/* { dg-options "--param max-aliased-vops=0" } */ struct T { diff --git a/gcc/testsuite/gcc.dg/torture/pr33563.c b/gcc/testsuite/gcc.dg/torture/pr33563.c index 47907db7ea6..33e78521c50 100644 --- a/gcc/testsuite/gcc.dg/torture/pr33563.c +++ b/gcc/testsuite/gcc.dg/torture/pr33563.c @@ -1,5 +1,4 @@ /* { dg-do run } */ -/* { dg-options "--param max-aliased-vops=0" } */ struct T { diff --git a/gcc/testsuite/gcc.dg/torture/pr33870.c b/gcc/testsuite/gcc.dg/torture/pr33870.c index 519efd3a592..9c0e30d94be 100644 --- a/gcc/testsuite/gcc.dg/torture/pr33870.c +++ b/gcc/testsuite/gcc.dg/torture/pr33870.c @@ -1,5 +1,4 @@ /* { dg-do run } */ -/* { dg-options "--param max-aliased-vops=1" } */ struct X { int i; diff --git a/gcc/testsuite/gcc.dg/torture/pr39074-2.c b/gcc/testsuite/gcc.dg/torture/pr39074-2.c index 89f7ebf8cd8..a90c5643dca 100644 --- a/gcc/testsuite/gcc.dg/torture/pr39074-2.c +++ b/gcc/testsuite/gcc.dg/torture/pr39074-2.c @@ -30,5 +30,5 @@ int main() return 0; } -/* { dg-final { scan-tree-dump "y.._., name memory tag: NMT..., is dereferenced, points-to vars: { i }" "alias" } } */ +/* { dg-final { scan-tree-dump "y.._., points-to vars: { i }" "alias" } } */ /* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/pr39074.c b/gcc/testsuite/gcc.dg/torture/pr39074.c index cc37c8e08ec..7be7e227b25 100644 --- a/gcc/testsuite/gcc.dg/torture/pr39074.c +++ b/gcc/testsuite/gcc.dg/torture/pr39074.c @@ -27,5 +27,5 @@ int main() return 0; } -/* { dg-final { scan-tree-dump "y.._., name memory tag: NMT..., is dereferenced, points-to vars: { i }" "alias" } } */ +/* { dg-final { scan-tree-dump "y.._., points-to vars: { i }" "alias" } } */ /* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/pta-callused-1.c b/gcc/testsuite/gcc.dg/torture/pta-callused-1.c index dfe994b7a84..dfbde86c65b 100644 --- a/gcc/testsuite/gcc.dg/torture/pta-callused-1.c +++ b/gcc/testsuite/gcc.dg/torture/pta-callused-1.c @@ -21,5 +21,5 @@ int main() return 0; } -/* { dg-final { scan-tree-dump "p.._., name memory tag: NMT..., is dereferenced, points-to vars: { i j }" "alias" } } */ +/* { dg-final { scan-tree-dump "p.._., points-to vars: { i j }" "alias" } } */ /* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/pta-ptrarith-3.c b/gcc/testsuite/gcc.dg/torture/pta-ptrarith-3.c new file mode 100644 index 00000000000..6c08319d8c5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pta-ptrarith-3.c @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-options "-fdump-tree-alias" } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ + +extern void abort (void); +struct X { + int *p; + int *q; + int *r; +}; +int __attribute__((noinline)) +foo(int i, int j, int k, int off) +{ + struct X x; + int **p, *q; + x.p = &i; + x.q = &j; + x.r = &k; + p = &x.q; + p += off; + /* *p points to { i, j, k } */ + q = *p; + return *q; +} +int main() +{ + if (foo(1, 2, 3, -1) != 1) + abort (); + if (foo(1, 2, 3, 0) != 2) + abort (); + if (foo(1, 2, 3, 1) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-tree-dump "q_., points-to vars: { i j k }" "alias" } } */ +/* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/pta-structcopy-1.c b/gcc/testsuite/gcc.dg/torture/pta-structcopy-1.c new file mode 100644 index 00000000000..bdb2acb0464 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pta-structcopy-1.c @@ -0,0 +1,34 @@ +/* { dg-do run } */ +/* { dg-options "-fno-tree-sra -fdump-tree-alias" } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ + +struct X +{ + long l1; + struct Y + { + long l2; + int *p; + } y; +}; +int i; +static int +foo (struct X *x) +{ + struct Y y = x->y; + *y.p = 0; + i = 1; + return *y.p; +} +extern void abort (void); +int main() +{ + struct X x; + x.y.p = &i; + if (foo(&x) != 1) + abort (); + return 0; +} + +/* { dg-final { scan-tree-dump "points-to vars: { i }" "alias" } } */ +/* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/ssa-pta-fn-1.c b/gcc/testsuite/gcc.dg/torture/ssa-pta-fn-1.c new file mode 100644 index 00000000000..21d36dc60f2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/ssa-pta-fn-1.c @@ -0,0 +1,61 @@ +/* { dg-do run } */ +/* { dg-options "-fdump-tree-alias" } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ + +extern void abort (void); +int *glob; + +int * __attribute__((noinline,const)) +foo_const(int *p) { return p; } + +int * __attribute__((noinline,pure)) +foo_pure(int *p) { return glob; } + +int * __attribute__((noinline)) +foo_normal(int *p) { glob = p; return p; } + +void test_const(void) +{ + int i; + int *p = &i; + int *q_const = foo_const(p); + *p = 1; + *q_const = 2; + if (*p != 2) + abort (); +} + +void test(void) +{ + int i; + int *p = &i; + int *q_normal = foo_normal(p); + *p = 1; + *q_normal = 2; + if (*p != 2) + abort (); +} + +void test_pure(void) +{ + int i; + int *p = &i; + int *q_pure = foo_pure(p); + *p = 1; + *q_pure = 2; + if (*p != 2) + abort (); +} + +int main() +{ + test_const(); + test(); + test_pure(); + return 0; +} + +/* { dg-final { scan-tree-dump "q_const_., points-to non-local, points-to vars: { i }" "alias" } } */ +/* { dg-final { scan-tree-dump "q_pure_., points-to non-local, points-to escaped, points-to vars: { i }" "alias" } } */ +/* { dg-final { scan-tree-dump "q_normal_., points-to non-local, points-to escaped, points-to vars: { }" "alias" } } */ +/* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20070302-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20070302-1.c index ab8e38e1dd6..4b148f23df5 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/20070302-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/20070302-1.c @@ -1,5 +1,4 @@ /* { dg-do link } */ -/* { dg-xfail-if "" { *-*-* } { "*" } { "" } } See PR34743. */ /* { dg-options "-O2" } */ struct A diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-15.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-15.c deleted file mode 100644 index 617af0fd154..00000000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/alias-15.c +++ /dev/null @@ -1,19 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O -fno-early-inlining -fdump-tree-alias-vops-details" } */ - -struct foo { - int a; - struct X { - int b[4]; - } b; -} m; -static inline struct X *wrap(struct X *p) { return p; } -int test2(void) -{ - struct X *p = wrap(&m.b); - /* Both memory references need to alias the same tags. */ - return p->b[3] - m.b.b[3]; -} - -/* { dg-final { scan-tree-dump-times "VUSE <m_.\\\(D\\\)>" 2 "alias" } } */ -/* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-16.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-16.c index cf10fa913ce..c71486c26c2 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/alias-16.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-16.c @@ -1,9 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-O --param max-aliased-vops=1" } */ -/* Compile with -O --param max-aliased-vops=1. This partitions all - the initial SFTs for 'm' which was causing the operand scanner to - miss adding the right SFTs to p->b[2]. */ extern void abort (void); struct X { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-18.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-18.c index 84d884effb5..e86acbc1900 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/alias-18.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-18.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-fre-details -fdump-tree-optimized --param max-aliased-vops=0" } */ +/* { dg-options "-O2 -fdump-tree-fre-details -fdump-tree-optimized" } */ struct A { int i; @@ -77,11 +77,11 @@ int test8 (struct A *p, int *q) } /* { dg-final { scan-tree-dump "with 0" "fre" } } */ -/* { dg-final { scan-tree-dump "with 1" "fre" { xfail *-*-* } } } */ -/* { dg-final { scan-tree-dump "with 3" "fre" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump "with 1" "fre" } } */ +/* { dg-final { scan-tree-dump "with 3" "fre" } } */ /* { dg-final { scan-tree-dump "with 4" "fre" } } */ /* { dg-final { scan-tree-dump "with 5" "fre" } } */ -/* { dg-final { scan-tree-dump "with 8" "fre" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump "with 8" "fre" } } */ /* { dg-final { scan-tree-dump-not "return 2;" "optimized" } } */ /* { dg-final { scan-tree-dump-not "return 6;" "optimized" } } */ /* { dg-final { scan-tree-dump-not "return 7;" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-19.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-19.c index b92df4343c2..7b3689049ac 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/alias-19.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-19.c @@ -26,6 +26,5 @@ int main() } /* { dg-final { scan-tree-dump "q_. = { a b }" "alias" } } */ -/* { dg-final { scan-tree-dump "q_., name memory tag: NMT..., is dereferenced, points-to vars: { a b }" "alias" } } */ -/* { dg-final { scan-tree-dump "# VUSE <a_.\\\(D\\\), b_.>" "alias" } } */ +/* { dg-final { scan-tree-dump "q_., points-to vars: { a b }" "alias" } } */ /* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-20.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-20.c new file mode 100644 index 00000000000..7991c52fd0a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-20.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fstrict-aliasing -fdump-tree-optimized" } */ + +struct S { float f; int i; }; +struct R { int x; int i; }; + +/* Strict-aliasing rules say that int and float do not alias. */ +int bar(struct S *s, int *i) +{ + *i = 0; + s->f = 1.0; + return *i; +} + +/* Strict-aliasing rules say that S and R do not alias. */ +int foo(struct S *s, struct R *r) +{ + r->i = 0; + s->i = 1; + return r->i; +} + +/* { dg-final { scan-tree-dump-times "return 0;" 2 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr13146.c b/gcc/testsuite/gcc.dg/tree-ssa/pr13146.c new file mode 100644 index 00000000000..b556457678c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr13146.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fstrict-aliasing -fdump-tree-optimized" } */ + +struct A +{ + int i; +}; +struct B +{ + struct A a; + int j; +}; + +int foo (struct A *p, struct B *q) +{ + p->i = 0; + q->j = 1; + return p->i; +} + +/* { dg-final { scan-tree-dump "return 0;" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr23086.c b/gcc/testsuite/gcc.dg/tree-ssa/pr23086.c new file mode 100644 index 00000000000..206b92de147 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr23086.c @@ -0,0 +1,35 @@ +/* { dg-do run } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +extern void link_error (void); +extern void abort (void); + +int *t; +int __attribute__((noinline)) g(int *a) +{ + t = a; + *a = 2; +} + +void __attribute__((noinline)) f(int *a) +{ + int b; + b = 1; + g(&b); + b = 2; + *a = 1; + if (b != 2) + link_error(); +} + +int main(void) +{ + int t; + f(&t); + if (t != 1) + abort (); + return 0; +} + +/* { dg-final { scan-tree-dump-not "link_error" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c b/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c index 331e01b5ae3..fd74af8d6a1 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr23382.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-alias-vops" } */ +/* { dg-options "-O2 -fdump-tree-pre-details" } */ struct a { int length; @@ -13,5 +13,5 @@ int f(void) struct a *a = malloc(sizeof(struct a)); return a->length; } -/* { dg-final { scan-tree-dump-times "VDEF <HEAP" 1 "alias"} } */ -/* { dg-final { cleanup-tree-dump "alias" } } */ +/* { dg-final { scan-tree-dump-times "Variable: HEAP" 1 "pre"} } */ +/* { dg-final { cleanup-tree-dump "pre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr2480.c b/gcc/testsuite/gcc.dg/tree-ssa/pr2480.c new file mode 100644 index 00000000000..d7f7af4d295 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr2480.c @@ -0,0 +1,53 @@ +/* { dg-do link } */ +/* { dg-options "-O2" } */ + +/* We have enough cascading at -O2 to cover the missed control-dependence + in SCCVN (which considers the link_error calls to clobber the structs). */ + +struct example +{ + char a; + int b; + char c; +} *ex1; + +extern void link_error(void); + +void +bar (void) +{ + ex1->a = 1; + ex1->b = 2; + ex1->c = 3; + + if (ex1->a != 1) + link_error (); + if (ex1->b != 2) + link_error (); + if (ex1->c != 3) + link_error (); + +} + +void +foo (struct example *ex2) +{ + ex2->a = 1; + ex2->b = 2; + ex2->c = 3; + + if (ex2->a != 1) + link_error (); + if (ex2->b != 2) + link_error (); + if (ex2->c != 3) + link_error (); + +} + +int main (void) +{ + bar (); + foo (ex1); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr26421.c b/gcc/testsuite/gcc.dg/tree-ssa/pr26421.c index 73db85c17da..70f123158af 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr26421.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr26421.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-alias-vops" } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ typedef struct { int i; @@ -18,5 +18,5 @@ int foo(void) /* Verify the call clobbers all of a. */ -/* { dg-final { scan-tree-dump-times "VDEF <a_" 2 "alias" } } */ -/* { dg-final { cleanup-tree-dump "alias" } } */ +/* { dg-final { scan-tree-dump-not "return 1;" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr38895.c b/gcc/testsuite/gcc.dg/tree-ssa/pr38895.c new file mode 100644 index 00000000000..0a96e53348a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr38895.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fstrict-aliasing -fdump-tree-optimized" } */ + +struct A { + int i; + int j; +}; +struct B { + struct A a1; + struct A a2; +}; +struct C { + struct A a1; + struct B b; +}; +int foo(struct C *c, struct B *b) +{ + c->a1.i = 1; + b->a1.i = 0; + return c->a1.i; +} + +/* { dg-final { scan-tree-dump "return 1;" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c new file mode 100644 index 00000000000..b61674dff3a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-alias" } */ + +extern void abort (void); +struct X { + int *p; + int *q; + int *r; +}; +int __attribute__((noinline)) +foo(int i, int j, int k, int off) +{ + struct X x; + int **p, *q; + x.p = &i; + x.q = &j; + x.r = &k; + p = &x.q; + p += 1; + /* *p points to { k } */ + q = *p; + return *q; +} + +/* { dg-final { scan-tree-dump "q_., points-to vars: { k }" "alias" } } */ +/* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c new file mode 100644 index 00000000000..adb01b23165 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-alias" } */ + +extern void abort (void); +struct X { + int *p; + int *q; + int *r; +}; +int __attribute__((noinline)) +foo(int i, int j, int k, int off) +{ + struct X x; + int **p, *q; + x.p = &i; + x.q = &j; + x.r = &k; + p = &x.q; + p -= 1; + /* *p points to { i } */ + q = *p; + return *q; +} + +/* { dg-final { scan-tree-dump "q_., points-to vars: { i }" "alias" } } */ +/* { dg-final { cleanup-tree-dump "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-3.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-3.c index 732dc302deb..661dc58ff09 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/sra-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-3.c @@ -24,5 +24,5 @@ copystruct1 (void) } /* There should be no reference to link_error. */ -/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-4.c new file mode 100644 index 00000000000..89118a62621 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-4.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-cddce1" } */ + +int foo(int b) +{ + int a[128]; + a[b] = 1; + if (b) + { + b = 2; + a[2] = 0; + } + a[2] = 3; + return a[2] + b; +} + +/* { dg-final { scan-tree-dump-times "a\\\[\[^\n\]\\\]" 2 "cddce1" } } */ +/* { dg-final { cleanup-tree-dump "cddce1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-5.c new file mode 100644 index 00000000000..11c9e666b3c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-5.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fno-tree-sra -fdump-tree-cddce1" } */ + +struct X { int i; }; +struct X foo(int b) +{ + struct X x; + if (b) + x.i = 0; + x.i = 1; + return x; +} + +/* { dg-final { scan-tree-dump-times "x.i =" 1 "cddce1" } } */ +/* { dg-final { cleanup-tree-dump "cddce1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-12.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-12.c new file mode 100644 index 00000000000..dd8f69c8aea --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-12.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-dse1" } */ + +void foo (int *p, int b) +{ + if (b) + *p = 1; + *p = 0; +} + +/* { dg-final { scan-tree-dump-times "\\\*p" 1 "dse1" } } */ +/* { dg-final { cleanup-tree-dump "dse1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-10.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-10.c index a27f2d6c023..34217a0298a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-10.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-10.c @@ -18,5 +18,9 @@ void __frame_state_for (volatile char *state_in, int x) } } -/* { dg-final { scan-tree-dump "Insertions: 2" "pre" } } */ +/* This is a weird testcase. It should need PPRE to hoist the loop + invariants and the volatileness of state_in prevents DSE of the + first store. Thus, this is XFAILed. */ + +/* { dg-final { scan-tree-dump "Insertions: 2" "pre" { xfail *-*-* } } } */ /* { dg-final { cleanup-tree-dump "pre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c index 3253afe2927..ae9eb5a2002 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c @@ -1,9 +1,7 @@ /* { dg-do compile } */ -/* { dg-options "-O -fstrict-aliasing -fno-tree-sra --param max-aliased-vops=0 --param max-fields-for-field-sensitive=0 -fdump-tree-fre-details" } */ +/* { dg-options "-O -fstrict-aliasing -fno-tree-sra -fdump-tree-fre-details" } */ -/* Should be optimized, propagating &a into (*p)[i] with parameters - --param max-aliased-vops=0 --param max-fields-for-field-sensitive=0 - which means max 1 VOP per stmt and no SFTs. */ +/* Should be optimized, propagating &a into (*p)[i]. */ /* For this testcase we need TBAA to work. */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c index d2d5e01bcc4..24b58ee941a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c @@ -1,9 +1,7 @@ /* { dg-do compile } */ -/* { dg-options "-O -fno-tree-sra --param max-aliased-vops=0 --param max-fields-for-field-sensitive=0 -fdump-tree-fre-details" } */ +/* { dg-options "-O -fno-tree-sra -fdump-tree-fre-details" } */ -/* Should be optimized, propagating &a into (*p)[i] with parameters - --param max-aliased-vops=0 --param max-fields-for-field-sensitive=0 - which means max 1 VOP per stmt and no SFTs. */ +/* Should be optimized, propagating &a into (*p)[i]. */ struct Foo { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-15.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-15.c index 1a286f1e1cb..a557f27f319 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-15.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-15.c @@ -1,9 +1,7 @@ /* { dg-do compile } */ -/* { dg-options "-O -fno-tree-sra --param max-aliased-vops=0 --param max-fields-for-field-sensitive=0 -fdump-tree-fre-details" } */ +/* { dg-options "-O -fno-tree-sra -fdump-tree-fre-details" } */ -/* Should be optimized, propagating &a into (*p)[i] with parameters - --param max-aliased-vops=0 --param max-fields-for-field-sensitive=0 - which means max 1 VOP per stmt and no SFTs. */ +/* Should be optimized, propagating &a into (*p)[i]. */ struct Foo { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-18.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-18.c new file mode 100644 index 00000000000..392b1f6cf7d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-18.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre" } */ + +struct a +{ + union + { + int a; + int b; + }; + union + { + int c; + int d; + }; +}; + +int f(struct a *c) +{ + int d = c->a; + c->c = 1; + return c->a + d; +} + +/* We should have CSEd the load from c->a. */ + +/* { dg-final { scan-tree-dump-times "c_.*\\\.a" 1 "fre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-19.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-19.c new file mode 100644 index 00000000000..688fe86403e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-19.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre" } */ + +struct a +{ + union + { + int a; + int b; + }; + union + { + int c; + int d; + }; + int e; +}; + +int f(struct a *c) +{ + int d; + c->e = 2; + d = c->a; + c->c = 1; + return c->a + d; +} + +/* We should have CSEd the load from c->a. */ + +/* { dg-final { scan-tree-dump-times "c_.*\\\.a" 1 "fre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-20.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-20.c new file mode 100644 index 00000000000..f73ad36c5b7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-20.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int i, j; +int foo(int b) +{ + j = 0; + if (b) + goto L2; +L1: + i = i + 1; +L2: + i = i + 1; + if (i == 1) + goto L1; + return j; +} + +/* { dg-final { scan-tree-dump "return 0;" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-23.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-23.c new file mode 100644 index 00000000000..491836d28ef --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-23.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre" } */ + +int f(int t, int a, int b) +{ + int c, d; + if (t) + { + c = a; + d = a; + } + else + { + c = b; + d = b; + } + return c+d; +} + +/* { dg-final { scan-tree-dump-times "PHI" 1 "fre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-3.c index b88a1e58af6..91956017898 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-lim-details" } */ +/* { dg-options "-O -fdump-tree-lim-details" } */ struct { int x; int y; } global; void foo(int n) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-23.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-23.c new file mode 100644 index 00000000000..88c8bb71eb9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-23.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-pre-stats" } */ + +struct { int x; int y; } global; +void foo(int n) +{ + int i; + for ( i=0; i<n; i++) + global.y += global.x*global.x; +} + +/* { dg-final { scan-tree-dump "Eliminated: 2" "pre" } } */ +/* { dg-final { cleanup-tree-dump "pre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-24.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-24.c new file mode 100644 index 00000000000..6729e2a297e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-24.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-pre" } */ + +void foo(int *p, double *x, int n) +{ + int i; + for (i = 0; i < n; ++i) + *(x + *p * i) = 0.0; +} + +/* We should remove the unnecessary insertion of a phi-node and + _not_ end up using the phi result for replacement *p. + The issue here is that when PHI-translating the virtual operands + we assign different value-numbers to the load. Re-running VN + after insertion or trying to be clever and doing this on the + fly during PHI translation would solve this. The next copyprop + fixes this anyway. */ + +/* { dg-final { scan-tree-dump-not "= prephitmp" "pre" { xfail *-*-* } } } */ +/* { dg-final { cleanup-tree-dump "pre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-25.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-25.c new file mode 100644 index 00000000000..32b068275c1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-25.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-pre-stats" } */ + +struct X { int i; }; + +int foo (int x) +{ + struct X a; + struct X b; + struct X *p; + a.i = 1; + b.i = 2; + if (x) + p = &a; + else + p = &b; + return p->i; +} + +/* We should eliminate the load from p for a PHI node with values 1 and 2. */ + +/* { dg-final { scan-tree-dump "Eliminated: 1" "pre" } } */ +/* { dg-final { cleanup-tree-dump "pre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-1.c index 263124b646e..65cd83d7cde 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-1.c @@ -17,5 +17,5 @@ void vnum_test8(int *data) } } /* We should eliminate m - n, and set n = n + k into n = m. */ -/* { dg-final { scan-tree-dump-times "Eliminated: 2" 1 "fre"} } */ +/* { dg-final { scan-tree-dump-times "Eliminated: 3" 1 "fre"} } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-2.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-2.c index 2c73a678b78..cc3661cc6d7 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-2.c @@ -21,5 +21,5 @@ int vnum_test8(int *data) } /* We should eliminate m - n, and set n = n + k into n = m, and set p to 0 */ -/* { dg-final { scan-tree-dump-times "Eliminated: 3" 1 "fre"} } */ +/* { dg-final { scan-tree-dump-times "Eliminated: 4" 1 "fre"} } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-4.c index 7caf4eec6f8..27ccda5264a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-4.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-sccvn-4.c @@ -23,5 +23,5 @@ int vnum_test8(int *data) } /* We should eliminate m - n, n + k, set data[5] = 0, eliminate the address arithmetic for data[5], and set p = 0. -/* { dg-final { scan-tree-dump-times "Eliminated: 5" 1 "fre"} } */ +/* { dg-final { scan-tree-dump-times "Eliminated: 6" 1 "fre"} } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/uninit-B.c b/gcc/testsuite/gcc.dg/uninit-B.c index adb1461d951..f03dd701853 100644 --- a/gcc/testsuite/gcc.dg/uninit-B.c +++ b/gcc/testsuite/gcc.dg/uninit-B.c @@ -9,7 +9,7 @@ void baz (void) { int i; - if (i) /* { dg-warning "is used uninitialized" "uninit i warning" } */ + if (i) /* { dg-warning "is used uninitialized" "uninit i warning" { xfail *-*-* } } */ bar (i); foo (&i); } diff --git a/gcc/testsuite/gcc.dg/uninit-pr19430.c b/gcc/testsuite/gcc.dg/uninit-pr19430.c index ecf9c009627..53810c553e1 100644 --- a/gcc/testsuite/gcc.dg/uninit-pr19430.c +++ b/gcc/testsuite/gcc.dg/uninit-pr19430.c @@ -29,7 +29,7 @@ void frob(int *pi); int main(void) { int i; - printf("i = %d\n", i); /* { dg-warning "'i' is used uninitialized in this function" } */ + printf("i = %d\n", i); /* { dg-warning "'i' is used uninitialized in this function" "" { xfail *-*-* } } */ frob(&i); return 0; @@ -38,6 +38,6 @@ int main(void) void foo3(int*); void bar3(void) { int x; - if(x) /* { dg-warning "'x' is used uninitialized in this function" "uninitialized" } */ + if(x) /* { dg-warning "'x' is used uninitialized in this function" "uninitialized" { xfail *-*-* } } */ foo3(&x); } diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-43.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-43.c index b64427f6d0b..d9bb114d416 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-43.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-43.c @@ -28,7 +28,8 @@ main1 (float *pa) float pb[N] __attribute__ ((__aligned__(16))) = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57}; float pc[N] __attribute__ ((__aligned__(16))) = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; - /* Not vectorizable: pa may alias pb and/or pc, since their addresses escape. */ + /* Vectorizable: pa may not alias pb and/or pc, even though their + addresses escape. &pa would need to escape to point to escaped memory. */ for (i = 0; i < N; i++) { pa[i] = pb[i] * pc[i]; @@ -74,6 +75,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */ /* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target vect_no_align } } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-49.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-49.c index 6c336754159..f61dff6e341 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-49.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-49.c @@ -58,5 +58,5 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-53.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-53.c index 02926b0f577..fe04694f657 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-53.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-53.c @@ -59,5 +59,5 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-57.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-57.c index 8d630b89a02..b7ef4b43017 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-57.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-57.c @@ -59,5 +59,5 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-61.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-61.c index 61cfec2bc80..39491a882e5 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-61.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-61.c @@ -61,5 +61,5 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ |