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
This commit is contained in:
parent
41cd495729
commit
36dc1a88ff
@ -1,5 +1,23 @@
|
||||
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,
|
||||
mark_base_types, hash_loc_operands, compare_loc_operands): Allow
|
||||
DW_OP_GNU_convert and DW_OP_GNU_reinterpret to use constant instead
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Diego Novillo <dnovillo@redhat.com>
|
||||
|
||||
@ -1199,6 +1199,24 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
|
||||
size);
|
||||
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:
|
||||
{
|
||||
ao_ref dref;
|
||||
@ -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_RESTORE:
|
||||
case BUILT_IN_MEMSET:
|
||||
case BUILT_IN_MEMSET_CHK:
|
||||
case BUILT_IN_FREXP:
|
||||
case BUILT_IN_FREXPF:
|
||||
case BUILT_IN_FREXPL:
|
||||
@ -1453,6 +1472,25 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
|
||||
size);
|
||||
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:
|
||||
{
|
||||
ao_ref dref;
|
||||
@ -1697,6 +1735,10 @@ stmt_kills_ref_p_1 (gimple stmt, ao_ref *ref)
|
||||
case BUILT_IN_MEMPCPY:
|
||||
case BUILT_IN_MEMMOVE:
|
||||
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 len = gimple_call_arg (stmt, 2);
|
||||
|
@ -1556,7 +1556,7 @@ evaluate_stmt (gimple stmt)
|
||||
|
||||
/* Resort to simplification for bitwise tracking. */
|
||||
if (flag_tree_bit_ccp
|
||||
&& likelyvalue == CONSTANT
|
||||
&& (likelyvalue == CONSTANT || is_gimple_call (stmt))
|
||||
&& !is_constant)
|
||||
{
|
||||
enum gimple_code code = gimple_code (stmt);
|
||||
@ -1616,6 +1616,8 @@ evaluate_stmt (gimple stmt)
|
||||
case BUILT_IN_MALLOC:
|
||||
case BUILT_IN_REALLOC:
|
||||
case BUILT_IN_CALLOC:
|
||||
case BUILT_IN_STRDUP:
|
||||
case BUILT_IN_STRNDUP:
|
||||
val.lattice_val = CONSTANT;
|
||||
val.value = build_int_cst (TREE_TYPE (gimple_get_lhs (stmt)), 0);
|
||||
val.mask = shwi_to_double_int
|
||||
@ -1631,6 +1633,20 @@ evaluate_stmt (gimple stmt)
|
||||
/ BITS_PER_UNIT - 1));
|
||||
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:;
|
||||
}
|
||||
}
|
||||
|
@ -831,7 +831,9 @@ propagate_necessity (struct edge_list *el)
|
||||
if (callee != NULL_TREE
|
||||
&& DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
|
||||
&& (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_CALLOC
|
||||
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_FREE
|
||||
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA
|
||||
|| DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
Contributed by Daniel Berlin <dberlin@dberlin.org>
|
||||
|
||||
@ -3982,6 +3982,14 @@ find_func_aliases_for_builtin_call (gimple t)
|
||||
case BUILT_IN_STPNCPY:
|
||||
case BUILT_IN_STRCAT:
|
||||
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 dest = gimple_call_arg (t, (DECL_FUNCTION_CODE (fndecl)
|
||||
@ -4011,6 +4019,7 @@ find_func_aliases_for_builtin_call (gimple t)
|
||||
return true;
|
||||
}
|
||||
case BUILT_IN_MEMSET:
|
||||
case BUILT_IN_MEMSET_CHK:
|
||||
{
|
||||
tree res = gimple_call_lhs (t);
|
||||
tree dest = gimple_call_arg (t, 0);
|
||||
@ -4627,6 +4636,14 @@ find_func_clobbers (gimple origt)
|
||||
case BUILT_IN_STPNCPY:
|
||||
case BUILT_IN_STRCAT:
|
||||
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)
|
||||
== BUILT_IN_BCOPY ? 1 : 0));
|
||||
@ -4649,6 +4666,7 @@ find_func_clobbers (gimple origt)
|
||||
/* The following function clobbers memory pointed to by
|
||||
its argument. */
|
||||
case BUILT_IN_MEMSET:
|
||||
case BUILT_IN_MEMSET_CHK:
|
||||
{
|
||||
tree dest = gimple_call_arg (t, 0);
|
||||
unsigned i;
|
||||
|
Loading…
Reference in New Issue
Block a user