Avoid matching the same pattern statement twice
commit2fcb0ed93fac91152f8d6d1fc780ec29d513da0d
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jul 2018 09:58:47 +0000 (3 09:58 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jul 2018 09:58:47 +0000 (3 09:58 +0000)
treeb00ef9e296556f69df3860647357ec75f32198ae
parent94982cd5094ffd456623dde7dc54e1c7f4487d09
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  <richard.sandiford@arm.com>

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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@262332 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-mixed-size-cond-1.c [new file with mode: 0644]
gcc/tree-vect-patterns.c