re PR tree-optimization/79697 (unused realloc(0, n) not eliminated)

2017-04-29  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>

	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
This commit is contained in:
Prathamesh Kulkarni 2017-04-29 10:05:13 +00:00 committed by Prathamesh Kulkarni
parent 6bcd876838
commit fe75f73248
5 changed files with 78 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2017-04-29 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
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.
2017-04-28 Martin Sebor <msebor@redhat.com>
PR tree-optimization/80523

View File

@ -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:;
}

View File

@ -1,3 +1,8 @@
2017-04-29 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
PR tree-optimization/79697
* gcc.dg/tree-ssa/pr79697.c: New test.
2017-04-29 Tom de Vries <tom@codesourcery.com>
* gcc.dg/tree-prof/pr66295.c: Require effective target avx512f.

View File

@ -0,0 +1,33 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-gimple -fdump-tree-cddce-details -fdump-tree-optimized" } */
void f(void)
{
__builtin_strdup ("abc");
}
void g(void)
{
__builtin_strndup ("abc", 3);
}
void h(void)
{
__builtin_realloc (0, 10);
}
void k(void)
{
char *p = __builtin_strdup ("abc");
__builtin_free (p);
char *q = __builtin_strndup ("abc", 3);
__builtin_free (q);
}
/* { 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" } } */
/* { dg-final { scan-tree-dump-not "__builtin_strdup" "optimized" } } */
/* { dg-final { scan-tree-dump-not "__builtin_strndup" "optimized" } } */
/* { dg-final { scan-tree-dump-not "__builtin_free" "optimized" } } */

View File

@ -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:;
@ -780,7 +782,9 @@ propagate_necessity (bool aggressive)
&& DECL_BUILT_IN_CLASS (def_callee) == BUILT_IN_NORMAL
&& (DECL_FUNCTION_CODE (def_callee) == BUILT_IN_ALIGNED_ALLOC
|| DECL_FUNCTION_CODE (def_callee) == BUILT_IN_MALLOC
|| DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC))
|| DECL_FUNCTION_CODE (def_callee) == BUILT_IN_CALLOC
|| DECL_FUNCTION_CODE (def_callee) == BUILT_IN_STRDUP
|| DECL_FUNCTION_CODE (def_callee) == BUILT_IN_STRNDUP))
{
gimple *bounds_def_stmt;
tree bounds;