diff options
author | Richard Guenther <rguenther@suse.de> | 2011-09-08 09:21:39 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-09-08 09:21:39 +0000 |
commit | c22c0db26ad16673415d7523781fcf80c8e545ba (patch) | |
tree | cacd1b123bb8053812cddbd152f5ddd2121054b5 | |
parent | 88b7601303a76eae0d7b831014cba0ff96360e73 (diff) | |
download | gcc-c22c0db26ad16673415d7523781fcf80c8e545ba.zip gcc-c22c0db26ad16673415d7523781fcf80c8e545ba.tar.gz gcc-c22c0db26ad16673415d7523781fcf80c8e545ba.tar.bz2 |
re PR tree-optimization/19831 (Missing DSE/malloc/free optimization)
2011-09-08 Richard Guenther <rguenther@suse.de>
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-dce-8.c | 12 | ||||
-rw-r--r-- | gcc/tree-ssa-dce.c | 32 |
4 files changed, 45 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7fc0f0..f441603 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-09-08 Richard Guenther <rguenther@suse.de> + + 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 <iains@gcc.gnu.org> *config/darwin-driver.c (darwin_find_version_from_kernel): New routine diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 18b487d..b432683 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-09-08 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/19831 + * gcc.dg/tree-ssa/ssa-dce-8.c: New testcase. + 2011-09-08 Tobias Burnus <burnus@net-b.de> 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 0000000..689eb99 --- /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 c9ad311..e29f365 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 |