diff options
author | Richard Biener <rguenther@suse.de> | 2018-06-19 06:53:04 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-06-19 06:53:04 +0000 |
commit | df0aef6d7e755b5150ddd8fe8fa4209461541cf0 (patch) | |
tree | 5f7cbbe5636899339318358506deccefd3ed7952 /gcc | |
parent | 6bdfada421e21cbeb4cfb29b2566ac6075be463a (diff) | |
download | gcc-df0aef6d7e755b5150ddd8fe8fa4209461541cf0.zip gcc-df0aef6d7e755b5150ddd8fe8fa4209461541cf0.tar.gz gcc-df0aef6d7e755b5150ddd8fe8fa4209461541cf0.tar.bz2 |
re PR tree-optimization/86179 (ice in get_later_stmt, at tree-vectorizer.h:1108)
2018-06-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/86179
* tree-vect-patterns.c (vect_pattern_recog_1): Clean up
after failed recognition.
* gcc.dg/pr86179.c: New testcase.
From-SVN: r261731
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr86179.c | 14 | ||||
-rw-r--r-- | gcc/tree-vect-patterns.c | 26 |
4 files changed, 46 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 239d08a..e1b5d2a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-06-19 Richard Biener <rguenther@suse.de> + + PR tree-optimization/86179 + * tree-vect-patterns.c (vect_pattern_recog_1): Clean up + after failed recognition. + 2018-06-18 Martin Sebor <msebor@redhat.com> PR middle-end/85602 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b3b1322..6783540 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-06-19 Richard Biener <rguenther@suse.de> + + PR tree-optimization/86179 + * gcc.dg/pr86179.c: New testcase. + 2018-06-18 Martin Sebor <msebor@redhat.com> PR middle-end/85602 diff --git a/gcc/testsuite/gcc.dg/pr86179.c b/gcc/testsuite/gcc.dg/pr86179.c new file mode 100644 index 0000000..6a90f09 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr86179.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +void c(int *d, char *g) +{ + char *a, *b, *e; + int f; + for (; f; f -= 8) { + *d++ = *e++ | (unsigned)*g++ << 8 | (unsigned)*b++ << 16 | + (unsigned)*a++ << 24; + *d++ = *e++ | (unsigned)*g++ << 8 | (unsigned)*b++ << 16 | + (unsigned)*a++ << 24; + } +} diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index c530810..19d4ea9 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -4496,7 +4496,18 @@ vect_pattern_recog_1 (vect_recog_func *recog_func, stmts_to_replace->quick_push (stmt); pattern_stmt = recog_func->fn (stmts_to_replace, &type_in, &type_out); if (!pattern_stmt) - return false; + { + /* Clear related stmt info that analysis might have noted for + to be replaced stmts. */ + for (i = 0; stmts_to_replace->iterate (i, &stmt) + && (unsigned) i < stmts_to_replace->length (); + i++) + { + stmt_info = vinfo_for_stmt (stmt); + STMT_VINFO_RELATED_STMT (stmt_info) = NULL; + } + return false; + } stmt = stmts_to_replace->last (); stmt_info = vinfo_for_stmt (stmt); @@ -4668,7 +4679,6 @@ vect_pattern_recog (vec_info *vinfo) gimple_stmt_iterator si; unsigned int i, j; auto_vec<gimple *, 1> stmts_to_replace; - gimple *stmt; DUMP_VECT_SCOPE ("vect_pattern_recog"); @@ -4685,6 +4695,10 @@ vect_pattern_recog (vec_info *vinfo) basic_block bb = bbs[i]; for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) { + gimple *stmt = gsi_stmt (si); + stmt_vec_info stmt_info = vinfo_for_stmt (stmt); + if (stmt_info && STMT_VINFO_IN_PATTERN_P (stmt_info)) + continue; /* Scan over all generic vect_recog_xxx_pattern functions. */ for (j = 0; j < NUM_PATTERNS; j++) if (vect_pattern_recog_1 (&vect_vect_recog_func_ptrs[j], si, @@ -4699,9 +4713,11 @@ vect_pattern_recog (vec_info *vinfo) for (si = bb_vinfo->region_begin; gsi_stmt (si) != gsi_stmt (bb_vinfo->region_end); gsi_next (&si)) { - if ((stmt = gsi_stmt (si)) - && vinfo_for_stmt (stmt) - && !STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt))) + gimple *stmt = gsi_stmt (si); + stmt_vec_info stmt_info = vinfo_for_stmt (stmt); + if (stmt_info + && (!STMT_VINFO_VECTORIZABLE (stmt_info) + || STMT_VINFO_IN_PATTERN_P (stmt_info))) continue; /* Scan over all generic vect_recog_xxx_pattern functions. */ |