From fe75f73248425f0f4c0d2196811ce1d7afb9c09f Mon Sep 17 00:00:00 2001 From: Prathamesh Kulkarni Date: Sat, 29 Apr 2017 10:05:13 +0000 Subject: re PR tree-optimization/79697 (unused realloc(0, n) not eliminated) 2017-04-29 Prathamesh Kulkarni PR tree-optimization/79697 * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): Check if callee is BUILT_IN_STRDUP, BUILT_IN_STRNDUP, BUILT_IN_REALLOC. (propagate_necessity): Check if def_callee is BUILT_IN_STRDUP or BUILT_IN_STRNDUP. * gimple-fold.c (gimple_fold_builtin_realloc): New function. (gimple_fold_builtin): Call gimple_fold_builtin_realloc. testsuite/ * gcc.dg/tree-ssa/pr79697.c: New test. From-SVN: r247407 --- gcc/gimple-fold.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'gcc/gimple-fold.c') diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index a6a958c..5ebdcdf 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -3251,6 +3251,28 @@ gimple_fold_builtin_acc_on_device (gimple_stmt_iterator *gsi, tree arg0) return true; } +/* Fold realloc (0, n) -> malloc (n). */ + +static bool +gimple_fold_builtin_realloc (gimple_stmt_iterator *gsi) +{ + gimple *stmt = gsi_stmt (*gsi); + tree arg = gimple_call_arg (stmt, 0); + tree size = gimple_call_arg (stmt, 1); + + if (operand_equal_p (arg, null_pointer_node, 0)) + { + tree fn_malloc = builtin_decl_implicit (BUILT_IN_MALLOC); + if (fn_malloc) + { + gcall *repl = gimple_build_call (fn_malloc, 1, size); + replace_call_with_call_and_fold (gsi, repl); + return true; + } + } + return false; +} + /* Fold the non-target builtin at *GSI and return whether any simplification was made. */ @@ -3409,6 +3431,9 @@ gimple_fold_builtin (gimple_stmt_iterator *gsi) case BUILT_IN_ACC_ON_DEVICE: return gimple_fold_builtin_acc_on_device (gsi, gimple_call_arg (stmt, 0)); + case BUILT_IN_REALLOC: + return gimple_fold_builtin_realloc (gsi); + default:; } -- cgit v1.1