gcc/ChangeLog:
* tree-ssa-threadbackward.c (back_threader::find_paths_to_names):
Always try to resolve path without looking back.
gcc/testsuite/ChangeLog:
* gcc.dg/graphite/scop-dsyr2k-2.c: Adjust for jump threading changes.
* gcc.dg/graphite/scop-dsyr2k.c: Same.
* gcc.dg/graphite/scop-dsyrk-2.c: Same.
* gcc.dg/graphite/scop-dsyrk.c: Same.
* gcc.dg/tree-ssa/pr20701.c: Same.
* gcc.dg/tree-ssa/pr20702.c: Same.
* gcc.dg/tree-ssa/pr21086.c: Same.
* gcc.dg/tree-ssa/pr25382.c: Same.
* gcc.dg/tree-ssa/pr58480.c: Same.
* gcc.dg/tree-ssa/ssa-vrp-thread-1.c: Same.
* gcc.dg/tree-ssa/vrp08.c: Same.
* gcc.dg/tree-ssa/vrp55.c: Same.
* gcc.dg/tree-ssa/ssa-dom-thread-4.c: Removed.
* gcc.dg/tree-ssa/ssa-dom-thread-7.c: Removed.
* gcc.dg/tree-ssa/ssa-thread-11.c: Removed.
* gcc.dg/uninit-pr89230-1.c: xfail.
---
gcc/testsuite/gcc.dg/graphite/scop-dsyr2k-2.c | 1 +
gcc/testsuite/gcc.dg/graphite/scop-dsyr2k.c | 1 +
gcc/testsuite/gcc.dg/graphite/scop-dsyrk-2.c | 1 +
gcc/testsuite/gcc.dg/graphite/scop-dsyrk.c | 1 +
gcc/testsuite/gcc.dg/tree-ssa/pr20701.c | 2 +-
gcc/testsuite/gcc.dg/tree-ssa/pr20702.c | 2 +-
gcc/testsuite/gcc.dg/tree-ssa/pr21086.c | 2 +-
gcc/testsuite/gcc.dg/tree-ssa/pr25382.c | 2 +-
gcc/testsuite/gcc.dg/tree-ssa/pr58480.c | 2 +-
.../gcc.dg/tree-ssa/ssa-dom-thread-4.c | 60 --------
.../gcc.dg/tree-ssa/ssa-dom-thread-7.c | 134 ------------------
gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-11.c | 50 -------
.../gcc.dg/tree-ssa/ssa-vrp-thread-1.c | 4 +-
gcc/testsuite/gcc.dg/tree-ssa/vrp08.c | 2 +-
gcc/testsuite/gcc.dg/tree-ssa/vrp55.c | 6 +-
gcc/testsuite/gcc.dg/uninit-pr89230-1.c | 3 +-
gcc/tree-ssa-threadbackward.c | 4 +-
17 files changed, 19 insertions(+), 258 deletions(-)
delete mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-4.c
delete mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
delete mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-11.c
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-dsyr2k-2.c
b/gcc/testsuite/gcc.dg/graphite/scop-dsyr2k-2.c
index 06aa19a8577..42e23fc157e 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-dsyr2k-2.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-dsyr2k-2.c
@@ -1,4 +1,5 @@
/* { dg-require-effective-target size32plus } */
+/* { dg-additional-options "-fno-thread-jumps" } */
#define NMAX 3000
static double a[NMAX][NMAX], b[NMAX][NMAX], c[NMAX][NMAX];
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-dsyr2k.c
b/gcc/testsuite/gcc.dg/graphite/scop-dsyr2k.c
index 41c91b97b57..feb99358ac7 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-dsyr2k.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-dsyr2k.c
@@ -1,4 +1,5 @@
/* { dg-require-effective-target size32plus } */
+/* { dg-additional-options "-fno-thread-jumps" } */
#define NMAX 3000
static double a[NMAX][NMAX], b[NMAX][NMAX], c[NMAX][NMAX];
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-dsyrk-2.c
b/gcc/testsuite/gcc.dg/graphite/scop-dsyrk-2.c
index 5622dce4798..935ade3fb6e 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-dsyrk-2.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-dsyrk-2.c
@@ -1,4 +1,5 @@
/* { dg-require-effective-target size32plus } */
+/* { dg-additional-options "-fno-thread-jumps" } */
#define NMAX 3000
#define MEASURE_TIME 1
diff --git a/gcc/testsuite/gcc.dg/graphite/scop-dsyrk.c b/gcc/testsuite/gcc.dg/graphite/scop-dsyrk.c
index e01a517be11..5c65e406589 100644
--- a/gcc/testsuite/gcc.dg/graphite/scop-dsyrk.c
+++ b/gcc/testsuite/gcc.dg/graphite/scop-dsyrk.c
@@ -1,4 +1,5 @@
/* { dg-require-effective-target size32plus } */
+/* { dg-additional-options "-fno-thread-jumps" } */
#define NMAX 3000
#define MEASURE_TIME 1
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c b/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c
index 2f914589e32..496c4256733 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" } */
+/* { dg-options "-O2 -fdump-tree-vrp1 -fno-early-inlining
-fdelete-null-pointer-checks -fdisable-tree-thread1" } */
typedef struct {
int code;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr20702.c
b/gcc/testsuite/gcc.dg/tree-ssa/pr20702.c
index c896857748c..81129674d8a 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr20702.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr20702.c
@@ -4,7 +4,7 @@
immediate successors of the basic block. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp
-fdump-tree-vrp1-details -fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fno-thread-jumps -fdisable-tree-evrp -fdump-tree-vrp1-details
-fdelete-null-pointer-checks" } */
extern void bar (int);
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c
index aadd53e2237..9b93d39d4e4 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fdump-tree-dce2
-fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fno-thread-jumps -fdisable-tree-evrp -fdump-tree-vrp1
-fdump-tree-dce2 -fdelete-null-pointer-checks" } */
int
foo (int *p)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr25382.c
b/gcc/testsuite/gcc.dg/tree-ssa/pr25382.c
index d74765551c2..8634c0a7895 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr25382.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr25382.c
@@ -3,7 +3,7 @@
Check that VRP now gets ranges from BIT_AND_EXPRs. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-ccp -fdisable-tree-evrp -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fno-thread-jumps -fno-tree-ccp -fdisable-tree-evrp
-fdump-tree-vrp1" } */
int
foo (int a)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr58480.c
b/gcc/testsuite/gcc.dg/tree-ssa/pr58480.c
index 42898e72d4e..f11623b7c6b 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr58480.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr58480.c
@@ -1,5 +1,5 @@
/* { dg-do compile { target { ! keeps_null_pointer_checks } } } */
-/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1
-fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fno-thread-jumps -fdisable-tree-evrp -fdump-tree-vrp1
-fdelete-null-pointer-checks" } */
extern void eliminate (void);
extern void* f1 (void *a, void *b) __attribute__((nonnull));
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-4.c
b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-4.c
deleted file mode 100644
index 9cd463571c4..00000000000
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-4.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp-thread2-details -fdump-tree-dom2-details
-std=gnu89 --param logical-op-non-short-circuit=1" } */
-struct bitmap_head_def;
-typedef struct bitmap_head_def *bitmap;
-typedef const struct bitmap_head_def *const_bitmap;
-typedef unsigned long BITMAP_WORD;
-typedef struct bitmap_element_def
-{
- struct bitmap_element_def *next;
- unsigned int indx;
-} bitmap_element;
-
-
-
-
-
-
-
-
-
-unsigned char
-bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b,
- const_bitmap kill)
-{
- unsigned char changed = 0;
-
- bitmap_element *dst_elt;
- const bitmap_element *a_elt, *b_elt, *kill_elt, *dst_prev;
-
- while (a_elt || b_elt)
- {
- unsigned char new_element = 0;
-
- if (b_elt)
- while (kill_elt && kill_elt->indx < b_elt->indx)
- kill_elt = kill_elt->next;
-
- if (b_elt && kill_elt && kill_elt->indx == b_elt->indx
- && (!a_elt || a_elt->indx >= b_elt->indx))
- {
- bitmap_element tmp_elt;
- unsigned ix;
-
- BITMAP_WORD ior = 0;
-
- changed = bitmap_elt_ior (dst, dst_elt, dst_prev,
- a_elt, &tmp_elt, changed);
-
- }
-
- }
-
-
- return changed;
-}
-/* We used to catch 3 jump threads in vrp-thread1, but they all
- rotated the loop, so they were disallowed. This in turn created
- other opportunities for the other threaders which result in the the
- post-loop threader (vrp-thread2) catching more. */
-/* { dg-final { scan-tree-dump-times "Registering jump thread" 5 "vrp-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
deleted file mode 100644
index 1da00a691c8..00000000000
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dom-thread-7.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-thread1-stats -fdump-tree-thread2-stats
-fdump-tree-dom2-stats -fdump-tree-thread3-stats -fdump-tree-dom3-stats
-fdump-tree-vrp2-stats -fno-guess-branch-probability" } */
-
-/* { dg-final { scan-tree-dump "Jumps threaded: 12" "thread3" } } */
-/* { dg-final { scan-tree-dump-not "Jumps threaded" "dom2" } } */
-
-/* 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*-*-* } } } } */
-
-enum STATE {
- S0=0,
- SI,
- S1,
- S2,
- S3,
- S4,
- S5,
- S6
-};
-
-int bar (enum STATE s);
-
-enum STATE foo (unsigned char **y, unsigned *c)
-{
- unsigned char *x = *y;
- unsigned char n;
- enum STATE s = S0;
-
- for( ; *x && s != SI; x++ )
- {
- n = *x;
- if (n == 'x')
- {
- x++;
- break;
- }
- switch(s)
- {
- case S0:
- if(bar(n))
- s = S3;
- else if( n == 'a' || n == 'b' )
- s = S1;
- else if( n == 'c' )
- s = S4;
- else
- {
- s = SI;
- c[SI]++;
- }
- c[S0]++;
- break;
- case S1:
- if(bar(n))
- {
- s = S3;
- c[S1]++;
- }
- else if( n == 'c' )
- {
- s = S4;
- c[S1]++;
- }
- else
- {
- s = SI;
- c[S1]++;
- }
- break;
- case S3:
- if( n == 'c' )
- {
- s = S4;
- c[S3]++;
- }
- else if(!bar(n))
- {
- s = SI;
- c[S3]++;
- }
- break;
- case S4:
- if( n == 'E' || n == 'e' )
- {
- s = S2;
- c[S4]++;
- }
- else if(!bar(n))
- {
- s = SI;
- c[S4]++;
- }
- break;
- case S2:
- if( n == 'a' || n == 'b' )
- {
- s = S5;
- c[S2]++;
- }
- else
- {
- s = SI;
- c[S2]++;
- }
- break;
- case S5:
- if(bar(n))
- {
- s = S6;
- c[S5]++;
- }
- else
- {
- s = SI;
- c[S5]++;
- }
- break;
- case S6:
- if(!bar(n))
- {
- s = SI;
- c[SI]++;
- }
- break;
- default:
- break;
- }
- }
- *y=x;
- return s;
-}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-11.c
b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-11.c
deleted file mode 100644
index 672a54e07db..00000000000
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-11.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp2-details --param
logical-op-non-short-circuit=1" } */
-/* { dg-additional-options "-fdisable-tree-ethread -fdisable-tree-thread1
-fdisable-tree-thread2" } */
-/* { dg-final { scan-tree-dump-not "IRREDUCIBLE_LOOP" "vrp2" } } */
-
-void abort (void);
-typedef struct bitmap_head_def *bitmap;
-typedef const struct bitmap_head_def *const_bitmap;
-typedef struct bitmap_obstack
-{
- struct bitmap_obstack *next;
- unsigned int indx;
-}
-bitmap_element;
-typedef struct bitmap_head_def
-{
- bitmap_element *first;
-}
-bitmap_head;
-static __inline__ unsigned char
-bitmap_elt_ior (bitmap dst, bitmap_element * dst_elt,
- bitmap_element * dst_prev, const bitmap_element * a_elt,
- const bitmap_element * b_elt)
-{
- ((void) (!(a_elt || b_elt) ? abort (), 0 : 0));
-}
-
-unsigned char
-bitmap_ior_and_compl (bitmap dst, const_bitmap a, const_bitmap b,
- const_bitmap kill)
-{
- bitmap_element *dst_elt = dst->first;
- const bitmap_element *a_elt = a->first;
- const bitmap_element *b_elt = b->first;
- const bitmap_element *kill_elt = kill->first;
- bitmap_element *dst_prev = ((void *) 0);
- while (a_elt || b_elt)
- {
- if (b_elt && kill_elt && kill_elt->indx == b_elt->indx
- && (!a_elt || a_elt->indx >= b_elt->indx));
- else
- {
- bitmap_elt_ior (dst, dst_elt, dst_prev, a_elt, b_elt);
- if (a_elt && b_elt && a_elt->indx == b_elt->indx)
- ;
- else if (a_elt && (!b_elt || a_elt->indx <= b_elt->indx))
- a_elt = a_elt->next;
- }
- }
-}
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 86d07ef9bdb..f3ca140bd26 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-vrp-thread1-details
-fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fdump-tree-thread1-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 "Threaded" 1 "vrp-thread1" { target { !
arm_cortex_m } } } } */
+/* { dg-final { scan-tree-dump-times "Registering jump thread" 1 "thread1" {
target { ! arm_cortex_m } } } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c
index c2da30b4b68..2c6742b76c7 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
-fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1-details
-fdisable-tree-thread1 -fdelete-null-pointer-checks" } */
/* Compile with -fno-tree-fre -O2 to prevent CSEing *p. */
int
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp55.c
b/gcc/testsuite/gcc.dg/tree-ssa/vrp55.c
index a478a6981ac..0ef57d935e4 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp55.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp55.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp-thread1-blocks-vops-details
-fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fdump-tree-ethread-details -fdelete-null-pointer-checks"
} */
void arf (void);
@@ -12,6 +12,6 @@ fu (char *p, int x)
arf ();
}
-/* { dg-final { scan-tree-dump-times "Threaded jump" 1 "vrp-thread1" { target { ! keeps_null_pointer_checks } } } } */
-/* { dg-final { scan-tree-dump-times "Threaded jump" 0 "vrp-thread1" { target
{ keeps_null_pointer_checks } } } } */
+/* { dg-final { scan-tree-dump-times "Registering jump thread" 1 "ethread" {
target { ! keeps_null_pointer_checks } } } } */
+/* { dg-final { scan-tree-dump-times "Registering jump thread" 0 "ethread" {
target { keeps_null_pointer_checks } } } } */
diff --git a/gcc/testsuite/gcc.dg/uninit-pr89230-1.c b/gcc/testsuite/gcc.dg/uninit-pr89230-1.c
index 1c07c4f6d78..dfc87a5b1a0 100644
--- a/gcc/testsuite/gcc.dg/uninit-pr89230-1.c
+++ b/gcc/testsuite/gcc.dg/uninit-pr89230-1.c
@@ -8,7 +8,8 @@ struct S { int i, j; };
int g (void)
{
- struct S *p = f (), *q;
+ struct S *p = f ();
+ struct S *q; // { dg-bogus "may be used uninitialized" "uninitialized" {
xfail *-*-* } }
if (p->i || !(q = f ()) || p->j != q->i)
{
diff --git a/gcc/tree-ssa-threadbackward.c b/gcc/tree-ssa-threadbackward.c
index d94e3b962db..edb396b3d6f 100644
--- a/gcc/tree-ssa-threadbackward.c
+++ b/gcc/tree-ssa-threadbackward.c
@@ -374,8 +374,8 @@ back_threader::find_paths_to_names (basic_block bb, bitmap
interesting)
return false;
}
- // Try to resolve the path with nothing but ranger knowledge.
- if (m_resolve && m_path.length () > 1 && maybe_register_path ())
+ // Try to resolve the path without looking back.
+ if (m_path.length () > 1 && maybe_register_path ())
{
m_path.pop ();
m_visited_bbs.remove (bb);