re PR tree-optimization/56210 (invalid -Warray-bounds warning)
authorRichard Biener <rguenther@suse.de>
Mon, 18 Mar 2013 10:33:11 +0000 (10:33 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 18 Mar 2013 10:33:11 +0000 (10:33 +0000)
2013-03-18  Richard Biener  <rguenther@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.

From-SVN: r196777

gcc/ChangeLog
gcc/tree-ssa-alias.c
gcc/tree-ssa-structalias.c

index 796eab74b415f93e0852bab7bfa280f66e6e4b25..f44089ac8664e47ceeb2136dfd1601825155b5f6 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-18  Richard Biener  <rguenther@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.
+
 2013-03-18  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/56483
index 2df27dda3c73c54d84b97f03954884a1c53ce7fa..878d8407185a1011db7d1c99acbcfce23b2079d9 100644 (file)
@@ -1314,6 +1314,43 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
                                           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:
index 31a4c49c66c8a44792b6fdc78190facb539a4606..31c04aa8bb3bfc954e237d6ee15ef52ee51ccb23 100644 (file)
@@ -4196,6 +4196,29 @@ find_func_aliases_for_builtin_call (gimple t)
            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: