diff options
author | Richard Biener <rguenther@suse.de> | 2020-10-19 11:30:46 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-10-19 13:22:49 +0200 |
commit | 361c378dda1f17435ecc364ab246978784df2482 (patch) | |
tree | fa0ac260fb9c5eb23a138beee8a99440688d8e55 | |
parent | 4ba60194bb668fa6749640d27e9194fe50b9b42c (diff) | |
download | gcc-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.c | 27 | ||||
-rw-r--r-- | gcc/tree-vect-slp.c | 9 |
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 ()) |