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:

Reply via email to