diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg')
133 files changed, 1183 insertions, 267 deletions
diff --git a/gcc/testsuite/gcc.dg/assign-warn-1.c b/gcc/testsuite/gcc.dg/assign-warn-1.c index a0cfd890f10..ae70242edd4 100644 --- a/gcc/testsuite/gcc.dg/assign-warn-1.c +++ b/gcc/testsuite/gcc.dg/assign-warn-1.c @@ -12,11 +12,11 @@ typedef void (*fp)(void); typedef void (*nrfp)(void) __attribute__((noreturn)); -TESTARG(fqa, nrfp, fp); /* { dg-warning "passing argument 1 of 'fqaF' makes qualified function pointer from unqualified" } */ -TESTARP(fqb, nrfp, fp); /* { dg-warning "passing argument 1 of 'fqbFp.x' makes qualified function pointer from unqualified" } */ -TESTASS(fqc, nrfp, fp); /* { dg-warning "assignment makes qualified function pointer from unqualified" } */ -TESTINI(fqd, nrfp, fp); /* { dg-warning "initialization makes qualified function pointer from unqualified" } */ -TESTRET(fqe, nrfp, fp); /* { dg-warning "return makes qualified function pointer from unqualified" } */ +TESTARG(fqa, nrfp, fp); /* { dg-warning "passing argument 1 of 'fqaF' makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ +TESTARP(fqb, nrfp, fp); /* { dg-warning "passing argument 1 of 'fqbFp.x' makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ +TESTASS(fqc, nrfp, fp); /* { dg-warning "assignment makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ +TESTINI(fqd, nrfp, fp); /* { dg-warning "initialization makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ +TESTRET(fqe, nrfp, fp); /* { dg-warning "return makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ TESTARG(ofqa, fp, nrfp); TESTARP(ofqb, fp, nrfp); @@ -24,11 +24,11 @@ TESTASS(ofqc, fp, nrfp); TESTINI(ofqd, fp, nrfp); TESTRET(ofqe, fp, nrfp); -TESTARG(qa, char *, const char *); /* { dg-warning "passing argument 1 of 'qaF' discards qualifiers from pointer target type" } */ -TESTARP(qb, char *, const char *); /* { dg-warning "passing argument 1 of 'qbFp.x' discards qualifiers from pointer target type" } */ -TESTASS(qc, char *, const char *); /* { dg-warning "assignment discards qualifiers from pointer target type" } */ -TESTINI(qd, char *, const char *); /* { dg-warning "initialization discards qualifiers from pointer target type" } */ -TESTRET(qe, char *, const char *); /* { dg-warning "return discards qualifiers from pointer target type" } */ +TESTARG(qa, char *, const char *); /* { dg-warning "passing argument 1 of 'qaF' discards 'const' qualifier from pointer target type" } */ +TESTARP(qb, char *, const char *); /* { dg-warning "passing argument 1 of 'qbFp.x' discards 'const' qualifier from pointer target type" } */ +TESTASS(qc, char *, const char *); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ +TESTINI(qd, char *, const char *); /* { dg-warning "initialization discards 'const' qualifier from pointer target type" } */ +TESTRET(qe, char *, const char *); /* { dg-warning "return discards 'const' qualifier from pointer target type" } */ TESTARG(oqa, const char *, char *); TESTARP(oqb, const char *, char *); diff --git a/gcc/testsuite/gcc.dg/assign-warn-2.c b/gcc/testsuite/gcc.dg/assign-warn-2.c index f3d861d7405..7813b72869d 100644 --- a/gcc/testsuite/gcc.dg/assign-warn-2.c +++ b/gcc/testsuite/gcc.dg/assign-warn-2.c @@ -13,11 +13,11 @@ typedef void (*fp)(void); typedef void (*nrfp)(void) __attribute__((noreturn)); -TESTARG(fqa, nrfp, fp); /* { dg-error "passing argument 1 of 'fqaF' makes qualified function pointer from unqualified" } */ -TESTARP(fqb, nrfp, fp); /* { dg-error "passing argument 1 of 'fqbFp.x' makes qualified function pointer from unqualified" } */ -TESTASS(fqc, nrfp, fp); /* { dg-error "assignment makes qualified function pointer from unqualified" } */ -TESTINI(fqd, nrfp, fp); /* { dg-error "initialization makes qualified function pointer from unqualified" } */ -TESTRET(fqe, nrfp, fp); /* { dg-error "return makes qualified function pointer from unqualified" } */ +TESTARG(fqa, nrfp, fp); /* { dg-error "passing argument 1 of 'fqaF' makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ +TESTARP(fqb, nrfp, fp); /* { dg-error "passing argument 1 of 'fqbFp.x' makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ +TESTASS(fqc, nrfp, fp); /* { dg-error "assignment makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ +TESTINI(fqd, nrfp, fp); /* { dg-error "initialization makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ +TESTRET(fqe, nrfp, fp); /* { dg-error "return makes '__attribute__..noreturn..' qualified function pointer from unqualified" } */ TESTARG(ofqa, fp, nrfp); TESTARP(ofqb, fp, nrfp); @@ -25,11 +25,11 @@ TESTASS(ofqc, fp, nrfp); TESTINI(ofqd, fp, nrfp); TESTRET(ofqe, fp, nrfp); -TESTARG(qa, char *, const char *); /* { dg-error "passing argument 1 of 'qaF' discards qualifiers from pointer target type" } */ -TESTARP(qb, char *, const char *); /* { dg-error "passing argument 1 of 'qbFp.x' discards qualifiers from pointer target type" } */ -TESTASS(qc, char *, const char *); /* { dg-error "assignment discards qualifiers from pointer target type" } */ -TESTINI(qd, char *, const char *); /* { dg-error "initialization discards qualifiers from pointer target type" } */ -TESTRET(qe, char *, const char *); /* { dg-error "return discards qualifiers from pointer target type" } */ +TESTARG(qa, char *, const char *); /* { dg-error "passing argument 1 of 'qaF' discards 'const' qualifier from pointer target type" } */ +TESTARP(qb, char *, const char *); /* { dg-error "passing argument 1 of 'qbFp.x' discards 'const' qualifier from pointer target type" } */ +TESTASS(qc, char *, const char *); /* { dg-error "assignment discards 'const' qualifier from pointer target type" } */ +TESTINI(qd, char *, const char *); /* { dg-error "initialization discards 'const' qualifier from pointer target type" } */ +TESTRET(qe, char *, const char *); /* { dg-error "return discards 'const' qualifier from pointer target type" } */ TESTARG(oqa, const char *, char *); TESTARP(oqb, const char *, char *); diff --git a/gcc/testsuite/gcc.dg/c90-const-expr-10.c b/gcc/testsuite/gcc.dg/c90-const-expr-10.c index bad388c90b1..30c60e31f90 100644 --- a/gcc/testsuite/gcc.dg/c90-const-expr-10.c +++ b/gcc/testsuite/gcc.dg/c90-const-expr-10.c @@ -8,7 +8,7 @@ __extension__ typedef __SIZE_TYPE__ size_t; void *p = (size_t)(void *)0; /* { dg-error "without a cast" } */ -struct s { void *a; } q = { (size_t)(void *)0 }; /* { dg-error "without a cast" } */ +struct s { void *a; } q = { (size_t)(void *)0 }; /* { dg-error "without a cast|near initialization" } */ void * f (void) { diff --git a/gcc/testsuite/gcc.dg/c99-array-lval-8.c b/gcc/testsuite/gcc.dg/c99-array-lval-8.c index b5048b66a77..c4e202ef301 100644 --- a/gcc/testsuite/gcc.dg/c99-array-lval-8.c +++ b/gcc/testsuite/gcc.dg/c99-array-lval-8.c @@ -12,15 +12,15 @@ f (void) const struct { int a[1]; } s; - int *p1 = s.a; /* { dg-error "qualifiers" } */ + int *p1 = s.a; /* { dg-error "qualifier" } */ int *p2 = (a ? s : s).a; /* In this case, the qualifier is properly on the array element type not on the rvalue structure and so is not discarded. */ struct { const int a[1]; } t; - int *p3 = t.a; /* { dg-error "qualifiers" } */ - int *p4 = (a ? t : t).a; /* { dg-error "qualifiers" } */ + int *p3 = t.a; /* { dg-error "qualifier" } */ + int *p4 = (a ? t : t).a; /* { dg-error "qualifier" } */ /* The issue could also lead to code being wrongly accepted. */ const struct { int a[1][1]; diff --git a/gcc/testsuite/gcc.dg/c99-arraydecl-3.c b/gcc/testsuite/gcc.dg/c99-arraydecl-3.c index 2ab927d6ab2..9f383b9c3bb 100644 --- a/gcc/testsuite/gcc.dg/c99-arraydecl-3.c +++ b/gcc/testsuite/gcc.dg/c99-arraydecl-3.c @@ -7,7 +7,7 @@ void f0 (int a[restrict]) { - int **b = &a; /* { dg-error "discards qualifiers" } */ + int **b = &a; /* { dg-error "discards 'restrict' qualifier" } */ int *restrict *c = &a; } @@ -15,6 +15,6 @@ void f1 (a) int a[restrict]; { - int **b = &a; /* { dg-error "discards qualifiers" } */ + int **b = &a; /* { dg-error "discards 'restrict' qualifier" } */ int *restrict *c = &a; } diff --git a/gcc/testsuite/gcc.dg/c99-const-expr-10.c b/gcc/testsuite/gcc.dg/c99-const-expr-10.c index 8e5a1043d29..2aca6106a47 100644 --- a/gcc/testsuite/gcc.dg/c99-const-expr-10.c +++ b/gcc/testsuite/gcc.dg/c99-const-expr-10.c @@ -6,7 +6,7 @@ /* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ void *p = (__SIZE_TYPE__)(void *)0; /* { dg-error "without a cast" } */ -struct s { void *a; } q = { (__SIZE_TYPE__)(void *)0 }; /* { dg-error "without a cast" } */ +struct s { void *a; } q = { (__SIZE_TYPE__)(void *)0 }; /* { dg-error "without a cast|near initialization" } */ void * f (void) { diff --git a/gcc/testsuite/gcc.dg/c99-restrict-4.c b/gcc/testsuite/gcc.dg/c99-restrict-4.c new file mode 100644 index 00000000000..5852d0a1127 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-restrict-4.c @@ -0,0 +1,17 @@ +/* Qualifiers lost when taking the address of a const restrict object. + PR 44322. */ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ +void * restrict const a[2]; +void * restrict const (*p2)[2]; + +void foo(void) { + p2 = &a; +} + +void * restrict volatile b[2]; +void * restrict volatile (*q2)[2]; + +void bar(void) { + q2 = &b; +} diff --git a/gcc/testsuite/gcc.dg/cast-qual-2.c b/gcc/testsuite/gcc.dg/cast-qual-2.c index 0be1d617176..5fd2b854d61 100644 --- a/gcc/testsuite/gcc.dg/cast-qual-2.c +++ b/gcc/testsuite/gcc.dg/cast-qual-2.c @@ -18,8 +18,8 @@ intfn_t *i2 = (intfn_t *) intfn; intfn_t *i3 = constfn; intfn_t *i4 = (intfn_t *) constfn; /* { dg-bogus "discards qualifier" } */ -constfn_t p1 = intfn; /* { dg-warning "makes qualified function" } */ -constfn_t p2 = (constfn_t) intfn; /* { dg-warning "new qualifier" } */ +constfn_t p1 = intfn; /* { dg-warning "makes '__attribute__..const..' qualified function" } */ +constfn_t p2 = (constfn_t) intfn; /* { dg-warning "adds '__attribute__..const..' qualifier" } */ constfn_t p3 = constfn; constfn_t p4 = (constfn_t) constfn; @@ -28,7 +28,7 @@ voidfn_t *v2 = (voidfn_t *) voidfn; voidfn_t *v3 = noreturnfn; voidfn_t *v4 = (voidfn_t *) noreturnfn; /* { dg-bogus "discards qualifier" } */ -noreturnfn_t n1 = voidfn; /* { dg-warning "makes qualified function" } */ -noreturnfn_t n2 = (noreturnfn_t) voidfn; /* { dg-warning "new qualifier" } */ +noreturnfn_t n1 = voidfn; /* { dg-warning "makes '__attribute__..noreturn..' qualified function" } */ +noreturnfn_t n2 = (noreturnfn_t) voidfn; /* { dg-warning "adds '__attribute__..noreturn..' qualifier" } */ noreturnfn_t n3 = noreturnfn; noreturnfn_t n4 = (noreturnfn_t) noreturnfn; diff --git a/gcc/testsuite/gcc.dg/compound-literal-1.c b/gcc/testsuite/gcc.dg/compound-literal-1.c index 6c644d46ea3..9b3b24e254e 100644 --- a/gcc/testsuite/gcc.dg/compound-literal-1.c +++ b/gcc/testsuite/gcc.dg/compound-literal-1.c @@ -2,7 +2,7 @@ /* PR c/43248 */ -int foo(__SIZE_TYPE__ i) +__extension__ int foo(__SIZE_TYPE__ i) { i ? : (void *){}; /* { dg-error "" } */ } diff --git a/gcc/testsuite/gcc.dg/cpp/line3.c b/gcc/testsuite/gcc.dg/cpp/line3.c index 7a1061478d4..4b40e4a6a95 100644 --- a/gcc/testsuite/gcc.dg/cpp/line3.c +++ b/gcc/testsuite/gcc.dg/cpp/line3.c @@ -13,14 +13,14 @@ main(void) { char *A; - A = "text"; /* { dg-warning "discards qualifiers" "case zero" } */ - A = one("text" /* { dg-warning "discards qualifiers" "case one" } */ + A = "text"; /* { dg-warning "discards 'const' qualifier" "case zero" } */ + A = one("text" /* { dg-warning "discards 'const' qualifier" "case one" } */ "text") ; - A = two("text" /* { dg-warning "discards qualifiers" "case two" } */ + A = two("text" /* { dg-warning "discards 'const' qualifier" "case two" } */ "text") ; - A = four("text" /* { dg-warning "discards qualifiers" "case four" } */ + A = four("text" /* { dg-warning "discards 'const' qualifier" "case four" } */ "text") ; diff --git a/gcc/testsuite/gcc.dg/format/gcc_diag-1.c b/gcc/testsuite/gcc.dg/format/gcc_diag-1.c index 46013c8699e..f88965fe659 100644 --- a/gcc/testsuite/gcc.dg/format/gcc_diag-1.c +++ b/gcc/testsuite/gcc.dg/format/gcc_diag-1.c @@ -70,13 +70,13 @@ foo (int i, int i1, int i2, unsigned int u, double d, char *s, void *p, cdiag ("%m"); cxxdiag ("%m"); - tdiag ("%D%F%T", t1, t1, t1); - tdiag ("%+D%+F%+T", t1, t1, t1); - tdiag ("%q+D%q+F%q+T", t1, t1, t1); + tdiag ("%D%F%T%V", t1, t1, t1, t1); + tdiag ("%+D%+F%+T%+V", t1, t1, t1, t1); + tdiag ("%q+D%q+F%q+T%q+V", t1, t1, t1, t1); tdiag ("%D%D%D%D", t1, t2, *t3, t4[5]); - cdiag ("%D%F%T", t1, t1, t1); - cdiag ("%+D%+F%+T", t1, t1, t1); - cdiag ("%q+D%q+F%q+T", t1, t1, t1); + cdiag ("%D%F%T%V", t1, t1, t1, t1); + cdiag ("%+D%+F%+T%+V", t1, t1, t1, t1); + cdiag ("%q+D%q+F%q+T%q+V", t1, t1, t1, t1); cdiag ("%D%D%D%D", t1, t2, *t3, t4[5]); cdiag ("%E", t1); cxxdiag ("%A%D%E%F%T%V", t1, t1, t1, t1, t1, t1); @@ -86,6 +86,10 @@ foo (int i, int i1, int i2, unsigned int u, double d, char *s, void *p, cxxdiag ("%+#A%+#D%+#E%+#F%+#T%+#V", t1, t1, t1, t1, t1, t1); cxxdiag ("%C%L%O%P%Q", i, i, i, i, i); + tdiag ("%v%qv%#v", i, i, i); + cdiag ("%v%qv%#v", i, i, i); + cxxdiag ("%v%qv%#v", i, i, i); + /* Bad stuff with extensions. */ diag ("%m", i); /* { dg-warning "format" "extra arg" } */ tdiag ("%m", i); /* { dg-warning "format" "extra arg" } */ @@ -121,6 +125,14 @@ foo (int i, int i1, int i2, unsigned int u, double d, char *s, void *p, cdiag ("%D", t1, t1); /* { dg-warning "format" "extra arg" } */ cxxdiag ("%D", t1, t1); /* { dg-warning "format" "extra arg" } */ + tdiag ("%V", i); /* { dg-warning "format" "wrong arg" } */ + cdiag ("%V", i); /* { dg-warning "format" "wrong arg" } */ + cxxdiag ("%V", i); /* { dg-warning "format" "wrong arg" } */ + + tdiag ("%v", t1); /* { dg-warning "format" "wrong arg" } */ + cdiag ("%v", t1); /* { dg-warning "format" "wrong arg" } */ + cxxdiag ("%v", t1); /* { dg-warning "format" "wrong arg" } */ + /* Standard specifiers not accepted in the diagnostic framework. */ diag ("%X\n", u); /* { dg-warning "format" "HEX" } */ diag ("%f\n", d); /* { dg-warning "format" "float" } */ diff --git a/gcc/testsuite/gcc.dg/funroll-loops-all.c b/gcc/testsuite/gcc.dg/funroll-loops-all.c index c6276759e6c..9cdc9017255 100644 --- a/gcc/testsuite/gcc.dg/funroll-loops-all.c +++ b/gcc/testsuite/gcc.dg/funroll-loops-all.c @@ -1,4 +1,4 @@ /* PR 17594 */ /* { dg-do compile } */ /* { dg-options "-funroll-loops-all" } */ -/* { dg-error "unrecognized command line option \"-funroll-loops-all\"" "" { target *-*-* } 0 } */ +/* { dg-error "unrecognized command line option '-funroll-loops-all'" "" { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gcc.dg/graphite/pr44391.c b/gcc/testsuite/gcc.dg/graphite/pr44391.c new file mode 100644 index 00000000000..91b3afa175a --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/pr44391.c @@ -0,0 +1,7 @@ +/* { dg-options "-Os -m32 -fgraphite-identity -ffast-math" } */ + +void byte_insert_op1 (unsigned char *loc, unsigned char *end, unsigned *pto) +{ + while (end != loc) + *pto = *--end; +} diff --git a/gcc/testsuite/gcc.dg/init-bad-7.c b/gcc/testsuite/gcc.dg/init-bad-7.c new file mode 100644 index 00000000000..738ed605060 --- /dev/null +++ b/gcc/testsuite/gcc.dg/init-bad-7.c @@ -0,0 +1,11 @@ +/* PR c/37724 */ +/* { dg-do compile } */ +/* { dg-options "-std=gnu99 -pedantic" } */ + +struct f +{ + int *a; +}; + +char b[10]; +struct f g = {b}; /* { dg-warning "initialization from incompatible pointer type|near initialization for" } */ diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-sra-6.c b/gcc/testsuite/gcc.dg/ipa/ipa-sra-6.c new file mode 100644 index 00000000000..c9a766d9e8f --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/ipa-sra-6.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fipa-sra -fdump-tree-eipa_sra-slim" } */ + +struct bovid +{ + float a; + int b; + struct bovid *next; +}; + +static int +__attribute__((noinline)) +foo (struct bovid *cow, int i) +{ + i++; + if (cow->next) + foo (cow->next, i); + return i; +} + +int main (int argc, char *argv[]) +{ + struct bovid cow; + + cow.a = 7.4; + cow.b = 6; + cow.next = (struct bovid *) 0; + + return foo (&cow, 0); +} + +/* { dg-final { scan-tree-dump-times "foo " 1 "eipa_sra" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/modif-1.c b/gcc/testsuite/gcc.dg/ipa/modif-1.c deleted file mode 100644 index db6915a9d9e..00000000000 --- a/gcc/testsuite/gcc.dg/ipa/modif-1.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Verify that modification analysis detects modfications. */ -/* { dg-do compile } */ -/* { dg-options "-O3 -c -fdump-ipa-inline-details -fno-early-inlining" } */ - -struct whatever -{ - int first; - unsigned second; -}; - -void func1 (struct whatever w); -void func2 (struct whatever *pw); -void func3 (int i); -void func4 (int *pi); - -void the_test (struct whatever u, struct whatever v, - struct whatever w, struct whatever x, - int i, int k, int l) -{ - struct whatever *pw = &w; - int *pk = &k; - - v.first = 9; - - func1 (u); - func1 (v); - func2 (pw); - func2 (&x); - func3 (i); - func4 (pk); - func4 (&l); -} - -/* { dg-final { scan-ipa-dump-not "param 0\[^\\n\]*modified" "inline" } } */ -/* { dg-final { scan-ipa-dump "param 1\[^\\n\]*modified" "inline" } } */ -/* { dg-final { scan-ipa-dump "param 2\[^\\n\]*modified" "inline" } } */ -/* { dg-final { scan-ipa-dump "param 3\[^\\n\]*modified" "inline" } } */ -/* { dg-final { scan-ipa-dump-not "param 4\[^\\n\]*modified" "inline" } } */ -/* { dg-final { scan-ipa-dump "param 5\[^\\n\]*modified" "inline" } } */ -/* { dg-final { scan-ipa-dump "param 6\[^\\n\]*modified" "inline" } } */ -/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/gcc.dg/ipa/pure-const-1.c b/gcc/testsuite/gcc.dg/ipa/pure-const-1.c new file mode 100644 index 00000000000..51837ea9bad --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pure-const-1.c @@ -0,0 +1,80 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-local-pure-const1 -fdump-ipa-pure-const -fdump-tree-optimized -fno-early-inlining" } */ +void abort (void); +int error_code; +static int val; +__attribute__ ((noinline, noclone)) +static int +i_am_pure1 (int a) +{ + if (a > 50) + abort (); + return a; +} + +__attribute__ ((noinline, noclone)) +static int +i_am_const2 (int a) +{ + return a+val; +} + +__attribute__ ((noinline, noclone)) +int +call_me(int a) +{ + return a; +} + +inline int +call_callback(int (*fn)(int), int a) +{ + return fn(a); +} + +__attribute__ ((noinline, noclone)) +i_am_const3(int a) +{ + return call_callback (call_me, a); +} + +__attribute__ ((noinline)) +explode_badly() +{ + error_code = 0xbad; + abort (); +} + +__attribute__ ((noinline, noclone)) +i_am_pure4(int a) +{ + if (a > 50) + explode_badly (); + return a; +} + +test() +{ + int s; + s = i_am_pure1(5); + s += i_am_pure1(5); + s += i_am_const2(5); + s += i_am_const2(5); + s += i_am_const3(5); + s += i_am_const3(5); + s += i_am_pure4(5); + s += i_am_pure4(5); + return s; +} +/* { dg-final { scan-tree-dump-times "i_am_pure1 .5" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "i_am_const2 .5" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "i_am_const3 .5" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "i_am_pure4 .5" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump "found to be looping pure: i_am_pure1" "local-pure-const1"} } */ +/* { dg-final { scan-tree-dump "found to be looping pure: i_am_pure4" "local-pure-const1"} } */ +/* { dg-final { scan-ipa-dump "found to be const: i_am_const2" "pure-const"} } */ +/* { dg-final { scan-ipa-dump "found to be const: i_am_const3" "pure-const"} } */ +/* { dg-final { cleanup-tree-dump "local-pure-const1" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ +/* { dg-final { cleanup-ipa-dump "pure-const" } } */ + diff --git a/gcc/testsuite/gcc.dg/ipa/pure-const-2.c b/gcc/testsuite/gcc.dg/ipa/pure-const-2.c new file mode 100644 index 00000000000..51d779776bc --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pure-const-2.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-local-pure-const1 -fdump-tree-optimized" } */ +static __attribute__ ((noinline, noclone)) +int i_am_pure(char *c, int n) +{ + char *d=__builtin_alloca (n); + int i; + int sum; + for (i=0;i<n;i++) + d[i] = c[i]; + for (i=0;i<n;i++) + d[i] *= c[n-i]; + for (i=0;i<n;i++) + sum+=d[i]; + if (sum) + __builtin_unreachable (); + return sum; +} +char array[11]; +int +main(void) +{ + i_am_pure (array,5); + i_am_pure (array,11); + return 0; +} +/* { dg-final { scan-tree-dump "found to be pure: i_am_pure" "local-pure-const1"} } */ +/* { dg-final { scan-tree-dump-not "i_am_pure" "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/lto/20091216-1_0.c b/gcc/testsuite/gcc.dg/lto/20091216-1_0.c index ee3b6c73c6b..054330bbe23 100644 --- a/gcc/testsuite/gcc.dg/lto/20091216-1_0.c +++ b/gcc/testsuite/gcc.dg/lto/20091216-1_0.c @@ -1,6 +1,10 @@ /* { dg-lto-do run } */ -asm (".globl start_; start_: nop"); +#ifdef __ia64 +asm (".globl start_\nstart_: nop 0"); +#else +asm (".globl start_\nstart_: nop"); +#endif int main () diff --git a/gcc/testsuite/gcc.dg/lto/20100603-1_0.c b/gcc/testsuite/gcc.dg/lto/20100603-1_0.c new file mode 100644 index 00000000000..cc35c78cfae --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100603-1_0.c @@ -0,0 +1,4 @@ +/* { dg-lto-do link } */ +/* { dg-extra-ld-options {-r -nostdlib} } */ + +/* This file intentionally left empty. */ diff --git a/gcc/testsuite/gcc.dg/lto/20100603-2_0.c b/gcc/testsuite/gcc.dg/lto/20100603-2_0.c new file mode 100644 index 00000000000..11bee496d9c --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100603-2_0.c @@ -0,0 +1,5 @@ +/* { dg-lto-do link } */ +/* { dg-extra-ld-options {-r -nostdlib} } */ + +int foo; +int *i = &foo; diff --git a/gcc/testsuite/gcc.dg/lto/20100603-3_0.c b/gcc/testsuite/gcc.dg/lto/20100603-3_0.c new file mode 100644 index 00000000000..3fc08fdbf6b --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/20100603-3_0.c @@ -0,0 +1,4 @@ +/* { dg-lto-do link } */ +/* { dg-extra-ld-options {-r -nostdlib} } */ + +int i = 42; diff --git a/gcc/testsuite/gcc.dg/noncompile/990416-1.c b/gcc/testsuite/gcc.dg/noncompile/990416-1.c index 49f5569394e..91801910bc3 100644 --- a/gcc/testsuite/gcc.dg/noncompile/990416-1.c +++ b/gcc/testsuite/gcc.dg/noncompile/990416-1.c @@ -2,11 +2,11 @@ extern void *memcpy (void *, const void *, __SIZE_TYPE__); typedef int word_type; static void -copy_reg (unsigned int reg, frame_state *udata, /* { dg-error "parse|syntax|expected" } */ - frame_state *target_udata) /* { dg-error "expected" } */ +copy_reg (unsigned int reg, frame_state *udata, /* { dg-error "unknown type name" } */ + frame_state *target_udata) /* { dg-error "unknown type name" } */ { - word_type *preg = get_reg_addr (reg, udata, 0); /* { dg-error "undeclared|function|without a cast" } */ - word_type *ptreg = get_reg_addr (reg, target_udata, 0); /* { dg-error "undeclared|without a cast" } */ + word_type *preg = ge_reg_addr (reg, udata, 0); + word_type *ptreg = ge_reg_addr (reg, target_udata, 0); memcpy (ptreg, preg, __builtin_dwarf_reg_size (reg)); } diff --git a/gcc/testsuite/gcc.dg/noncompile/pr44517.c b/gcc/testsuite/gcc.dg/noncompile/pr44517.c new file mode 100644 index 00000000000..5977d68fef8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/noncompile/pr44517.c @@ -0,0 +1,18 @@ +/* PR c/44517: Improve diagnostic for misspelled typename in function declaration. */ +int f1(int x, pid_t y, long z, in t) { +/* { dg-error "unknown type name 'pid_t'" "" { target *-*-* } 2 } */ +/* { dg-error "unknown type name 'in'" "" { target *-*-* } 2 } */ + return x + y + z + t; +} + +int f2(int x, lon y, long z, ...){ /* { dg-error "unknown type name 'lon'" } */ + return; +} + +void f3(int n, int a[n], pid_t x); /* { dg-error "unknown type name 'pid_t'" } */ +void f4() {} +void f5(int a, *b); /* { dg-error "expected declaration specifiers or" } */ +void f6(int a, b); /* { dg-error "expected declaration specifiers or" } */ +void f7(int a, goto b); /* { dg-error "expected declaration specifiers or" } */ +void f8(int a, in goto); /* { dg-error "unknown type name 'in'" } */ +void f9(int a, in 1); /* { dg-error "unknown type name 'in'" } */ diff --git a/gcc/testsuite/gcc.dg/noreturn-4.c b/gcc/testsuite/gcc.dg/noreturn-4.c index bcc29dac69a..6fe144754d0 100644 --- a/gcc/testsuite/gcc.dg/noreturn-4.c +++ b/gcc/testsuite/gcc.dg/noreturn-4.c @@ -4,7 +4,7 @@ extern void exit (int) __attribute__ ((__noreturn__)); int -main (void) /* { dg-warning "function might be possible candidate for attribute 'noreturn'" "warn for main" } */ +main (void) /* { dg-warning "function might be candidate for attribute 'noreturn'" "warn for main" } */ { exit (0); } diff --git a/gcc/testsuite/gcc.dg/noreturn-7.c b/gcc/testsuite/gcc.dg/noreturn-7.c index 1913be1fe1d..fd2be2d56c0 100644 --- a/gcc/testsuite/gcc.dg/noreturn-7.c +++ b/gcc/testsuite/gcc.dg/noreturn-7.c @@ -13,7 +13,7 @@ void _exit(int status) __attribute__ ((__noreturn__)); int z = 0; -void g() /* { dg-warning "possible candidate" } */ +void g() /* { dg-warning "might be candidate" } */ { if (++z > 10) _exit(0); @@ -27,14 +27,14 @@ void f() f(); } /* { dg-bogus "does return" } */ -int h() /* { dg-warning "possible candidate" } */ +int h() /* { dg-warning "might be candidate" } */ { if (++z > 10) _exit(0); return h(); } /* { dg-bogus "end of non-void function" } */ -int k() /* { dg-warning "possible candidate" } */ +int k() /* { dg-warning "might be candidate" } */ { if (++z > 10) _exit(0); diff --git a/gcc/testsuite/gcc.dg/opts-1.c b/gcc/testsuite/gcc.dg/opts-1.c new file mode 100644 index 00000000000..0d16c3ded6e --- /dev/null +++ b/gcc/testsuite/gcc.dg/opts-1.c @@ -0,0 +1,9 @@ +/* Test negative forms of various options are rejected. */ +/* { dg-do compile } */ +/* { dg-options "-Wno-strict-aliasing=1 -Wno-strict-overflow=1 -fno-abi-version=1 -fno-lto-compression-level=1 -fno-tree-parallelize-loops=1" } */ + +/* { dg-error "-fno-abi-version" "-fno-abi-version" { target *-*-* } 0 } */ +/* { dg-error "-fno-lto-compression-level" "-fno-lto-compression-level" { target *-*-* } 0 } */ +/* { dg-error "-fno-tree-parallelize-loops" "-fno-tree-parallelize-loops" { target *-*-* } 0 } */ +/* { dg-warning "-Wno-strict-overflow" "-Wno-strict-overflow" { target *-*-* } 0 } */ +/* { dg-warning "-Wno-strict-aliasing" "-Wno-strict-aliasing" { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gcc.dg/opts-2.c b/gcc/testsuite/gcc.dg/opts-2.c new file mode 100644 index 00000000000..f7683635a0e --- /dev/null +++ b/gcc/testsuite/gcc.dg/opts-2.c @@ -0,0 +1,8 @@ +/* -O as an operand to another option should not take effect as an + optimization option. */ +/* { dg-do compile } */ +/* { dg-options "-I -O" } */ + +#ifdef __OPTIMIZE__ +#error "__OPTIMIZE__ defined" +#endif diff --git a/gcc/testsuite/gcc.dg/opts-3.c b/gcc/testsuite/gcc.dg/opts-3.c new file mode 100644 index 00000000000..50cd1db52d4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/opts-3.c @@ -0,0 +1,7 @@ +/* Parameters of -Xassembler should not be interpreted as driver + options (and so cause the driver to exit prematurely, as in this + testcase, or have other unintended effects). */ +/* { dg-do compile } */ +/* { dg-options "-Xassembler -dumpmachine" } */ + +int int x; /* { dg-error "two or more data types" } */ diff --git a/gcc/testsuite/gcc.dg/plugin/finish_unit_plugin.c b/gcc/testsuite/gcc.dg/plugin/finish_unit_plugin.c index 634daeeda13..26496a2e695 100644 --- a/gcc/testsuite/gcc.dg/plugin/finish_unit_plugin.c +++ b/gcc/testsuite/gcc.dg/plugin/finish_unit_plugin.c @@ -12,6 +12,7 @@ #include "tree.h" #include "tree-pass.h" #include "intl.h" +#include "cgraph.h" int plugin_is_GPL_compatible; diff --git a/gcc/testsuite/gcc.dg/plugin/one_time_plugin.c b/gcc/testsuite/gcc.dg/plugin/one_time_plugin.c index 4a6a8a61969..2c4cd497192 100644 --- a/gcc/testsuite/gcc.dg/plugin/one_time_plugin.c +++ b/gcc/testsuite/gcc.dg/plugin/one_time_plugin.c @@ -37,7 +37,7 @@ struct gimple_opt_pass one_pass = NULL, /* sub */ NULL, /* next */ 0, /* static_pass_number */ - 0, /* tv_id */ + TV_NONE, /* tv_id */ PROP_gimple_any, /* properties_required */ 0, /* properties_provided */ 0, /* properties_destroyed */ diff --git a/gcc/testsuite/gcc.dg/plugin/selfassign.c b/gcc/testsuite/gcc.dg/plugin/selfassign.c index 8d76301d815..eb8f24a45a8 100644 --- a/gcc/testsuite/gcc.dg/plugin/selfassign.c +++ b/gcc/testsuite/gcc.dg/plugin/selfassign.c @@ -52,9 +52,7 @@ get_real_ref_rhs (tree expr) /* We are only interested in an assignment with a single rhs operand because if it is not, the original assignment will not possibly be a self-assignment. */ - if (is_gimple_assign (def_stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (def_stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (def_stmt)) return get_real_ref_rhs (gimple_assign_rhs1 (def_stmt)); else return NULL_TREE; @@ -66,7 +64,7 @@ get_real_ref_rhs (tree expr) case PARM_DECL: case FIELD_DECL: case COMPONENT_REF: - case INDIRECT_REF: + case MEM_REF: case ARRAY_REF: return expr; default: @@ -116,17 +114,18 @@ get_non_ssa_expr (tree expr) else return expr; } - case INDIRECT_REF: + case MEM_REF: { tree orig_base = TREE_OPERAND (expr, 0); - tree base = get_non_ssa_expr (orig_base); - if (!base) - return NULL_TREE; - /* If BASE is converted, build a new indirect reference tree. */ - if (base != orig_base) - return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (base)), base); - else - return expr; + if (TREE_CODE (orig_base) == SSA_NAME) + { + tree base = get_non_ssa_expr (orig_base); + if (!base) + return NULL_TREE; + return fold_build2 (MEM_REF, TREE_TYPE (expr), + base, TREE_OPERAND (expr, 1)); + } + return expr; } case ARRAY_REF: { @@ -153,9 +152,7 @@ get_non_ssa_expr (tree expr) && !gimple_nop_p (SSA_NAME_DEF_STMT (expr))) { gimple def_stmt = SSA_NAME_DEF_STMT (expr); - if (is_gimple_assign (def_stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (def_stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (def_stmt)) vdecl = gimple_assign_rhs1 (def_stmt); } return get_non_ssa_expr (vdecl); @@ -201,9 +198,7 @@ warn_self_assign (gimple stmt) tree rhs, lhs; /* Check assigment statement. */ - if (is_gimple_assign (stmt) - && (get_gimple_rhs_class (gimple_assign_rhs_code (stmt)) - == GIMPLE_SINGLE_RHS)) + if (gimple_assign_single_p (stmt)) { rhs = get_real_ref_rhs (gimple_assign_rhs1 (stmt)); if (!rhs) @@ -275,7 +270,7 @@ static struct gimple_opt_pass pass_warn_self_assign = NULL, /* sub */ NULL, /* next */ 0, /* static_pass_number */ - 0, /* tv_id */ + TV_NONE, /* tv_id */ PROP_ssa, /* properties_required */ 0, /* properties_provided */ 0, /* properties_destroyed */ diff --git a/gcc/testsuite/gcc.dg/pr32370.c b/gcc/testsuite/gcc.dg/pr32370.c index 80a7c545d47..f039bdf98e7 100644 --- a/gcc/testsuite/gcc.dg/pr32370.c +++ b/gcc/testsuite/gcc.dg/pr32370.c @@ -2,15 +2,19 @@ /* { dg-do compile { target i?86-*-* x86_64-*-* ia64-*-* } } */ /* { dg-options "" { target ia64-*-* } } */ /* { dg-options "-ffixed-esi" { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-mabi=sysv -ffixed-esi" { target x86_64-*-mingw* } } */ -#if defined __i386__ || defined __x86_64__ +#if (defined __i386__ || defined __x86_64__) && ! defined _WIN64 # define C "=S" # define TYPE unsigned long -#elif defined __ia64__ +#elif defined __ia64__ || defined _WIN64 # define C "=a" # define TYPE unsigned long long #endif +#ifdef _WIN64 +__extension__ +#endif unsigned int foo (TYPE port) { diff --git a/gcc/testsuite/gcc.dg/pr36902.c b/gcc/testsuite/gcc.dg/pr36902.c index 8b4ba6fcdb2..43a2d14f981 100644 --- a/gcc/testsuite/gcc.dg/pr36902.c +++ b/gcc/testsuite/gcc.dg/pr36902.c @@ -44,7 +44,7 @@ foo2(unsigned char * to, const unsigned char * from, int n) *to = *from; break; case 5: - to[4] = from [4]; /* { dg-warning "20:array subscript is above array bounds" } */ + to[4] = from [4]; /* { dg-warning "array subscript is above array bounds" } */ break; } return to; diff --git a/gcc/testsuite/gcc.dg/pr37561.c b/gcc/testsuite/gcc.dg/pr37561.c index 82eca964008..ec712a7841d 100644 --- a/gcc/testsuite/gcc.dg/pr37561.c +++ b/gcc/testsuite/gcc.dg/pr37561.c @@ -1,7 +1,7 @@ /* PR c++/37561 */ /* { dg-do compile } */ -__PTRDIFF_TYPE__ p; +__extension__ __PTRDIFF_TYPE__ p; char q; void diff --git a/gcc/testsuite/gcc.dg/pr39874.c b/gcc/testsuite/gcc.dg/pr39874.c new file mode 100644 index 00000000000..ca452831016 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr39874.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +extern void func(); + +void test1(char *signature) +{ + char ch = signature[0]; + if (ch == 15 || ch == 3) + { + if (ch == 15) func(); + } +} + + +void test2(char *signature) +{ + char ch = signature[0]; + if (ch == 15 || ch == 3) + { + if (ch > 14) func(); + } +} + +/* { dg-final { scan-tree-dump-times " == 15" 2 "optimized" } } */ +/* { dg-final { scan-tree-dump-not " == 3" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ + + diff --git a/gcc/testsuite/gcc.dg/pr41340.c b/gcc/testsuite/gcc.dg/pr41340.c index 72ad9296894..b86f40bf467 100644 --- a/gcc/testsuite/gcc.dg/pr41340.c +++ b/gcc/testsuite/gcc.dg/pr41340.c @@ -10,6 +10,8 @@ struct S2 { struct S1 s2; }; struct S3 { unsigned s3; struct S2 **s4; }; struct S5 { struct S2 *s5; }; +__extension__ typedef __INTPTR_TYPE__ ssize_t; + extern void fn0 (void) __attribute__ ((__noreturn__)); T fn6 (struct S3); void fn7 (void); @@ -45,7 +47,7 @@ fn5 (struct S3 x, T *y) { if (!fn3 (x)) { - *y = (T) (long) fn4 (x); + *y = (T) (ssize_t) fn4 (x); return 1; } return 0; diff --git a/gcc/testsuite/gcc.dg/pr41551.c b/gcc/testsuite/gcc.dg/pr41551.c index 25a8e717fb8..e24fbc33db4 100644 --- a/gcc/testsuite/gcc.dg/pr41551.c +++ b/gcc/testsuite/gcc.dg/pr41551.c @@ -3,8 +3,10 @@ /* Make sure we do not ICE. */ +__extension__ typedef __SIZE_TYPE__ size_t; + int main(void) { int var, *p = &var; - return (double)(unsigned long)(p); + return (double)(size_t)(p); } diff --git a/gcc/testsuite/gcc.dg/pr42461.c b/gcc/testsuite/gcc.dg/pr42461.c new file mode 100644 index 00000000000..0518bfd9736 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr42461.c @@ -0,0 +1,14 @@ +/* PR rtl-optimization/42461 */ +/* Reported by Patrick Pelissier <patrick.pelissier@gmail.com> */ + +/* { dg-do link } */ +/* { dg-options "-O2" } */ + +extern int link_failure (int) __attribute__ ((pure)); + +int main (void) +{ + if (link_failure (0) < 1) + __builtin_unreachable (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/pr44393.c b/gcc/testsuite/gcc.dg/pr44393.c new file mode 100644 index 00000000000..906d5932a0f --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44393.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-Os -ftree-loop-distribution" } */ + +int i; +void foo () +{ + int **pp = 0, *p = 0; + while (--i) + { + *p++ = 0; + *pp++ = p; + } + i = *p; +} + diff --git a/gcc/testsuite/gcc.dg/pr44404.c b/gcc/testsuite/gcc.dg/pr44404.c new file mode 100644 index 00000000000..a0b4ceb98ca --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44404.c @@ -0,0 +1,35 @@ +/* PR rtl-optimization/44404 + foo() used to be miscompiled on ARM due to a bug in auto-inc-dec.c, + which resulted in "strb r1, [r1], #-36". */ + +/* { dg-do run } */ +/* { dg-options "-O2 -fno-unroll-loops" } */ + +extern char *strcpy (char *, const char *); +extern int strcmp (const char*, const char*); +extern void abort (void); + +char buf[128]; + +void __attribute__((noinline)) +bar (int a, const char *p) +{ + if (strcmp (p, "0123456789abcdefghijklmnopqrstuvwxyz") != 0) + abort (); +} + +void __attribute__((noinline)) +foo (int a) +{ + if (a) + bar (0, buf); + strcpy (buf, "0123456789abcdefghijklmnopqrstuvwxyz"); + bar (0, buf); +} + +int +main (void) +{ + foo (0); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/pr44509.c b/gcc/testsuite/gcc.dg/pr44509.c new file mode 100644 index 00000000000..7c50bd0fc28 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44509.c @@ -0,0 +1,9 @@ +/* PR bootstrap/44509 */ +/* { dg-do compile } */ +/* { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" } */ + +double +foo (void) +{ + return __DBL_MAX__ - __FLT_MAX__; +} diff --git a/gcc/testsuite/gcc.dg/pr44539.c b/gcc/testsuite/gcc.dg/pr44539.c new file mode 100644 index 00000000000..9cfff7a3ae5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44539.c @@ -0,0 +1,29 @@ +/* PR tree-optimization/44539 */ +/* { dg-do compile } */ +/* { dg-options "-ftracer -freorder-blocks -O2" } */ + +void bar (int file); +extern int baz (void); + +void noret1 () +{ + bar (0); + __builtin_exit (0); +} + +void noret2 () +{ + __builtin_exit (0); +} + +void bar (int i) +{ + if (baz ()) + noret1 (i); +} + +void foo (int i) +{ + if (~i) bar (i); + i ? noret1 () : noret2 (); +} diff --git a/gcc/testsuite/gcc.dg/pr44674.c b/gcc/testsuite/gcc.dg/pr44674.c new file mode 100644 index 00000000000..c3f16ff20ee --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44674.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fprofile-generate" } */ + +void +jumpfunc (void *p) +{ + void *l = &&jumplabel; +jumplabel: + __builtin_memcpy (p, l, 1); +} diff --git a/gcc/testsuite/gcc.dg/pr44699.c b/gcc/testsuite/gcc.dg/pr44699.c new file mode 100644 index 00000000000..601cc78f572 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44699.c @@ -0,0 +1,157 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +typedef long unsigned int size_t; +typedef long int intmax_t; +typedef long unsigned int uintmax_t; +extern void *xmalloc (size_t) __attribute__ ((__malloc__)); +extern const char *trim_filename (const char *); + +static __inline void * +__inline_memcpy_chk (void *__dest, const void *__src, size_t __len) +{ + return __builtin___memcpy_chk (__dest, __src, __len, __builtin_object_size (__dest, 0)); +} + +typedef unsigned int hashval_t; +typedef hashval_t (*htab_hash) (const void *); +typedef int (*htab_eq) (const void *, const void *); +typedef void (*htab_del) (void *); +typedef int (*htab_trav) (void **, void *); +typedef void *(*htab_alloc) (size_t, size_t); +typedef void (*htab_free) (void *); + +typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t); +typedef void (*htab_free_with_arg) (void *, void *); +struct htab { + htab_hash hash_f; + htab_eq eq_f; + htab_del del_f; + void ** entries; + size_t size; + size_t n_elements; + size_t n_deleted; + unsigned int searches; + unsigned int collisions; + htab_alloc alloc_f; + htab_free free_f; + void * alloc_arg; + htab_alloc_with_arg alloc_with_arg_f; + htab_free_with_arg free_with_arg_f; + unsigned int size_prime_index; +}; + +typedef struct htab *htab_t; +enum insert_option {NO_INSERT, INSERT}; +extern void * htab_find (htab_t, const void *); +extern void ** htab_find_slot (htab_t, const void *, enum insert_option); + +enum mode_class { MODE_RANDOM, MODE_CC, MODE_INT, MODE_PARTIAL_INT, MODE_FRACT, MODE_UFRACT, MODE_ACCUM, MODE_UACCUM, MODE_FLOAT, MODE_DECIMAL_FLOAT, MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MODE_VECTOR_INT, MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM, MODE_VECTOR_FLOAT, MAX_MODE_CLASS }; + +static const char *const mode_class_names[MAX_MODE_CLASS] = +{ + "MODE_RANDOM", "MODE_CC", "MODE_INT", "MODE_PARTIAL_INT", "MODE_FRACT", "MODE_UFRACT", "MODE_ACCUM", "MODE_UACCUM", "MODE_FLOAT", "MODE_DECIMAL_FLOAT", "MODE_COMPLEX_INT", "MODE_COMPLEX_FLOAT", "MODE_VECTOR_INT", "MODE_VECTOR_FRACT", "MODE_VECTOR_UFRACT", "MODE_VECTOR_ACCUM", "MODE_VECTOR_UACCUM", "MODE_VECTOR_FLOAT" +}; +struct mode_data +{ + struct mode_data *next; + + const char *name; + enum mode_class cl; + unsigned int precision; + unsigned int bytesize; + unsigned int ncomponents; + unsigned int alignment; + const char *format; + + struct mode_data *component; + struct mode_data *wider; + struct mode_data *wider_2x; + + struct mode_data *contained; + + struct mode_data *next_cont; + + const char *file; + unsigned int line; + unsigned int counter; + unsigned int ibit; + unsigned int fbit; +}; + +static struct mode_data *modes[MAX_MODE_CLASS]; +static unsigned int n_modes[MAX_MODE_CLASS]; +static struct mode_data *void_mode; + +static const struct mode_data blank_mode = { + 0, "<unknown>", MAX_MODE_CLASS, + -1U, -1U, -1U, -1U, + 0, 0, 0, 0, 0, 0, + "<unknown>", 0, 0, 0, 0 +}; + +static htab_t modes_by_name; + +static __inline__ struct mode_data * +find_mode (const char *name) +{ + struct mode_data key; + + key.name = name; + return (struct mode_data *) htab_find (modes_by_name, &key); +} + +static struct mode_data * +new_mode (enum mode_class cl, const char *name, + const char *file, unsigned int line) +{ + struct mode_data *m; + static unsigned int count = 0; + + m = find_mode (name); + if (m) + { + error ("%s:%d: duplicate definition of mode \"%s\"", + trim_filename (file), line, name); + error ("%s:%d: previous definition here", m->file, m->line); + return m; + } + + m = ((struct mode_data *) xmalloc (sizeof (struct mode_data))); + ((__builtin_object_size (m, 0) != (size_t) -1) ? __builtin___memcpy_chk (m, &blank_mode, sizeof (struct mode_data), __builtin_object_size (m, 0)) : __inline_memcpy_chk (m, &blank_mode, sizeof (struct mode_data))); + m->cl = cl; + m->name = name; + if (file) + m->file = trim_filename (file); + m->line = line; + m->counter = count++; + + m->next = modes[cl]; + modes[cl] = m; + n_modes[cl]++; + + *htab_find_slot (modes_by_name, m, INSERT) = m; + + return m; +} + +static void +make_int_mode (const char *name, + unsigned int precision, unsigned int bytesize, + const char *file, unsigned int line) +{ + struct mode_data *m = new_mode (MODE_INT, name, file, line); + m->bytesize = bytesize; + m->precision = precision; +} + +static void +create_modes (void) +{ +make_int_mode ("HI", -1U, 2, "../../work/gcc/machmode.def", 182); +} + +int +main (int argc, char **argv) +{ + create_modes (); +} diff --git a/gcc/testsuite/gcc.dg/pragma-diag-1.c b/gcc/testsuite/gcc.dg/pragma-diag-1.c new file mode 100644 index 00000000000..b6d294d9ab5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pragma-diag-1.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ +/* { dg-message "warnings being treated as errors" "" {target "*-*-*"} 0 } */ + +main() +{ + int a; + int b; + int c; + int d; + +#pragma GCC diagnostic error "-Wuninitialized" + foo(a); /* { dg-error "uninitialized" } */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" + foo(b); +#pragma GCC diagnostic pop + foo(c); /* { dg-error "uninitialized" } */ +#pragma GCC diagnostic pop + foo(d); /* { dg-warning "uninitialized" } */ +} diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_global_array.c b/gcc/testsuite/gcc.dg/struct/w_prof_global_array.c index cbfd0bc72bb..ca3643e43de 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_global_array.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_global_array.c @@ -26,5 +26,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_global_var.c b/gcc/testsuite/gcc.dg/struct/w_prof_global_var.c index c51648c4ef0..baff45d917d 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_global_var.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_global_var.c @@ -39,5 +39,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_local_array.c b/gcc/testsuite/gcc.dg/struct/w_prof_local_array.c index 1a798e399d3..8953264fea1 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_local_array.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_local_array.c @@ -34,5 +34,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_local_var.c b/gcc/testsuite/gcc.dg/struct/w_prof_local_var.c index 82f24a1a4b1..9a23f8d53a8 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_local_var.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_local_var.c @@ -37,5 +37,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_single_str_global.c b/gcc/testsuite/gcc.dg/struct/w_prof_single_str_global.c index b2223c88b8b..b0202399104 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_single_str_global.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_single_str_global.c @@ -28,6 +28,6 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_prof_two_strs.c b/gcc/testsuite/gcc.dg/struct/w_prof_two_strs.c index 308c30e4fd7..e9de98c3b8a 100644 --- a/gcc/testsuite/gcc.dg/struct/w_prof_two_strs.c +++ b/gcc/testsuite/gcc.dg/struct/w_prof_two_strs.c @@ -61,6 +61,6 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 2" "ipa_struct_reorg" } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 2" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/w_ratio_cold_str.c b/gcc/testsuite/gcc.dg/struct/w_ratio_cold_str.c index 19de595e8ed..3c26e3be7b6 100644 --- a/gcc/testsuite/gcc.dg/struct/w_ratio_cold_str.c +++ b/gcc/testsuite/gcc.dg/struct/w_ratio_cold_str.c @@ -39,5 +39,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" } } */ +/* { dg-final-use { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final-use { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_array_field.c b/gcc/testsuite/gcc.dg/struct/wo_prof_array_field.c index 12c217aad97..5d5e37b4f0e 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_array_field.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_array_field.c @@ -23,5 +23,5 @@ int main() } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_array_through_pointer.c b/gcc/testsuite/gcc.dg/struct/wo_prof_array_through_pointer.c index abf50a54fec..efb68be8bdd 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_array_through_pointer.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_array_through_pointer.c @@ -35,5 +35,5 @@ main () return 0; } -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_double_malloc.c b/gcc/testsuite/gcc.dg/struct/wo_prof_double_malloc.c index b1508eec5c7..77226b449c5 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_double_malloc.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_double_malloc.c @@ -26,5 +26,5 @@ int main() } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_empty_str.c b/gcc/testsuite/gcc.dg/struct/wo_prof_empty_str.c index db7f6b09cb5..58411202767 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_empty_str.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_empty_str.c @@ -43,5 +43,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "No structures to transform" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "No structures to transform" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_arg_to_local.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_arg_to_local.c index e6638b73a60..781a847f9f7 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_arg_to_local.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_arg_to_local.c @@ -42,5 +42,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is passed to local function...Excluded." "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is passed to local function...Excluded." "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_return.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_return.c index 8830c55601d..8892fa99098 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_return.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_return.c @@ -29,5 +29,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is return type of function...Excluded" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is return type of function...Excluded" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_str_init.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_str_init.c index 5f634fc119c..6da3420f6e8 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_str_init.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_str_init.c @@ -28,6 +28,6 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is initialized...Excluded" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is initialized...Excluded" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_array.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_array.c index 55a644e1971..bd03ec42f05 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_array.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_array.c @@ -30,5 +30,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_pointer.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_pointer.c index 4cb94afc5df..59e0e48321a 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_pointer.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_pointer.c @@ -45,5 +45,5 @@ main (void) } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_value.c b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_value.c index bade3153909..a6b32ddd688 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_value.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_escape_substr_value.c @@ -42,5 +42,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" } } */ +/* { dg-final { scan-ipa-dump "is a field in the structure" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_global_array.c b/gcc/testsuite/gcc.dg/struct/wo_prof_global_array.c index 4ffd4b5a265..b61e26b1248 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_global_array.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_global_array.c @@ -29,5 +29,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_global_var.c b/gcc/testsuite/gcc.dg/struct/wo_prof_global_var.c index 4c00d02434a..39351e072e2 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_global_var.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_global_var.c @@ -42,5 +42,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_local_array.c b/gcc/testsuite/gcc.dg/struct/wo_prof_local_array.c index 3d92da40517..18d5a734740 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_local_array.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_local_array.c @@ -37,5 +37,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_local_var.c b/gcc/testsuite/gcc.dg/struct/wo_prof_local_var.c index a6fd7be4371..26a9dbd7314 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_local_var.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_local_var.c @@ -40,5 +40,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_malloc_size_var.c b/gcc/testsuite/gcc.dg/struct/wo_prof_malloc_size_var.c index 04b8b6621fb..6caadcf1230 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_malloc_size_var.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_malloc_size_var.c @@ -44,5 +44,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_global.c b/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_global.c index 22193f2ae57..812763d53ff 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_global.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_global.c @@ -31,5 +31,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 1" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_local.c b/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_local.c index e17ca56ee8b..313af1080c1 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_local.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_single_str_local.c @@ -31,5 +31,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "No structures to transform" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "No structures to transform" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/struct/wo_prof_two_strs.c b/gcc/testsuite/gcc.dg/struct/wo_prof_two_strs.c index 24dae559829..92da94d2923 100644 --- a/gcc/testsuite/gcc.dg/struct/wo_prof_two_strs.c +++ b/gcc/testsuite/gcc.dg/struct/wo_prof_two_strs.c @@ -64,5 +64,5 @@ main () } /*--------------------------------------------------------------------------*/ -/* { dg-final { scan-ipa-dump "Number of structures to transform is 2" "ipa_struct_reorg" { xfail { "avr-*-*" } } } } */ +/* { dg-final { scan-ipa-dump "Number of structures to transform is 2" "ipa_struct_reorg" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "*" } } */ diff --git a/gcc/testsuite/gcc.dg/torture/pr43781.c b/gcc/testsuite/gcc.dg/torture/pr43781.c new file mode 100644 index 00000000000..37fe5a36769 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr43781.c @@ -0,0 +1,45 @@ +/* { dg-do compile } */ + +typedef int int32_t; +typedef unsigned char uint8_t; + +struct S0 +{ + uint8_t f3; +}; + +struct S2 +{ + uint8_t f5; +}; + +struct S0 g_22 = { + 0 +}; + +int32_t g_91; +const struct S2 *g_314; +const struct S2 **g_313 = &g_314; +struct S2 g_320[2] = { + 0 +}; + +void +int32func (uint64p_34) +{ + for (g_22.f3 = 0; g_22.f3 <= 0; g_22.f3) + { + lbl_491:{ + if (1) + { + int32_t *l_453[2][7][7][1][1]; + int i, j, k, l, m; + for (m; m; m++) + l_453[i][j][k][l][m]; + } + *g_313 = 0; + if (g_91) + goto lbl_491; + } + } +} diff --git a/gcc/testsuite/gcc.dg/tree-prof/stringop-1.c b/gcc/testsuite/gcc.dg/tree-prof/stringop-1.c index d32a6cedc7a..0f477b2376c 100644 --- a/gcc/testsuite/gcc.dg/tree-prof/stringop-1.c +++ b/gcc/testsuite/gcc.dg/tree-prof/stringop-1.c @@ -16,7 +16,7 @@ main() /* { dg-final-use { scan-tree-dump "Single value 4 stringop" "tree_profile"} } */ /* Really this ought to simplify into assignment, but we are not there yet. */ /* a[0] = b[0] is what we fold the resulting memcpy into. */ -/* { dg-final-use { scan-tree-dump "a.0. = " "optimized"} } */ -/* { dg-final-use { scan-tree-dump "= b.0." "optimized"} } */ +/* { dg-final-use { scan-tree-dump " = MEM.*&b" "optimized"} } */ +/* { dg-final-use { scan-tree-dump "MEM.*&a\\\] = " "optimized"} } */ /* { dg-final-use { cleanup-tree-dump "optimized" } } */ /* { dg-final-use { cleanup-tree-dump "tree_profile" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030807-7.c b/gcc/testsuite/gcc.dg/tree-ssa/20030807-7.c index f9f5fb798ef..ed6f7c0d5d5 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/20030807-7.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/20030807-7.c @@ -33,5 +33,5 @@ simplify_condition (cond_p) } /* There should be exactly one IF conditional. */ -/* { dg-final { scan-tree-dump-times "if " 1 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "if " 1 "vrp1" { xfail *-*-* } } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c deleted file mode 100644 index dc764c3d79e..00000000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-2.c +++ /dev/null @@ -1,13 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O1 -fdump-tree-optimized" } */ -struct a{ - int a; - int b; -} a; -int * -t() -{ - return (int *)&a; -} -/* { dg-final { scan-tree-dump "a.a" "optimized"} } */ -/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-3.c b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-3.c deleted file mode 100644 index b764187a029..00000000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-3.c +++ /dev/null @@ -1,28 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O1 -fdump-tree-optimized" } */ -union a -{ - struct s1 - { - long long a; - long long b; - } s1; - struct s2 - { - int c; - int d; - } s2; - struct s3 - { - unsigned long long e; - unsigned long long f; - } s3; -} a; -int * -t () -{ - return (int *) &a; -} - -/* { dg-final { scan-tree-dump "a.s2.c" "optimized"} } */ -/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-1.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-1.c index ee3cb0ebfe5..7b07d7f488f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-1.c @@ -15,5 +15,5 @@ void f(struct a * b, __SIZE_TYPE__ i) c[i] = 1; } -/* { dg-final { scan-tree-dump-times "t\\\[i.*\\\] =.* 1;" 1 "forwprop1" } } */ +/* { dg-final { scan-tree-dump-times "t\\\[i.*\\\].* = 1;" 1 "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c index 0b865245a96..b46b8ece816 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-10.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fdump-tree-forwprop1" } */ +/* { dg-options "-O -fdump-tree-fre-details" } */ int b; unsigned a; @@ -15,9 +15,8 @@ void test2(void) } /* The indirect load should be replaced by a load from a and a - conversion to int. */ + conversion to int. FRE should then be able to replace + the rhs of the store to b by 1. */ -/* { dg-final { scan-tree-dump "= a;" "forwprop1" } } */ -/* { dg-final { scan-tree-dump "= \\\(int\\\) " "forwprop1" } } */ -/* { dg-final { scan-tree-dump-not "= \\\*" "forwprop1" } } */ -/* { dg-final { cleanup-tree-dump "forwprop1" } } */ +/* { dg-final { scan-tree-dump "Replaced\[^\\n\]*with 1" "fre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c index fe04e66fa1a..2aefb9ace63 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c @@ -17,5 +17,5 @@ void f(__SIZE_TYPE__ i) c[i] = 1; } -/* { dg-final { scan-tree-dump-times "t\\\[i.*\\\] =.* 1;" 1 "forwprop1" } } */ +/* { dg-final { scan-tree-dump-times "t\\\[i.*\\\].* = 1;" 1 "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop?" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c index 710bc5dd114..1b68d5a35f0 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-5.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O1 -fdump-tree-forwprop1 -w" } */ +/* { dg-options "-O1 -fdump-tree-esra -w" } */ #define vector __attribute__((vector_size(16) )) struct VecClass @@ -15,7 +15,8 @@ vector float foo( vector float v ) return y.v; } -/* We should be able to convert the cast to a VCE in forwprop1. */ -/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "forwprop1"} } */ -/* { dg-final { cleanup-tree-dump "forwprop1" } } */ - +/* We should be able to remove the intermediate struct and directly + return x. As we do not fold VIEW_CONVERT_EXPR<struct VecClass>(x).v + that doesn't happen right now. */ +/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "esra"} } */ +/* { dg-final { cleanup-tree-dump "esra" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-8.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-8.c index 4e0751f8119..fc74297242c 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-8.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-8.c @@ -12,5 +12,5 @@ int foo(struct X *q) /* We should have propragated &q->a into (*pointer). */ /* { dg-final { scan-tree-dump-times "pointer" 0 "forwprop1"} } */ -/* { dg-final { scan-tree-dump "->a\\\[0\\\]" "forwprop1" } } */ +/* { dg-final { scan-tree-dump "\\\[0\\\]" "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-1.c new file mode 100644 index 00000000000..a31e8ea7a47 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-1.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-fnsplit" } */ +int test2(a) +{ + if (a<100) + return 1; + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + do_something_big (); + return 0; +} + +test() +{ + test2(10); + test2(20); +} +/* { dg-final { scan-tree-dump-times "Splitting function" 1 "fnsplit"} } */ +/* { dg-final { cleanup-tree-dump "fnsplit" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-2.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-2.c new file mode 100644 index 00000000000..bbde73d6c7c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-2.c @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-fnsplit" } */ +int b; +int c; +int d; +split_me(int a) +{ + int t = 0; + if (d>4) + return; + do + { + long_function (t); + long_function (t); + long_function (t); + long_function (t); + long_function (t); + long_function (t); + make_me_irregular: + long_function (t); + long_function (t); + long_function (t); + long_function (t); + long_function (t); + t=b; + } + while (t); + if (c) + goto make_me_irregular; +} + +main() +{ + split_me (1); + split_me (2); + split_me (3); + split_me (4); + split_me (5); +} +/* { dg-final { scan-tree-dump-times "Splitting function" 1 "fnsplit"} } */ +/* { dg-final { cleanup-tree-dump "fnsplit" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-3.c new file mode 100644 index 00000000000..05a37f81027 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-3.c @@ -0,0 +1,21 @@ +int baz (void); +static int +foo (int x) +{ + if (__builtin_expect (x <= 0, 0)) + { + __builtin_printf ("foo\n"); + __builtin_printf ("foo\n"); + __builtin_printf ("foo\n"); + __builtin_abort (); + } + return 6; +} + +int a,b,c; + +int +bar (int x) +{ + return foo (a) + foo (b) + foo (c); +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-4.c new file mode 100644 index 00000000000..9d5864bad3c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ipa-split-4.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-fnsplit" } */ +int make_me_big (void); +void abort (void); + +int +split_me (int a) +{ + if (__builtin_expect(a<10, 1)) + { + abort (); + } + else + { + make_me_big (); + make_me_big (); + make_me_big (); + make_me_big (); + return a+1; + } +} + +int +test(void) +{ + return split_me (0)+split_me(1)+split_me(2); +} +/* { dg-final { scan-tree-dump-times "Splitting function" 1 "fnsplit"} } */ +/* { dg-final { cleanup-tree-dump "fnsplit" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c b/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c index 9733d8f99d8..4b8239e4531 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-pre-stats" } */ +/* { dg-options "-O2 -fdump-tree-pre-stats -fdump-tree-fre" } */ #include <stddef.h> union tree_node; @@ -72,7 +72,9 @@ main (void) remove_useless_vars (&unexpanded_var_list, 0); return 0; } -/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre" } } */ + +/* See PR44656. The last elimination is only done by PRE. */ +/* { dg-final { scan-tree-dump-not "= unexpanded_var_list;" "fre" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump-times "Eliminated: 1" 2 "pre" } } */ /* { dg-final { scan-tree-dump-times "Insertions: 2" 1 "pre" } } */ /* { dg-final { cleanup-tree-dump "pre" } } */ - diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-1.c index 736a4d95577..bff58f6a41d 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-1.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all" } */ +/* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all -march=i486" { target { i?86-*-* && ilp32} } } */ /* { dg-require-effective-target size32plus } */ double u[1782225]; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-3.c index 51508f98a61..d7dd211e9bc 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-3.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all" } */ +/* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all -march=i486" { target { i?86-*-* && ilp32} } } */ /* { dg-require-effective-target size32plus } */ double u[1782225]; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-4.c index e2d6abced60..6682538a2ed 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-4.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-4.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all" } */ +/* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all -march=i486" { target { i?86-*-* && ilp32} } } */ /* { dg-require-effective-target size32plus } */ double u[1782225]; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-5.c index 2f64925e901..3540723dc56 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-5.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-5.c @@ -1,5 +1,6 @@ /* { dg-do compile { target { size32plus } } } */ /* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all" } */ +/* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all -march=i486" { target { i?86-*-* && ilp32} } } */ int foo () { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-6.c index edf30a3d573..e6a290a6a13 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-6.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-6.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all" } */ +/* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all -march=i486" { target { i?86-*-* && ilp32} } } */ /* { dg-require-effective-target size32plus } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-8.c b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-8.c index 21f8ffafce6..67569d8a316 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ltrans-8.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ltrans-8.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all" } */ +/* { dg-options "-O2 -ftree-loop-linear -fdump-tree-ltrans-all -march=i486" { target { i?86-*-* && ilp32} } } */ double foo(double *a) { int i,j; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr17141-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr17141-1.c index af867515002..853fe70c623 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr17141-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr17141-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-forwprop1" } */ +/* { dg-options "-O -fdump-tree-forwprop1" } */ struct A { int i; }; int @@ -11,5 +11,7 @@ foo(struct A *locp, int str) return locp->i; } -/* { dg-final { scan-tree-dump "locp.*->i =" "forwprop1" } } */ +/* We should have propagated &locp->i into its dereference. */ + +/* { dg-final { scan-tree-dump "locp_\[^\\n\]* =" "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c index 2409608d9da..f924d26cca2 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1" } */ +/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-dce1" } */ int foo (int *p) @@ -16,8 +16,9 @@ foo (int *p) } /* Target with fno-delete-null-pointer-checks should not fold checks */ -/* { dg-final { scan-tree-dump-times "Folding predicate " 1 "vrp1" { target { ! keeps_null_pointer_checks } } } } */ +/* { dg-final { scan-tree-dump "Folding predicate " "vrp1" { target { ! keeps_null_pointer_checks } } } } */ /* { dg-final { scan-tree-dump-times "Folding predicate " 0 "vrp1" { target { keeps_null_pointer_checks } } } } */ -/* { dg-final { scan-tree-dump-not "b_. =" "vrp1" { target { ! avr-*-* } } } } */ -/* { dg-final { scan-tree-dump "b_. =" "vrp1" { target { avr-*-* } } } } */ +/* { dg-final { scan-tree-dump-not "b_. =" "dce1" { target { ! avr-*-* } } } } */ +/* { dg-final { scan-tree-dump "b_. =" "dce1" { target { avr-*-* } } } } */ /* { dg-final { cleanup-tree-dump "vrp1" } } */ +/* { dg-final { cleanup-tree-dump "dce1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr44258.c b/gcc/testsuite/gcc.dg/tree-ssa/pr44258.c new file mode 100644 index 00000000000..a98d3ceccbf --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr44258.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-esra-details" } */ + +struct blah +{ + char a[4]; +}; + +struct str +{ + struct blah b1; + char x; +}; + +struct val +{ + char y; + struct blah b2; +}; + +union U +{ + struct str str; + struct val val; +}; + + +extern struct blah e_b1, e_b2; +extern union U *e_u; + +int foo (int b) +{ + union U u; + + u.str.b1 = e_b1; + u.val.b2 = e_b2; + u.str.b1.a[3] = 0; + + *e_u = u; +} + +/* { dg-final { scan-tree-dump-times "Created a replacement" 0 "esra"} } */ +/* { dg-final { cleanup-tree-dump "esra" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr44423.c b/gcc/testsuite/gcc.dg/tree-ssa/pr44423.c new file mode 100644 index 00000000000..6232d64963a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr44423.c @@ -0,0 +1,47 @@ +/* { dg-do compile { target x86_64-*-* } } */ +/* { dg-options "-O2 -fdump-tree-esra-details" } */ + +#include "xmmintrin.h" + +typedef __m128 v4sf; // vector of 4 floats (SSE1) + +#define ARRSZ 1024 + +typedef union { + float f[4]; + v4sf v; +} V4SF; + +struct COLOUR { + float r,g,b; +}; + +void func (float *pre1, float pre2, struct COLOUR *a, V4SF *lpic) + { + V4SF va; + int y; + va.f[0]=a->r;va.f[1]=a->g;va.f[2]=a->b;va.f[3]=0.f; + for (y=0; y<20; ++y) + { + float att = pre1[y]*pre2; + v4sf tmpatt=_mm_load1_ps(&att); + tmpatt=_mm_mul_ps(tmpatt,va.v); + lpic[y].v=_mm_add_ps(tmpatt,lpic[y].v); + } + } + +int main() + { + V4SF lpic[ARRSZ]; + float pre1[ARRSZ]; + int i; + struct COLOUR col={0.,2.,4.}; + for (i=0; i<20; ++i) + pre1[i]=0.4; + for (i=0;i<10000000;++i) + func(&pre1[0],0.3,&col,&lpic[0]); + return 0; + } + +/* { dg-final { scan-tree-dump-times "Created a replacement" 0 "esra"} } */ +/* { dg-final { cleanup-tree-dump "esra" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr44483.c b/gcc/testsuite/gcc.dg/tree-ssa/pr44483.c new file mode 100644 index 00000000000..cdae91a9098 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr44483.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-c -O3" { target *-*-* } } */ + +int ffesum (void) { + int ch[4], ii, jj, kk; + char asc[32]; + + for (ii = 0; ii < 4; ii++) + { + for (jj = 0; jj < 4; jj++) + ch[jj] = ii; + for (kk = 0; kk < 13; kk++) + for (jj = 0; jj < 4; jj += 2) + if ((unsigned char) ch[jj] || (unsigned char) ch[jj + 1]) + ch[jj]++; + for (jj = 0; jj < 4; jj++) + asc[4 * jj + ii] = ch[jj]; + } + return asc[0]; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/prefetch-7.c b/gcc/testsuite/gcc.dg/tree-ssa/prefetch-7.c index 3b9e19fe5e5..9e453a7c08a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/prefetch-7.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/prefetch-7.c @@ -5,20 +5,12 @@ /* { dg-options "-O2 -fprefetch-loop-arrays -march=athlon -msse2 -mfpmath=sse --param simultaneous-prefetches=100 -fdump-tree-aprefetch-details -fdump-tree-optimized" } */ #define K 1000000 -int a[K], b[K]; +int a[K]; void test(int *p) { unsigned i; - /* Nontemporal store should be used for a. */ - for (i = 0; i < K; i++) - a[i] = 0; - - /* Nontemporal store should be used for a, nontemporal prefetch for b. */ - for (i = 0; i < K; i++) - a[i] = b[i]; - /* Nontemporal store should not be used here (only write and read temporal prefetches). */ for (i = 0; i < K - 10000; i++) @@ -44,18 +36,14 @@ void test(int *p) } /* { dg-final { scan-tree-dump-times "Issued prefetch" 5 "aprefetch" } } */ -/* { dg-final { scan-tree-dump-times "Issued nontemporal prefetch" 3 "aprefetch" } } */ -/* { dg-final { scan-tree-dump-times "a nontemporal store" 2 "aprefetch" } } */ +/* { dg-final { scan-tree-dump-times "Issued nontemporal prefetch" 2 "aprefetch" } } */ +/* { dg-final { scan-tree-dump-times "a nontemporal store" 0 "aprefetch" } } */ -/* { dg-final { scan-tree-dump-times "builtin_prefetch" 8 "optimized" } } */ -/* { dg-final { scan-tree-dump-times "=\\{nt\\}" 18 "optimized" } } */ -/* { dg-final { scan-tree-dump-times "__builtin_ia32_mfence" 2 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "builtin_prefetch" 7 "optimized" } } */ /* { dg-final { scan-assembler-times "prefetchw" 5 } } */ /* { dg-final { scan-assembler-times "prefetcht" 1 } } */ -/* { dg-final { scan-assembler-times "prefetchnta" 2 } } */ -/* { dg-final { scan-assembler-times "movnti" 18 } } */ -/* { dg-final { scan-assembler-times "mfence" 2 } } */ +/* { dg-final { scan-assembler-times "prefetchnta" 1 } } */ /* { dg-final { cleanup-tree-dump "aprefetch" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/prefetch-8.c b/gcc/testsuite/gcc.dg/tree-ssa/prefetch-8.c new file mode 100644 index 00000000000..a05d552ace1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/prefetch-8.c @@ -0,0 +1,28 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target sse2 } */ +/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=athlon" } } */ +/* { dg-options "-O2 -fprefetch-loop-arrays -march=athlon -msse2 -mfpmath=sse --param simultaneous-prefetches=100 -fdump-tree-aprefetch-details -fdump-tree-optimized" } */ + +#define K 1000000 +int a[K]; + +void test() +{ + unsigned i; + + /* Nontemporal store should be used for a. */ + for (i = 0; i < K; i++) + a[i] = 0; +} + +/* { dg-final { scan-tree-dump-times "a nontemporal store" 1 "aprefetch" } } */ + +/* { dg-final { scan-tree-dump "=\\{nt\\}" "optimized" } } */ +/* { dg-final { scan-tree-dump-times "__builtin_ia32_mfence" 1 "optimized" } } */ + +/* { dg-final { scan-assembler "movnti" } } */ +/* { dg-final { scan-assembler-times "mfence" 1 } } */ + +/* { dg-final { cleanup-tree-dump "aprefetch" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/prefetch-9.c b/gcc/testsuite/gcc.dg/tree-ssa/prefetch-9.c new file mode 100644 index 00000000000..eb22a660e43 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/prefetch-9.c @@ -0,0 +1,32 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target sse2 } */ +/* { dg-skip-if "" { i?86-*-* x86_64-*-* } { "-march=*" } { "-march=athlon" } } */ +/* { dg-options "-O2 -fprefetch-loop-arrays -march=athlon -msse2 -mfpmath=sse --param simultaneous-prefetches=100 -fdump-tree-aprefetch-details -fdump-tree-optimized" } */ + +#define K 1000000 +int a[K], b[K]; + +void test() +{ + unsigned i; + + /* Nontemporal store should be used for a, nontemporal prefetch for b. */ + for (i = 0; i < K; i++) + a[i] = b[i]; + +} + +/* { dg-final { scan-tree-dump-times "Issued nontemporal prefetch" 1 "aprefetch" } } */ +/* { dg-final { scan-tree-dump-times "a nontemporal store" 1 "aprefetch" } } */ + +/* { dg-final { scan-tree-dump-times "builtin_prefetch" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump "=\\{nt\\}" "optimized" } } */ +/* { dg-final { scan-tree-dump-times "__builtin_ia32_mfence" 1 "optimized" } } */ + +/* { dg-final { scan-assembler-times "prefetchnta" 1 } } */ +/* { dg-final { scan-assembler "movnti" } } */ +/* { dg-final { scan-assembler-times "mfence" 1 } } */ + +/* { dg-final { cleanup-tree-dump "aprefetch" } } */ +/* { 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 index b61674dff3a..6db9ba0d871 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-alias" } */ +/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-ealias" } */ extern void abort (void); struct X { @@ -22,5 +22,5 @@ foo(int i, int j, int k, int off) return *q; } -/* { dg-final { scan-tree-dump "q_., points-to vars: { k }" "alias" } } */ -/* { dg-final { cleanup-tree-dump "alias" } } */ +/* { dg-final { scan-tree-dump "q_., points-to vars: { k }" "ealias" } } */ +/* { dg-final { cleanup-tree-dump "ealias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c index adb01b23165..85b96b190e2 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-alias" } */ +/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-ealias" } */ extern void abort (void); struct X { @@ -22,5 +22,5 @@ foo(int i, int j, int k, int off) return *q; } -/* { dg-final { scan-tree-dump "q_., points-to vars: { i }" "alias" } } */ -/* { dg-final { cleanup-tree-dump "alias" } } */ +/* { dg-final { scan-tree-dump "q_., points-to vars: { i }" "ealias" } } */ +/* { dg-final { cleanup-tree-dump "ealias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-21.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-21.c index 3b23c36238e..3f4adf43483 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-21.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-21.c @@ -21,5 +21,9 @@ int bar (void) return q->i; } -/* { dg-final { scan-tree-dump-times "a.b.i" 2 "ccp1" } } */ +/* The first access is through struct A, so a.b.i is fine, + the second access needs to preserve the original access type struct B. */ + +/* { dg-final { scan-tree-dump-times "a.b.i" 1 "ccp1" } } */ +/* { dg-final { scan-tree-dump-times "MEM\\\[\\\(struct B \\\*\\\)&a\\\].i" 1 "ccp1" } } */ /* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-23.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-23.c index ac7f068cfd1..fb4af2d484d 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-23.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-23.c @@ -15,5 +15,5 @@ int foo (void) return *x; } -/* { dg-final { scan-tree-dump "a.i\\\[1\\\]" "ccp1" } } */ +/* { dg-final { scan-tree-dump "MEM\\\[\\\(int \\\*\\\)&a \\\+ 4B\\\]" "ccp1" } } */ /* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-25.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-25.c index f29c4942ace..7912a57f09e 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-25.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-25.c @@ -9,6 +9,6 @@ int foo(int i) } /* { dg-final { scan-tree-dump "&a\\\[\[iD\]\\\." "ccp1" } } */ -/* { dg-final { scan-tree-dump "= a\\\[\[iD\]\\\." "forwprop1" } } */ +/* { dg-final { scan-tree-dump "= .*&a\\\]\\\[\[iD\]\\\." "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "ccp1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-26.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-26.c index 542c4293960..c0a548155cb 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-26.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-26.c @@ -7,5 +7,5 @@ int foo(int i) return (a + 1)[i]; } -/* { dg-final { scan-tree-dump "= a\\\[D\\\." "forwprop1" } } */ +/* { dg-final { scan-tree-dump "=.*&a\\\]\\\[D\\\." "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-1.c index 0cb63242c0e..b9ec6bc720f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-1.c @@ -11,6 +11,5 @@ int f(int *a) return *c + t; } -/* { dg-final { scan-tree-dump "Replaced \\\(int \\\*\\\) b_.*with a_" "fre" } } */ -/* { dg-final { scan-tree-dump "Replaced \\\*c_.*with t_" "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced \\\*a_\[^\n\].*with t_" "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ 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 ae9eb5a2002..972e6c69ef9 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c @@ -23,6 +23,5 @@ void foo(double (*q)[4], struct Foo *tmp1) } } -/* { dg-final { scan-tree-dump "Inserted .* &a" "fre" } } */ -/* { dg-final { scan-tree-dump "Replaced tmp1_.\\\(D\\\)->data" "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced tmp1_.\\\(D\\\)->data with &a" "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ 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 81b82fe4880..9d1b3f2ba92 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c @@ -27,6 +27,5 @@ void foo(double (*q)[4]) bar(a); } -/* { dg-final { scan-tree-dump "Inserted .* &a" "fre" } } */ -/* { dg-final { scan-tree-dump "Replaced tmp1.data" "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced tmp1.data with &a" "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-26.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-26.c index 978b7abab3a..b986bdd92a9 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-26.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-26.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Os -fdump-tree-pre-details" } */ +/* { dg-options "-O -fdump-tree-fre-details" } */ typedef union { @@ -23,5 +23,5 @@ void foo(SA* pResult, SB* method, SC* self) pResult->data = pResult->data; } -/* { dg-final { scan-tree-dump "Deleted redundant store" "pre" } } */ -/* { dg-final { cleanup-tree-dump "pre" } } */ +/* { dg-final { scan-tree-dump "Deleted redundant store" "fre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-7.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-7.c index c87f62e69c6..f87476a3a9f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-7.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-7.c @@ -7,6 +7,6 @@ foo (int *array) return array[1]; return 0; } -/* We should eliminate one address calculation, and one load. */ -/* { dg-final { scan-tree-dump-times "Eliminated: 2" 1 "fre"} } */ +/* We should eliminate one load. */ +/* { dg-final { scan-tree-dump-times "Eliminated: 1" 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 27ccda5264a..7caf4eec6f8 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: 6" 1 "fre"} } */ +/* { dg-final { scan-tree-dump-times "Eliminated: 5" 1 "fre"} } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-1.c b/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-1.c index 78e92d769e4..7dc7833647b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-1.c @@ -1,5 +1,5 @@ /* { dg-do "compile" } */ -/* { dg-options "-O2 -fdump-tree-fre" } */ +/* { dg-options "-O2 -fdump-tree-fre-details" } */ struct S { float f; }; int __attribute__((noinline)) @@ -11,5 +11,5 @@ foo (float *r, struct S *p) return i + *q; } -/* { dg-final { scan-tree-dump-times "\\\*q" 1 "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced\[^\n\]*with i_." "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-2.c b/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-2.c index aa9e142bba0..812dac928da 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/struct-aliasing-2.c @@ -12,7 +12,8 @@ foo ( struct S *p) } -/* There should only be one load of p->f because fwprop can change *(int *)&p->f into just (int)p->f. */ -/* { dg-final { scan-tree-dump-times "p_.\\\(D\\\)->f" 1 "fre" } } */ +/* There should only be one load of p->f because fwprop can change + *(int *)&p->f into just (int)p->f. */ +/* { dg-final { scan-tree-dump-times "= \[^\n\]*p_.\\\(D\\\)" 1 "fre" } } */ /* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp47.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp47.c index 73382941488..25b77201c59 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp47.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp47.c @@ -5,6 +5,7 @@ this. */ /* { dg-do compile { target { ! "mips*-*-* s390*-*-* avr-*-*" } } } */ /* { dg-options "-O2 -fdump-tree-vrp -fdump-tree-dom" } */ +/* { dg-options "-O2 -fdump-tree-vrp -fdump-tree-dom -march=i586" { target { i?86-*-* && ilp32 } } } */ int h(int x, int y) { diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-10.c b/gcc/testsuite/gcc.dg/vect/bb-slp-10.c index 1a678ca3677..d31ffb47c34 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-10.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-10.c @@ -28,6 +28,9 @@ main1 (unsigned int x, unsigned int y) *pout++ = a2 * x; *pout++ = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[1] != (in[0] + 23) * x || out[2] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-11.c b/gcc/testsuite/gcc.dg/vect/bb-slp-11.c index 92a86cd242a..14c4f3a82c6 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-11.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-11.c @@ -27,6 +27,9 @@ main1 (unsigned int x, unsigned int y) *pout++ = a2 * x; *pout++ = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != (in[0] + 23) * x || out[1] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-13.c b/gcc/testsuite/gcc.dg/vect/bb-slp-13.c index 5005ae5019f..7e1d3ff798b 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-13.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-13.c @@ -25,6 +25,9 @@ main1 (unsigned int x, unsigned int y) out[2] = a2 * x; out[3] = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != (in[0] + 23) * x || out[1] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-14.c b/gcc/testsuite/gcc.dg/vect/bb-slp-14.c index 673a163c92f..6ffbe28741a 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-14.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-14.c @@ -26,6 +26,9 @@ main1 (unsigned int x, unsigned int y) out[2] = a2 * x; out[3] = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != (in[0] + 23) * x || out[1] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-15.c b/gcc/testsuite/gcc.dg/vect/bb-slp-15.c index ba8bc757e86..b927348c810 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-15.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-15.c @@ -30,6 +30,9 @@ main1 (unsigned int x, unsigned int y) out[2] = a2 * x; out[3] = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != (in[0] + 23) * x || out[1] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-17.c b/gcc/testsuite/gcc.dg/vect/bb-slp-17.c index 36227391d2e..bb4bd5d8bc5 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-17.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-17.c @@ -34,6 +34,9 @@ main1 (unsigned int x, unsigned int y) out[2] = a2 * x; out[3] = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != (in[0] + 23) * x || out[1] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-18.c b/gcc/testsuite/gcc.dg/vect/bb-slp-18.c index ab99f822aff..c5da3516c46 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-18.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-18.c @@ -25,6 +25,9 @@ main1 (unsigned int x, unsigned int y) out[2] = a2 * x; out[3] = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != a0 * x || out[1] != a1 * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-19.c b/gcc/testsuite/gcc.dg/vect/bb-slp-19.c index 5ee83a1945e..2cb1568488a 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-19.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-19.c @@ -9,10 +9,10 @@ unsigned short out[N]; unsigned short in[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; +int i; __attribute__ ((noinline)) int main1 () { - int i; unsigned short *pin = &in[0]; unsigned short *pout = &out[0]; @@ -27,6 +27,9 @@ main1 () *pout++ = *pin++; *pout++ = *pin++; + if (i) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != in[0] || out[1] != in[1] diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-20.c b/gcc/testsuite/gcc.dg/vect/bb-slp-20.c index 910eae5baff..ec12051e00a 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-20.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-20.c @@ -37,6 +37,9 @@ main1 (unsigned int x, unsigned int y) out[2] = a2 * x; out[3] = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != (in[0] + 23) * x || out[1] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-21.c b/gcc/testsuite/gcc.dg/vect/bb-slp-21.c index f0b4f6b1ac8..697914ab053 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-21.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-21.c @@ -37,6 +37,9 @@ main1 (unsigned int x, unsigned int y) out[2] = a2 * x; out[3] = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != (in[0] + 23) * x || out[1] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-22.c b/gcc/testsuite/gcc.dg/vect/bb-slp-22.c index 3e6e685f118..7463bc653d9 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-22.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-22.c @@ -36,6 +36,9 @@ main1 (unsigned int x, unsigned int y) out[3] = a3 * y; } + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if ((x <= y && (out[0] != (in[0] + 23) * x diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-23.c b/gcc/testsuite/gcc.dg/vect/bb-slp-23.c index 640d81a2560..d125f9d7115 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-23.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-23.c @@ -30,6 +30,9 @@ main1 (unsigned int x, unsigned int y) out[2] = a2 * x; out[3] = a3 * y; + if (x) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != (in[0] + 23) * x || out[1] != (in[1] + 142) * y diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-3.c b/gcc/testsuite/gcc.dg/vect/bb-slp-3.c index 07ad7129ad7..c35f035e0f2 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-3.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-3.c @@ -9,10 +9,10 @@ unsigned int out[N]; unsigned int in[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; +int i; __attribute__ ((noinline)) int main1 () { - int i; unsigned int *pin = &in[0]; unsigned int *pout = &out[0]; @@ -21,6 +21,9 @@ main1 () *pout++ = *pin++; *pout++ = *pin++; + if (i) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != in[0] || out[1] != in[1] diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-4.c b/gcc/testsuite/gcc.dg/vect/bb-slp-4.c index 4ed8d7c6b39..faa90f3dfde 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-4.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-4.c @@ -9,16 +9,19 @@ unsigned short out[N]; unsigned short in[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; +int i; __attribute__ ((noinline)) int main1 () { - int i; unsigned short *pin = &in[0]; unsigned short *pout = &out[0]; *pout++ = *pin++; *pout++ = *pin++; + if (i) + __asm__ volatile ("" : : : "memory"); + /* Check results. */ if (out[0] != in[0] || out[1] != in[1]) diff --git a/gcc/testsuite/gcc.dg/vect/pr44507.c b/gcc/testsuite/gcc.dg/vect/pr44507.c new file mode 100644 index 00000000000..50c485399a4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr44507.c @@ -0,0 +1,55 @@ +/* { dg-require-effective-target vect_int } */ + +#include <stdlib.h> +#include "tree-vect.h" + +int seeIf256ByteArrayIsConstant( + unsigned char *pArray) +{ + int index; + unsigned int curVal, orVal, andVal; + int bytesAreEqual = 0; + + if (pArray != 0) + { + for (index = 0, orVal = 0, andVal = 0xFFFFFFFF; + index < 64; + index += (int)sizeof(unsigned int)) + { + curVal = *((unsigned int *)(&pArray[index])); + orVal = orVal | curVal; + andVal = andVal & curVal; + } + + if (!((orVal == andVal) + && ((orVal >> 8) == (andVal & 0x00FFFFFF)))) + abort (); + } + + return 0; +} + + +int main(int argc, char** argv) +{ + unsigned char array1[64] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + }; + + argv = argv; + argc = argc; + + check_vect (); + + return seeIf256ByteArrayIsConstant(&array1[0]); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/testsuite/gcc.dg/vect/slp-perm-5.c b/gcc/testsuite/gcc.dg/vect/slp-perm-5.c index e7c9f7feaa8..4e0c145ef1f 100644 --- a/gcc/testsuite/gcc.dg/vect/slp-perm-5.c +++ b/gcc/testsuite/gcc.dg/vect/slp-perm-5.c @@ -61,8 +61,7 @@ int main (int argc, const char* argv[]) input2[i] = i%256; output[i] = 0; output2[i] = 0; - if (input[i] > 256) - abort (); + __asm__ volatile (""); } foo (input, output, input2, output2); diff --git a/gcc/testsuite/gcc.dg/vect/slp-perm-6.c b/gcc/testsuite/gcc.dg/vect/slp-perm-6.c index 430415c5a33..27e60369c6c 100644 --- a/gcc/testsuite/gcc.dg/vect/slp-perm-6.c +++ b/gcc/testsuite/gcc.dg/vect/slp-perm-6.c @@ -60,8 +60,7 @@ int main (int argc, const char* argv[]) input2[i] = i%256; output[i] = 0; output2[i] = 0; - if (input[i] > 256) - abort (); + __asm__ volatile (""); } foo (input, output, input2, output2); diff --git a/gcc/testsuite/gcc.dg/volatile2.c b/gcc/testsuite/gcc.dg/volatile2.c index 4bfc441c862..d663123c83d 100644 --- a/gcc/testsuite/gcc.dg/volatile2.c +++ b/gcc/testsuite/gcc.dg/volatile2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-gimple -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ struct GTeth_desc { @@ -12,14 +12,11 @@ struct GTeth_softc void foo(struct GTeth_softc *sc) { - /* Verify that we retain the cast to (volatile struct GTeth_desc *) - after gimplification and that we keep the volatileness on the + /* Verify that we retain the volatileness on the store until after optimization. */ volatile struct GTeth_desc *p = &sc->txq_desc[0]; p->ed_cmdsts = 0; } -/* { dg-final { scan-tree-dump "\\(volatile struct GTeth_desc \\*\\) D" "gimple" } } */ /* { dg-final { scan-tree-dump "{v}" "optimized" } } */ -/* { dg-final { cleanup-tree-dump "gimple" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ |