From: Richard Guenther Date: Thu, 8 Sep 2011 09:21:39 +0000 (+0000) Subject: re PR tree-optimization/19831 (Missing DSE/malloc/free optimization) X-Git-Tag: releases/gcc-4.7.0~3859 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c22c0db26ad16673415d7523781fcf80c8e545ba;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7fc0f014bfd..f4416030d23c 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 18b487d063c3..b432683ced97 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 000000000000..689eb99c2893 --- /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 c9ad3117eb8f..e29f3659be8b 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