On 25 February 2017 at 14:43, Marc Glisse <marc.gli...@inria.fr> wrote: > On Sat, 25 Feb 2017, Prathamesh Kulkarni wrote: > >> Hi, >> The attached patch deletes calls to strdup, strndup if it's >> return-value is unused, >> and same for realloc if the first arg is NULL. >> Bootstrap+tested on x86_64-unknown-linux-gnu. >> OK for GCC 8 ? > > > Instead of specializing realloc(0,*) wherever we can perform the same > optimization as with malloc, wouldn't it be better to optimize: > realloc(0,n) -> malloc(n) > and let the malloc optimizations happen? Thanks for the suggestions. In the attached patch, realloc (0, n) is folded to malloc (n). Bootstrap+test in progress on x86_64-unknown-linux-gnu. Does the patch look OK ?
Thanks, Prathamesh > > (realloc(p,0)->free(p) is more tricky because of the return value, like > malloc(0)) > > -- > Marc Glisse
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index a75dd91..e6eceea 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:; } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr79697.c b/gcc/testsuite/gcc.dg/tree-ssa/pr79697.c new file mode 100644 index 0000000..8219289 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr79697.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-gimple -fdump-tree-cddce-details" } */ + +void f(void) +{ + __builtin_strdup ("abc"); +} + +void g(void) +{ + __builtin_strndup ("abc", 3); +} + +void h(void) +{ + __builtin_realloc (0, 10); +} + +/* { dg-final { scan-tree-dump "Deleting : __builtin_strdup" "cddce1" } } */ +/* { dg-final { scan-tree-dump "Deleting : __builtin_strndup" "cddce1" } } */ +/* { dg-final { scan-tree-dump "__builtin_malloc" "gimple" } } */ diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 5ebe57b..4225c3c 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -233,6 +233,8 @@ mark_stmt_if_obviously_necessary (gimple *stmt, bool aggressive) case BUILT_IN_CALLOC: case BUILT_IN_ALLOCA: case BUILT_IN_ALLOCA_WITH_ALIGN: + case BUILT_IN_STRDUP: + case BUILT_IN_STRNDUP: return; default:;