aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-10-19 11:30:46 +0200
committerRichard Biener <rguenther@suse.de>2020-10-19 13:22:49 +0200
commit361c378dda1f17435ecc364ab246978784df2482 (patch)
treefa0ac260fb9c5eb23a138beee8a99440688d8e55
parent4ba60194bb668fa6749640d27e9194fe50b9b42c (diff)
downloadgcc-361c378dda1f17435ecc364ab246978784df2482.zip
gcc-361c378dda1f17435ecc364ab246978784df2482.tar.gz
gcc-361c378dda1f17435ecc364ab246978784df2482.tar.bz2
tree-optimization/97486 - avoid edge insertion in SLP vectorizing
This avoids edge inserting and eventual splitting during BB SLP vectorization for now. 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.
-rw-r--r--gcc/testsuite/gcc.dg/vect/bb-slp-pr97486.c27
-rw-r--r--gcc/tree-vect-slp.c9
2 files changed, 36 insertions, 0 deletions
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 0000000..17d48a7
--- /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 a2fbbc5..f36d8d1 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -4214,6 +4214,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 (is_ctrl_altering_stmt (last))
+ {
+ r |= vect_slp_bbs (bbs);
+ bbs.truncate (0);
+ }
}
if (!bbs.is_empty ())