From: Jakub Jelinek Date: Wed, 22 Jun 2011 10:46:36 +0000 (+0200) Subject: tree-ssa-ccp.c (evaluate_stmt): Try bitwise tracking for builtin calls even if likely... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=36dc1a88ff11de41ed1b2a313f28ad12cd3c7bd3;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d5cd5ce0d1c..a8e03fdd24f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,23 @@ 2011-06-22 Jakub Jelinek + * 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 diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 02b3ca07e07..5647899f531 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -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 @@ -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); diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 11bfb767f4c..fd95abbc8e7 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -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:; } } diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 6900ee77e86..a088ef2a56f 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -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 diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 6f076dcd3e7..faf4f6a56d4 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -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 @@ -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;