From 2d7ad38707e1fd71193d440198cc0726092b9015 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 11 Apr 2023 16:06:12 +0200 Subject: [PATCH] tree-optimization/109469 - SLP with returns-twice region start The following avoids an SLP region starting with a returns-twice call where we cannot insert stmts at the head. PR tree-optimization/109469 * tree-vect-slp.cc (vect_slp_function): Skip region starts with a returns-twice call. * gcc.dg/torture/pr109469.c: New testcase. --- gcc/testsuite/gcc.dg/torture/pr109469.c | 15 +++++++++++++++ gcc/tree-vect-slp.cc | 19 ++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr109469.c diff --git a/gcc/testsuite/gcc.dg/torture/pr109469.c b/gcc/testsuite/gcc.dg/torture/pr109469.c new file mode 100644 index 0000000..d05a93b --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr109469.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +__attribute__((returns_twice)) int foo(); + +struct xio myproc; +struct xio { + void (*read_proc)(); + void (*write_proc)(); +}; + +void dummy_write_proc() { + switch (foo()) + default: + myproc.read_proc = myproc.write_proc = dummy_write_proc; +} diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 356bdfb..d73deae 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -7671,10 +7671,23 @@ vect_slp_function (function *fun) { r |= vect_slp_bbs (bbs, NULL); bbs.truncate (0); - bbs.quick_push (bb); } - else - bbs.safe_push (bb); + + /* We need to be able to insert at the head of the region which + we cannot for region starting with a returns-twice call. */ + if (bbs.is_empty ()) + if (gcall *first = safe_dyn_cast (first_stmt (bb))) + if (gimple_call_flags (first) & ECF_RETURNS_TWICE) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "skipping bb%d as start of region as it " + "starts with returns-twice call\n", + bb->index); + continue; + } + + bbs.safe_push (bb); /* When we have a stmt ending this block and defining a value we have to insert on edges when inserting after it for -- 2.7.4