Avoid matching the same pattern statement twice
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 3 Jul 2018 09:58:47 +0000 (09:58 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 3 Jul 2018 09:58:47 +0000 (09:58 +0000)
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.

From-SVN: r262332

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

index 99226d5..1526dd5 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-03  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * 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  <rguenther@suse.de>
 
        * tree-vect-stmts.c (vect_is_simple_use): Consolidate dumping,
index fb4422f..38e85e4 100644 (file)
@@ -1,3 +1,7 @@
+2018-07-03  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * gcc.dg/vect/vect-mixed-size-cond-1.c: New test.
+
 2018-07-02  Jim Wilson  <jimw@sifive.com>
 
        * 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 (file)
index 0000000..372ed7e
--- /dev/null
@@ -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;
+    }
+}
index 56cfbc6..4ffec66 100644 (file)
@@ -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;
     }