diff options
Diffstat (limited to 'sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109469-SLP-returns-twice.patch')
-rw-r--r-- | sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109469-SLP-returns-twice.patch | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109469-SLP-returns-twice.patch b/sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109469-SLP-returns-twice.patch new file mode 100644 index 000000000000..7d45c9e60af8 --- /dev/null +++ b/sys-devel/gcc/files/gcc-13.0.1_pre20230409-PR109469-SLP-returns-twice.patch @@ -0,0 +1,66 @@ +https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109469 +https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=2d7ad38707e1fd71193d440198cc0726092b9015 + +From 2d7ad38707e1fd71193d440198cc0726092b9015 Mon Sep 17 00:00:00 2001 +From: Richard Biener <rguenther@suse.de> +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. +--- /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; ++} +--- 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 <gcall *> (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.31.1 |