Avoid matching the same pattern statement twice

Programming / Compilers / GCC - rsandifo [138bc75d-0d04-0410-961f-82ee72b054a4] - 3 July 2018 09:58 EDT

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

- 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.dg/vect/vect-mixed-size-cond-1.c: New test.

2fcb0ed93fa Avoid matching the same pattern statement twice
gcc/ChangeLog | 6 ++++++
gcc/testsuite/ChangeLog | 4 ++++
gcc/testsuite/gcc.dg/vect/vect-mixed-size-cond-1.c | 14 ++++++++++++++
gcc/tree-vect-patterns.c | 5 +++++
4 files changed, 29 insertions(+)

Upstream: gcc.gnu.org

  • Share