From: Richard Sandiford Date: Tue, 3 Jul 2018 09:58:47 +0000 (+0000) Subject: Avoid matching the same pattern statement twice X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3239dde94019f11e6c1a8c6ae2b3f7d944689148;p=gcc.git Avoid matching the same pattern statement twice r262275 allowed pattern matching on pattern statements. Testing for SVE on more benchmarks showed a case where this interacted badly with 14/n. The new over-widening detection could narrow a COND_EXPR A to another COND_EXPR B, which mixed_size_cond could then match. This was working as expected. However, we left B (now dead) in the pattern definition sequence with a non-null PATTERN_DEF_SEQ. mask_conversion also matched B, and unlike most recognisers, didn't clear PATTERN_DEF_SEQ before adding statements to it. This meant that the statements created by mixed_size_cond appeared in two supposedy separate sequences, causing much confusion. This patch removes pattern statements that are replaced by further pattern statements. As a belt-and-braces fix, it also nullifies PATTERN_DEF_SEQ on failure, in the same way Richard B. did recently for RELATED_STMT. I have patches to clean up the PATTERN_DEF_SEQ handling, but they only apply after the complete PR85694 sequence, whereas this needs to go in before 14/n. 2018-07-03 Richard Sandiford gcc/ * tree-vect-patterns.c (vect_mark_pattern_stmts): Remove pattern statements that have been replaced by further pattern statements. (vect_pattern_recog_1): Clear STMT_VINFO_PATTERN_DEF_SEQ on failure. gcc/testsuite/ * gcc.dg/vect/vect-mixed-size-cond-1.c: New test. From-SVN: r262332 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 99226d5861f..1526dd5036f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-07-03 Richard Sandiford + + * tree-vect-patterns.c (vect_mark_pattern_stmts): Remove pattern + statements that have been replaced by further pattern statements. + (vect_pattern_recog_1): Clear STMT_VINFO_PATTERN_DEF_SEQ on failure. + 2018-07-03 Richard Biener * tree-vect-stmts.c (vect_is_simple_use): Consolidate dumping, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fb4422ff6e7..38e85e434a7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-07-03 Richard Sandiford + + * gcc.dg/vect/vect-mixed-size-cond-1.c: New test. + 2018-07-02 Jim Wilson * gcc.target/riscv/interrupt-debug.c: New. diff --git a/gcc/testsuite/gcc.dg/vect/vect-mixed-size-cond-1.c b/gcc/testsuite/gcc.dg/vect/vect-mixed-size-cond-1.c new file mode 100644 index 00000000000..372ed7ed58c --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-mixed-size-cond-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +int +f (unsigned char *restrict x, short *restrict y) +{ + for (int i = 0; i < 100; ++i) + { + unsigned short a = (x[i] + 11) >> 1; + unsigned short b = (x[i] + 42) >> 2; + unsigned short cmp = y[i] == 0 ? a : b; + int res = cmp + 1; + x[i] = res; + } +} diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 56cfbc61d69..4ffec66613b 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -4295,6 +4295,9 @@ vect_mark_pattern_stmts (gimple *orig_stmt, gimple *pattern_stmt, gimple_stmt_iterator gsi = gsi_for_stmt (orig_stmt, orig_def_seq); gsi_insert_seq_before_without_update (&gsi, def_seq, GSI_SAME_STMT); gsi_insert_before_without_update (&gsi, pattern_stmt, GSI_SAME_STMT); + + /* Remove the pattern statement that this new pattern replaces. */ + gsi_remove (&gsi, false); } else vect_set_pattern_stmt (pattern_stmt, orig_stmt_info, pattern_vectype); @@ -4358,6 +4361,8 @@ vect_pattern_recog_1 (vect_recog_func *recog_func, if (!is_pattern_stmt_p (stmt_info)) STMT_VINFO_RELATED_STMT (stmt_info) = NULL; } + /* Clear any half-formed pattern definition sequence. */ + STMT_VINFO_PATTERN_DEF_SEQ (stmt_info) = NULL; return; }