[PATCH] Handle __builtin*chk and other builtins in various spots
Richard Guenther
richard.guenther@gmail.com
Wed Jun 22 11:19:00 GMT 2011
On Tue, Jun 21, 2011 at 6:31 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> While working on __builtin_assume_aligned support, I've noticed
> a bunch of places which handle some builtins specially in CCP/DCE/aliasing,
> but don't handle other similar calls. Additionally
> in CCP for stringops that just return its first argument we can use
> first arguments properties for the return value and e.g. reasoning
> about alignment of malloc/calloc/alloca etc. is useful even if likely_value
> for the call doesn't return CONSTANT, as it doesn't depend on the arguments.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok.
Thanks,
Richard.
> 2011-06-21 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.
>
> --- gcc/tree-ssa-ccp.c.jj 2011-06-17 11:02:19.000000000 +0200
> +++ gcc/tree-ssa-ccp.c 2011-06-21 14:14:37.000000000 +0200
> @@ -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:;
> }
> }
> --- gcc/tree-ssa-alias.c.jj 2011-06-17 11:01:22.000000000 +0200
> +++ gcc/tree-ssa-alias.c 2011-06-21 14:15:42.000000000 +0200
> @@ -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,
> 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,
> 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, a
> 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
> 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);
> --- gcc/tree-ssa-structalias.c.jj 2011-06-17 11:02:19.000000000 +0200
> +++ gcc/tree-ssa-structalias.c 2011-06-21 14:05:13.000000000 +0200
> @@ -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 (gimp
> 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 (gimp
> 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;
> --- gcc/tree-ssa-dce.c.jj 2011-06-17 11:02:19.000000000 +0200
> +++ gcc/tree-ssa-dce.c 2011-06-21 14:15:16.000000000 +0200
> @@ -830,7 +830,9 @@ propagate_necessity (struct edge_list *e
> 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
>
> Jakub
>
More information about the Gcc-patches
mailing list