aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-11-28 14:52:44 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-11-28 14:52:44 +0000
commitc54e20229d2984cdd3b1bee1ae81fa454ed9d9de (patch)
treefe2cf62fefd5928cc0053b5fa535f210ed4cbd19 /gcc
parent0c6b087cc13517cbf9f52786e2727b6fc774d9da (diff)
downloadgcc-c54e20229d2984cdd3b1bee1ae81fa454ed9d9de.zip
gcc-c54e20229d2984cdd3b1bee1ae81fa454ed9d9de.tar.gz
gcc-c54e20229d2984cdd3b1bee1ae81fa454ed9d9de.tar.bz2
re PR middle-end/59330 (Crash in is_gimple_reg_type)
2013-11-28 Richard Biener <rguenther@suse.de> PR tree-optimization/59330 * tree-ssa-dce.c (eliminate_unnecessary_stmts): Simplify and fix delayed marking of free calls not necessary. * gcc.dg/torture/pr59330.c: New testcase. From-SVN: r205486
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr59330.c17
-rw-r--r--gcc/tree-ssa-dce.c28
4 files changed, 38 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 507f862..cac4cc1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-11-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/59330
+ * tree-ssa-dce.c (eliminate_unnecessary_stmts): Simplify
+ and fix delayed marking of free calls not necessary.
+
2013-11-28 Andrew MacLeod <amacleod@redhat.com>
* tree-ssa-propagate.c (valid_gimple_call_p): Pass TREE_TYPE to
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c4f749e..3206152 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2013-11-28 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/59330
+ * gcc.dg/torture/pr59330.c: New testcase.
+
+2013-11-28 Richard Biener <rguenther@suse.de>
+
PR lto/59323
* gcc.dg/lto/pr59323_0.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr59330.c b/gcc/testsuite/gcc.dg/torture/pr59330.c
new file mode 100644
index 0000000..74b832e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr59330.c
@@ -0,0 +1,17 @@
+/* { dg-do run } */
+
+void free(void *ptr)
+{
+}
+
+void *foo(void)
+{
+ return 0;
+}
+
+int main(void)
+{
+ void *p = foo();
+ free(p);
+ return 0;
+}
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index 61c5af6..e2177fe 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -1191,26 +1191,18 @@ eliminate_unnecessary_stmts (void)
stats.total++;
/* We can mark a call to free as not necessary if the
- defining statement of its argument is an allocation
- function and that is not necessary itself. */
- if (gimple_call_builtin_p (stmt, BUILT_IN_FREE))
+ defining statement of its argument is not necessary
+ (and thus is getting removed). */
+ if (gimple_plf (stmt, STMT_NECESSARY)
+ && gimple_call_builtin_p (stmt, BUILT_IN_FREE))
{
tree ptr = gimple_call_arg (stmt, 0);
- tree callee2;
- gimple def_stmt;
- if (TREE_CODE (ptr) != SSA_NAME)
- continue;
- def_stmt = SSA_NAME_DEF_STMT (ptr);
- if (!is_gimple_call (def_stmt)
- || gimple_plf (def_stmt, STMT_NECESSARY))
- continue;
- callee2 = gimple_call_fndecl (def_stmt);
- if (callee2 == NULL_TREE
- || DECL_BUILT_IN_CLASS (callee2) != BUILT_IN_NORMAL
- || (DECL_FUNCTION_CODE (callee2) != BUILT_IN_MALLOC
- && DECL_FUNCTION_CODE (callee2) != BUILT_IN_CALLOC))
- continue;
- gimple_set_plf (stmt, STMT_NECESSARY, false);
+ if (TREE_CODE (ptr) == SSA_NAME)
+ {
+ gimple def_stmt = SSA_NAME_DEF_STMT (ptr);
+ if (!gimple_plf (def_stmt, STMT_NECESSARY))
+ gimple_set_plf (stmt, STMT_NECESSARY, false);
+ }
}
/* If GSI is not necessary then remove it. */