diff options
author | Ian Lance Taylor <iant@golang.org> | 2022-02-11 15:02:44 -0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2022-02-11 15:02:44 -0800 |
commit | 9a510fb0970d3d9a4201bce8965cabe67850386b (patch) | |
tree | 43d7fd2bbfd7ad8c9625a718a5e8718889351994 /gcc/testsuite/gcc.dg/tree-ssa | |
parent | a6d3012b274f38b20e2a57162106f625746af6c6 (diff) | |
parent | 8dc2499aa62f768c6395c9754b8cabc1ce25c494 (diff) | |
download | gcc-9a510fb0970d3d9a4201bce8965cabe67850386b.zip gcc-9a510fb0970d3d9a4201bce8965cabe67850386b.tar.gz gcc-9a510fb0970d3d9a4201bce8965cabe67850386b.tar.bz2 |
Merge from trunk revision 8dc2499aa62f768c6395c9754b8cabc1ce25c494
Diffstat (limited to 'gcc/testsuite/gcc.dg/tree-ssa')
128 files changed, 2098 insertions, 199 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bittest.c b/gcc/testsuite/gcc.dg/tree-ssa/bittest.c new file mode 100644 index 0000000..7d712ca --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/bittest.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + + +void bar (void); + +void +foo(unsigned int abc123) +{ + unsigned int xyzpdq = (1 << abc123); + if ((xyzpdq & 0x800) != 0) + bar(); +} + +void +baz(unsigned int abc123) +{ + unsigned int xyzpdq = (1 << abc123); + if ((xyzpdq & 0x800) == 0) + bar(); +} + +/* What we want to verify is that the bit test against xyzpdq is + replaced with a test against abc123 which avoids the shifting + and bit ops. */ +/* { dg-final { scan-tree-dump-not "xyzpdq" "optimized"} } */ +/* { dg-final { scan-tree-dump-times "if .abc123" 2 "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-snprintf-13.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-snprintf-13.c new file mode 100644 index 0000000..c5b5f0c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-snprintf-13.c @@ -0,0 +1,131 @@ +/* PR tree-optimization/104119 - unexpected -Wformat-overflow after strlen + in ILP32 since Ranger integration + Verify that unlike -Wformat-overflow the sprintf optimization doesn't + assume the length of a string isn't bounded by the size of the array + member it's stored in. + { dg-do compile } + { dg-options "-O2 -Wall -fdump-tree-optimized" } */ + +typedef __SIZE_TYPE__ size_t; + +void* memcpy (void*, const void*, size_t); +int snprintf (char*, size_t, const char*, ...); +char* strcpy (char*, const char*); +size_t strlen (const char*); + +extern void keep_call_on_line (int); +extern void elim_call_on_line (int); + +void sink (void*, ...); + +struct __attribute__ ((packed)) S +{ + char a4[4], b4[4], ax[]; +}; + +extern struct S es; + +void test_extern_decl_memcpy (void) +{ + struct S *p = &es; + + /* Set strlen (P->A4) to [3, PTRDIFF - 2]. */ + memcpy (p->a4, "123", 3); + int i = snprintf (0, 0, "%s", p->a4); + if (i > 4) + keep_call_on_line (__LINE__); +} + +void test_extern_decl_strcpy_3 (void) +{ + struct S *p = &es; + + /* Set strlen (P->A4) to 3. */ + strcpy (p->a4, "123"); + int i = snprintf (0, 0, "%s", p->a4); + if (i > 4) + elim_call_on_line (__LINE__); +} + +void test_extern_decl_strcpy_X (const char *s) +{ + struct S *p = &es; + + /* Set strlen (P->A4) to [0, PTRDIFF_MAX - 2]. */ + strcpy (p->a4, s); + int i = snprintf (0, 0, "%s", p->a4); + if (i > 4) + keep_call_on_line (__LINE__); +} + +size_t test_extern_decl_strlen (void) +{ + struct S *p = &es; + + /* Set strlen (P->A4) to [0, PTRDIFF - 2]. */ + size_t n = strlen (p->a4); + int i = snprintf (0, 0, "%s", p->a4); + if (i > 4) + keep_call_on_line (__LINE__); + return n; +} + + +static struct S ss; + +/* Store and read SS to prevent optimizers from assuming it's unchanged. */ + +extern void set_ss (struct S *p) +{ + if (ss.a4[(unsigned char)*p->a4]) + __builtin_memcpy (&ss, p, sizeof ss); +} + + +void test_static_decl_memcpy (void) +{ + struct S *p = &ss; + + /* Set strlen (P->A4) to [3, PTRDIFF - 2]. */ + memcpy (p->a4, "123", 3); + int i = snprintf (0, 0, "%s", p->a4); + if (i > 4) + keep_call_on_line (__LINE__); +} + +void test_static_decl_strcpy_3 (void) +{ + struct S *p = &ss; + + /* Set strlen (P->A4) to 3. */ + strcpy (p->a4, "123"); + int i = snprintf (0, 0, "%s", p->a4); + if (i > 4) + elim_call_on_line (__LINE__); +} + +void test_static_decl_strcpy_X (const char *s) +{ + struct S *p = &ss; + + /* Set strlen (P->A4) to [0, PTRDIFF_MAX - 2]. */ + strcpy (p->a4, s); + int i = snprintf (0, 0, "%s", p->a4); + if (i > 4) + keep_call_on_line (__LINE__); +} + +size_t test_static_decl_strlen (void) +{ + struct S *p = &ss; + + /* Set strlen (P->A4) to [0, PTRDIFF - 2]. */ + size_t n = strlen (p->a4); + int i = snprintf (0, 0, "%s", p->a4); + if (i > 4) + keep_call_on_line (__LINE__); + return n; +} + +/* { dg-final { scan-tree-dump-times "keep_call_on_line" 6 "optimized" } } + { dg-final { scan-tree-dump-not "elim_call_on_line" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-snprintf-warn-6.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-snprintf-warn-6.c new file mode 100644 index 0000000..2857e83 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-snprintf-warn-6.c @@ -0,0 +1,47 @@ +/* PR tree-optimization/78969 - bogus snprintf truncation warning due to + missing range info + { dg-do compile } + { dg-options "-O2 -Wall -Wformat-truncation=2" } */ + +typedef __SIZE_TYPE__ size_t; + +extern int snprintf (char*, size_t, const char*, ...); + + +void f (unsigned j, char *p) +{ + if (j > 999) + j = 0; + + snprintf (p, 4, "%3u", j); +} + +void g (unsigned j, char *p) +{ + if (j > 999) + return; + + snprintf (p, 4, "%3u", j); // { dg-bogus "-Wformat-truncation" } +} + + +void pr78969_c4 (char * p /* NNN\0" */) +{ + for (int idx = 0; idx < 1000; idx++) { + // guaranteed to be in [0-999] range + snprintf (p, 4, "%d", idx); // { dg-bogus "-Wformat-truncation" } + } +} + + +void sink (int, ...); + +char d[4]; + +void pr78969_c12 (unsigned i) +{ + if (i >= 1000 && i < 10000) + snprintf (d, 4, "%3d", i / 10); // { dg-bogus "-Wformat-truncation" } + else + sink (i / 10 % 10); +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-16.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-16.c index d6cbfe3..f975e16 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-16.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-16.c @@ -130,16 +130,18 @@ void test_width_var (void) { /* Create an unsigned range with a lower bound greater than 1 and - an upper bound in excess of INT_MAX and verify that the lower - bound isn't used as the minimum output (since the excessive - upper bound wraps around zero). It's possible to constrain - the upper bound on the output more, based on the upper bound - of the width here, but not worth the trouble. */ - extern unsigned w; + an upper bound in excess of INT_MAX and verify that after conversion + to signed int the lower bound isn't used as the minimum output (since + the excessive upper bound wraps around zero). Passing the precision + as unsigned, without the cast to signed int, is undedined. + It's possible to constrain the upper bound on the output more, based + on the upper bound of the width here, but not worth the trouble. */ + unsigned w = W (unsigned); if (w < 5 || (unsigned)-1 - 7 < w) w = 5; + int val = V (int); - T ("%*u", w, V (int)); /* { dg-warning "between 1 and 2147483648 " } */ + T ("%*u", (int)w, val); /* { dg-warning "between 1 and 2147483648 " } */ } { @@ -234,13 +236,17 @@ void test_precision_var (void) { /* Similar to the corresponding width case, create an unsigned range with a lower bound greater than 1 and an upper bound in excess of - INT_MAX and verify that the lower bound isn't used as the minimum - output (since the excessive upper bound wraps around zero). */ - extern unsigned p; + INT_MAX and verify that after conversion to int the lower bound isn't + used as the minimum output (since the excessive upper bound wraps + around zero). Passing the precision as unsigned, without a cast to + signed int, is undefined. */ + unsigned p = V (unsigned); if (p < 7 || (unsigned)-1 - 9 < p) p = 7; - T ("%.*u", p, V (int)); /* { dg-warning "up to 2147483647 " } */ + int val = V (int); + + T ("%.*u", (int)p, val); /* { dg-warning "up to 2147483647 " } */ } { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-22.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-22.c index 685a4fd..82eb585 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-22.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-22.c @@ -18,7 +18,18 @@ void g (char *s1, char *s2) if (n + d + 1 >= 1025) return; - sprintf (b, "%s.%s", s1, s2); // { dg-bogus "\\\[-Wformat-overflow" } + /* Ranger can find ranges here: + [1] n_6: size_t [0, 1023] + [2] d_8: size_t [0, 1023] + + Whereas evrp can't really: + [1] n_6: size_t [0, 9223372036854775805] + [2] d_8: size_t [0, 9223372036854775805] + + This is causing the sprintf warning pass to issue a false + positive here. */ + + sprintf (b, "%s.%s", s1, s2); // { dg-bogus "\\\[-Wformat-overflow" "" { xfail *-*-* } } f (b); } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-25.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-25.c index df46023..a28f066 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-25.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-25.c @@ -1,6 +1,7 @@ /* PR middle-end/97373 - missing warning on sprintf into allocated destination { dg-do compile } - { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */ + { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } + { dg-require-effective-target alloca } */ #include "../range.h" diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-28.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-28.c new file mode 100644 index 0000000..d58d980 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-28.c @@ -0,0 +1,21 @@ +/* Verify that -Wformat-overflow uses context-sensitive ranges even + at -O0 to avoid both false positives and negatives. + { dg-do compile } + { dg-options "-O0 -Wall" } */ + +extern int sprintf (char*, const char*, ...); + +extern char a[4]; + +void test_context_range (int c) +{ + int i = 998; + + /* Prior to the switch to Ranger in GCC 12 -Wformat-overflow triggers + for both calls because EVRP doesn't expose the accurate range of + the argument. */ + if (c) + sprintf (a, "%i", i + 2); // { dg-warning "writing a terminating nul past the end of the destination" } + else + sprintf (a, "%i", i + 1); // { dg-bogus "-Wformat-overflow" } +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-29.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-29.c new file mode 100644 index 0000000..3591f4f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-29.c @@ -0,0 +1,179 @@ +/* PR tree-optimization/104119 - unexpected -Wformat-overflow after strlen + in ILP32 since Ranger integration + { dg-do compile } + { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */ + +typedef __SIZE_TYPE__ size_t; + +void* malloc (size_t); +int sprintf (char*, const char*, ...); +size_t strlen (const char*); + +void sink (void*, ...); + +struct __attribute__ ((packed)) S +{ + char a3[3], a4[4], a5[5], a6[6], a7[7], a8[8], a9[9], ax[]; +}; + +extern struct S s; +extern char a4[4], a7[7], a8[8]; + + +void test_decl (void) +{ + struct S *p = &s; + + { + size_t n = strlen (p->a3); + sprintf (a4, "%s", p->a3); // { dg-bogus "-Wformat-overflow" } + sink (a4, n); + } + + { + size_t n = strlen (p->a4); + sprintf (a4, "%s", p->a4); // { dg-bogus "-Wformat-overflow" } + sink (a4, n); + } + + { + size_t n = strlen (p->a5); + sprintf (a4, "%s", p->a5); // { dg-warning "may write a terminating nul past the end" } + sink (a4, n); + } + + { + size_t n = strlen (p->a7); + sprintf (a8, "%s", p->a7); // { dg-bogus "-Wformat-overflow" } + sink (a8, n); + } + + { + size_t n = strlen (p->a8); + sprintf (a8, "%s", p->a8); // { dg-bogus "-Wformat-overflow" } + sink (a8, n); + } + + { + size_t n = strlen (p->a9); + sprintf (a8, "%s", p->a9); // { dg-warning "may write a terminating nul past the end " } + sink (a8, n); + } + + { + size_t n = strlen (p->ax); + sprintf (a7, "%s", p->ax); // { dg-bogus "-Wformat-overflow" "pr??????" { xfail ilp32 } } + sink (a7, n); + } +} + + +/* Verify the warning with a pointer to an allocated object with nonstant + size in known range. */ + +void test_alloc_5_8 (int n) +{ + if (n < 5 || 8 < n) + n = 5; + + struct S *p = (struct S*)malloc (sizeof *p + n); + sink (p); // initialize *p + + { + size_t n = strlen (p->a3); + sprintf (a4, "%s", p->a3); // { dg-bogus "-Wformat-overflow" } + sink (a4, n); + } + + { + size_t n = strlen (p->a4); + sprintf (a4, "%s", p->a4); // { dg-bogus "-Wformat-overflow" } + sink (a4, n); + } + + { + size_t n = strlen (p->a5); + sprintf (a4, "%s", p->a5); // { dg-warning "may write a terminating nul past the end" } + sink (a4, n); + } + + { + size_t n = strlen (p->a7); + sprintf (a8, "%s", p->a7); // { dg-bogus "-Wformat-overflow" } + sink (a8, n); + } + + { + size_t n = strlen (p->a8); + sprintf (a8, "%s", p->a8); // { dg-bogus "-Wformat-overflow" } + sink (a8, n); + } + + { + size_t n = strlen (p->a9); + sprintf (a8, "%s", p->a9); // { dg-warning "may write a terminating nul past the end " } + sink (a8, n); + } + + { + /* The size of the flexible array member p->ax is between 5 and 8 + bytes so the length of the string stored in it is at most 7. + Verify the warning triggers based on its size and also gets + the length right. */ + size_t n = strlen (p->ax); + sprintf (a4, "%s", p->ax); // { dg-warning "writing up to 7 bytes " } + sink (a4, n); + } + + { + size_t n = strlen (p->ax); + sprintf (a8, "%s", p->ax); + sink (a8, n); + } +} + + +void test_ptr (struct S *p) +{ + { + size_t n = strlen (p->a3); + sprintf (a4, "%s", p->a3); // { dg-bogus "-Wformat-overflow" } + sink (a4, n); + } + + { + size_t n = strlen (p->a4); + sprintf (a4, "%s", p->a4); // { dg-bogus "-Wformat-overflow" } + sink (a4, n); + } + + { + size_t n = strlen (p->a5); + sprintf (a4, "%s", p->a5); // { dg-warning "may write a terminating nul past the end" } + sink (a4, n); + } + + { + size_t n = strlen (p->a7); + sprintf (a8, "%s", p->a7); // { dg-bogus "-Wformat-overflow" } + sink (a8, n); + } + + { + size_t n = strlen (p->a8); + sprintf (a8, "%s", p->a8); // { dg-bogus "-Wformat-overflow" } + sink (a8, n); + } + + { + size_t n = strlen (p->a9); + sprintf (a8, "%s", p->a9); // { dg-warning "may write a terminating nul past the end " } + sink (a8, n); + } + + { + size_t n = strlen (p->ax); + sprintf (a8, "%s", p->ax); // { dg-bogus "-Wformat-overflow" "pr??????" { xfail ilp32 } } + sink (a8, n); + } +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf.c index f90558e..9368a2e 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf.c @@ -3,7 +3,8 @@ constant folding. With optimization enabled the test will fail to link if any of the assertions fails. Without optimization the test aborts at runtime if any of the assertions fails. */ -/* { dg-do run } */ +/* { dg-do run { target c99_runtime } } */ +/* { dg-do link { target { ! c99_runtime } } } */ /* { dg-skip-if "not IEEE float layout" { "pdp11-*-*" } } */ /* { dg-additional-options "-O2 -Wall -Wno-pedantic -fprintf-return-value" } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/divide-6.c b/gcc/testsuite/gcc.dg/tree-ssa/divide-6.c new file mode 100644 index 0000000..a9fc4c0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/divide-6.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +unsigned int f(unsigned int x) { + return 1 / x; +} + +/* { dg-final { scan-tree-dump-not "1 / x_..D.;" "optimized" } } */ +/* { dg-final { scan-tree-dump "x_..D. == 1;" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/divide-7.c b/gcc/testsuite/gcc.dg/tree-ssa/divide-7.c new file mode 100644 index 0000000..c605515 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/divide-7.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int f(int x) { + return 1 / x; +} + +/* { dg-final { scan-tree-dump-not "1 / x_\[0-9]\+\\\(D\\\);" "optimized" } } */ +/* { dg-final { scan-tree-dump " <= 2 \\? x_\[0-9]\+\\\(D\\\) : 0;" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/evrp-trans2.c b/gcc/testsuite/gcc.dg/tree-ssa/evrp-trans2.c new file mode 100644 index 0000000..d6fe427 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/evrp-trans2.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-evrp" } */ + +#define int unsigned +#include "evrp-trans.c" + +/* { dg-final { scan-tree-dump-not "kill" "evrp" } } */ +/* { dg-final { scan-tree-dump-times "keep" 13 "evrp"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/evrp9.c b/gcc/testsuite/gcc.dg/tree-ssa/evrp9.c index 6e7828e..fb7c319 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/evrp9.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/evrp9.c @@ -24,5 +24,7 @@ foo (unsigned int x, unsigned int y) bar (); } -/* { dg-final { scan-tree-dump-not "== 5" "evrp" } } */ -/* { dg-final { scan-tree-dump-not "== 6" "evrp" } } */ +/* { dg-final { scan-tree-dump-times "Folding predicate minv_.* == 5 to 0" 1 "evrp" } } */ +/* { dg-final { scan-tree-dump-times "Folding predicate minv_.* == 6 to 0" 1 "evrp" } } */ +/* { dg-final { scan-tree-dump-times "Folding predicate maxv_.* == 5 to 0" 1 "evrp" } } */ +/* { dg-final { scan-tree-dump-times "Folding predicate maxv_.* == 6 to 0" 1 "evrp" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-3.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-3.c index 707e630..a55231b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-3.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-iftoswitch-optimized" } */ +/* Supplying case-values-threshold makes the testcase less target dependent. */ +/* { dg-options "-O2 -fdump-tree-iftoswitch-optimized --param case-values-threshold=4" } */ int IsMySuperRandomChar(int aChar) { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-5.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-5.c index ceeae90..54771e6 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-5.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-5.c @@ -4,8 +4,8 @@ int crud (unsigned char c) { return (((((((((((int) c == 46) || (int) c == 44) - || (int) c == 58) || (int) c == 59) || (int) c == 60) - || (int) c == 62) || (int) c == 34) || (int) c == 92) + || (int) c == 58) || (int) c == 60) || (int) c == 62) + || (int) c == 64) || (int) c == 34) || (int) c == 92) || (int) c == 39) != 0); } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-13.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-13.c new file mode 100644 index 0000000..94d8a9c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-13.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-early-inlining -fdump-tree-fixup_cfg3" } */ + +int n; + +static int +bar (void) +{ + int a; + + n = 0; + a = 0; + + return n; +} + +__attribute__ ((pure, returns_twice)) int +foo (void) +{ + n = bar () + 1; + foo (); + + return 0; +} + +/* Abnormal edges should be properly elided after IPA inlining of bar. */ +/* { dg-final { scan-tree-dump-times "bb" 1 "fixup_cfg3" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-5.c b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-5.c new file mode 100644 index 0000000..a6af497 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-5.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +int* +foo (int* mem, int sz, int val) +{ + int i; + for (i = 0; i < sz; i++) + if (mem[i] == val) + return &mem[i]; + return 0; +} + +/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned long\\) sz_\[0-9\]\\(D\\) \\* 4 \\+ \\(unsigned long\\) mem_\[0-9\]\\(D\\)" "ivopts" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-6.c b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-6.c new file mode 100644 index 0000000..8383154 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-6.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +int* +foo (int* mem, int sz, int val) +{ + int i; + for (i = 0; i != sz; i++) + if (mem[i] == val) + return &mem[i]; + return 0; +} + +/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned long\\) sz_\[0-9\]\\(D\\) \\* 4 \\+ \\(unsigned long\\) mem_\[0-9\]\\(D\\)" "ivopts" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-7.c b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-7.c new file mode 100644 index 0000000..44f5603 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-7.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +int* +foo (int* mem, int beg, int end, int val) +{ + int i; + for (i = beg; i < end; i++) + if (mem[i] == val) + return &mem[i]; + return 0; +} +/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned long\\) \\(\\(unsigned int\\) end_\[0-9\]\\(D\\) - \\(unsigned int\\) beg_\[0-9\]\\(D\\)\\)" "ivopts" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-8.c b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-8.c new file mode 100644 index 0000000..b2556ea --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-8.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +int* +foo (int* mem, char sz, int val) +{ + char i; + for (i = 0; i < sz; i++) + if (mem[i] == val) + return &mem[i]; + return 0; +} + +/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned (long|int)\\) sz_\[0-9\]*\\(D\\) \\* 4 \\+ \\(unsigned (long|int)\\) mem_\[0-9\]*\\(D\\)" "ivopts" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ivopts-9.c b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-9.c new file mode 100644 index 0000000..d26d994 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ivopts-9.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +int* +foo (int* mem, unsigned char sz, int val) +{ + unsigned char i; + for (i = 0; i < sz; i++) + if (mem[i] == val) + return &mem[i]; + return 0; +} + +/* { dg-final { scan-tree-dump "inv_expr \[0-9\]: \\t\\(unsigned (long|int)\\) sz_\[0-9\]\\(D\\) \\* 4 \\+ \\(unsigned (long|int)\\) mem_\[0-9\]\\(D\\)" "ivopts" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-rawmemchr-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-rawmemchr-1.c index 6abfd27..bf6335f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-rawmemchr-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-rawmemchr-1.c @@ -1,5 +1,6 @@ /* { dg-do run { target s390x-*-* } } */ /* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ +/* { dg-additional-options "-march=z13 -mzarch" { target s390x-*-* } } */ /* { dg-final { scan-tree-dump-times "generated rawmemchrQI" 2 "ldist" { target s390x-*-* } } } */ /* { dg-final { scan-tree-dump-times "generated rawmemchrHI" 2 "ldist" { target s390x-*-* } } } */ /* { dg-final { scan-tree-dump-times "generated rawmemchrSI" 2 "ldist" { target s390x-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-rawmemchr-2.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-rawmemchr-2.c index 00d6ea0..83f5a35 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-rawmemchr-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-rawmemchr-2.c @@ -1,5 +1,6 @@ /* { dg-do run { target s390x-*-* } } */ /* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ +/* { dg-additional-options "-march=z13 -mzarch" { target s390x-*-* } } */ /* { dg-final { scan-tree-dump-times "generated rawmemchrQI" 2 "ldist" { target s390x-*-* } } } */ /* { dg-final { scan-tree-dump-times "generated rawmemchrHI" 2 "ldist" { target s390x-*-* } } } */ /* { dg-final { scan-tree-dump-times "generated rawmemchrSI" 2 "ldist" { target s390x-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-1.c index 918b600..aeb04b9 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-1.c @@ -1,5 +1,6 @@ /* { dg-do run } */ /* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ +/* { dg-additional-options "-march=z13 -mzarch" { target s390x-*-* } } */ /* { dg-final { scan-tree-dump-times "generated strlenQI\n" 4 "ldist" } } */ /* { dg-final { scan-tree-dump-times "generated strlenHI\n" 4 "ldist" { target s390x-*-* } } } */ /* { dg-final { scan-tree-dump-times "generated strlenSI\n" 4 "ldist" { target s390x-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-3.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-3.c index 370fd5e..0652857 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-3.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ +/* { dg-additional-options "-march=z13 -mzarch" { target s390x-*-* } } */ /* { dg-final { scan-tree-dump-times "generated strlenSI\n" 1 "ldist" { target s390x-*-* } } } */ extern int s[]; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c new file mode 100644 index 0000000..eafb37e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-strlen-4.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-loop-distribution -fno-tree-loop-distribute-patterns -fdump-tree-ldist-details" } */ +/* { dg-final { scan-tree-dump-not "generated strlen" "ldist" } } */ + +/* Copied from gcc/testsuite/gcc.c-torture/execute/builtins/lib/strlen.c. */ + +__SIZE_TYPE__ +foo (const char *s) +{ + __SIZE_TYPE__ i; + + i = 0; + while (s[i] != 0) + i++; + + return i; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-10.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-10.c new file mode 100644 index 0000000..4a6d9e5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-10.c @@ -0,0 +1,20 @@ +/* { dg-do link } */ +/* { dg-options "-O2 -fdump-tree-modref1" } */ +void linker_error (); +__attribute__((noinline)) +int * +test (int **a) +{ + return *a; +} +int +main() +{ + int val; + int *a=&val; + int *b = test (&a); + if (b == (int *)&a) + linker_error (); + return 0; +} +/* { dg-final { scan-tree-dump "no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape not_returned_directly no_indirect_read" "modref1"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-11.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-11.c new file mode 100644 index 0000000..10ebe1f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-11.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-modref1 -fno-ipa-pure-const" } */ +struct linkedlist { + struct linkedlist *next; +}; +struct linkedlist * +find_last (struct linkedlist *l) +{ + while (l->next) + l = l->next; + return l; +} +/* { dg-final { scan-tree-dump "parm 0 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape" "modref1"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-12.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-12.c new file mode 100644 index 0000000..f8ce047 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-12.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +void foo (); +int +test() +{ + struct {int a,b;} a = {0,0}; + __attribute__ ((noinline)) + void nested () + { + a.b++; + } + nested (); + return a.a; +} +/* { dg-final { scan-tree-dump "return 0" "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-13.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-13.c new file mode 100644 index 0000000..276711e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-13.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-release_ssa" } */ +struct wrap { + void **array; +}; +__attribute__ ((noinline)) +void +write_array (struct wrap *ptr) +{ + ptr->array[0]=0; +} +int +test () +{ + void *arrayval; + struct wrap w = {&arrayval}; + write_array (&w); + return w.array == &arrayval; +} +/* We should deterine that write_array writes to PTR only indirectly. */ +/* { dg-final { scan-tree-dump "return 1" "release_ssa" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-14.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-14.c new file mode 100644 index 0000000..986248f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-14.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wsuggest-attribute=const" } */ +struct a {int a,b,c;}; +__attribute__ ((noinline)) +int init (struct a *a) +{ + a->a=1; + a->b=2; + a->c=3; +} +int const_fn () /* { dg-warning "function might be candidate for attribute 'const" } */ +{ + struct a a; + init (&a); + return a.a + a.b + a.c; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-15.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-15.c new file mode 100644 index 0000000..06881f2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-15.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-modref1" } */ +int test (int *a) +{ + int i; + for (i=0; a[i];i++); + return i+a[i]; +} +/* { dg-final { scan-tree-dump "access: Parm 0" "modref1"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-5.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-5.c index fde3177..0bee79d 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/modref-5.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-5.c @@ -24,4 +24,4 @@ main() __builtin_abort (); return 0; } -/* { dg-final { scan-tree-dump "parm 1 flags: nodirectescape" "modref1" } } */ +/* { dg-final { scan-tree-dump "parm 1 flags: no_direct_clobber no_direct_escape" "modref1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-6.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-6.c index 2d97a49..7146389 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/modref-6.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-6.c @@ -28,10 +28,10 @@ int test2() return a; } /* Flags for normal call. */ -/* { dg-final { scan-tree-dump "parm 0 flags: direct noclobber noescape nodirectescape not_returned" "modref1" } } */ +/* { dg-final { scan-tree-dump "parm 0 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape not_returned_directly not_returned_indirectly no_indirect_read" "modref1" } } */ /* Flags for pure call. */ -/* { dg-final { scan-tree-dump "parm 0 flags: direct not_returned" "modref1" } } */ +/* { dg-final { scan-tree-dump "parm 0 flags: not_returned_directly not_returned_indirectly no_indirect_read" "modref1" } } */ /* Flags for const call. */ -/* { dg-final { scan-tree-dump "parm 0 flags: not_returned" "modref1" } } */ +/* { dg-final { scan-tree-dump "parm 0 flags: not_returned_directly" "modref1" } } */ /* Overall we want to make "int a" non escaping. */ /* { dg-final { scan-tree-dump "return 42" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-7.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-7.c index 53ffa1c..b55d706 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/modref-7.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-7.c @@ -10,4 +10,4 @@ int test(struct a *a, int p) a->array[0] = 1; } /* All three accesses combine to one bigger access. */ -/* { dg-final { scan-tree-dump-not "param=modref-max-accesses" "modref1" } } */ +/* { dg-final { scan-tree-dump-not "--param modref-max-accesses" "modref1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-8.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-8.c index 15ae4ac..c51590f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/modref-8.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-8.c @@ -1,4 +1,4 @@ -/* { dg-options "-O2 --param modref-max-adjustments=8 -fdump-tree-modref1" } */ +/* { dg-options "-O2 --param modref-max-adjustments=8 -fdump-tree-modref1 -fno-optimize-sibling-calls" } */ /* { dg-do compile } */ void set (char *p) @@ -17,8 +17,8 @@ recurse (char *p, int n) if (n) recurse (p+1,n-1); } -/* { dg-final { scan-tree-dump-not "param=modref-max-accesses" "modref1" } } */ -/* { dg-final { scan-tree-dump "param=modref-max-adjustments" "modref1" } } */ +/* { dg-final { scan-tree-dump-not "--param modref-max-accesses" "modref1" } } */ +/* { dg-final { scan-tree-dump "--param modref-max-adjustments" "modref1" } } */ /* In set all accesses should merge together. */ /* { dg-final { scan-tree-dump "access: Parm 0 param offset:0 offset:0 size:8 max_size:40" "modref1" } } */ /* In recurse we should cap the recrusion after 8 attempts and set max_size to -1. */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-1.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-1.c new file mode 100644 index 0000000..1f80cc5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-1.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-dse1-details" } */ +volatile int *ptr; +struct a { + int a,b,c; +} a; +__attribute__((noinline)) +static int init (struct a*a) +{ + a->a=0; + a->b=1; +} +__attribute__((noinline)) +static int use (struct a*a) +{ + if (a->c != 3) + *ptr=5; +} + +void +main(void) +{ + struct a a; + init (&a); + a.c=3; + use (&a); +} +/* { dg-final { scan-tree-dump "Deleted dead store: init" "dse1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-2.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-2.c new file mode 100644 index 0000000..e41d065 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-2.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-dse2-details" } */ +volatile int *ptr; +struct a { + int a,b,c; +} a; +__attribute__((noinline)) +static int init (struct a*a) +{ + a->a=0; + a->b=1; + a->c=1; +} +__attribute__((noinline)) +static int use (struct a*a) +{ + if (a->c != 3) + *ptr=5; +} + +void +main(void) +{ + struct a a; + init (&a); + a.c=3; + use (&a); +} +/* Only DSE2 is tracking live bytes needed to figure out that store to c is + also dead above. */ +/* { dg-final { scan-tree-dump "Deleted dead store: init" "dse2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-3.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-3.c new file mode 100644 index 0000000..c69e423 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-3.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-dse1-details" } */ +__attribute__ ((noinline)) +void write (int *a) +{ + *a=1; + a[1]=2; +} +int test () +{ + int a; + a=2; + write (&a); + return a; +} +int test2 (int *a) +{ + *a=2; + write (a); + return *a; +} +/* { dg-final { scan-tree-dump-times "Deleted dead store" 2 "dse1"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-4.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-4.c new file mode 100644 index 0000000..19e91b0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-4.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-dse1-details" } */ +struct a {int a,b,c;}; +__attribute__ ((noinline)) +void +kill_me (struct a *a) +{ + a->a=0; + a->b=0; + a->c=0; +} +__attribute__ ((noinline)) +void +my_pleasure (struct a *a) +{ + a->a=1; + a->c=2; +} +void +set (struct a *a) +{ + kill_me (a); + my_pleasure (a); + a->b=1; +} +/* { dg-final { scan-tree-dump "Deleted dead store: kill_me" "dse1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-5.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-5.c new file mode 100644 index 0000000..dc2c289 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-5.c @@ -0,0 +1,42 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-dse1-details" } */ +struct a {int a,b,c;}; +__attribute__ ((noinline)) +void +kill_me (struct a *a) +{ + a->a=0; + a->b=0; + a->c=0; +} +__attribute__ ((noinline)) +int +wrap(int b, struct a *a) +{ + kill_me (a); + return b; +} +__attribute__ ((noinline)) +void +my_pleasure (struct a *a) +{ + a->a=1; + a->c=2; +} +__attribute__ ((noinline)) +int +wrap2(int b, struct a *a) +{ + my_pleasure (a); + return b; +} + +int +set (struct a *a) +{ + wrap (0, a); + int ret = wrap2 (0, a); + a->b=1; + return ret; +} +/* { dg-final { scan-tree-dump "Deleted dead store: wrap" "dse1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-6.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-6.c new file mode 100644 index 0000000..d1e45a8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-dse-6.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +int +main() +{ + int a,b; + __attribute__ ((noinline)) + void kill_me() + { + a=1234; + b=2234; + } + a=0; + b=1234; + __attribute__ ((noinline)) + int reta() + { + return a; + } + return reta(); +} +/* { dg-final { scan-tree-dump-not "kill_me" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "1234" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/nonzero-1.c b/gcc/testsuite/gcc.dg/tree-ssa/nonzero-1.c index c9d438e..aa21b71 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/nonzero-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/nonzero-1.c @@ -1,12 +1,13 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdelete-null-pointer-checks" } */ +/* { dg-options "-O2 -fdelete-null-pointer-checks -fdump-tree-optimized" } */ /* { dg-require-weak "" } */ /* { dg-skip-if "" keeps_null_pointer_checks } */ -extern int a; /* { dg-error "declared weak after being used" } */ +extern int a; int t() { + /* { dg-final { scan-tree-dump "&a != 0" "optimized" } } */ return &a!=0; } extern int a __attribute__ ((weak)); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/nonzero-1a.c b/gcc/testsuite/gcc.dg/tree-ssa/nonzero-1a.c new file mode 100644 index 0000000..3d1eb97 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/nonzero-1a.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdelete-null-pointer-checks -fdump-tree-optimized" } */ + +/* { dg-skip-if "" keeps_null_pointer_checks } */ +extern int a; +int +t() +{ + /* { dg-final { scan-tree-dump-not "&a != 0" "optimized" } } */ + return &a!=0; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c new file mode 100644 index 0000000..21aa66e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-26.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fgimple -fdump-tree-phiopt1" } */ + +int __GIMPLE (ssa,startwith("phiopt")) +foo (int a, int b, int flag) +{ + int res; + + __BB(2): + if (flag_2(D) != 0) + goto __BB6; + else + goto __BB4; + + __BB(4): + if (a_3(D) > b_4(D)) + goto __BB7; + else + goto __BB6; + + __BB(6): + goto __BB7; + + __BB(7): + res_1 = __PHI (__BB4: a_3(D), __BB6: b_4(D)); + return res_1; +} + +/* We should be able to detect MAX despite the extra edge into + the middle BB. */ +/* { dg-final { scan-tree-dump "MAX" "phiopt1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-1.c b/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-1.c index 59663dd..be504dd 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Ofast -fdump-tree-vrp-thread1" } */ +/* { dg-options "-Ofast -fdump-tree-dom2" } */ void g (int); void g1 (int); @@ -27,4 +27,9 @@ f (long a, long b, long c, long d, long x) g (a); } -/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "vrp-thread1" } } */ +/* This is actually a regression. The backward threader cannot thread + the above scenario, but it is being caught by the DOM threader + which still uses the forward threader. We should implement this + optimization in the backward threader before killing the forward + threader. Similarly for the other phi_on_compare-*.c tests. */ +/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "dom2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-2.c b/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-2.c index 0c2f6e0..b186570 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Ofast -fdump-tree-vrp-thread1" } */ +/* { dg-options "-Ofast -fdump-tree-dom2" } */ void g (void); void g1 (void); @@ -20,4 +20,4 @@ f (long a, long b, long c, long d, int x) } } -/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "vrp-thread1" } } */ +/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "dom2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-3.c b/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-3.c index 6a3d359..b48ecbf 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Ofast -fdump-tree-vrp-thread1" } */ +/* { dg-options "-Ofast -fdump-tree-dom2" } */ void g (void); void g1 (void); @@ -22,4 +22,4 @@ f (long a, long b, long c, long d, int x) } } -/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "vrp-thread1" } } */ +/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "dom2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-4.c b/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-4.c index 9bc4c6d..1e09f89 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-4.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/phi_on_compare-4.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Ofast -fdump-tree-vrp-thread1" } */ +/* { dg-options "-Ofast -fdump-tree-dom2" } */ void g (int); void g1 (int); @@ -37,4 +37,4 @@ f (long a, long b, long c, long d, int x) g (c + d); } -/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "vrp-thread1" } } */ +/* { dg-final { scan-tree-dump-times "Removing basic block" 1 "dom2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr100278.c b/gcc/testsuite/gcc.dg/tree-ssa/pr100278.c deleted file mode 100644 index 8d70228..0000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr100278.c +++ /dev/null @@ -1,17 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O2" } */ - -void a() -{ -#if defined __s390__ - register int b asm("r5"); -#elif defined __x86_64__ - register int b asm("eax"); -#else - volatile int b; -#endif - if (b) - b = 1; - for (; b;) - ; -} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr100359.c b/gcc/testsuite/gcc.dg/tree-ssa/pr100359.c new file mode 100644 index 0000000..2924352 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr100359.c @@ -0,0 +1,31 @@ +/* { dg-do link } */ +/* { dg-options "-O3 -fdump-tree-cunrolli-optimized" } */ + +extern void foo(void); +static int b, f, *a = &b; +int **c = &a; +static void d() { + int g, h; + for (f = 0; f < 1; f++) { + int *i = &b; + { + int *j[3], **k = &a; + for (g = 0; g < 3; g++) + for (h = 0; h < 1; h++) + j[g] = &b; + *k = j[0]; + } + *c = i; + } +} +int main() { + d(); + *a = 0; + if (**c) + foo(); + return 0; +} + +/* Verify that we unroll the inner loop early even with -O3. */ +/* { dg-final { scan-tree-dump "loop with 1 iterations completely unrolled" "cunrolli" } } */ +/* { dg-final { scan-tree-dump "loop with 3 iterations completely unrolled" "cunrolli" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr100453.c b/gcc/testsuite/gcc.dg/tree-ssa/pr100453.c deleted file mode 100644 index 0cf0ad2..0000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr100453.c +++ /dev/null @@ -1,18 +0,0 @@ -/* { dg-do run } */ -/* { dg-options "-O1" } */ - -struct a { - int b : 4; -} d; -static int c, e; -static const struct a f; -static void g(const struct a h) { - for (; c < 1; c++) - d = h; - e = h.b; - c = h.b; -} -int main() { - g(f); - return 0; -} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr101189.c b/gcc/testsuite/gcc.dg/tree-ssa/pr101189.c deleted file mode 100644 index 5730708..0000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr101189.c +++ /dev/null @@ -1,17 +0,0 @@ -/* PR tree-optimization/101189 */ -/* { dg-do compile } */ -/* { dg-options "-O2" } */ - -static int a, b; -int main() { - int d = 0, e, f = 5; - if (a) - f = 0; - for (; f < 4; f++) - ; - e = f ^ -f; - e && d; - if (!e) - e || b; - return 0; -} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr101335.c b/gcc/testsuite/gcc.dg/tree-ssa/pr101335.c deleted file mode 100644 index 921362c..0000000 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr101335.c +++ /dev/null @@ -1,17 +0,0 @@ -/* { dg-do run } */ -/* { dg-options "-O2" } */ - -unsigned a = 0xFFFFFFFF; -int b; -int main() -{ - int c = ~a; - unsigned d = c - 10; - if (d > c) - c = 20; - b = -(c | 0); - if (b > -8) - __builtin_abort (); - return 0; -} - diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr101941-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr101941-1.c new file mode 100644 index 0000000..a1a342a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr101941-1.c @@ -0,0 +1,53 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fconserve-stack -fdump-tree-optimized" } */ +/* Check to make sure that if + rfc4106_set_hash_subkey gets split, + the error function does not gets split away + from the if statement conditionalizing it. + Checking this via the scan tree also. */ +struct crypto_aes_ctx { + char key_dec[128]; +}; + +int rfc4106_set_hash_subkey_hash_subkey; + +void __write_overflow(void)__attribute__((__error__(""))); +void __write_overflow1(void); +void aes_encrypt(void*); + +void fortify_panic(const char*) __attribute__((__noreturn__)) ; + +char *rfc4106_set_hash_subkey(struct crypto_aes_ctx *ctx) { + void *a = &ctx->key_dec[0]; + unsigned p_size = __builtin_object_size(a, 0); +#ifdef __OPTIMIZE__ + if (p_size < 16) { + __write_overflow1(); + fortify_panic(__func__); + } + if (p_size < 32) { + __write_overflow(); + fortify_panic(__func__); + } +#endif + aes_encrypt(ctx); + return ctx->key_dec; +} + +char *(*gg)(struct crypto_aes_ctx *) = rfc4106_set_hash_subkey; + +void a(void) +{ + struct crypto_aes_ctx ctx; + rfc4106_set_hash_subkey(&ctx); +} +void b(void) +{ + struct crypto_aes_ctx ctx; + ctx.key_dec[0] = 0; + rfc4106_set_hash_subkey(&ctx); +} + +/* This testcase should still split out one of the above basic blocks dealing + with __write_overflow. */ +/* { dg-final { scan-tree-dump-times "Function rfc4106_set_hash_subkey.part" 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr102232.c b/gcc/testsuite/gcc.dg/tree-ssa/pr102232.c new file mode 100644 index 0000000..62bca69 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr102232.c @@ -0,0 +1,52 @@ +/* PR tree-optimization/102232 */ +/* { dg-do run } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int __attribute__ ((noipa)) foo (int a, int b) +{ + return b * (1 + a / b) - a; +} + +int +main (void) +{ + // few randomly generated test cases + if (foo (71856034, 238) != 212) + { + __builtin_abort (); + } + if (foo (71856034, 10909) != 1549) + { + __builtin_abort (); + } + if (foo (20350, 1744) != 578) + { + __builtin_abort (); + } + if (foo (444813, 88563) != 86565) + { + __builtin_abort (); + } + if (foo (112237, 63004) != 13771) + { + __builtin_abort (); + } + if (foo (68268386, 787116) != 210706) + { + __builtin_abort (); + } + if (foo (-444813, 88563) != 90561) + { + __builtin_abort (); + } + if (foo (-68268386, 787116) != 1363526) + { + __builtin_abort (); + } + + return 0; +} + +/* Verify that multiplication and division has been removed. */ +/* { dg-final { scan-tree-dump-not " \\* " "optimized" } } */ +/* { dg-final { scan-tree-dump-not " / " "optimized" } } */
\ No newline at end of file diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr102880.c b/gcc/testsuite/gcc.dg/tree-ssa/pr102880.c new file mode 100644 index 0000000..0306dee --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr102880.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +void foo(void); + +static int b, c, d, e, f, ah; +static short g, ai, am, aq, as; +static char an, at, av, ax, ay; +static char a(char h, char i) { return i == 0 || h && i == 1 ? 0 : h % i; } +static void ae(int h) { + if (a(b, h)) + foo(); + +} +int main() { + ae(1); + ay = a(0, ay); + ax = a(g, aq); + at = a(0, as); + av = a(c, 1); + an = a(am, f); + int al = e || ((a(1, ah) && b) & d) == 2; + ai = al; +} + +/* We should eliminate the call to foo. */ +/* { dg-final { scan-tree-dump-not "foo" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr102906.c b/gcc/testsuite/gcc.dg/tree-ssa/pr102906.c new file mode 100644 index 0000000..1846f0b6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr102906.c @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-Os -fdump-tree-ch-details" } + +extern unsigned int foo (int*) __attribute__((pure)); + +unsigned int +tr2 (int array[], int n) +{ + unsigned int sum = 0; + int x; + if (n > 0) + for (x = 0; x < n; x++) + sum += foo (&array[x]); + return sum; +} + +// { dg-final { scan-tree-dump-not "Not duplicating.*optimizing for size" "ch2" } } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr102951.c b/gcc/testsuite/gcc.dg/tree-ssa/pr102951.c new file mode 100644 index 0000000..42b6fe6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr102951.c @@ -0,0 +1,41 @@ +/* PR tree-optimization/102951 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ccp1" } */ +/* { dg-final { scan-tree-dump-times "return \&a\\\[1\\\];" 2 "ccp1" } } */ +/* { dg-final { scan-tree-dump-times "return \&a\\\[4\\\];" 2 "ccp1" } } */ +/* { dg-final { scan-tree-dump-not "MIN_EXPR" "ccp1" } } */ +/* { dg-final { scan-tree-dump-not "MAX_EXPR" "ccp1" } } */ + +extern int a[5]; + +int * +foo (void) +{ + int *p1 = &a[1]; + int *p2 = &a[2]; + return p1 < p2 ? p1 : p2; +} + +int * +bar (void) +{ + int *p1 = &a[1]; + int *p2 = &a[2]; + return p1 <= p2 ? p1 : p2; +} + +int * +baz (void) +{ + int *p1 = &a[3]; + int *p2 = &a[4]; + return p1 > p2 ? p1 : p2; +} + +int * +qux (void) +{ + int *p1 = &a[3]; + int *p2 = &a[4]; + return p1 >= p2 ? p1 : p2; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103218-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103218-1.c new file mode 100644 index 0000000..f086f07 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103218-1.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* PR tree-optimization/103218 */ + +/* These first two are removed during forwprop1 */ +signed char f(signed char a) +{ + signed char t = a < 0; + int tt = (unsigned char)(t << 7); + return tt; +} +signed char f0(signed char a) +{ + unsigned char t = a < 0; + int tt = (unsigned char)(t << 7); + return tt; +} + +/* This one is removed during phiopt. */ +signed char f1(signed char a) +{ + if (a < 0) + return 1u<<7; + return 0; +} + +/* These three examples should remove "a < 0" by optimized. */ +/* { dg-final { scan-tree-dump-times "< 0" 0 "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c new file mode 100644 index 0000000..f2ef3f1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103220-1.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +unsigned char f(unsigned char a) +{ + signed char d = (signed char) a; + signed char e = d & ~1; + unsigned char t = e; + t &= ~2; + return t; +} +/* The above should reduce down to just & 252 rather than keping + the two &s there. */ +/* { dg-final { scan-tree-dump-times "& 252" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "& -2" 0 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "& 253" 0 "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c new file mode 100644 index 0000000..25d7412 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103220-2.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +signed char f(unsigned char a) +{ + unsigned char b = a & 127; + signed char c = (signed char) b; + signed char d = (signed char) a; + signed char e = d & -128; + signed char h = c | e; + return h; +} +/* The above should reduce down to just return with a cast. + removing the two &s there and |'s. */ +/* { dg-final { scan-tree-dump-times "& 127" 0 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "& -128" 0 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "\\\| " 0 "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103228-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103228-1.c new file mode 100644 index 0000000..a753981 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103228-1.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +int f(int a, int b) +{ + b|=1u; + b|=2; + return b; +} +/* { dg-final { scan-tree-dump-times "\\\| 3" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "\\\| 1" 0 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "\\\| 2" 0 "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103245-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103245-1.c new file mode 100644 index 0000000..68ddead --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103245-1.c @@ -0,0 +1,25 @@ +/* PR tree-optimization/103245 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-final { scan-tree-dump-times " = ABSU_EXPR <v_\[0-9]*\\\(D\\\)>;" 1 "optimized" } } */ + +unsigned +f1 (int v) +{ + unsigned int d_6; + int b_5; + int a_4; + _Bool _1; + unsigned int v1_2; + unsigned int _7; + int _9; + + _1 = v < 0; + a_4 = (int) _1; + b_5 = -a_4; + _9 = b_5 | 1; + d_6 = (unsigned int) _9; + v1_2 = (unsigned int) v; + _7 = v1_2 * d_6; + return _7; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103257-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103257-1.c new file mode 100644 index 0000000..89f4f44 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103257-1.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +void link_error(void); +unsigned b, c; +static short a(short e, short f) { return e * f; } +int main() { + if (a(1 ^ ((0, 0) ^ 1 && b) <= b, c)) + link_error (); + c = 0; +} +/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103345.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103345.c new file mode 100644 index 0000000..dc8810a --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103345.c @@ -0,0 +1,53 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-bswap-details" } */ + +typedef unsigned int uint32_t; +typedef unsigned char uint8_t; + +uint32_t load_le_32_or(const uint8_t *ptr) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return ((uint32_t)ptr[0]) | + ((uint32_t)ptr[1] << 8) | + ((uint32_t)ptr[2] << 16) | + ((uint32_t)ptr[3] << 24); +#else + return ((uint32_t)ptr[3]) | + ((uint32_t)ptr[2] << 8) | + ((uint32_t)ptr[1] << 16) | + ((uint32_t)ptr[0] << 24); +#endif +} + +uint32_t load_le_32_add(const uint8_t *ptr) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return ((uint32_t)ptr[0]) + + ((uint32_t)ptr[1] << 8) + + ((uint32_t)ptr[2] << 16) + + ((uint32_t)ptr[3] << 24); +#else + return ((uint32_t)ptr[3]) + + ((uint32_t)ptr[2] << 8) + + ((uint32_t)ptr[1] << 16) + + ((uint32_t)ptr[0] << 24); +#endif +} + +uint32_t load_le_32_xor(const uint8_t *ptr) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return ((uint32_t)ptr[0]) ^ + ((uint32_t)ptr[1] << 8) ^ + ((uint32_t)ptr[2] << 16) ^ + ((uint32_t)ptr[3] << 24); +#else + return ((uint32_t)ptr[3]) ^ + ((uint32_t)ptr[2] << 8) ^ + ((uint32_t)ptr[1] << 16) ^ + ((uint32_t)ptr[0] << 24); +#endif +} + +/* { dg-final { scan-tree-dump-times "32 bit load in target endianness found" 3 "bswap" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr103514.c b/gcc/testsuite/gcc.dg/tree-ssa/pr103514.c new file mode 100644 index 0000000..2e81335 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr103514.c @@ -0,0 +1,33 @@ +/* { dg-do compile } */ +/* { dg-options "-O --param logical-op-non-short-circuit=1 -fdump-tree-optimized" } */ +#include <stdbool.h> + +bool +i (bool a, bool b) +{ + return (a & b) ^ (a == b); +} + +bool +j (bool a, bool b) +{ + return (a & b) == (a ^ b); +} + +bool +g (bool a, bool b) +{ + return (a && b) == (a ^ b); +} + +bool +h (bool a, bool b) +{ + return (a && b) ^ (a == b); +} + + +/* Make sure we have removed "==" and "^" and "&". */ +/* { dg-final { scan-tree-dump-not "&" "optimized"} } */ +/* { dg-final { scan-tree-dump-not "\\^" "optimized"} } */ +/* { dg-final { scan-tree-dump-not "==" "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c b/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c index 496c425..f05076c 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1 -fno-early-inlining -fdelete-null-pointer-checks -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdump-tree-vrp1 -fno-early-inlining -fdelete-null-pointer-checks -fno-thread-jumps" } */ typedef struct { int code; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21001.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21001.c index 4ea5f21..f9216a4 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21001.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21001.c @@ -5,7 +5,7 @@ range information out of the conditional. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1-details" } */ +/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fno-thread-jumps -fdump-tree-vrp1-details" } */ /* { dg-additional-options "-fdisable-tree-ethread -fdisable-tree-thread1" } */ int diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c index b9edabc..8c8f447 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c @@ -4,8 +4,7 @@ allows us to eliminate the second "if" statement. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp -fdump-tree-vrp1-details" } */ -/* { dg-additional-options "-fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp -fdisable-tree-ethread -fdisable-tree-threadfull1 -fdump-tree-vrp1-details" } */ struct f { int i; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21417.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21417.c index b934c9c..36d9cb0 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21417.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21417.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdisable-tree-thread3 -fdump-tree-thread4-details" } */ +/* { dg-options "-O2 -fdump-tree-thread2-details" } */ struct tree_common { @@ -49,5 +49,5 @@ L23: /* We should thread the backedge to the top of the loop; ie we only execute the if (expr->common.code != 142) test once per loop iteration. */ -/* { dg-final { scan-tree-dump-times "jump thread" 1 "thread4" } } */ +/* { dg-final { scan-tree-dump-times "jump thread" 1 "thread2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c index f8d7353..9610570 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21458-2.c @@ -16,4 +16,4 @@ foo (int a) } } -/* { dg-final { scan-tree-dump-times "Predicate evaluates to: 1" 1 "evrp" } } */ +/* { dg-final { scan-tree-dump-times "Folding predicate.* to 1" 1 "evrp" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c index 43f046e..83b7c80 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-evrp-details -fdump-tree-vrp-thread1-details" } */ +/* { dg-options "-O2 -fdump-tree-evrp-details" } */ static int blocksize = 4096; @@ -34,8 +34,3 @@ void foo (void) /* First, we should simplify the bits < 0 test within the loop. */ /* { dg-final { scan-tree-dump-times "Simplified relational" 1 "evrp" } } */ - -/* We used to check for 3 threaded jumps here, but they all would - rotate the loop. */ - - diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21563.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21563.c index 72dce83..504b3cc 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr21563.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21563.c @@ -2,7 +2,7 @@ Make sure VRP folds the second "if" statement. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp -fdump-tree-vrp1-details -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fno-thread-jumps -fdisable-tree-evrp -fdump-tree-vrp1-details" } */ int foo (int a) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr23744.c b/gcc/testsuite/gcc.dg/tree-ssa/pr23744.c index ba3fda3..f70f254 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr23744.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr23744.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-ccp -fdisable-tree-evrp -fdump-tree-vrp1-details" } */ +/* { dg-options "-O2 -fno-tree-ccp -fdisable-tree-evrp -fdump-tree-vrp1" } */ void h (void); @@ -17,4 +17,5 @@ int g (int i, int j) return 1; } -/* { dg-final { scan-tree-dump-times "gimple_simplified" 1 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "return 0" 1 "vrp1" } } */ +/* { dg-final { scan-tree-dump-not "return 1" "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr49039.c b/gcc/testsuite/gcc.dg/tree-ssa/pr49039.c index a2044d0..102b073 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr49039.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr49039.c @@ -1,6 +1,6 @@ /* PR tree-optimization/49039 */ /* { dg-do compile } */ -/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fno-thread-jumps" } */ extern void bar (void); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr55177-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr55177-1.c new file mode 100644 index 0000000..de1a264 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr55177-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +extern int x; + +void foo(void) +{ + int a = __builtin_bswap32(x); + a &= 0x5a5b5c5d; + x = __builtin_bswap32(a); +} + +/* { dg-final { scan-tree-dump-times "__builtin_bswap32" 0 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "& 1566333786" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times "& 1515936861" 0 "optimized"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr59597.c b/gcc/testsuite/gcc.dg/tree-ssa/pr59597.c index 764b3fe..0f66aae 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr59597.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr59597.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Ofast -fdump-tree-vrp-thread1-details" } */ +/* { dg-options "-Ofast -fdisable-tree-cunrolli -fdump-tree-threadfull1-details" } */ typedef unsigned short u16; typedef unsigned char u8; @@ -56,7 +56,8 @@ main (int argc, char argv[]) return crc; } -/* None of the threads we can get in vrp-thread1 are valid. They all - cross or rotate loops. */ -/* { dg-final { scan-tree-dump-not "Registering jump thread" "vrp-thread1" } } */ -/* { dg-final { scan-tree-dump-not "joiner" "vrp-thread1" } } */ +/* We used to have no threads in vrp-thread1 because all the attempted + ones would cross loops. Now we get 30+ threads before VRP because + of loop unrolling. A better option is to disable unrolling and + test for the original 4 threads that this test was testing. */ +/* { dg-final { scan-tree-dump-times "Registering jump thread" 4 "threadfull1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c index 0229a82..f5af7a1 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c @@ -1,6 +1,6 @@ /* PR tree-optimization/61839. */ /* { dg-do run } */ -/* { dg-options "-O2 -fdump-tree-vrp-thread1 -fdisable-tree-evrp -fdump-tree-optimized -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdisable-tree-evrp -fdisable-tree-ethread -fdisable-tree-threadfull1 -fdump-tree-vrp1 -fdump-tree-optimized" } */ /* { dg-require-effective-target int32plus } */ __attribute__ ((noinline)) @@ -38,11 +38,11 @@ int main () } /* Scan for c = 972195717) >> [0, 1] in function foo. */ -/* { dg-final { scan-tree-dump-times "486097858 : 972195717" 1 "vrp-thread1" } } */ +/* { dg-final { scan-tree-dump-times "486097858 : 972195717" 1 "vrp1" } } */ /* Previously we were checking for two ?: with constant PHI arguments, but now we collapse them into one. */ /* Scan for c = 972195717) >> [2, 3] in function bar. */ -/* { dg-final { scan-tree-dump-times "243048929 : 121524464" 1 "vrp-thread1" } } */ +/* { dg-final { scan-tree-dump-times "243048929 : 121524464" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "486097858" 0 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_3.c index 7be1873..bc2126f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_3.c @@ -1,6 +1,6 @@ /* PR tree-optimization/61839. */ /* { dg-do run } */ -/* { dg-options "-O2 -fdump-tree-vrp-thread1 -fdump-tree-optimized -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdump-tree-vrp -fdump-tree-optimized -fdisable-tree-ethread -fdisable-tree-threadfull1" } */ __attribute__ ((noinline)) int foo (int a, unsigned b) @@ -22,5 +22,5 @@ int main () } /* Scan for c [12, 13] << 8 in function foo. */ -/* { dg-final { scan-tree-dump-times "3072 : 3328" 1 "vrp-thread1" } } */ +/* { dg-final { scan-tree-dump-times "3072 : 3328" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "3072" 0 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c index ba7025a..e9bb744 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr66752-3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-thread1-details -fdump-tree-thread4" } */ +/* { dg-options "-O2 -fdump-tree-threadfull1-details -fdump-tree-thread2" } */ extern int status, pt; extern int count; @@ -35,7 +35,7 @@ foo (int N, int c, int b, int *a) /* There are 2 jump threading opportunities (which don't cross loops), all of which will be realized, which will eliminate testing of FLAG, completely. */ -/* { dg-final { scan-tree-dump-times "Registering jump" 2 "thread1"} } */ +/* { dg-final { scan-tree-dump-times "Registering jump" 2 "threadfull1"} } */ /* We used to remove references to FLAG by DCE2, but this was depending on early threaders threading through loop boundaries @@ -43,4 +43,4 @@ foo (int N, int c, int b, int *a) run after loop optimizations , can successfully eliminate the references to FLAG. Verify that ther are no references by the late threading passes. */ -/* { dg-final { scan-tree-dump-not "if .flag" "thread4"} } */ +/* { dg-final { scan-tree-dump-not "if .flag" "thread2"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr68198.c b/gcc/testsuite/gcc.dg/tree-ssa/pr68198.c index af8b7a5..1250729 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr68198.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr68198.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-thread1-details -fdisable-tree-ethread" } */ +/* { dg-options "-O2 -fdump-tree-threadfull1-details -fdisable-tree-ethread" } */ extern void abort (void); @@ -38,4 +38,4 @@ c_finish_omp_clauses (tree clauses) } /* There are 3 jump threading opportunities. */ -/* { dg-final { scan-tree-dump-times "Registering jump" 3 "thread1"} } */ +/* { dg-final { scan-tree-dump-times "Registering jump" 3 "threadfull1"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c index 89735f6..5ffd5f7 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69270-3.c @@ -3,7 +3,7 @@ /* We're looking for a constant argument a PHI node. There should only be one if we unpropagate correctly. */ -/* { dg-final { scan-tree-dump-times ", 1" 1 "uncprop1"} } */ +/* { dg-final { scan-tree-dump-times "<1\|, 1" 1 "uncprop1"} } */ typedef long unsigned int size_t; typedef union gimple_statement_d *gimple; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr76174.c b/gcc/testsuite/gcc.dg/tree-ssa/pr76174.c new file mode 100644 index 0000000..17a4a0f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr76174.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-cddce1" } */ + +void foo(); + +void l(unsigned int r) { + unsigned int q = 0; + unsigned int c = r; + for (unsigned int x = 0; x<r; x++) { + if (q == c) { + foo(); + c *= 2; + } + q++; + } +} + +/* We should be able to elide the body of the function by means of + figuring out the equality between the two IVs and then simplifying + the q == c test. */ +/* { dg-final { scan-tree-dump-not "foo" "cddce1" } } */ +/* { dg-final { scan-tree-dump-times "bb" 1 "cddce1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr77445-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr77445-2.c index f2a5e78..b3db1bc 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr77445-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr77445-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-thread-details-blocks-stats" } */ +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-thread-details-blocks-stats -fdump-tree-threadfull1-blocks-stats -fdump-tree-threadfull2-blocks-stats" } */ typedef enum STATES { START=0, INVALID, @@ -123,8 +123,8 @@ enum STATES FMS( u8 **in , u32 *transitions) { aarch64 has the highest CASE_VALUES_THRESHOLD in GCC. It's high enough to change decisions in switch expansion which in turn can expose new jump threading opportunities. Skip the later tests on aarch64. */ -/* { dg-final { scan-tree-dump "Jumps threaded: \[7-9\]" "thread2" } } */ +/* { dg-final { scan-tree-dump "Jumps threaded: \[7-9\]" "thread1" } } */ /* { dg-final { scan-tree-dump-not "optimizing for size" "thread1" } } */ -/* { dg-final { scan-tree-dump-not "optimizing for size" "thread2" } } */ -/* { dg-final { scan-tree-dump-not "optimizing for size" "thread3" { target { ! aarch64*-*-* } } } } */ -/* { dg-final { scan-tree-dump-not "optimizing for size" "thread4" { target { ! aarch64*-*-* } } } } */ +/* { dg-final { scan-tree-dump-not "optimizing for size" "threadfull1" } } */ +/* { dg-final { scan-tree-dump-not "optimizing for size" "thread2" { target { ! aarch64*-*-* } } } } */ +/* { dg-final { scan-tree-dump-not "optimizing for size" "threadfull2" { target { ! aarch64*-*-* } } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr77445.c b/gcc/testsuite/gcc.dg/tree-ssa/pr77445.c index 883a63d..72bf0ec 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pr77445.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr77445.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-thread3-details-blocks -fno-early-inlining -fno-tree-vrp -fno-tree-dominator-opts" } */ +/* { dg-options "-O2 -fno-early-inlining -fno-tree-vrp -fno-tree-dominator-opts -fdump-tree-thread2-details-blocks" } */ static int a; static int b; @@ -25,5 +25,5 @@ main (int argc) if (b) test2 (); } -/* { dg-final { scan-tree-dump-times "Registering jump thread" 2 "thread3" } } */ -/* { dg-final { scan-tree-dump-not "Invalid sum" "thread3" } } */ +/* { dg-final { scan-tree-dump-times "Registering jump thread" 2 "thread2" } } */ +/* { dg-final { scan-tree-dump-not "Invalid sum" "thread2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89074.c b/gcc/testsuite/gcc.dg/tree-ssa/pr89074.c new file mode 100644 index 0000000..666dfa7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89074.c @@ -0,0 +1,12 @@ +/* PR c++/89074 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-final { scan-tree-dump "return 1;" "optimized" } } */ + +int +foo (void) +{ + const char *a = &"foo"[0]; + const char *b = "foo"; + return a == b; +} diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr96779-disabled.c b/gcc/testsuite/gcc.dg/tree-ssa/pr96779-disabled.c new file mode 100644 index 0000000..205133d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr96779-disabled.c @@ -0,0 +1,84 @@ +/* PR tree-optimization/96779 */ +/* { dg-do run } */ +/* { dg-options "-O -fdump-tree-optimized -fwrapv" } */ + +#include <stdbool.h> + +bool __attribute__ ((noipa)) f_func(int a) +{ + return -a == a; +} + +bool __attribute__ ((noipa)) g_func(unsigned int a) +{ + return -a == a; +} + +bool __attribute__ ((noipa)) h_func(short a) +{ + return -a == a; +} + +bool __attribute__ ((noipa)) k_func(long a) +{ + return -a == a; +} + +int +main (void) +{ + // few randomly generated test cases + if (f_func (71856034)) + { + __builtin_abort (); + } + if (g_func (71856034)) + { + __builtin_abort (); + } + if (h_func (1744)) + { + __builtin_abort (); + } + if (k_func (68268386)) + { + __builtin_abort (); + } + if (f_func (-112237)) + { + __builtin_abort (); + } + if (g_func (-787116)) + { + __builtin_abort (); + } + if (h_func (-863)) + { + __builtin_abort (); + } + if (k_func (-787116)) + { + __builtin_abort (); + } + if (!f_func (0)) + { + __builtin_abort (); + } + if (!g_func (0)) + { + __builtin_abort (); + } + if (!h_func (0)) + { + __builtin_abort (); + } + if (!k_func (0)) + { + __builtin_abort (); + } + + return 0; +} + +/* Verify that we have *not* transfered "= -" pattern in any of those functions. */ +/* { dg-final { scan-tree-dump-times "= -" 4 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr96779.c b/gcc/testsuite/gcc.dg/tree-ssa/pr96779.c new file mode 100644 index 0000000..0d46e8e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr96779.c @@ -0,0 +1,79 @@ +/* PR tree-optimization/96779 */ +/* { dg-do run } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +#include <stdbool.h> + +bool __attribute__ ((noipa)) f_func(int a) +{ + return -a == a; +} + +bool __attribute__ ((noipa)) h_func(short a) +{ + return -a == a; +} + +bool __attribute__ ((noipa)) k_func(long a) +{ + return -a == a; +} + +int +main (void) +{ + // few randomly generated test cases + if (f_func (71856034)) + { + __builtin_abort (); + } + if (f_func (71856034)) + { + __builtin_abort (); + } + if (h_func (1744)) + { + __builtin_abort (); + } + if (k_func (68268386)) + { + __builtin_abort (); + } + if (f_func (-112237)) + { + __builtin_abort (); + } + if (f_func (-787116)) + { + __builtin_abort (); + } + if (h_func (-863)) + { + __builtin_abort (); + } + if (k_func (-787116)) + { + __builtin_abort (); + } + if (!f_func (0)) + { + __builtin_abort (); + } + if (!f_func (0)) + { + __builtin_abort (); + } + if (!h_func (0)) + { + __builtin_abort (); + } + if (!k_func (0)) + { + __builtin_abort (); + } + + return 0; +} + +/* Verify that we transfered to "= -" pattern from "_2 = -_1;". */ +/* { dg-final { scan-tree-dump-not "= -" "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98737-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr98737-1.c new file mode 100644 index 0000000..e313a7f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr98737-1.c @@ -0,0 +1,148 @@ +/* PR target/98737 */ +/* { dg-do compile { target i?86-*-* x86_64-*-* powerpc*-*-* aarch64*-*-* } } */ +/* { dg-options "-O2 -fdump-tree-optimized -fcompare-debug" } */ +/* { dg-additional-options "-march=i686" { target ia32 } } */ +/* { dg-final { scan-tree-dump-not "__atomic_fetch_" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "__sync_fetch_and_" "optimized" } } */ + +typedef signed char schar; +typedef unsigned long ulong; +typedef unsigned int uint; +typedef unsigned short ushort; +typedef unsigned char uchar; +long vlong; +int vint; +short vshort; +schar vschar; +ulong vulong; +uint vuint; +ushort vushort; +uchar vuchar; +#define A(n, t, ut, f, o, ...) \ +t fn##n (t x) \ +{ \ + ut z = f (&v##t, x, ##__VA_ARGS__); \ + t w = (t) z; \ + return w o x; \ +} +#define B(n, f, o, ...) \ + A(n##0, long, ulong, f, o, ##__VA_ARGS__) \ + A(n##1, int, uint, f, o, ##__VA_ARGS__) \ + A(n##2, short, ushort, f, o, ##__VA_ARGS__) \ + A(n##3, schar, uchar, f, o, ##__VA_ARGS__) \ + A(n##4, ulong, ulong, f, o, ##__VA_ARGS__) \ + A(n##5, uint, uint, f, o, ##__VA_ARGS__) \ + A(n##6, ushort, ushort, f, o, ##__VA_ARGS__) \ + A(n##7, uchar, uchar, f, o, ##__VA_ARGS__) + +B(00, __atomic_fetch_add, +, __ATOMIC_RELAXED) +B(01, __atomic_fetch_sub, -, __ATOMIC_RELAXED) +B(02, __atomic_fetch_and, &, __ATOMIC_RELAXED) +B(03, __atomic_fetch_xor, ^, __ATOMIC_RELAXED) +B(04, __atomic_fetch_or, |, __ATOMIC_RELAXED) +B(05, __sync_fetch_and_add, +) +B(06, __sync_fetch_and_sub, -) +B(07, __sync_fetch_and_and, &) +B(08, __sync_fetch_and_xor, ^) +B(09, __sync_fetch_and_or, |) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (void) \ +{ \ + ut z = f (&v##t, 42, ##__VA_ARGS__); \ + t w = (t) z; \ + return w o 42; \ +} + +B(10, __atomic_fetch_add, +, __ATOMIC_RELAXED) +B(11, __atomic_fetch_sub, -, __ATOMIC_RELAXED) +B(12, __atomic_fetch_and, &, __ATOMIC_RELAXED) +B(13, __atomic_fetch_xor, ^, __ATOMIC_RELAXED) +B(14, __atomic_fetch_or, |, __ATOMIC_RELAXED) +B(15, __sync_fetch_and_add, +) +B(16, __sync_fetch_and_sub, -) +B(17, __sync_fetch_and_and, &) +B(18, __sync_fetch_and_xor, ^) +B(19, __sync_fetch_and_or, |) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (t x) \ +{ \ + ut z = f (&v##t, x, ##__VA_ARGS__); \ + t w = (t) z; \ + t v = w o x; \ + return v == 0; \ +} + +B(20, __atomic_fetch_add, +, __ATOMIC_RELAXED) +B(21, __atomic_fetch_sub, -, __ATOMIC_RELAXED) +B(22, __atomic_fetch_and, &, __ATOMIC_RELAXED) +B(23, __atomic_fetch_xor, ^, __ATOMIC_RELAXED) +B(24, __atomic_fetch_or, |, __ATOMIC_RELAXED) +B(25, __sync_fetch_and_add, +) +B(26, __sync_fetch_and_sub, -) +B(27, __sync_fetch_and_and, &) +B(28, __sync_fetch_and_xor, ^) +B(29, __sync_fetch_and_or, |) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (void) \ +{ \ + ut z = f (&v##t, 42, ##__VA_ARGS__); \ + t w = (t) z; \ + t v = w o 42; \ + return v != 0; \ +} + +B(30, __atomic_fetch_add, +, __ATOMIC_RELAXED) +B(31, __atomic_fetch_sub, -, __ATOMIC_RELAXED) +B(32, __atomic_fetch_and, &, __ATOMIC_RELAXED) +B(33, __atomic_fetch_xor, ^, __ATOMIC_RELAXED) +B(34, __atomic_fetch_or, |, __ATOMIC_RELAXED) +B(35, __sync_fetch_and_add, +) +B(36, __sync_fetch_and_sub, -) +B(37, __sync_fetch_and_and, &) +B(38, __sync_fetch_and_xor, ^) +B(39, __sync_fetch_and_or, |) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (t x) \ +{ \ + return (t) (((t) f (&v##t, x, ##__VA_ARGS__)) \ + o x) != 0; \ +} + +B(40, __atomic_fetch_add, +, __ATOMIC_RELAXED) +B(41, __atomic_fetch_sub, -, __ATOMIC_RELAXED) +B(42, __atomic_fetch_and, &, __ATOMIC_RELAXED) +B(43, __atomic_fetch_xor, ^, __ATOMIC_RELAXED) +B(44, __atomic_fetch_or, |, __ATOMIC_RELAXED) +B(45, __sync_fetch_and_add, +) +B(46, __sync_fetch_and_sub, -) +B(47, __sync_fetch_and_and, &) +B(48, __sync_fetch_and_xor, ^) +B(49, __sync_fetch_and_or, |) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (void) \ +{ \ + return (t) (((t) f (&v##t, 42, ##__VA_ARGS__))\ + o 42) == 0; \ +} + +B(50, __atomic_fetch_add, +, __ATOMIC_RELAXED) +B(51, __atomic_fetch_sub, -, __ATOMIC_RELAXED) +B(52, __atomic_fetch_and, &, __ATOMIC_RELAXED) +B(53, __atomic_fetch_xor, ^, __ATOMIC_RELAXED) +/* (whatever | 42) == 0 is 0, so we can't test this. */ +/* B(54, __atomic_fetch_or, |, __ATOMIC_RELAXED) */ +B(55, __sync_fetch_and_add, +) +B(56, __sync_fetch_and_sub, -) +B(57, __sync_fetch_and_and, &) +B(58, __sync_fetch_and_xor, ^) +/* B(59, __sync_fetch_and_or, |) */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98737-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr98737-2.c new file mode 100644 index 0000000..09149bc --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr98737-2.c @@ -0,0 +1,123 @@ +/* PR target/98737 */ +/* { dg-do compile { target i?86-*-* x86_64-*-* powerpc*-*-* aarch64*-*-* } } */ +/* { dg-options "-O2 -fdump-tree-optimized -fcompare-debug" } */ +/* { dg-additional-options "-march=i686" { target ia32 } } */ +/* { dg-final { scan-tree-dump-not "__atomic_\[^f]" "optimized" } } */ +/* { dg-final { scan-tree-dump-not "__sync_\[^f]" "optimized" } } */ + +typedef signed char schar; +typedef unsigned long ulong; +typedef unsigned int uint; +typedef unsigned short ushort; +typedef unsigned char uchar; +long vlong; +int vint; +short vshort; +schar vschar; +ulong vulong; +uint vuint; +ushort vushort; +uchar vuchar; +#define A(n, t, ut, f, o, ...) \ +t fn##n (t x) \ +{ \ + ut z = f (&v##t, x, ##__VA_ARGS__); \ + t w = (t) z; \ + return w o x; \ +} +#define B(n, f, o, ...) \ + A(n##0, long, ulong, f, o, ##__VA_ARGS__) \ + A(n##1, int, uint, f, o, ##__VA_ARGS__) \ + A(n##2, short, ushort, f, o, ##__VA_ARGS__) \ + A(n##3, schar, uchar, f, o, ##__VA_ARGS__) \ + A(n##4, ulong, ulong, f, o, ##__VA_ARGS__) \ + A(n##5, uint, uint, f, o, ##__VA_ARGS__) \ + A(n##6, ushort, ushort, f, o, ##__VA_ARGS__) \ + A(n##7, uchar, uchar, f, o, ##__VA_ARGS__) + +B(00, __atomic_add_fetch, -, __ATOMIC_RELAXED) +B(01, __atomic_sub_fetch, +, __ATOMIC_RELAXED) +B(03, __atomic_xor_fetch, ^, __ATOMIC_RELAXED) +B(05, __sync_add_and_fetch, -) +B(06, __sync_sub_and_fetch, +) +B(08, __sync_xor_and_fetch, ^) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (void) \ +{ \ + ut z = f (&v##t, 42, ##__VA_ARGS__); \ + t w = (t) z; \ + return w o 42; \ +} + +B(10, __atomic_add_fetch, -, __ATOMIC_RELAXED) +B(11, __atomic_sub_fetch, +, __ATOMIC_RELAXED) +B(13, __atomic_xor_fetch, ^, __ATOMIC_RELAXED) +B(15, __sync_add_and_fetch, -) +B(16, __sync_sub_and_fetch, +) +B(18, __sync_xor_and_fetch, ^) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (t x) \ +{ \ + ut z = f (&v##t, x, ##__VA_ARGS__); \ + t w = (t) z; \ + t v = w o x; \ + return v == 0; \ +} + +B(20, __atomic_add_fetch, -, __ATOMIC_RELAXED) +B(21, __atomic_sub_fetch, +, __ATOMIC_RELAXED) +B(23, __atomic_xor_fetch, ^, __ATOMIC_RELAXED) +B(25, __sync_add_and_fetch, -) +B(26, __sync_sub_and_fetch, +) +B(28, __sync_xor_and_fetch, ^) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (void) \ +{ \ + ut z = f (&v##t, 42, ##__VA_ARGS__); \ + t w = (t) z; \ + t v = w o 42; \ + return v != 0; \ +} + +B(30, __atomic_add_fetch, -, __ATOMIC_RELAXED) +B(31, __atomic_sub_fetch, +, __ATOMIC_RELAXED) +B(33, __atomic_xor_fetch, ^, __ATOMIC_RELAXED) +B(35, __sync_add_and_fetch, -) +B(36, __sync_sub_and_fetch, +) +B(38, __sync_xor_and_fetch, ^) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (t x) \ +{ \ + return (t) (((t) f (&v##t, x, ##__VA_ARGS__)) \ + o x) != 0; \ +} + +B(40, __atomic_add_fetch, -, __ATOMIC_RELAXED) +B(41, __atomic_sub_fetch, +, __ATOMIC_RELAXED) +B(43, __atomic_xor_fetch, ^, __ATOMIC_RELAXED) +B(45, __sync_add_and_fetch, -) +B(46, __sync_sub_and_fetch, +) +B(48, __sync_xor_and_fetch, ^) + +#undef A +#define A(n, t, ut, f, o, ...) \ +t fn##n (void) \ +{ \ + return (t) (((t) f (&v##t, 42, ##__VA_ARGS__))\ + o 42) == 0; \ +} + +B(50, __atomic_add_fetch, -, __ATOMIC_RELAXED) +B(51, __atomic_sub_fetch, +, __ATOMIC_RELAXED) +B(53, __atomic_xor_fetch, ^, __ATOMIC_RELAXED) +B(55, __sync_add_and_fetch, -) +B(56, __sync_sub_and_fetch, +) +B(58, __sync_xor_and_fetch, ^) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98953.c b/gcc/testsuite/gcc.dg/tree-ssa/pr98953.c new file mode 100644 index 0000000..7687dc2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr98953.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-bswap-details" } */ + +int foo(unsigned char *ptr) +{ +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + return ptr[0] + (ptr[1] << 8); +#else + return ptr[1] + (ptr[0] << 8); +#endif +} + +/* { dg-final { scan-tree-dump "16 bit load in target endianness found" "bswap" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c b/gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c index aa639b4..b9a57d8 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/pta-callused.c @@ -22,5 +22,5 @@ int bar (int b) return *foo (&q); } -/* { dg-final { scan-tree-dump "CALLUSED\\(\[0-9\]+\\) = { NONLOCAL f.* i q }" "alias" } } */ +/* { dg-final { scan-tree-dump "CALLUSED\\(\[0-9\]+\\) = { ESCAPED NONLOCAL f.* i q }" "alias" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-1.c index c3ccb5d..c6c2b2b 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-thread1-details --param logical-op-non-short-circuit=1" } */ +/* { dg-options "-O2 -fdump-tree-threadfull1-details --param logical-op-non-short-circuit=1" } */ // Copied from ssa-dom-thread-11.c @@ -17,4 +17,4 @@ mark_target_live_regs (int b, int block, int bb_tick) /* When the first two conditionals in the first IF are true, but the third conditional is false, then there's a jump threading opportunity to bypass the second IF statement. */ -/* { dg-final { scan-tree-dump-times "Registering.*jump thread" 1 "thread1"} } */ +/* { dg-final { scan-tree-dump-times "Registering.*jump thread" 1 "threadfull1"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-2.c b/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-2.c index d2689b6..163d9e1 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-thread2-details -w" } */ +/* { dg-options "-O2 -fdump-tree-thread1-details -w" } */ // Copied from ssa-dom-thread-12.c. @@ -36,4 +36,4 @@ scan_function (gimple stmt) that stmt->num_ops - 3 != 0. When that test is false, we can derive a value for stmt->num_ops. That in turn allows us to thread the jump for the conditional at the start of the call to gimple_op. */ -/* { dg-final { scan-tree-dump-times "Registering.*jump thread" 1 "thread2"} } */ +/* { dg-final { scan-tree-dump-times "Registering.*jump thread" 1 "thread1"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-4.c b/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-4.c index d5aa2e8..dde43ff 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-4.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ranger-threader-4.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ -/* { dg-additional-options "-O2 -fdump-tree-vrp-details -fdump-tree-thread1-details --param logical-op-non-short-circuit=1" } */ -/* { dg-final { scan-tree-dump-times "Registering jump" 8 "thread1" } } */ +/* { dg-additional-options "-O2 -fdump-tree-threadfull1-details --param logical-op-non-short-circuit=1" } */ +/* { dg-final { scan-tree-dump-times "Registering jump" 8 "threadfull1" } } */ /* Copied from ssa-thread-14. */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/recip-3.c b/gcc/testsuite/gcc.dg/tree-ssa/recip-3.c index 638bf38..410b280 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/recip-3.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/recip-3.c @@ -1,7 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-O1 -fno-trapping-math -funsafe-math-optimizations -fdump-tree-recip" } */ -double F[2] = { 0.0, 0.0 }, e; +double F[5] = { 0.0, 0.0 }, e; /* In this case the optimization is interesting. */ float h () @@ -13,7 +13,7 @@ float h () d = 2.*e; E = 1. - d; - for( i=0; i < 2; i++ ) + for( i=0; i < 5; i++ ) if( d > 0.01 ) { P = ( W < E ) ? (W - E)/d : (E - W)/d; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-1.c index 759d9ab..5b2ac53 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-vrp -fdump-tree-dom2-details" } */ +/* { dg-options "-O2 -fno-tree-vrp -fdisable-tree-threadfull1 -fdump-tree-dom2-details" } */ void t(void); void q(void); void q1(void); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-11.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-11.c index 73969bb..bcc9ccf 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-11.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-11.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-dom2-details --param logical-op-non-short-circuit=1 -fdisable-tree-thread1 -fdisable-tree-thread2 -fdisable-tree-vrp-thread1 " } */ +/* { dg-options "-O2 -fdump-tree-dom2-details --param logical-op-non-short-circuit=1 -fdisable-tree-thread1 -fdisable-tree-thread2 -fdisable-tree-threadfull1" } */ static int *bb_ticks; extern void frob (void); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-12.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-12.c index bad5e0a..e68acbb 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-12.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-12.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-dom2-details -w -fdisable-tree-thread2" } */ +/* { dg-options "-O2 -fdump-tree-dom2-details -w -fdisable-tree-thread1" } */ typedef long unsigned int size_t; union tree_node; typedef union tree_node *tree; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-14.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-14.c index a25fe8b..8497ed6 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-14.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-14.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-dom2-details -w --param logical-op-non-short-circuit=1" } */ -/* { dg-additional-options "-fdisable-tree-thread1 -fdisable-tree-ethread -fdisable-tree-thread2" } */ +/* { dg-additional-options "-fdisable-tree-thread1 -fdisable-tree-ethread -fdisable-tree-threadfull1" } */ enum optab_methods { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-16.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-16.c index 1b677f4..e8555f2 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-16.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-16.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-dom2-details -w --param logical-op-non-short-circuit=1 -fdisable-tree-vrp-thread1" } */ +/* { dg-options "-O2 -fdump-tree-dom2-details -w --param logical-op-non-short-circuit=1 -fdisable-tree-threadfull1" } */ unsigned char validate_subreg (unsigned int offset, unsigned int isize, unsigned int osize, int zz, int qq) { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2b.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2b.c index 823ada9..74a55aa 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2b.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-2b.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-thread3-stats -fdump-tree-dom2-stats -fdisable-tree-ethread" } */ +/* { dg-options "-O2 -fdump-tree-thread2-stats -fdump-tree-dom2-stats -fdisable-tree-ethread" } */ void foo(); void bla(); @@ -26,4 +26,4 @@ void thread_latch_through_header (void) case. And we want to thread through the header as well. These are both caught by threading in DOM. */ /* { dg-final { scan-tree-dump-not "Jumps threaded" "dom2"} } */ -/* { dg-final { scan-tree-dump-times "Jumps threaded: 1" 1 "thread3"} } */ +/* { dg-final { scan-tree-dump-times "Jumps threaded: 1" 1 "thread2"} } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c index ee17edd..b64e71d 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c @@ -1,15 +1,18 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-dom2-stats -fdump-tree-thread3-stats -fdump-tree-dom3-stats -fdump-tree-vrp-thread2-stats -fno-guess-branch-probability" } */ +/* { dg-options "-O2 -fdump-tree-dom2-stats -fdump-tree-thread2-stats -fdump-tree-dom3-stats -fno-guess-branch-probability" } */ /* { dg-final { scan-tree-dump-not "Jumps threaded" "dom2" } } */ +/* We were previously checking for no threads in vrp-thread2, but now + that we have merged the post and pre threaders, we get a dozen + threads before VRP2. */ + /* aarch64 has the highest CASE_VALUES_THRESHOLD in GCC. It's high enough to change decisions in switch expansion which in turn can expose new jump threading opportunities. Skip the later tests on aarch64. */ /* { dg-final { scan-tree-dump-not "Jumps threaded" "dom3" { target { ! aarch64*-*-* } } } } */ -/* { dg-final { scan-tree-dump-not "Jumps threaded" "vrp-thread2" { target { ! aarch64*-*-* } } } } */ -/* { dg-final { scan-tree-dump "Jumps threaded: 11" "thread3" { target { ! aarch64*-*-* } } } } */ -/* { dg-final { scan-tree-dump "Jumps threaded: 18" "thread3" { target { aarch64*-*-* } } } } */ +/* { dg-final { scan-tree-dump "Jumps threaded: 7" "thread2" { target { ! aarch64*-*-* } } } } */ +/* { dg-final { scan-tree-dump "Jumps threaded: 18" "thread2" { target { aarch64*-*-* } } } } */ enum STATE { S0=0, diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-98.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-98.c new file mode 100644 index 0000000..3d28609 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-98.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-fre1-details" } */ + +int foo (int a, int s, unsigned int k) +{ + int i = a, j = a; + do + { + i += s; + j += j; + j -= a; + } + while (k--); + return j+i; +} + +/* We want the redundant PHI for j to disappear. */ +/* { dg-final { scan-tree-dump "Replaced redundant PHI node defining j" "fre1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-18.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-18.c new file mode 100644 index 0000000..da19806 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-18.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fstrict-aliasing -fdump-tree-lim2-details" } */ + +unsigned p; + +void foo (float *q) +{ + for (int i = 0; i < 256; ++i) + { + if (p) + { + unsigned a = p; + *(q++) = 1.; + p = a + 1; + } + } +} + +/* { dg-final { scan-tree-dump-times "Executing store motion" 1 "lim2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-19.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-19.c new file mode 100644 index 0000000..51c1913 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-19.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-lim2-details" } */ + +volatile int x; +void +bar (int, char *, char *); +void +foo (int *a, int n, int m, int s, int t) +{ + int i; + int j; + int k; + + for (i = 0; i < m; i++) // Loop 1 + { + if (__builtin_expect (x, 0)) + for (j = 0; j < n; j++) // Loop 2 + for (k = 0; k < n; k++) // Loop 3 + { + bar (s / 5, "one", "two"); + a[t] = s; + } + a[t] = t; + } +} + +/* { dg-final { scan-tree-dump-times "out of loop 2" 4 "lim2" } } */ +/* { dg-final { scan-tree-dump-times "out of loop 1" 3 "lim2" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-20.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-20.c new file mode 100644 index 0000000..bc60a04 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-20.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-lim2-details" } */ + +/* Test that `count' is not hoisted out of loop when bb is cold. */ + +int count; +volatile int x; + +struct obj { + int data; + struct obj *next; + +} *q; + +void +func (int m) +{ + struct obj *p; + for (int i = 0; i < m; i++) + if (__builtin_expect (x, 0)) + count++; + +} + +/* { dg-final { scan-tree-dump-not "Executing store motion of" "lim2" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-21.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-21.c new file mode 100644 index 0000000..ffe6f8f --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-21.c @@ -0,0 +1,35 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-lim2-details" } */ + +/* Test that `data' and 'data1' is not hoisted out of inner loop and outer loop + when it is in cold loop. */ + +int count; +volatile int x; + +struct obj { + int data; + int data1; + struct obj *next; +}; + +void +func (int m, int n, int k, struct obj *a) +{ + struct obj *q = a; + for (int j = 0; j < m; j++) + if (__builtin_expect (m, 0)) + for (int i = 0; i < m; i++) + { + if (__builtin_expect (x, 0)) + { + count++; + q->data += 3; /* Not hoisted out to inner loop. */ + } + count += n; + q->data1 += k; /* Not hoisted out to outer loop. */ + } +} + +/* { dg-final { scan-tree-dump-not "Executing store motion of" "lim2" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-22.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-22.c new file mode 100644 index 0000000..16ba4ce --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-22.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-lim2-details" } */ + +volatile int x; +volatile int y; +void +bar (int, char *, char *); +void +foo (int *a, int n, int m, int s, int t) +{ + int i; + int j; + int k; + + for (i = 0; i < m; i++) // Loop 1 + { + if (__builtin_expect (x, 0)) + for (j = 0; j < n; j++) // Loop 2 + if (__builtin_expect (y, 0)) + for (k = 0; k < n; k++) // Loop 3 + { + bar (s / 5, "one", "two"); + a[t] = s; + } + a[t] = t; + } +} + +/* { dg-final { scan-tree-dump-times "out of loop 3" 4 "lim2" } } */ +/* { dg-final { scan-tree-dump-times "out of loop 1" 3 "lim2" } } */ + + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-23.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-23.c new file mode 100644 index 0000000..e788074 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-23.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-lim2-details" } */ + +volatile int x; +void +bar (int, char *, char *); +void +foo (int *a, int n, int k) +{ + int i; + + for (i = 0; i < n; i++) + { + if (__builtin_expect (x, 0)) + bar (k / 5, "one", "two"); + a[i] = k; + } +} + +/* { dg-final { scan-tree-dump-not "out of loop 1" "lim2" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c index 8c5cc82..51fc065 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-14.c @@ -1,7 +1,6 @@ /* { dg-do compile } */ -/* { dg-additional-options "-O2 -fdump-tree-vrp-thread1-details --param logical-op-non-short-circuit=1" } */ -/* { dg-additional-options "-fdisable-tree-thread1" } */ -/* { dg-final { scan-tree-dump-times "Threaded jump" 8 "vrp-thread1" } } */ +/* { dg-additional-options "-O2 --param logical-op-non-short-circuit=1 -fdump-tree-threadfull1-details" } */ +/* { dg-final { scan-tree-dump-times "Registering jump thread" 8 "threadfull1" } } */ void foo (void); void bar (void); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-backedge.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-backedge.c index 890a0ee..ef9a3e8 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-backedge.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-backedge.c @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-O2 -fdisable-tree-ethread -fdisable-tree-thread1 -fdisable-tree-thread2 -fno-tree-dominator-opts -fdump-tree-thread3-details" } +// { dg-options "-O2 -fdisable-tree-ethread -fdisable-tree-thread1 -fdisable-tree-thread2 -fno-tree-dominator-opts -fdump-tree-threadfull2-details" } // Test that we can thread jumps across the backedge of a loop through // the switch statement to a particular case. @@ -29,4 +29,4 @@ int foo (unsigned int x, int s) return s; } -// { dg-final { scan-tree-dump "Registering jump thread:.*normal \\(back\\)" "thread3" } } +// { dg-final { scan-tree-dump "Registering jump thread:.*normal \\(back\\)" "threadfull2" } } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c index f3ca140..25c2d3a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-vrp-thread-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-thread1-details -fdelete-null-pointer-checks" } */ +/* { dg-options "-O2 -fdump-tree-threadfull1-details -fdelete-null-pointer-checks" } */ /* { dg-skip-if "" keeps_null_pointer_checks } */ void oof (void); @@ -29,5 +29,5 @@ build_omp_regions_1 (basic_block bb, struct omp_region *parent, /* ARM Cortex-M defined LOGICAL_OP_NON_SHORT_CIRCUIT to false, so skip below test. */ -/* { dg-final { scan-tree-dump-times "Registering jump thread" 1 "thread1" { target { ! arm_cortex_m } } } } */ +/* { dg-final { scan-tree-dump-times "Registering jump thread" 1 "threadfull1" { target { ! arm_cortex_m } } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/tree-ssa.exp b/gcc/testsuite/gcc.dg/tree-ssa/tree-ssa.exp index 2a22ea9..e5b524f 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/tree-ssa.exp +++ b/gcc/testsuite/gcc.dg/tree-ssa/tree-ssa.exp @@ -1,4 +1,4 @@ -# Copyright (C) 1997-2021 Free Software Foundation, Inc. +# Copyright (C) 1997-2022 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp02.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp02.c index 2285c55..6e9c8df 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp02.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp02.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1 -fdelete-null-pointer-checks -fdisable-tree-evrp -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdump-tree-vrp1 -fdelete-null-pointer-checks -fdisable-tree-evrp -fno-thread-jumps" } */ struct A { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c index 1d7ea4e8..4cbaca4 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fno-thread-jumps" } */ struct A { diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp05.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp05.c index c17cd1b..7f38e8d 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp05.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp05.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1 -fno-early-inlining -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdump-tree-vrp1 -fno-early-inlining -fno-thread-jumps" } */ inline int ten() diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp06.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp06.c index acb03c2..898477e 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp06.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp06.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fno-thread-jumps" } */ int baz (void); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c index 31a5415..ec5f6cc 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1-details -fdelete-null-pointer-checks -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1-details -fdelete-null-pointer-checks -fno-thread-jumps" } */ int foo (int i, int *p) @@ -34,6 +34,3 @@ foo (int i, int *p) /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp1" } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 0" 1 "vrp1" { target { ! keeps_null_pointer_checks } } } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 0" 0 "vrp1" { target { keeps_null_pointer_checks } } } } */ - -/* { dg-final { scan-tree-dump-times "PREDICATE: p_\[0-9\]" 2 "vrp1" { target { ! keeps_null_pointer_checks } } } } */ -/* { dg-final { scan-tree-dump-times "PREDICATE: p_\[0-9\]" 1 "vrp1" { target { keeps_null_pointer_checks } } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c index 2c6742b..c9d9023 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1-details -fdisable-tree-thread1 -fdelete-null-pointer-checks" } */ +/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1-details -fno-thread-jumps -fdelete-null-pointer-checks" } */ /* Compile with -fno-tree-fre -O2 to prevent CSEing *p. */ int @@ -20,5 +20,4 @@ foo (int a, int *p) } /* Target disabling -fdelete-null-pointer-checks should not fold checks */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp1" { target { ! keeps_null_pointer_checks } } } } */ -/* { dg-final { scan-tree-dump-times "PREDICATE: p_.* ne_expr 0" 1 "vrp1" { target { ! keeps_null_pointer_checks } } } } */ /* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 0 "vrp1" { target { keeps_null_pointer_checks } } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c index fad0051..3541696 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1 -std=gnu89 -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1 -std=gnu89 -fno-thread-jumps" } */ foo (int *p) { @@ -27,4 +27,5 @@ L78: } } -/* { dg-final { scan-tree-dump-times "Folding predicate p_.. != 0B to 1" 2 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "Folding predicate p_" 2 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "!= 0B to 1" 2 "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp106.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp106.c index f25ea9c..dc5021a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp106.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp106.c @@ -1,6 +1,6 @@ /* PR tree-optimization/18046 */ -/* { dg-options "-O2 -fdump-tree-vrp-thread1-details" } */ -/* { dg-final { scan-tree-dump-times "Threaded jump" 1 "vrp-thread1" } } */ +/* { dg-options "-O2 -fdump-tree-ethread-details" } */ +/* { dg-final { scan-tree-dump-times "Registering jump thread" 1 "ethread" } } */ /* During VRP we expect to thread the true arm of the conditional through the switch and to the BB that corresponds to the 7 ... 9 case label. */ extern void foo (void); diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp113.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp113.c index ab8d91e..dfe4989 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp113.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp113.c @@ -13,5 +13,3 @@ int f(int a) { case 7: return 19; } } - -/* { dg-final { scan-tree-dump "return 3;" "vrp1" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp116.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp116.c index d9d7b23..9e68a77 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp116.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp116.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1" } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ int f (int m1, int m2, int c) @@ -9,4 +9,4 @@ f (int m1, int m2, int c) return e ? m1 : m2; } -/* { dg-final { scan-tree-dump-times "\\? c_\[0-9\]\\(D\\) : 0" 1 "vrp1" } } */ +/* { dg-final { scan-tree-dump-times "\\? c_\[0-9\]\\(D\\) : 0" 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c index f9df67f..e582299 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c @@ -23,5 +23,5 @@ int g (int b) { return 1; } -/* { dg-final { scan-tree-dump "Folding predicate a_. == 0 to 0" "vrp1" } } */ -/* { dg-final { scan-tree-dump "Folding predicate b_. != 0 to 1" "vrp1" } } */ +/* { dg-final { scan-tree-dump "Folding predicate a_\.\* == 0 to 0" "vrp1" } } */ +/* { dg-final { scan-tree-dump "Folding predicate b_\.\* != 0 to 1" "vrp1" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp33.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp33.c index 88833eb..470675e 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp33.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp33.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-vrp1 -fno-tree-fre -fdisable-tree-evrp -fdisable-tree-ethread -fdisable-tree-thread1" } */ +/* { dg-options "-O2 -fdump-tree-vrp1 -fno-tree-fre -fdisable-tree-evrp -fno-thread-jumps" } */ /* This is from PR14052. */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c index 66d74e9..9e53547 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdisable-tree-evrp -fno-tree-fre -fdump-tree-vrp1-details -fdisable-tree-ethread" } */ +/* { dg-options "-O2 -fdisable-tree-evrp -fno-tree-fre -fdump-tree-vrp1 -fdisable-tree-ethread" } */ void bar (void); int foo (int i, int j) @@ -18,5 +18,6 @@ int foo (int i, int j) return j; } -/* { dg-final { scan-tree-dump "res_.: int \\\[1, 1\\\]" "vrp1" } } */ -/* { dg-final { scan-tree-dump-not "Threaded" "vrp1" } } */ +/* { dg-final { scan-tree-dump-not "PHI" "vrp1" } } */ +/* { dg-final { scan-tree-dump-not "goto" "vrp1" } } */ +/* { dg-final { scan-tree-dump-not "if" "vrp1" } } */ |