This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
[PATCH] gcc 8: Implement -felide-function-bodies
- From: David Malcolm <dmalcolm at redhat dot com>
- To: gcc at gcc dot gnu dot org
- Cc: David Malcolm <dmalcolm at redhat dot com>
- Date: Sat, 1 Apr 2017 01:00:48 -0400
- Subject: [PATCH] gcc 8: Implement -felide-function-bodies
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dmalcolm at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 2A0B03E244
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 2A0B03E244
The following patch implements a new function-body-elision
optimization, which can dramatically improve performance,
especially under certain benchmarks.
For example, given this test program...
$ cat test.c
int factorial (int i)
{
if (i > 1)
return i * factorial (i - 1);
else
return 1;
}
int main (int argc, const char *argv[])
{
return factorial (atoi (argv[1]));
}
...it improves performance:
$ time ./without-elision 50000
real 0m0.007s
user 0m0.003s
sys 0m0.003s
$ time ./with-elision 50000
real 0m0.003s
user 0m0.000s
sys 0m0.002s
and can even bulletproof the code against certain crashes:
$ time ./without-elision 20170401
Segmentation fault (core dumped)
real 0m0.159s
user 0m0.003s
sys 0m0.027s
$ time ./with-elision 20170401
real 0m0.003s
user 0m0.000s
sys 0m0.003s
It should be interesting to see what effect this has on
other benchmarks.
Dave
gcc/ChangeLog:
* common.opt (felide-function-bodies): New option.
* gimplify.c (gimplify_body): Implement function-body
elision.
---
gcc/common.opt | 4 ++++
gcc/gimplify.c | 3 +++
2 files changed, 7 insertions(+)
diff --git a/gcc/common.opt b/gcc/common.opt
index 4021622..a32a56d 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -1299,6 +1299,10 @@ fipa-sra
Common Report Var(flag_ipa_sra) Init(0) Optimization
Perform interprocedural reduction of aggregates.
+felide-function-bodies
+Common Optimization Var(flag_elide_function_bodies)
+Perform function body elision optimization
+
feliminate-unused-debug-symbols
Common Report Var(flag_debug_only_used_symbols)
Perform unused symbol elimination in debug info.
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index fbf136f..4853953 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -12390,6 +12390,9 @@ gimplify_body (tree fndecl, bool do_parms)
the body so that DECL_VALUE_EXPR gets processed correctly. */
parm_stmts = do_parms ? gimplify_parameters () : NULL;
+ if (flag_elide_function_bodies)
+ DECL_SAVED_TREE (fndecl) = NULL_TREE;
+
/* Gimplify the function's body. */
seq = NULL;
gimplify_stmt (&DECL_SAVED_TREE (fndecl), &seq);
--
1.8.5.3