Commit 36dc1a88 by Jakub Jelinek Committed by Jakub Jelinek

tree-ssa-ccp.c (evaluate_stmt): Try bitwise tracking for builtin calls even if…

tree-ssa-ccp.c (evaluate_stmt): Try bitwise tracking for builtin calls even if likelyvalue is not CONSTANT.

	* tree-ssa-ccp.c (evaluate_stmt): Try bitwise tracking for
	builtin calls even if likelyvalue is not CONSTANT.
	Handle BUILT_IN_STRDUP and BUILT_IN_STRNDUP like BUILT_IN_MALLOC.
	Return get_value_for_expr of first operand
	for BUILT_IN_{MEM{CPY,MOVE,SET},STR{,N}CPY}{,_CHK}.
	* tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle
	BUILT_IN_{MEM{{,P}CPY,MOVE,SET},STR{,N}C{PY,AT},STPCPY}_CHK like
	their non-checking counterparts.
	(call_may_clobber_ref_p_1): Likewise.
	(stmt_kills_ref_p_1): Handle BUILT_IN_MEM{{,P}CPY,MOVE,SET}_CHK
	like their non-checking counterparts.
	* tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
	Handle BUILT_IN_{MEM{{,P}CPY,MOVE,SET},STR{,N}C{PY,AT},STPCPY}_CHK
	like their non-checking counterparts.
	(find_func_clobbers): Likewise.
	* tree-ssa-dce.c (propagate_necessity): Handle BUILT_IN_MEMSET_CHK
	like BUILT_IN_MEMSET and BUILT_IN_CALLOC like BUILT_IN_MALLOC.

From-SVN: r175290
parent 41cd4957
2011-06-22 Jakub Jelinek <jakub@redhat.com> 2011-06-22 Jakub Jelinek <jakub@redhat.com>
* tree-ssa-ccp.c (evaluate_stmt): Try bitwise tracking for
builtin calls even if likelyvalue is not CONSTANT.
Handle BUILT_IN_STRDUP and BUILT_IN_STRNDUP like BUILT_IN_MALLOC.
Return get_value_for_expr of first operand
for BUILT_IN_{MEM{CPY,MOVE,SET},STR{,N}CPY}{,_CHK}.
* tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Handle
BUILT_IN_{MEM{{,P}CPY,MOVE,SET},STR{,N}C{PY,AT},STPCPY}_CHK like
their non-checking counterparts.
(call_may_clobber_ref_p_1): Likewise.
(stmt_kills_ref_p_1): Handle BUILT_IN_MEM{{,P}CPY,MOVE,SET}_CHK
like their non-checking counterparts.
* tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
Handle BUILT_IN_{MEM{{,P}CPY,MOVE,SET},STR{,N}C{PY,AT},STPCPY}_CHK
like their non-checking counterparts.
(find_func_clobbers): Likewise.
* tree-ssa-dce.c (propagate_necessity): Handle BUILT_IN_MEMSET_CHK
like BUILT_IN_MEMSET and BUILT_IN_CALLOC like BUILT_IN_MALLOC.
* dwarf2out.c (size_of_loc_descr, output_loc_operands, * dwarf2out.c (size_of_loc_descr, output_loc_operands,
mark_base_types, hash_loc_operands, compare_loc_operands): Allow mark_base_types, hash_loc_operands, compare_loc_operands): Allow
DW_OP_GNU_convert and DW_OP_GNU_reinterpret to use constant instead DW_OP_GNU_convert and DW_OP_GNU_reinterpret to use constant instead
......
/* Alias analysis for trees. /* Alias analysis for trees.
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Diego Novillo <dnovillo@redhat.com> Contributed by Diego Novillo <dnovillo@redhat.com>
...@@ -1199,6 +1199,24 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref) ...@@ -1199,6 +1199,24 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
size); size);
return refs_may_alias_p_1 (&dref, ref, false); return refs_may_alias_p_1 (&dref, ref, false);
} }
case BUILT_IN_STRCPY_CHK:
case BUILT_IN_STRNCPY_CHK:
case BUILT_IN_MEMCPY_CHK:
case BUILT_IN_MEMMOVE_CHK:
case BUILT_IN_MEMPCPY_CHK:
case BUILT_IN_STPCPY_CHK:
case BUILT_IN_STRCAT_CHK:
case BUILT_IN_STRNCAT_CHK:
{
ao_ref dref;
tree size = NULL_TREE;
if (gimple_call_num_args (call) == 4)
size = gimple_call_arg (call, 2);
ao_ref_init_from_ptr_and_size (&dref,
gimple_call_arg (call, 1),
size);
return refs_may_alias_p_1 (&dref, ref, false);
}
case BUILT_IN_BCOPY: case BUILT_IN_BCOPY:
{ {
ao_ref dref; ao_ref dref;
...@@ -1216,6 +1234,7 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref) ...@@ -1216,6 +1234,7 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
case BUILT_IN_STACK_SAVE: case BUILT_IN_STACK_SAVE:
case BUILT_IN_STACK_RESTORE: case BUILT_IN_STACK_RESTORE:
case BUILT_IN_MEMSET: case BUILT_IN_MEMSET:
case BUILT_IN_MEMSET_CHK:
case BUILT_IN_FREXP: case BUILT_IN_FREXP:
case BUILT_IN_FREXPF: case BUILT_IN_FREXPF:
case BUILT_IN_FREXPL: case BUILT_IN_FREXPL:
...@@ -1453,6 +1472,25 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref) ...@@ -1453,6 +1472,25 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
size); size);
return refs_may_alias_p_1 (&dref, ref, false); return refs_may_alias_p_1 (&dref, ref, false);
} }
case BUILT_IN_STRCPY_CHK:
case BUILT_IN_STRNCPY_CHK:
case BUILT_IN_MEMCPY_CHK:
case BUILT_IN_MEMMOVE_CHK:
case BUILT_IN_MEMPCPY_CHK:
case BUILT_IN_STPCPY_CHK:
case BUILT_IN_STRCAT_CHK:
case BUILT_IN_STRNCAT_CHK:
case BUILT_IN_MEMSET_CHK:
{
ao_ref dref;
tree size = NULL_TREE;
if (gimple_call_num_args (call) == 4)
size = gimple_call_arg (call, 2);
ao_ref_init_from_ptr_and_size (&dref,
gimple_call_arg (call, 0),
size);
return refs_may_alias_p_1 (&dref, ref, false);
}
case BUILT_IN_BCOPY: case BUILT_IN_BCOPY:
{ {
ao_ref dref; ao_ref dref;
...@@ -1697,6 +1735,10 @@ stmt_kills_ref_p_1 (gimple stmt, ao_ref *ref) ...@@ -1697,6 +1735,10 @@ stmt_kills_ref_p_1 (gimple stmt, ao_ref *ref)
case BUILT_IN_MEMPCPY: case BUILT_IN_MEMPCPY:
case BUILT_IN_MEMMOVE: case BUILT_IN_MEMMOVE:
case BUILT_IN_MEMSET: case BUILT_IN_MEMSET:
case BUILT_IN_MEMCPY_CHK:
case BUILT_IN_MEMPCPY_CHK:
case BUILT_IN_MEMMOVE_CHK:
case BUILT_IN_MEMSET_CHK:
{ {
tree dest = gimple_call_arg (stmt, 0); tree dest = gimple_call_arg (stmt, 0);
tree len = gimple_call_arg (stmt, 2); tree len = gimple_call_arg (stmt, 2);
......
...@@ -1556,7 +1556,7 @@ evaluate_stmt (gimple stmt) ...@@ -1556,7 +1556,7 @@ evaluate_stmt (gimple stmt)
/* Resort to simplification for bitwise tracking. */ /* Resort to simplification for bitwise tracking. */
if (flag_tree_bit_ccp if (flag_tree_bit_ccp
&& likelyvalue == CONSTANT && (likelyvalue == CONSTANT || is_gimple_call (stmt))
&& !is_constant) && !is_constant)
{ {
enum gimple_code code = gimple_code (stmt); enum gimple_code code = gimple_code (stmt);
...@@ -1616,6 +1616,8 @@ evaluate_stmt (gimple stmt) ...@@ -1616,6 +1616,8 @@ evaluate_stmt (gimple stmt)
case BUILT_IN_MALLOC: case BUILT_IN_MALLOC:
case BUILT_IN_REALLOC: case BUILT_IN_REALLOC:
case BUILT_IN_CALLOC: case BUILT_IN_CALLOC:
case BUILT_IN_STRDUP:
case BUILT_IN_STRNDUP:
val.lattice_val = CONSTANT; val.lattice_val = CONSTANT;
val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0); val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
val.mask = shwi_to_double_int val.mask = shwi_to_double_int
...@@ -1631,6 +1633,20 @@ evaluate_stmt (gimple stmt) ...@@ -1631,6 +1633,20 @@ evaluate_stmt (gimple stmt)
/ BITS_PER_UNIT - 1)); / BITS_PER_UNIT - 1));
break; break;
/* These builtins return their first argument, unmodified. */
case BUILT_IN_MEMCPY:
case BUILT_IN_MEMMOVE:
case BUILT_IN_MEMSET:
case BUILT_IN_STRCPY:
case BUILT_IN_STRNCPY:
case BUILT_IN_MEMCPY_CHK:
case BUILT_IN_MEMMOVE_CHK:
case BUILT_IN_MEMSET_CHK:
case BUILT_IN_STRCPY_CHK:
case BUILT_IN_STRNCPY_CHK:
val = get_value_for_expr (gimple_call_arg (stmt, 0), true);
break;
default:; default:;
} }
} }
......
...@@ -831,7 +831,9 @@ propagate_necessity (struct edge_list *el) ...@@ -831,7 +831,9 @@ propagate_necessity (struct edge_list *el)
if (callee != NULL_TREE if (callee != NULL_TREE
&& DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
&& (DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET && (DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_MEMSET_CHK
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_MALLOC || DECL_FUNCTION_CODE (callee) == BUILT_IN_MALLOC
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_CALLOC
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_FREE || DECL_FUNCTION_CODE (callee) == BUILT_IN_FREE
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE || DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE
......
/* Tree based points-to analysis /* Tree based points-to analysis
Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Daniel Berlin <dberlin@dberlin.org> Contributed by Daniel Berlin <dberlin@dberlin.org>
...@@ -3982,6 +3982,14 @@ find_func_aliases_for_builtin_call (gimple t) ...@@ -3982,6 +3982,14 @@ find_func_aliases_for_builtin_call (gimple t)
case BUILT_IN_STPNCPY: case BUILT_IN_STPNCPY:
case BUILT_IN_STRCAT: case BUILT_IN_STRCAT:
case BUILT_IN_STRNCAT: case BUILT_IN_STRNCAT:
case BUILT_IN_STRCPY_CHK:
case BUILT_IN_STRNCPY_CHK:
case BUILT_IN_MEMCPY_CHK:
case BUILT_IN_MEMMOVE_CHK:
case BUILT_IN_MEMPCPY_CHK:
case BUILT_IN_STPCPY_CHK:
case BUILT_IN_STRCAT_CHK:
case BUILT_IN_STRNCAT_CHK:
{ {
tree res = gimple_call_lhs (t); tree res = gimple_call_lhs (t);
tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (fndecl) tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (fndecl)
...@@ -4011,6 +4019,7 @@ find_func_aliases_for_builtin_call (gimple t) ...@@ -4011,6 +4019,7 @@ find_func_aliases_for_builtin_call (gimple t)
return true; return true;
} }
case BUILT_IN_MEMSET: case BUILT_IN_MEMSET:
case BUILT_IN_MEMSET_CHK:
{ {
tree res = gimple_call_lhs (t); tree res = gimple_call_lhs (t);
tree dest = gimple_call_arg (t, 0); tree dest = gimple_call_arg (t, 0);
...@@ -4627,6 +4636,14 @@ find_func_clobbers (gimple origt) ...@@ -4627,6 +4636,14 @@ find_func_clobbers (gimple origt)
case BUILT_IN_STPNCPY: case BUILT_IN_STPNCPY:
case BUILT_IN_STRCAT: case BUILT_IN_STRCAT:
case BUILT_IN_STRNCAT: case BUILT_IN_STRNCAT:
case BUILT_IN_STRCPY_CHK:
case BUILT_IN_STRNCPY_CHK:
case BUILT_IN_MEMCPY_CHK:
case BUILT_IN_MEMMOVE_CHK:
case BUILT_IN_MEMPCPY_CHK:
case BUILT_IN_STPCPY_CHK:
case BUILT_IN_STRCAT_CHK:
case BUILT_IN_STRNCAT_CHK:
{ {
tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (decl) tree dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (decl)
== BUILT_IN_BCOPY ? 1 : 0)); == BUILT_IN_BCOPY ? 1 : 0));
...@@ -4649,6 +4666,7 @@ find_func_clobbers (gimple origt) ...@@ -4649,6 +4666,7 @@ find_func_clobbers (gimple origt)
/* The following function clobbers memory pointed to by /* The following function clobbers memory pointed to by
its argument. */ its argument. */
case BUILT_IN_MEMSET: case BUILT_IN_MEMSET:
case BUILT_IN_MEMSET_CHK:
{ {
tree dest = gimple_call_arg (t, 0); tree dest = gimple_call_arg (t, 0);
unsigned i; unsigned i;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment