diff mbox series

tree-optimization/97486 - avoid edge insertion in SLP vectorizing

Message ID nycvar.YFH.7.76.2010191132290.27240@elmra.sevgm.obk
State New
Headers show
Series tree-optimization/97486 - avoid edge insertion in SLP vectorizing | expand

Commit Message

Richard Biener Oct. 19, 2020, 9:32 a.m. UTC
This avoids edge inserting and eventual splitting during BB SLP
vectorization for now.

Bootstrap / regtest pending on x86_64-unknown-linux-gnu.

2020-10-19  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97486
	* tree-vect-slp.c (vect_slp_function): Split after stmts
	ending a BB.

	* gcc.dg/vect/bb-slp-pr97486.c: New testcase.
---
 gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c | 27 ++++++++++++++++++++++
 gcc/tree-vect-slp.c                        |  9 ++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c
new file mode 100644
index 00000000000..17d48a7fe69
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c
@@ -0,0 +1,27 @@ 
+/* { dg-do compile } */
+
+struct {
+  int *end_info;
+  int *fp;
+} png_load_body_c;
+
+int *png_set_longjmp_fn();
+
+void setjmp();
+
+void png_load_body()
+{
+  int *fp;
+  int png_ptr, info_ptr, *end_info;
+  if (!fp)
+    return;
+  if (png_ptr) {
+    info_ptr = 0;
+    end_info = png_set_longjmp_fn();
+  }
+  png_load_body_c.end_info = end_info;
+  png_load_body_c.fp = fp;
+  if (png_ptr)
+    png_set_longjmp_fn();
+  setjmp(info_ptr);
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 20a109b5347..0f9185e6c55 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -4285,6 +4285,15 @@  vect_slp_function (function *fun)
 	}
       else
 	bbs.safe_push (bb);
+
+      /* When we have a stmt ending this block we have to insert on
+	 edges when inserting after it.  Avoid this for now.  */
+      if (gimple *last = last_stmt (bb))
+	if (stmt_ends_bb_p (last))
+	  {
+	    r |= vect_slp_bbs (bbs);
+	    bbs.truncate (0);
+	  }
     }
 
   if (!bbs.is_empty ())