From c22c0db26ad16673415d7523781fcf80c8e545ba Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 8 Sep 2011 09:21:39 +0000 Subject: [PATCH] re PR tree-optimization/19831 (Missing DSE/malloc/free optimization) 2011-09-08 Richard Guenther PR tree-optimization/19831 * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Do not mark allocation functions as necessary. * gcc.dg/tree-ssa/ssa-dce-8.c: New testcase. From-SVN: r178683 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-8.c | 12 +++++++++ gcc/tree-ssa-dce.c | 32 ++++++++++++++++------- 4 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-8.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7fc0f014bf..f4416030d23 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-09-08 Richard Guenther + + PR tree-optimization/19831 + * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Do not mark + allocation functions as necessary. + 2011-09-08 Iain Sandoe *config/darwin-driver.c (darwin_find_version_from_kernel): New routine diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 18b487d063c..b432683ced9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-09-08 Richard Guenther + + PR tree-optimization/19831 + * gcc.dg/tree-ssa/ssa-dce-8.c: New testcase. + 2011-09-08 Tobias Burnus PR fortran/44646 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-8.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-8.c new file mode 100644 index 00000000000..689eb99c289 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-8.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int main() +{ + int *p = __builtin_malloc (4); + *p = 4; + return 0; +} + +/* { dg-final { scan-tree-dump-not "malloc" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index c9ad3117eb8..e29f3659be8 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -299,17 +299,29 @@ mark_stmt_if_obviously_necessary (gimple stmt, bool aggressive) return; case GIMPLE_CALL: - /* Most, but not all function calls are required. Function calls that - produce no result and have no side effects (i.e. const pure - functions) are unnecessary. */ - if (gimple_has_side_effects (stmt)) - { - mark_stmt_necessary (stmt, true); + { + tree callee = gimple_call_fndecl (stmt); + if (callee != NULL_TREE + && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL) + switch (DECL_FUNCTION_CODE (callee)) + { + case BUILT_IN_MALLOC: + case BUILT_IN_CALLOC: + case BUILT_IN_ALLOCA: + return; + } + /* Most, but not all function calls are required. Function calls that + produce no result and have no side effects (i.e. const pure + functions) are unnecessary. */ + if (gimple_has_side_effects (stmt)) + { + mark_stmt_necessary (stmt, true); + return; + } + if (!gimple_call_lhs (stmt)) return; - } - if (!gimple_call_lhs (stmt)) - return; - break; + break; + } case GIMPLE_DEBUG: /* Debug temps without a value are not useful. ??? If we could -- 2.30.2