This fixes an issue that shows up in PR56210. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard. 2013-03-18 Richard Biener <rguent...@suse.de> PR tree-optimization/56210 * tree-ssa-structalias.c (find_func_aliases_for_builtin_call): Handle string / character search functions. * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Likewise. Index: gcc/tree-ssa-structalias.c =================================================================== *** gcc/tree-ssa-structalias.c (revision 195751) --- gcc/tree-ssa-structalias.c (working copy) *************** find_func_aliases_for_builtin_call (gimp *** 4196,4201 **** --- 4257,4285 ---- return true; } break; + /* String / character search functions return a pointer into the + source string or NULL. */ + case BUILT_IN_INDEX: + case BUILT_IN_STRCHR: + case BUILT_IN_STRRCHR: + case BUILT_IN_MEMCHR: + case BUILT_IN_STRSTR: + case BUILT_IN_STRPBRK: + if (gimple_call_lhs (t)) + { + tree src = gimple_call_arg (t, 0); + get_constraint_for_ptr_offset (src, NULL_TREE, &rhsc); + constraint_expr nul; + nul.var = nothing_id; + nul.offset = 0; + nul.type = ADDRESSOF; + rhsc.safe_push (nul); + get_constraint_for (gimple_call_lhs (t), &lhsc); + process_all_all_constraints (lhsc, rhsc); + lhsc.release(); + rhsc.release(); + } + return true; /* Trampolines are special - they set up passing the static frame. */ case BUILT_IN_INIT_TRAMPOLINE: Index: gcc/tree-ssa-alias.c =================================================================== *** gcc/tree-ssa-alias.c (revision 195751) --- gcc/tree-ssa-alias.c (working copy) *************** ref_maybe_used_by_call_p_1 (gimple call, *** 1314,1319 **** --- 1314,1356 ---- size); return refs_may_alias_p_1 (&dref, ref, false); } + /* These read memory pointed to by the first argument. */ + case BUILT_IN_INDEX: + case BUILT_IN_STRCHR: + case BUILT_IN_STRRCHR: + { + ao_ref dref; + ao_ref_init_from_ptr_and_size (&dref, + gimple_call_arg (call, 0), + NULL_TREE); + return refs_may_alias_p_1 (&dref, ref, false); + } + /* These read memory pointed to by the first argument with size + in the third argument. */ + case BUILT_IN_MEMCHR: + { + ao_ref dref; + ao_ref_init_from_ptr_and_size (&dref, + gimple_call_arg (call, 0), + gimple_call_arg (call, 2)); + return refs_may_alias_p_1 (&dref, ref, false); + } + /* These read memory pointed to by the first and second arguments. */ + case BUILT_IN_STRSTR: + case BUILT_IN_STRPBRK: + { + ao_ref dref; + ao_ref_init_from_ptr_and_size (&dref, + gimple_call_arg (call, 0), + NULL_TREE); + if (refs_may_alias_p_1 (&dref, ref, false)) + return true; + ao_ref_init_from_ptr_and_size (&dref, + gimple_call_arg (call, 1), + NULL_TREE); + return refs_may_alias_p_1 (&dref, ref, false); + } + /* The following builtins do not read from memory. */ case BUILT_IN_FREE: case BUILT_IN_MALLOC: