[gcc r11-3741] fix ICE with BB vectorization of PHIs

Richard Biener rguenth@gcc.gnu.org
Fri Oct 9 07:46:30 GMT 2020


https://gcc.gnu.org/g:36500ed18aa89c31b56123aeae43f18fac950674

commit r11-3741-g36500ed18aa89c31b56123aeae43f18fac950674
Author: Richard Biener <rguenther@suse.de>
Date:   Fri Oct 9 08:56:21 2020 +0200

    fix ICE with BB vectorization of PHIs
    
    This fixes a vector CTOR insertion issue when we try to insert after
    a PHI node.
    
    2020-10-09  Richard Biener  <rguenther@suse.de>
    
            * tree-vect-slp.c (vect_create_constant_vectors): Properly insert
            after PHIs.
    
            * gcc.dg/vect/bb-slp-phis-1.c: New testcase.

Diff:
---
 gcc/testsuite/gcc.dg/vect/bb-slp-phis-1.c | 20 ++++++++++++++++++++
 gcc/tree-vect-slp.c                       |  4 +++-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-phis-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-phis-1.c
new file mode 100644
index 00000000000..014c13b8506
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-phis-1.c
@@ -0,0 +1,20 @@
+/* From gcc.c-torture/execute/loop-13.c  */
+/* { dg-do compile } */
+/* { dg-additional-options "-march=cascadelake" { target x86_64-*-* i?86-*-* } } */
+#define TYPE long
+
+void
+scale (TYPE *alpha, TYPE *x, int n)
+{
+  int i, ix;
+
+  if (*alpha != 1)
+    for (i = 0, ix = 0; i < n; i++, ix += 2)
+      {
+	TYPE tmpr, tmpi;
+	tmpr = *alpha * x[ix];
+	tmpi = *alpha * x[ix + 1];
+	x[ix] = tmpr;
+	x[ix + 1] = tmpi;
+      }
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 7e22506b49f..dbe76ac7251 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -4144,7 +4144,9 @@ vect_create_constant_vectors (vec_info *vinfo, slp_tree op_node)
 		  if (insert_after)
 		    {
 		      gimple_stmt_iterator gsi;
-		      if (!stmt_ends_bb_p (insert_after->stmt))
+		      if (gimple_code (insert_after->stmt) == GIMPLE_PHI)
+			gsi = gsi_after_labels (gimple_bb (insert_after->stmt));
+		      else if (!stmt_ends_bb_p (insert_after->stmt))
 			gsi = gsi_for_stmt (insert_after->stmt);
 		      else
 			{


More information about the Gcc-cvs mailing list