diff options
author | Jakub Jelinek <jakub@redhat.com> | 2023-02-07 10:34:45 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2023-02-07 10:34:45 +0100 |
commit | 5321d53279a60ee589a3c9779beb46503f9fc49f (patch) | |
tree | 1343400a88bd35eddf8f98020f273e635bcbe567 /gcc | |
parent | cad2412cc84518195fceb2db31e82e6df7e5a2c2 (diff) | |
download | gcc-5321d53279a60ee589a3c9779beb46503f9fc49f.zip gcc-5321d53279a60ee589a3c9779beb46503f9fc49f.tar.gz gcc-5321d53279a60ee589a3c9779beb46503f9fc49f.tar.bz2 |
ipa-split: Don't split returns_twice functions [PR106923]
As discussed in the PR, returns_twice functions are rare/special beasts
that need special treatment in the cfg, and inside of their bodies
we don't know which part actually works the weird returns twice way
(either in the fork/vfork sense, or in the setjmp) and aren't updating
ab edges to reflect that.
I think easiest is just to never split these, like we already never
split noreturn or malloc functions.
2023-02-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/106923
* ipa-split.cc (execute_split_functions): Don't split returns_twice
functions.
* gcc.dg/pr106923.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ipa-split.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr106923.c | 23 |
2 files changed, 26 insertions, 2 deletions
diff --git a/gcc/ipa-split.cc b/gcc/ipa-split.cc index 0113461..6730f4f 100644 --- a/gcc/ipa-split.cc +++ b/gcc/ipa-split.cc @@ -1715,10 +1715,11 @@ execute_split_functions (void) struct cgraph_node *node = cgraph_node::get (current_function_decl); if (flags_from_decl_or_type (current_function_decl) - & (ECF_NORETURN|ECF_MALLOC)) + & (ECF_NORETURN|ECF_MALLOC|ECF_RETURNS_TWICE)) { if (dump_file) - fprintf (dump_file, "Not splitting: noreturn/malloc function.\n"); + fprintf (dump_file, "Not splitting: noreturn/malloc/returns_twice " + "function.\n"); return 0; } if (MAIN_NAME_P (DECL_NAME (current_function_decl))) diff --git a/gcc/testsuite/gcc.dg/pr106923.c b/gcc/testsuite/gcc.dg/pr106923.c new file mode 100644 index 0000000..1c89f41 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr106923.c @@ -0,0 +1,23 @@ +/* PR tree-optimization/106923 */ +/* { dg-do compile } */ +/* { dg-options "-O1 -finline-small-functions -fpartial-inlining --param max-inline-insns-single=1 --param uninlined-function-insns=10000" } */ + +int n; + +int +baz (void); + +__attribute__ ((returns_twice)) int +bar (void) +{ + if (baz ()) + ++n; + + return 0; +} + +int +foo (void) +{ + return bar (); +} |