OSDN Git Service

PR debug/47106
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-alias.c
1 /* Alias analysis for trees.
2    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4    Contributed by Diego Novillo <dnovillo@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "tm_p.h"
28 #include "target.h"
29 #include "basic-block.h"
30 #include "timevar.h"
31 #include "ggc.h"
32 #include "langhooks.h"
33 #include "flags.h"
34 #include "function.h"
35 #include "tree-pretty-print.h"
36 #include "tree-dump.h"
37 #include "gimple.h"
38 #include "tree-flow.h"
39 #include "tree-inline.h"
40 #include "tree-pass.h"
41 #include "convert.h"
42 #include "params.h"
43 #include "ipa-type-escape.h"
44 #include "vec.h"
45 #include "bitmap.h"
46 #include "vecprim.h"
47 #include "pointer-set.h"
48 #include "alloc-pool.h"
49 #include "tree-ssa-alias.h"
50
51 /* Broad overview of how alias analysis on gimple works:
52
53    Statements clobbering or using memory are linked through the
54    virtual operand factored use-def chain.  The virtual operand
55    is unique per function, its symbol is accessible via gimple_vop (cfun).
56    Virtual operands are used for efficiently walking memory statements
57    in the gimple IL and are useful for things like value-numbering as
58    a generation count for memory references.
59
60    SSA_NAME pointers may have associated points-to information
61    accessible via the SSA_NAME_PTR_INFO macro.  Flow-insensitive
62    points-to information is (re-)computed by the TODO_rebuild_alias
63    pass manager todo.  Points-to information is also used for more
64    precise tracking of call-clobbered and call-used variables and
65    related disambiguations.
66
67    This file contains functions for disambiguating memory references,
68    the so called alias-oracle and tools for walking of the gimple IL.
69
70    The main alias-oracle entry-points are
71
72    bool stmt_may_clobber_ref_p (gimple, tree)
73
74      This function queries if a statement may invalidate (parts of)
75      the memory designated by the reference tree argument.
76
77    bool ref_maybe_used_by_stmt_p (gimple, tree)
78
79      This function queries if a statement may need (parts of) the
80      memory designated by the reference tree argument.
81
82    There are variants of these functions that only handle the call
83    part of a statement, call_may_clobber_ref_p and ref_maybe_used_by_call_p.
84    Note that these do not disambiguate against a possible call lhs.
85
86    bool refs_may_alias_p (tree, tree)
87
88      This function tries to disambiguate two reference trees.
89
90    bool ptr_deref_may_alias_global_p (tree)
91
92      This function queries if dereferencing a pointer variable may
93      alias global memory.
94
95    More low-level disambiguators are available and documented in
96    this file.  Low-level disambiguators dealing with points-to
97    information are in tree-ssa-structalias.c.  */
98
99
100 /* Query statistics for the different low-level disambiguators.
101    A high-level query may trigger multiple of them.  */
102
103 static struct {
104   unsigned HOST_WIDE_INT refs_may_alias_p_may_alias;
105   unsigned HOST_WIDE_INT refs_may_alias_p_no_alias;
106   unsigned HOST_WIDE_INT ref_maybe_used_by_call_p_may_alias;
107   unsigned HOST_WIDE_INT ref_maybe_used_by_call_p_no_alias;
108   unsigned HOST_WIDE_INT call_may_clobber_ref_p_may_alias;
109   unsigned HOST_WIDE_INT call_may_clobber_ref_p_no_alias;
110 } alias_stats;
111
112 void
113 dump_alias_stats (FILE *s)
114 {
115   fprintf (s, "\nAlias oracle query stats:\n");
116   fprintf (s, "  refs_may_alias_p: "
117            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
118            HOST_WIDE_INT_PRINT_DEC" queries\n",
119            alias_stats.refs_may_alias_p_no_alias,
120            alias_stats.refs_may_alias_p_no_alias
121            + alias_stats.refs_may_alias_p_may_alias);
122   fprintf (s, "  ref_maybe_used_by_call_p: "
123            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
124            HOST_WIDE_INT_PRINT_DEC" queries\n",
125            alias_stats.ref_maybe_used_by_call_p_no_alias,
126            alias_stats.refs_may_alias_p_no_alias
127            + alias_stats.ref_maybe_used_by_call_p_may_alias);
128   fprintf (s, "  call_may_clobber_ref_p: "
129            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
130            HOST_WIDE_INT_PRINT_DEC" queries\n",
131            alias_stats.call_may_clobber_ref_p_no_alias,
132            alias_stats.call_may_clobber_ref_p_no_alias
133            + alias_stats.call_may_clobber_ref_p_may_alias);
134 }
135
136
137 /* Return true, if dereferencing PTR may alias with a global variable.  */
138
139 bool
140 ptr_deref_may_alias_global_p (tree ptr)
141 {
142   struct ptr_info_def *pi;
143
144   /* If we end up with a pointer constant here that may point
145      to global memory.  */
146   if (TREE_CODE (ptr) != SSA_NAME)
147     return true;
148
149   pi = SSA_NAME_PTR_INFO (ptr);
150
151   /* If we do not have points-to information for this variable,
152      we have to punt.  */
153   if (!pi)
154     return true;
155
156   /* ???  This does not use TBAA to prune globals ptr may not access.  */
157   return pt_solution_includes_global (&pi->pt);
158 }
159
160 /* Return true if dereferencing PTR may alias DECL.
161    The caller is responsible for applying TBAA to see if PTR
162    may access DECL at all.  */
163
164 static bool
165 ptr_deref_may_alias_decl_p (tree ptr, tree decl)
166 {
167   struct ptr_info_def *pi;
168
169   /* Conversions are irrelevant for points-to information and
170      data-dependence analysis can feed us those.  */
171   STRIP_NOPS (ptr);
172
173   /* Anything we do not explicilty handle aliases.  */
174   if ((TREE_CODE (ptr) != SSA_NAME
175        && TREE_CODE (ptr) != ADDR_EXPR
176        && TREE_CODE (ptr) != POINTER_PLUS_EXPR)
177       || !POINTER_TYPE_P (TREE_TYPE (ptr))
178       || (TREE_CODE (decl) != VAR_DECL
179           && TREE_CODE (decl) != PARM_DECL
180           && TREE_CODE (decl) != RESULT_DECL))
181     return false;
182
183   /* Disregard pointer offsetting.  */
184   if (TREE_CODE (ptr) == POINTER_PLUS_EXPR)
185     {
186       do
187         {
188           ptr = TREE_OPERAND (ptr, 0);
189         }
190       while (TREE_CODE (ptr) == POINTER_PLUS_EXPR);
191       return ptr_deref_may_alias_decl_p (ptr, decl);
192     }
193
194   /* ADDR_EXPR pointers either just offset another pointer or directly
195      specify the pointed-to set.  */
196   if (TREE_CODE (ptr) == ADDR_EXPR)
197     {
198       tree base = get_base_address (TREE_OPERAND (ptr, 0));
199       if (base
200           && (INDIRECT_REF_P (base)
201               || TREE_CODE (base) == MEM_REF))
202         ptr = TREE_OPERAND (base, 0);
203       else if (base
204                && SSA_VAR_P (base))
205         return base == decl;
206       else if (base
207                && CONSTANT_CLASS_P (base))
208         return false;
209       else
210         return true;
211     }
212
213   /* Non-aliased variables can not be pointed to.  */
214   if (!may_be_aliased (decl))
215     return false;
216
217   /* If we do not have useful points-to information for this pointer
218      we cannot disambiguate anything else.  */
219   pi = SSA_NAME_PTR_INFO (ptr);
220   if (!pi)
221     return true;
222
223   /* If the decl can be used as a restrict tag and we have a restrict
224      pointer and that pointers points-to set doesn't contain this decl
225      then they can't alias.  */
226   if (DECL_RESTRICTED_P (decl)
227       && TYPE_RESTRICT (TREE_TYPE (ptr))
228       && pi->pt.vars_contains_restrict)
229     return bitmap_bit_p (pi->pt.vars, DECL_PT_UID (decl));
230
231   return pt_solution_includes (&pi->pt, decl);
232 }
233
234 /* Return true if dereferenced PTR1 and PTR2 may alias.
235    The caller is responsible for applying TBAA to see if accesses
236    through PTR1 and PTR2 may conflict at all.  */
237
238 bool
239 ptr_derefs_may_alias_p (tree ptr1, tree ptr2)
240 {
241   struct ptr_info_def *pi1, *pi2;
242
243   /* Conversions are irrelevant for points-to information and
244      data-dependence analysis can feed us those.  */
245   STRIP_NOPS (ptr1);
246   STRIP_NOPS (ptr2);
247
248   /* Anything we do not explicilty handle aliases.  */
249   if ((TREE_CODE (ptr1) != SSA_NAME
250        && TREE_CODE (ptr1) != ADDR_EXPR
251        && TREE_CODE (ptr1) != POINTER_PLUS_EXPR)
252       || (TREE_CODE (ptr2) != SSA_NAME
253           && TREE_CODE (ptr2) != ADDR_EXPR
254           && TREE_CODE (ptr2) != POINTER_PLUS_EXPR)
255       || !POINTER_TYPE_P (TREE_TYPE (ptr1))
256       || !POINTER_TYPE_P (TREE_TYPE (ptr2)))
257     return true;
258
259   /* Disregard pointer offsetting.  */
260   if (TREE_CODE (ptr1) == POINTER_PLUS_EXPR)
261     {
262       do
263         {
264           ptr1 = TREE_OPERAND (ptr1, 0);
265         }
266       while (TREE_CODE (ptr1) == POINTER_PLUS_EXPR);
267       return ptr_derefs_may_alias_p (ptr1, ptr2);
268     }
269   if (TREE_CODE (ptr2) == POINTER_PLUS_EXPR)
270     {
271       do
272         {
273           ptr2 = TREE_OPERAND (ptr2, 0);
274         }
275       while (TREE_CODE (ptr2) == POINTER_PLUS_EXPR);
276       return ptr_derefs_may_alias_p (ptr1, ptr2);
277     }
278
279   /* ADDR_EXPR pointers either just offset another pointer or directly
280      specify the pointed-to set.  */
281   if (TREE_CODE (ptr1) == ADDR_EXPR)
282     {
283       tree base = get_base_address (TREE_OPERAND (ptr1, 0));
284       if (base
285           && (INDIRECT_REF_P (base)
286               || TREE_CODE (base) == MEM_REF))
287         ptr1 = TREE_OPERAND (base, 0);
288       else if (base
289                && SSA_VAR_P (base))
290         return ptr_deref_may_alias_decl_p (ptr2, base);
291       else
292         return true;
293     }
294   if (TREE_CODE (ptr2) == ADDR_EXPR)
295     {
296       tree base = get_base_address (TREE_OPERAND (ptr2, 0));
297       if (base
298           && (INDIRECT_REF_P (base)
299               || TREE_CODE (base) == MEM_REF))
300         ptr2 = TREE_OPERAND (base, 0);
301       else if (base
302                && SSA_VAR_P (base))
303         return ptr_deref_may_alias_decl_p (ptr1, base);
304       else
305         return true;
306     }
307
308   /* We may end up with two empty points-to solutions for two same pointers.
309      In this case we still want to say both pointers alias, so shortcut
310      that here.  */
311   if (ptr1 == ptr2)
312     return true;
313
314   /* If we do not have useful points-to information for either pointer
315      we cannot disambiguate anything else.  */
316   pi1 = SSA_NAME_PTR_INFO (ptr1);
317   pi2 = SSA_NAME_PTR_INFO (ptr2);
318   if (!pi1 || !pi2)
319     return true;
320
321   /* If both pointers are restrict-qualified try to disambiguate
322      with restrict information.  */
323   if (TYPE_RESTRICT (TREE_TYPE (ptr1))
324       && TYPE_RESTRICT (TREE_TYPE (ptr2))
325       && !pt_solutions_same_restrict_base (&pi1->pt, &pi2->pt))
326     return false;
327
328   /* ???  This does not use TBAA to prune decls from the intersection
329      that not both pointers may access.  */
330   return pt_solutions_intersect (&pi1->pt, &pi2->pt);
331 }
332
333 /* Return true if dereferencing PTR may alias *REF.
334    The caller is responsible for applying TBAA to see if PTR
335    may access *REF at all.  */
336
337 static bool
338 ptr_deref_may_alias_ref_p_1 (tree ptr, ao_ref *ref)
339 {
340   tree base = ao_ref_base (ref);
341
342   if (INDIRECT_REF_P (base)
343       || TREE_CODE (base) == MEM_REF)
344     return ptr_derefs_may_alias_p (ptr, TREE_OPERAND (base, 0));
345   else if (SSA_VAR_P (base))
346     return ptr_deref_may_alias_decl_p (ptr, base);
347
348   return true;
349 }
350
351
352 /* Dump alias information on FILE.  */
353
354 void
355 dump_alias_info (FILE *file)
356 {
357   size_t i;
358   const char *funcname
359     = lang_hooks.decl_printable_name (current_function_decl, 2);
360   referenced_var_iterator rvi;
361   tree var;
362
363   fprintf (file, "\n\nAlias information for %s\n\n", funcname);
364
365   fprintf (file, "Aliased symbols\n\n");
366
367   FOR_EACH_REFERENCED_VAR (cfun, var, rvi)
368     {
369       if (may_be_aliased (var))
370         dump_variable (file, var);
371     }
372
373   fprintf (file, "\nCall clobber information\n");
374
375   fprintf (file, "\nESCAPED");
376   dump_points_to_solution (file, &cfun->gimple_df->escaped);
377
378   fprintf (file, "\n\nFlow-insensitive points-to information\n\n");
379
380   for (i = 1; i < num_ssa_names; i++)
381     {
382       tree ptr = ssa_name (i);
383       struct ptr_info_def *pi;
384
385       if (ptr == NULL_TREE
386           || SSA_NAME_IN_FREE_LIST (ptr))
387         continue;
388
389       pi = SSA_NAME_PTR_INFO (ptr);
390       if (pi)
391         dump_points_to_info_for (file, ptr);
392     }
393
394   fprintf (file, "\n");
395 }
396
397
398 /* Dump alias information on stderr.  */
399
400 DEBUG_FUNCTION void
401 debug_alias_info (void)
402 {
403   dump_alias_info (stderr);
404 }
405
406
407 /* Dump the points-to set *PT into FILE.  */
408
409 void
410 dump_points_to_solution (FILE *file, struct pt_solution *pt)
411 {
412   if (pt->anything)
413     fprintf (file, ", points-to anything");
414
415   if (pt->nonlocal)
416     fprintf (file, ", points-to non-local");
417
418   if (pt->escaped)
419     fprintf (file, ", points-to escaped");
420
421   if (pt->ipa_escaped)
422     fprintf (file, ", points-to unit escaped");
423
424   if (pt->null)
425     fprintf (file, ", points-to NULL");
426
427   if (pt->vars)
428     {
429       fprintf (file, ", points-to vars: ");
430       dump_decl_set (file, pt->vars);
431       if (pt->vars_contains_global)
432         fprintf (file, " (includes global vars)");
433       if (pt->vars_contains_restrict)
434         fprintf (file, " (includes restrict tags)");
435     }
436 }
437
438 /* Dump points-to information for SSA_NAME PTR into FILE.  */
439
440 void
441 dump_points_to_info_for (FILE *file, tree ptr)
442 {
443   struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
444
445   print_generic_expr (file, ptr, dump_flags);
446
447   if (pi)
448     dump_points_to_solution (file, &pi->pt);
449   else
450     fprintf (file, ", points-to anything");
451
452   fprintf (file, "\n");
453 }
454
455
456 /* Dump points-to information for VAR into stderr.  */
457
458 DEBUG_FUNCTION void
459 debug_points_to_info_for (tree var)
460 {
461   dump_points_to_info_for (stderr, var);
462 }
463
464
465 /* Initializes the alias-oracle reference representation *R from REF.  */
466
467 void
468 ao_ref_init (ao_ref *r, tree ref)
469 {
470   r->ref = ref;
471   r->base = NULL_TREE;
472   r->offset = 0;
473   r->size = -1;
474   r->max_size = -1;
475   r->ref_alias_set = -1;
476   r->base_alias_set = -1;
477 }
478
479 /* Returns the base object of the memory reference *REF.  */
480
481 tree
482 ao_ref_base (ao_ref *ref)
483 {
484   if (ref->base)
485     return ref->base;
486   ref->base = get_ref_base_and_extent (ref->ref, &ref->offset, &ref->size,
487                                        &ref->max_size);
488   return ref->base;
489 }
490
491 /* Returns the base object alias set of the memory reference *REF.  */
492
493 static alias_set_type
494 ao_ref_base_alias_set (ao_ref *ref)
495 {
496   tree base_ref;
497   if (ref->base_alias_set != -1)
498     return ref->base_alias_set;
499   if (!ref->ref)
500     return 0;
501   base_ref = ref->ref;
502   while (handled_component_p (base_ref))
503     base_ref = TREE_OPERAND (base_ref, 0);
504   ref->base_alias_set = get_alias_set (base_ref);
505   return ref->base_alias_set;
506 }
507
508 /* Returns the reference alias set of the memory reference *REF.  */
509
510 alias_set_type
511 ao_ref_alias_set (ao_ref *ref)
512 {
513   if (ref->ref_alias_set != -1)
514     return ref->ref_alias_set;
515   ref->ref_alias_set = get_alias_set (ref->ref);
516   return ref->ref_alias_set;
517 }
518
519 /* Init an alias-oracle reference representation from a gimple pointer
520    PTR and a gimple size SIZE in bytes.  If SIZE is NULL_TREE the the
521    size is assumed to be unknown.  The access is assumed to be only
522    to or after of the pointer target, not before it.  */
523
524 void
525 ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size)
526 {
527   HOST_WIDE_INT t1, t2;
528   ref->ref = NULL_TREE;
529   if (TREE_CODE (ptr) == ADDR_EXPR)
530     ref->base = get_ref_base_and_extent (TREE_OPERAND (ptr, 0),
531                                          &ref->offset, &t1, &t2);
532   else
533     {
534       ref->base = build2 (MEM_REF, char_type_node,
535                           ptr, null_pointer_node);
536       ref->offset = 0;
537     }
538   if (size
539       && host_integerp (size, 0)
540       && TREE_INT_CST_LOW (size) * 8 / 8 == TREE_INT_CST_LOW (size))
541     ref->max_size = ref->size = TREE_INT_CST_LOW (size) * 8;
542   else
543     ref->max_size = ref->size = -1;
544   ref->ref_alias_set = 0;
545   ref->base_alias_set = 0;
546 }
547
548 /* Return 1 if TYPE1 and TYPE2 are to be considered equivalent for the
549    purpose of TBAA.  Return 0 if they are distinct and -1 if we cannot
550    decide.  */
551
552 static inline int
553 same_type_for_tbaa (tree type1, tree type2)
554 {
555   type1 = TYPE_MAIN_VARIANT (type1);
556   type2 = TYPE_MAIN_VARIANT (type2);
557
558   /* If we would have to do structural comparison bail out.  */
559   if (TYPE_STRUCTURAL_EQUALITY_P (type1)
560       || TYPE_STRUCTURAL_EQUALITY_P (type2))
561     return -1;
562
563   /* Compare the canonical types.  */
564   if (TYPE_CANONICAL (type1) == TYPE_CANONICAL (type2))
565     return 1;
566
567   /* ??? Array types are not properly unified in all cases as we have
568      spurious changes in the index types for example.  Removing this
569      causes all sorts of problems with the Fortran frontend.  */
570   if (TREE_CODE (type1) == ARRAY_TYPE
571       && TREE_CODE (type2) == ARRAY_TYPE)
572     return -1;
573
574   /* ??? In Ada, an lvalue of an unconstrained type can be used to access an
575      object of one of its constrained subtypes, e.g. when a function with an
576      unconstrained parameter passed by reference is called on an object and
577      inlined.  But, even in the case of a fixed size, type and subtypes are
578      not equivalent enough as to share the same TYPE_CANONICAL, since this
579      would mean that conversions between them are useless, whereas they are
580      not (e.g. type and subtypes can have different modes).  So, in the end,
581      they are only guaranteed to have the same alias set.  */
582   if (get_alias_set (type1) == get_alias_set (type2))
583     return -1;
584
585   /* The types are known to be not equal.  */
586   return 0;
587 }
588
589 /* Determine if the two component references REF1 and REF2 which are
590    based on access types TYPE1 and TYPE2 and of which at least one is based
591    on an indirect reference may alias.  REF2 is the only one that can
592    be a decl in which case REF2_IS_DECL is true.
593    REF1_ALIAS_SET, BASE1_ALIAS_SET, REF2_ALIAS_SET and BASE2_ALIAS_SET
594    are the respective alias sets.  */
595
596 static bool
597 aliasing_component_refs_p (tree ref1, tree type1,
598                            alias_set_type ref1_alias_set,
599                            alias_set_type base1_alias_set,
600                            HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
601                            tree ref2, tree type2,
602                            alias_set_type ref2_alias_set,
603                            alias_set_type base2_alias_set,
604                            HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2,
605                            bool ref2_is_decl)
606 {
607   /* If one reference is a component references through pointers try to find a
608      common base and apply offset based disambiguation.  This handles
609      for example
610        struct A { int i; int j; } *q;
611        struct B { struct A a; int k; } *p;
612      disambiguating q->i and p->a.j.  */
613   tree *refp;
614   int same_p;
615
616   /* Now search for the type1 in the access path of ref2.  This
617      would be a common base for doing offset based disambiguation on.  */
618   refp = &ref2;
619   while (handled_component_p (*refp)
620          && same_type_for_tbaa (TREE_TYPE (*refp), type1) == 0)
621     refp = &TREE_OPERAND (*refp, 0);
622   same_p = same_type_for_tbaa (TREE_TYPE (*refp), type1);
623   /* If we couldn't compare types we have to bail out.  */
624   if (same_p == -1)
625     return true;
626   else if (same_p == 1)
627     {
628       HOST_WIDE_INT offadj, sztmp, msztmp;
629       get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp);
630       offset2 -= offadj;
631       return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
632     }
633   /* If we didn't find a common base, try the other way around.  */
634   refp = &ref1;
635   while (handled_component_p (*refp)
636          && same_type_for_tbaa (TREE_TYPE (*refp), type2) == 0)
637     refp = &TREE_OPERAND (*refp, 0);
638   same_p = same_type_for_tbaa (TREE_TYPE (*refp), type2);
639   /* If we couldn't compare types we have to bail out.  */
640   if (same_p == -1)
641     return true;
642   else if (same_p == 1)
643     {
644       HOST_WIDE_INT offadj, sztmp, msztmp;
645       get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp);
646       offset1 -= offadj;
647       return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
648     }
649
650   /* If we have two type access paths B1.path1 and B2.path2 they may
651      only alias if either B1 is in B2.path2 or B2 is in B1.path1.
652      But we can still have a path that goes B1.path1...B2.path2 with
653      a part that we do not see.  So we can only disambiguate now
654      if there is no B2 in the tail of path1 and no B1 on the
655      tail of path2.  */
656   if (base1_alias_set == ref2_alias_set
657       || alias_set_subset_of (base1_alias_set, ref2_alias_set))
658     return true;
659   /* If this is ptr vs. decl then we know there is no ptr ... decl path.  */
660   if (!ref2_is_decl)
661     return (base2_alias_set == ref1_alias_set
662             || alias_set_subset_of (base2_alias_set, ref1_alias_set));
663   return false;
664 }
665
666 /* Return true if two memory references based on the variables BASE1
667    and BASE2 constrained to [OFFSET1, OFFSET1 + MAX_SIZE1) and
668    [OFFSET2, OFFSET2 + MAX_SIZE2) may alias.  */
669
670 static bool
671 decl_refs_may_alias_p (tree base1,
672                        HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
673                        tree base2,
674                        HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2)
675 {
676   gcc_assert (SSA_VAR_P (base1) && SSA_VAR_P (base2));
677
678   /* If both references are based on different variables, they cannot alias.  */
679   if (base1 != base2)
680     return false;
681
682   /* If both references are based on the same variable, they cannot alias if
683      the accesses do not overlap.  */
684   return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
685 }
686
687 /* Return true if an indirect reference based on *PTR1 constrained
688    to [OFFSET1, OFFSET1 + MAX_SIZE1) may alias a variable based on BASE2
689    constrained to [OFFSET2, OFFSET2 + MAX_SIZE2).  *PTR1 and BASE2 have
690    the alias sets BASE1_ALIAS_SET and BASE2_ALIAS_SET which can be -1
691    in which case they are computed on-demand.  REF1 and REF2
692    if non-NULL are the complete memory reference trees.  */
693
694 static bool
695 indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
696                                HOST_WIDE_INT offset1,
697                                HOST_WIDE_INT max_size1 ATTRIBUTE_UNUSED,
698                                alias_set_type ref1_alias_set,
699                                alias_set_type base1_alias_set,
700                                tree ref2 ATTRIBUTE_UNUSED, tree base2,
701                                HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2,
702                                alias_set_type ref2_alias_set,
703                                alias_set_type base2_alias_set, bool tbaa_p)
704 {
705   tree ptr1;
706   tree ptrtype1;
707   HOST_WIDE_INT offset1p = offset1, offset2p = offset2;
708
709   ptr1 = TREE_OPERAND (base1, 0);
710
711   /* The offset embedded in MEM_REFs can be negative.  Bias them
712      so that the resulting offset adjustment is positive.  */
713   if (TREE_CODE (base1) == MEM_REF
714       || TREE_CODE (base1) == TARGET_MEM_REF)
715     {
716       double_int moff = mem_ref_offset (base1);
717       moff = double_int_lshift (moff,
718                                 BITS_PER_UNIT == 8
719                                 ? 3 : exact_log2 (BITS_PER_UNIT),
720                                 HOST_BITS_PER_DOUBLE_INT, true);
721       if (double_int_negative_p (moff))
722         offset2p += double_int_neg (moff).low;
723       else
724         offset1p += moff.low;
725     }
726
727   /* If only one reference is based on a variable, they cannot alias if
728      the pointer access is beyond the extent of the variable access.
729      (the pointer base cannot validly point to an offset less than zero
730      of the variable).
731      They also cannot alias if the pointer may not point to the decl.  */
732   if ((TREE_CODE (base1) != TARGET_MEM_REF
733        || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1)))
734       && !ranges_overlap_p (MAX (0, offset1p), -1, offset2p, max_size2))
735     return false;
736   if (!ptr_deref_may_alias_decl_p (ptr1, base2))
737     return false;
738
739   /* Disambiguations that rely on strict aliasing rules follow.  */
740   if (!flag_strict_aliasing || !tbaa_p)
741     return true;
742
743   if (TREE_CODE (base1) == MEM_REF)
744     ptrtype1 = TREE_TYPE (TREE_OPERAND (base1, 1));
745   else if (TREE_CODE (base1) == TARGET_MEM_REF)
746     ptrtype1 = TREE_TYPE (TMR_OFFSET (base1));
747   else
748     ptrtype1 = TREE_TYPE (ptr1);
749
750   /* If the alias set for a pointer access is zero all bets are off.  */
751   if (base1_alias_set == -1)
752     base1_alias_set = get_deref_alias_set (ptrtype1);
753   if (base1_alias_set == 0)
754     return true;
755   if (base2_alias_set == -1)
756     base2_alias_set = get_alias_set (base2);
757
758   /* If both references are through the same type, they do not alias
759      if the accesses do not overlap.  This does extra disambiguation
760      for mixed/pointer accesses but requires strict aliasing.
761      For MEM_REFs we require that the component-ref offset we computed
762      is relative to the start of the type which we ensure by
763      comparing rvalue and access type and disregarding the constant
764      pointer offset.  */
765   if ((TREE_CODE (base1) != TARGET_MEM_REF
766        || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1)))
767       && (TREE_CODE (base1) != MEM_REF
768           || same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1)
769       && same_type_for_tbaa (TREE_TYPE (ptrtype1), TREE_TYPE (base2)) == 1)
770     return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
771
772   /* When we are trying to disambiguate an access with a pointer dereference
773      as base versus one with a decl as base we can use both the size
774      of the decl and its dynamic type for extra disambiguation.
775      ???  We do not know anything about the dynamic type of the decl
776      other than that its alias-set contains base2_alias_set as a subset
777      which does not help us here.  */
778   /* As we know nothing useful about the dynamic type of the decl just
779      use the usual conflict check rather than a subset test.
780      ???  We could introduce -fvery-strict-aliasing when the language
781      does not allow decls to have a dynamic type that differs from their
782      static type.  Then we can check 
783      !alias_set_subset_of (base1_alias_set, base2_alias_set) instead.  */
784   if (base1_alias_set != base2_alias_set
785       && !alias_sets_conflict_p (base1_alias_set, base2_alias_set))
786     return false;
787   /* If the size of the access relevant for TBAA through the pointer
788      is bigger than the size of the decl we can't possibly access the
789      decl via that pointer.  */
790   if (DECL_SIZE (base2) && COMPLETE_TYPE_P (TREE_TYPE (ptrtype1))
791       && TREE_CODE (DECL_SIZE (base2)) == INTEGER_CST
792       && TREE_CODE (TYPE_SIZE (TREE_TYPE (ptrtype1))) == INTEGER_CST
793       /* ???  This in turn may run afoul when a decl of type T which is
794          a member of union type U is accessed through a pointer to
795          type U and sizeof T is smaller than sizeof U.  */
796       && TREE_CODE (TREE_TYPE (ptrtype1)) != UNION_TYPE
797       && TREE_CODE (TREE_TYPE (ptrtype1)) != QUAL_UNION_TYPE
798       && tree_int_cst_lt (DECL_SIZE (base2), TYPE_SIZE (TREE_TYPE (ptrtype1))))
799     return false;
800
801   /* Do access-path based disambiguation.  */
802   if (ref1 && ref2
803       && handled_component_p (ref1)
804       && handled_component_p (ref2)
805       && TREE_CODE (base1) != TARGET_MEM_REF
806       && (TREE_CODE (base1) != MEM_REF
807           || same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1))
808     return aliasing_component_refs_p (ref1, TREE_TYPE (ptrtype1),
809                                       ref1_alias_set, base1_alias_set,
810                                       offset1, max_size1,
811                                       ref2, TREE_TYPE
812                                               (reference_alias_ptr_type (ref2)),
813                                       ref2_alias_set, base2_alias_set,
814                                       offset2, max_size2, true);
815
816   return true;
817 }
818
819 /* Return true if two indirect references based on *PTR1
820    and *PTR2 constrained to [OFFSET1, OFFSET1 + MAX_SIZE1) and
821    [OFFSET2, OFFSET2 + MAX_SIZE2) may alias.  *PTR1 and *PTR2 have
822    the alias sets BASE1_ALIAS_SET and BASE2_ALIAS_SET which can be -1
823    in which case they are computed on-demand.  REF1 and REF2
824    if non-NULL are the complete memory reference trees. */
825
826 static bool
827 indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
828                            HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
829                            alias_set_type ref1_alias_set,
830                            alias_set_type base1_alias_set,
831                            tree ref2 ATTRIBUTE_UNUSED, tree base2,
832                            HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2,
833                            alias_set_type ref2_alias_set,
834                            alias_set_type base2_alias_set, bool tbaa_p)
835 {
836   tree ptr1;
837   tree ptr2;
838   tree ptrtype1, ptrtype2;
839
840   ptr1 = TREE_OPERAND (base1, 0);
841   ptr2 = TREE_OPERAND (base2, 0);
842
843   /* If both bases are based on pointers they cannot alias if they may not
844      point to the same memory object or if they point to the same object
845      and the accesses do not overlap.  */
846   if ((!cfun || gimple_in_ssa_p (cfun))
847       && operand_equal_p (ptr1, ptr2, 0)
848       && (((TREE_CODE (base1) != TARGET_MEM_REF
849             || (!TMR_INDEX (base1) && !TMR_INDEX2 (base1)))
850            && (TREE_CODE (base2) != TARGET_MEM_REF
851                || (!TMR_INDEX (base2) && !TMR_INDEX2 (base2))))
852           || (TREE_CODE (base1) == TARGET_MEM_REF
853               && TREE_CODE (base2) == TARGET_MEM_REF
854               && (TMR_STEP (base1) == TMR_STEP (base2)
855                   || (TMR_STEP (base1) && TMR_STEP (base2)
856                       && operand_equal_p (TMR_STEP (base1),
857                                           TMR_STEP (base2), 0)))
858               && (TMR_INDEX (base1) == TMR_INDEX (base2)
859                   || (TMR_INDEX (base1) && TMR_INDEX (base2)
860                       && operand_equal_p (TMR_INDEX (base1),
861                                           TMR_INDEX (base2), 0)))
862               && (TMR_INDEX2 (base1) == TMR_INDEX2 (base2)
863                   || (TMR_INDEX2 (base1) && TMR_INDEX2 (base2)
864                       && operand_equal_p (TMR_INDEX2 (base1),
865                                           TMR_INDEX2 (base2), 0))))))
866     {
867       /* The offset embedded in MEM_REFs can be negative.  Bias them
868          so that the resulting offset adjustment is positive.  */
869       if (TREE_CODE (base1) == MEM_REF
870           || TREE_CODE (base1) == TARGET_MEM_REF)
871         {
872           double_int moff = mem_ref_offset (base1);
873           moff = double_int_lshift (moff,
874                                     BITS_PER_UNIT == 8
875                                     ? 3 : exact_log2 (BITS_PER_UNIT),
876                                     HOST_BITS_PER_DOUBLE_INT, true);
877           if (double_int_negative_p (moff))
878             offset2 += double_int_neg (moff).low;
879           else
880             offset1 += moff.low;
881         }
882       if (TREE_CODE (base2) == MEM_REF
883           || TREE_CODE (base2) == TARGET_MEM_REF)
884         {
885           double_int moff = mem_ref_offset (base2);
886           moff = double_int_lshift (moff,
887                                     BITS_PER_UNIT == 8
888                                     ? 3 : exact_log2 (BITS_PER_UNIT),
889                                     HOST_BITS_PER_DOUBLE_INT, true);
890           if (double_int_negative_p (moff))
891             offset1 += double_int_neg (moff).low;
892           else
893             offset2 += moff.low;
894         }
895       return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
896     }
897   if (!ptr_derefs_may_alias_p (ptr1, ptr2))
898     return false;
899
900   /* Disambiguations that rely on strict aliasing rules follow.  */
901   if (!flag_strict_aliasing || !tbaa_p)
902     return true;
903
904   if (TREE_CODE (base1) == MEM_REF)
905     ptrtype1 = TREE_TYPE (TREE_OPERAND (base1, 1));
906   else if (TREE_CODE (base1) == TARGET_MEM_REF)
907     ptrtype1 = TREE_TYPE (TMR_OFFSET (base1));
908   else
909     ptrtype1 = TREE_TYPE (ptr1);
910   if (TREE_CODE (base2) == MEM_REF)
911     ptrtype2 = TREE_TYPE (TREE_OPERAND (base2, 1));
912   else if (TREE_CODE (base2) == TARGET_MEM_REF)
913     ptrtype2 = TREE_TYPE (TMR_OFFSET (base2));
914   else
915     ptrtype2 = TREE_TYPE (ptr2);
916
917   /* If the alias set for a pointer access is zero all bets are off.  */
918   if (base1_alias_set == -1)
919     base1_alias_set = get_deref_alias_set (ptrtype1);
920   if (base1_alias_set == 0)
921     return true;
922   if (base2_alias_set == -1)
923     base2_alias_set = get_deref_alias_set (ptrtype2);
924   if (base2_alias_set == 0)
925     return true;
926
927   /* If both references are through the same type, they do not alias
928      if the accesses do not overlap.  This does extra disambiguation
929      for mixed/pointer accesses but requires strict aliasing.  */
930   if ((TREE_CODE (base1) != TARGET_MEM_REF || !TMR_INDEX (base1))
931       && (TREE_CODE (base2) != TARGET_MEM_REF || !TMR_INDEX (base2))
932       && (TREE_CODE (base1) != MEM_REF
933           || same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1)
934       && (TREE_CODE (base2) != MEM_REF
935           || same_type_for_tbaa (TREE_TYPE (base2), TREE_TYPE (ptrtype2)) == 1)
936       && same_type_for_tbaa (TREE_TYPE (ptrtype1),
937                              TREE_TYPE (ptrtype2)) == 1)
938     return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
939
940   /* Do type-based disambiguation.  */
941   if (base1_alias_set != base2_alias_set
942       && !alias_sets_conflict_p (base1_alias_set, base2_alias_set))
943     return false;
944
945   /* Do access-path based disambiguation.  */
946   if (ref1 && ref2
947       && handled_component_p (ref1)
948       && handled_component_p (ref2)
949       && TREE_CODE (base1) != TARGET_MEM_REF
950       && TREE_CODE (base2) != TARGET_MEM_REF
951       && (TREE_CODE (base1) != MEM_REF
952           || same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1)
953       && (TREE_CODE (base2) != MEM_REF
954           || same_type_for_tbaa (TREE_TYPE (base2), TREE_TYPE (ptrtype2)) == 1))
955     return aliasing_component_refs_p (ref1, TREE_TYPE (ptrtype1),
956                                       ref1_alias_set, base1_alias_set,
957                                       offset1, max_size1,
958                                       ref2, TREE_TYPE (ptrtype2),
959                                       ref2_alias_set, base2_alias_set,
960                                       offset2, max_size2, false);
961
962   return true;
963 }
964
965 /* Return true, if the two memory references REF1 and REF2 may alias.  */
966
967 bool
968 refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p)
969 {
970   tree base1, base2;
971   HOST_WIDE_INT offset1 = 0, offset2 = 0;
972   HOST_WIDE_INT max_size1 = -1, max_size2 = -1;
973   bool var1_p, var2_p, ind1_p, ind2_p;
974
975   gcc_checking_assert ((!ref1->ref
976                         || TREE_CODE (ref1->ref) == SSA_NAME
977                         || DECL_P (ref1->ref)
978                         || TREE_CODE (ref1->ref) == STRING_CST
979                         || handled_component_p (ref1->ref)
980                         || INDIRECT_REF_P (ref1->ref)
981                         || TREE_CODE (ref1->ref) == MEM_REF
982                         || TREE_CODE (ref1->ref) == TARGET_MEM_REF)
983                        && (!ref2->ref
984                            || TREE_CODE (ref2->ref) == SSA_NAME
985                            || DECL_P (ref2->ref)
986                            || TREE_CODE (ref2->ref) == STRING_CST
987                            || handled_component_p (ref2->ref)
988                            || INDIRECT_REF_P (ref2->ref)
989                            || TREE_CODE (ref2->ref) == MEM_REF
990                            || TREE_CODE (ref2->ref) == TARGET_MEM_REF));
991
992   /* Decompose the references into their base objects and the access.  */
993   base1 = ao_ref_base (ref1);
994   offset1 = ref1->offset;
995   max_size1 = ref1->max_size;
996   base2 = ao_ref_base (ref2);
997   offset2 = ref2->offset;
998   max_size2 = ref2->max_size;
999
1000   /* We can end up with registers or constants as bases for example from
1001      *D.1663_44 = VIEW_CONVERT_EXPR<struct DB_LSN>(__tmp$B0F64_59);
1002      which is seen as a struct copy.  */
1003   if (TREE_CODE (base1) == SSA_NAME
1004       || TREE_CODE (base1) == CONST_DECL
1005       || TREE_CODE (base1) == CONSTRUCTOR
1006       || TREE_CODE (base1) == ADDR_EXPR
1007       || CONSTANT_CLASS_P (base1)
1008       || TREE_CODE (base2) == SSA_NAME
1009       || TREE_CODE (base2) == CONST_DECL
1010       || TREE_CODE (base2) == CONSTRUCTOR
1011       || TREE_CODE (base2) == ADDR_EXPR
1012       || CONSTANT_CLASS_P (base2))
1013     return false;
1014
1015   /* We can end up refering to code via function and label decls.
1016      As we likely do not properly track code aliases conservatively
1017      bail out.  */
1018   if (TREE_CODE (base1) == FUNCTION_DECL
1019       || TREE_CODE (base1) == LABEL_DECL
1020       || TREE_CODE (base2) == FUNCTION_DECL
1021       || TREE_CODE (base2) == LABEL_DECL)
1022     return true;
1023
1024   /* Defer to simple offset based disambiguation if we have
1025      references based on two decls.  Do this before defering to
1026      TBAA to handle must-alias cases in conformance with the
1027      GCC extension of allowing type-punning through unions.  */
1028   var1_p = SSA_VAR_P (base1);
1029   var2_p = SSA_VAR_P (base2);
1030   if (var1_p && var2_p)
1031     return decl_refs_may_alias_p (base1, offset1, max_size1,
1032                                   base2, offset2, max_size2);
1033
1034   ind1_p = (INDIRECT_REF_P (base1)
1035             || (TREE_CODE (base1) == MEM_REF)
1036             || (TREE_CODE (base1) == TARGET_MEM_REF));
1037   ind2_p = (INDIRECT_REF_P (base2)
1038             || (TREE_CODE (base2) == MEM_REF)
1039             || (TREE_CODE (base2) == TARGET_MEM_REF));
1040
1041   /* Canonicalize the pointer-vs-decl case.  */
1042   if (ind1_p && var2_p)
1043     {
1044       HOST_WIDE_INT tmp1;
1045       tree tmp2;
1046       ao_ref *tmp3;
1047       tmp1 = offset1; offset1 = offset2; offset2 = tmp1;
1048       tmp1 = max_size1; max_size1 = max_size2; max_size2 = tmp1;
1049       tmp2 = base1; base1 = base2; base2 = tmp2;
1050       tmp3 = ref1; ref1 = ref2; ref2 = tmp3;
1051       var1_p = true;
1052       ind1_p = false;
1053       var2_p = false;
1054       ind2_p = true;
1055     }
1056
1057   /* First defer to TBAA if possible.  */
1058   if (tbaa_p
1059       && flag_strict_aliasing
1060       && !alias_sets_conflict_p (ao_ref_alias_set (ref1),
1061                                  ao_ref_alias_set (ref2)))
1062     return false;
1063
1064   /* Dispatch to the pointer-vs-decl or pointer-vs-pointer disambiguators.  */
1065   if (var1_p && ind2_p)
1066     return indirect_ref_may_alias_decl_p (ref2->ref, base2,
1067                                           offset2, max_size2,
1068                                           ao_ref_alias_set (ref2), -1,
1069                                           ref1->ref, base1,
1070                                           offset1, max_size1,
1071                                           ao_ref_alias_set (ref1),
1072                                           ao_ref_base_alias_set (ref1),
1073                                           tbaa_p);
1074   else if (ind1_p && ind2_p)
1075     return indirect_refs_may_alias_p (ref1->ref, base1,
1076                                       offset1, max_size1,
1077                                       ao_ref_alias_set (ref1), -1,
1078                                       ref2->ref, base2,
1079                                       offset2, max_size2,
1080                                       ao_ref_alias_set (ref2), -1,
1081                                       tbaa_p);
1082
1083   gcc_unreachable ();
1084 }
1085
1086 bool
1087 refs_may_alias_p (tree ref1, tree ref2)
1088 {
1089   ao_ref r1, r2;
1090   bool res;
1091   ao_ref_init (&r1, ref1);
1092   ao_ref_init (&r2, ref2);
1093   res = refs_may_alias_p_1 (&r1, &r2, true);
1094   if (res)
1095     ++alias_stats.refs_may_alias_p_may_alias;
1096   else
1097     ++alias_stats.refs_may_alias_p_no_alias;
1098   return res;
1099 }
1100
1101 /* Returns true if there is a anti-dependence for the STORE that
1102    executes after the LOAD.  */
1103
1104 bool
1105 refs_anti_dependent_p (tree load, tree store)
1106 {
1107   ao_ref r1, r2;
1108   ao_ref_init (&r1, load);
1109   ao_ref_init (&r2, store);
1110   return refs_may_alias_p_1 (&r1, &r2, false);
1111 }
1112
1113 /* Returns true if there is a output dependence for the stores
1114    STORE1 and STORE2.  */
1115
1116 bool
1117 refs_output_dependent_p (tree store1, tree store2)
1118 {
1119   ao_ref r1, r2;
1120   ao_ref_init (&r1, store1);
1121   ao_ref_init (&r2, store2);
1122   return refs_may_alias_p_1 (&r1, &r2, false);
1123 }
1124
1125 /* If the call CALL may use the memory reference REF return true,
1126    otherwise return false.  */
1127
1128 static bool
1129 ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
1130 {
1131   tree base, callee;
1132   unsigned i;
1133   int flags = gimple_call_flags (call);
1134
1135   /* Const functions without a static chain do not implicitly use memory.  */
1136   if (!gimple_call_chain (call)
1137       && (flags & (ECF_CONST|ECF_NOVOPS)))
1138     goto process_args;
1139
1140   base = ao_ref_base (ref);
1141   if (!base)
1142     return true;
1143
1144   /* If the reference is based on a decl that is not aliased the call
1145      cannot possibly use it.  */
1146   if (DECL_P (base)
1147       && !may_be_aliased (base)
1148       /* But local statics can be used through recursion.  */
1149       && !is_global_var (base))
1150     goto process_args;
1151
1152   callee = gimple_call_fndecl (call);
1153
1154   /* Handle those builtin functions explicitly that do not act as
1155      escape points.  See tree-ssa-structalias.c:find_func_aliases
1156      for the list of builtins we might need to handle here.  */
1157   if (callee != NULL_TREE
1158       && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
1159     switch (DECL_FUNCTION_CODE (callee))
1160       {
1161         /* All the following functions clobber memory pointed to by
1162            their first argument.  */
1163         case BUILT_IN_STRCPY:
1164         case BUILT_IN_STRNCPY:
1165         case BUILT_IN_MEMCPY:
1166         case BUILT_IN_MEMMOVE:
1167         case BUILT_IN_MEMPCPY:
1168         case BUILT_IN_STPCPY:
1169         case BUILT_IN_STPNCPY:
1170         case BUILT_IN_STRCAT:
1171         case BUILT_IN_STRNCAT:
1172           {
1173             ao_ref dref;
1174             tree size = NULL_TREE;
1175             if (gimple_call_num_args (call) == 3)
1176               size = gimple_call_arg (call, 2);
1177             ao_ref_init_from_ptr_and_size (&dref,
1178                                            gimple_call_arg (call, 1),
1179                                            size);
1180             return refs_may_alias_p_1 (&dref, ref, false);
1181           }
1182         case BUILT_IN_BCOPY:
1183           {
1184             ao_ref dref;
1185             tree size = gimple_call_arg (call, 2);
1186             ao_ref_init_from_ptr_and_size (&dref,
1187                                            gimple_call_arg (call, 0),
1188                                            size);
1189             return refs_may_alias_p_1 (&dref, ref, false);
1190           }
1191         /* The following builtins do not read from memory.  */
1192         case BUILT_IN_FREE:
1193         case BUILT_IN_MALLOC:
1194         case BUILT_IN_CALLOC:
1195         case BUILT_IN_MEMSET:
1196         case BUILT_IN_FREXP:
1197         case BUILT_IN_FREXPF:
1198         case BUILT_IN_FREXPL:
1199         case BUILT_IN_GAMMA_R:
1200         case BUILT_IN_GAMMAF_R:
1201         case BUILT_IN_GAMMAL_R:
1202         case BUILT_IN_LGAMMA_R:
1203         case BUILT_IN_LGAMMAF_R:
1204         case BUILT_IN_LGAMMAL_R:
1205         case BUILT_IN_MODF:
1206         case BUILT_IN_MODFF:
1207         case BUILT_IN_MODFL:
1208         case BUILT_IN_REMQUO:
1209         case BUILT_IN_REMQUOF:
1210         case BUILT_IN_REMQUOL:
1211         case BUILT_IN_SINCOS:
1212         case BUILT_IN_SINCOSF:
1213         case BUILT_IN_SINCOSL:
1214           return false;
1215         /* __sync_* builtins and some OpenMP builtins act as threading
1216            barriers.  */
1217 #undef DEF_SYNC_BUILTIN
1218 #define DEF_SYNC_BUILTIN(ENUM, NAME, TYPE, ATTRS) case ENUM:
1219 #include "sync-builtins.def"
1220 #undef DEF_SYNC_BUILTIN
1221         case BUILT_IN_GOMP_ATOMIC_START:
1222         case BUILT_IN_GOMP_ATOMIC_END:
1223         case BUILT_IN_GOMP_BARRIER:
1224         case BUILT_IN_GOMP_TASKWAIT:
1225         case BUILT_IN_GOMP_CRITICAL_START:
1226         case BUILT_IN_GOMP_CRITICAL_END:
1227         case BUILT_IN_GOMP_CRITICAL_NAME_START:
1228         case BUILT_IN_GOMP_CRITICAL_NAME_END:
1229         case BUILT_IN_GOMP_LOOP_END:
1230         case BUILT_IN_GOMP_ORDERED_START:
1231         case BUILT_IN_GOMP_ORDERED_END:
1232         case BUILT_IN_GOMP_PARALLEL_END:
1233         case BUILT_IN_GOMP_SECTIONS_END:
1234         case BUILT_IN_GOMP_SINGLE_COPY_START:
1235         case BUILT_IN_GOMP_SINGLE_COPY_END:
1236           return true;
1237
1238         default:
1239           /* Fallthru to general call handling.  */;
1240       }
1241
1242   /* Check if base is a global static variable that is not read
1243      by the function.  */
1244   if (TREE_CODE (base) == VAR_DECL
1245       && TREE_STATIC (base))
1246     {
1247       bitmap not_read;
1248
1249       if (callee != NULL_TREE
1250           && (not_read
1251                 = ipa_reference_get_not_read_global (cgraph_node (callee)))
1252           && bitmap_bit_p (not_read, DECL_UID (base)))
1253         goto process_args;
1254     }
1255
1256   /* Check if the base variable is call-used.  */
1257   if (DECL_P (base))
1258     {
1259       if (pt_solution_includes (gimple_call_use_set (call), base))
1260         return true;
1261     }
1262   else if ((INDIRECT_REF_P (base)
1263             || TREE_CODE (base) == MEM_REF)
1264            && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
1265     {
1266       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
1267       if (!pi)
1268         return true;
1269
1270       if (pt_solutions_intersect (gimple_call_use_set (call), &pi->pt))
1271         return true;
1272     }
1273   else
1274     return true;
1275
1276   /* Inspect call arguments for passed-by-value aliases.  */
1277 process_args:
1278   for (i = 0; i < gimple_call_num_args (call); ++i)
1279     {
1280       tree op = gimple_call_arg (call, i);
1281       int flags = gimple_call_arg_flags (call, i);
1282
1283       if (flags & EAF_UNUSED)
1284         continue;
1285
1286       if (TREE_CODE (op) == WITH_SIZE_EXPR)
1287         op = TREE_OPERAND (op, 0);
1288
1289       if (TREE_CODE (op) != SSA_NAME
1290           && !is_gimple_min_invariant (op))
1291         {
1292           ao_ref r;
1293           ao_ref_init (&r, op);
1294           if (refs_may_alias_p_1 (&r, ref, true))
1295             return true;
1296         }
1297     }
1298
1299   return false;
1300 }
1301
1302 static bool
1303 ref_maybe_used_by_call_p (gimple call, tree ref)
1304 {
1305   ao_ref r;
1306   bool res;
1307   ao_ref_init (&r, ref);
1308   res = ref_maybe_used_by_call_p_1 (call, &r);
1309   if (res)
1310     ++alias_stats.ref_maybe_used_by_call_p_may_alias;
1311   else
1312     ++alias_stats.ref_maybe_used_by_call_p_no_alias;
1313   return res;
1314 }
1315
1316
1317 /* If the statement STMT may use the memory reference REF return
1318    true, otherwise return false.  */
1319
1320 bool
1321 ref_maybe_used_by_stmt_p (gimple stmt, tree ref)
1322 {
1323   if (is_gimple_assign (stmt))
1324     {
1325       tree rhs;
1326
1327       /* All memory assign statements are single.  */
1328       if (!gimple_assign_single_p (stmt))
1329         return false;
1330
1331       rhs = gimple_assign_rhs1 (stmt);
1332       if (is_gimple_reg (rhs)
1333           || is_gimple_min_invariant (rhs)
1334           || gimple_assign_rhs_code (stmt) == CONSTRUCTOR)
1335         return false;
1336
1337       return refs_may_alias_p (rhs, ref);
1338     }
1339   else if (is_gimple_call (stmt))
1340     return ref_maybe_used_by_call_p (stmt, ref);
1341
1342   return true;
1343 }
1344
1345 /* If the call in statement CALL may clobber the memory reference REF
1346    return true, otherwise return false.  */
1347
1348 static bool
1349 call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
1350 {
1351   tree base;
1352   tree callee;
1353
1354   /* If the call is pure or const it cannot clobber anything.  */
1355   if (gimple_call_flags (call)
1356       & (ECF_PURE|ECF_CONST|ECF_LOOPING_CONST_OR_PURE|ECF_NOVOPS))
1357     return false;
1358
1359   base = ao_ref_base (ref);
1360   if (!base)
1361     return true;
1362
1363   if (TREE_CODE (base) == SSA_NAME
1364       || CONSTANT_CLASS_P (base))
1365     return false;
1366
1367   /* If the reference is based on a decl that is not aliased the call
1368      cannot possibly clobber it.  */
1369   if (DECL_P (base)
1370       && !may_be_aliased (base)
1371       /* But local non-readonly statics can be modified through recursion
1372          or the call may implement a threading barrier which we must
1373          treat as may-def.  */
1374       && (TREE_READONLY (base)
1375           || !is_global_var (base)))
1376     return false;
1377
1378   callee = gimple_call_fndecl (call);
1379
1380   /* Handle those builtin functions explicitly that do not act as
1381      escape points.  See tree-ssa-structalias.c:find_func_aliases
1382      for the list of builtins we might need to handle here.  */
1383   if (callee != NULL_TREE
1384       && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
1385     switch (DECL_FUNCTION_CODE (callee))
1386       {
1387         /* All the following functions clobber memory pointed to by
1388            their first argument.  */
1389         case BUILT_IN_STRCPY:
1390         case BUILT_IN_STRNCPY:
1391         case BUILT_IN_MEMCPY:
1392         case BUILT_IN_MEMMOVE:
1393         case BUILT_IN_MEMPCPY:
1394         case BUILT_IN_STPCPY:
1395         case BUILT_IN_STPNCPY:
1396         case BUILT_IN_STRCAT:
1397         case BUILT_IN_STRNCAT:
1398         case BUILT_IN_MEMSET:
1399           {
1400             ao_ref dref;
1401             tree size = NULL_TREE;
1402             if (gimple_call_num_args (call) == 3)
1403               size = gimple_call_arg (call, 2);
1404             ao_ref_init_from_ptr_and_size (&dref,
1405                                            gimple_call_arg (call, 0),
1406                                            size);
1407             return refs_may_alias_p_1 (&dref, ref, false);
1408           }
1409         case BUILT_IN_BCOPY:
1410           {
1411             ao_ref dref;
1412             tree size = gimple_call_arg (call, 2);
1413             ao_ref_init_from_ptr_and_size (&dref,
1414                                            gimple_call_arg (call, 1),
1415                                            size);
1416             return refs_may_alias_p_1 (&dref, ref, false);
1417           }
1418         /* Allocating memory does not have any side-effects apart from
1419            being the definition point for the pointer.  */
1420         case BUILT_IN_MALLOC:
1421         case BUILT_IN_CALLOC:
1422           /* Unix98 specifies that errno is set on allocation failure.  */
1423           if (flag_errno_math
1424               && targetm.ref_may_alias_errno (ref))
1425             return true;
1426           return false;
1427         /* Freeing memory kills the pointed-to memory.  More importantly
1428            the call has to serve as a barrier for moving loads and stores
1429            across it.  */
1430         case BUILT_IN_FREE:
1431           {
1432             tree ptr = gimple_call_arg (call, 0);
1433             return ptr_deref_may_alias_ref_p_1 (ptr, ref);
1434           }
1435         case BUILT_IN_GAMMA_R:
1436         case BUILT_IN_GAMMAF_R:
1437         case BUILT_IN_GAMMAL_R:
1438         case BUILT_IN_LGAMMA_R:
1439         case BUILT_IN_LGAMMAF_R:
1440         case BUILT_IN_LGAMMAL_R:
1441           {
1442             tree out = gimple_call_arg (call, 1);
1443             if (ptr_deref_may_alias_ref_p_1 (out, ref))
1444               return true;
1445             if (flag_errno_math)
1446               break;
1447             return false;
1448           }
1449         case BUILT_IN_FREXP:
1450         case BUILT_IN_FREXPF:
1451         case BUILT_IN_FREXPL:
1452         case BUILT_IN_MODF:
1453         case BUILT_IN_MODFF:
1454         case BUILT_IN_MODFL:
1455           {
1456             tree out = gimple_call_arg (call, 1);
1457             return ptr_deref_may_alias_ref_p_1 (out, ref);
1458           }
1459         case BUILT_IN_REMQUO:
1460         case BUILT_IN_REMQUOF:
1461         case BUILT_IN_REMQUOL:
1462           {
1463             tree out = gimple_call_arg (call, 2);
1464             if (ptr_deref_may_alias_ref_p_1 (out, ref))
1465               return true;
1466             if (flag_errno_math)
1467               break;
1468             return false;
1469           }
1470         case BUILT_IN_SINCOS:
1471         case BUILT_IN_SINCOSF:
1472         case BUILT_IN_SINCOSL:
1473           {
1474             tree sin = gimple_call_arg (call, 1);
1475             tree cos = gimple_call_arg (call, 2);
1476             return (ptr_deref_may_alias_ref_p_1 (sin, ref)
1477                     || ptr_deref_may_alias_ref_p_1 (cos, ref));
1478           }
1479         /* __sync_* builtins and some OpenMP builtins act as threading
1480            barriers.  */
1481 #undef DEF_SYNC_BUILTIN
1482 #define DEF_SYNC_BUILTIN(ENUM, NAME, TYPE, ATTRS) case ENUM:
1483 #include "sync-builtins.def"
1484 #undef DEF_SYNC_BUILTIN
1485         case BUILT_IN_GOMP_ATOMIC_START:
1486         case BUILT_IN_GOMP_ATOMIC_END:
1487         case BUILT_IN_GOMP_BARRIER:
1488         case BUILT_IN_GOMP_TASKWAIT:
1489         case BUILT_IN_GOMP_CRITICAL_START:
1490         case BUILT_IN_GOMP_CRITICAL_END:
1491         case BUILT_IN_GOMP_CRITICAL_NAME_START:
1492         case BUILT_IN_GOMP_CRITICAL_NAME_END:
1493         case BUILT_IN_GOMP_LOOP_END:
1494         case BUILT_IN_GOMP_ORDERED_START:
1495         case BUILT_IN_GOMP_ORDERED_END:
1496         case BUILT_IN_GOMP_PARALLEL_END:
1497         case BUILT_IN_GOMP_SECTIONS_END:
1498         case BUILT_IN_GOMP_SINGLE_COPY_START:
1499         case BUILT_IN_GOMP_SINGLE_COPY_END:
1500           return true;
1501         default:
1502           /* Fallthru to general call handling.  */;
1503       }
1504
1505   /* Check if base is a global static variable that is not written
1506      by the function.  */
1507   if (callee != NULL_TREE
1508       && TREE_CODE (base) == VAR_DECL
1509       && TREE_STATIC (base))
1510     {
1511       bitmap not_written;
1512
1513       if ((not_written
1514              = ipa_reference_get_not_written_global (cgraph_node (callee)))
1515           && bitmap_bit_p (not_written, DECL_UID (base)))
1516         return false;
1517     }
1518
1519   /* Check if the base variable is call-clobbered.  */
1520   if (DECL_P (base))
1521     return pt_solution_includes (gimple_call_clobber_set (call), base);
1522   else if ((INDIRECT_REF_P (base)
1523             || TREE_CODE (base) == MEM_REF)
1524            && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
1525     {
1526       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
1527       if (!pi)
1528         return true;
1529
1530       return pt_solutions_intersect (gimple_call_clobber_set (call), &pi->pt);
1531     }
1532
1533   return true;
1534 }
1535
1536 /* If the call in statement CALL may clobber the memory reference REF
1537    return true, otherwise return false.  */
1538
1539 bool
1540 call_may_clobber_ref_p (gimple call, tree ref)
1541 {
1542   bool res;
1543   ao_ref r;
1544   ao_ref_init (&r, ref);
1545   res = call_may_clobber_ref_p_1 (call, &r);
1546   if (res)
1547     ++alias_stats.call_may_clobber_ref_p_may_alias;
1548   else
1549     ++alias_stats.call_may_clobber_ref_p_no_alias;
1550   return res;
1551 }
1552
1553
1554 /* If the statement STMT may clobber the memory reference REF return true,
1555    otherwise return false.  */
1556
1557 bool
1558 stmt_may_clobber_ref_p_1 (gimple stmt, ao_ref *ref)
1559 {
1560   if (is_gimple_call (stmt))
1561     {
1562       tree lhs = gimple_call_lhs (stmt);
1563       if (lhs
1564           && TREE_CODE (lhs) != SSA_NAME)
1565         {
1566           ao_ref r;
1567           ao_ref_init (&r, lhs);
1568           if (refs_may_alias_p_1 (ref, &r, true))
1569             return true;
1570         }
1571
1572       return call_may_clobber_ref_p_1 (stmt, ref);
1573     }
1574   else if (gimple_assign_single_p (stmt))
1575     {
1576       tree lhs = gimple_assign_lhs (stmt);
1577       if (TREE_CODE (lhs) != SSA_NAME)
1578         {
1579           ao_ref r;
1580           ao_ref_init (&r, lhs);
1581           return refs_may_alias_p_1 (ref, &r, true);
1582         }
1583     }
1584   else if (gimple_code (stmt) == GIMPLE_ASM)
1585     return true;
1586
1587   return false;
1588 }
1589
1590 bool
1591 stmt_may_clobber_ref_p (gimple stmt, tree ref)
1592 {
1593   ao_ref r;
1594   ao_ref_init (&r, ref);
1595   return stmt_may_clobber_ref_p_1 (stmt, &r);
1596 }
1597
1598 /* If STMT kills the memory reference REF return true, otherwise
1599    return false.  */
1600
1601 static bool
1602 stmt_kills_ref_p_1 (gimple stmt, ao_ref *ref)
1603 {
1604   if (gimple_has_lhs (stmt)
1605       && TREE_CODE (gimple_get_lhs (stmt)) != SSA_NAME)
1606     {
1607       tree base, lhs = gimple_get_lhs (stmt);
1608       HOST_WIDE_INT size, offset, max_size;
1609       ao_ref_base (ref);
1610       base = get_ref_base_and_extent (lhs, &offset, &size, &max_size);
1611       /* We can get MEM[symbol: sZ, index: D.8862_1] here,
1612          so base == ref->base does not always hold.  */
1613       if (base == ref->base)
1614         {
1615           /* For a must-alias check we need to be able to constrain
1616              the accesses properly.  */
1617           if (size != -1 && size == max_size
1618               && ref->max_size != -1)
1619             {
1620               if (offset <= ref->offset
1621                   && offset + size >= ref->offset + ref->max_size)
1622                 return true;
1623             }
1624         }
1625     }
1626   return false;
1627 }
1628
1629 bool
1630 stmt_kills_ref_p (gimple stmt, tree ref)
1631 {
1632   ao_ref r;
1633   ao_ref_init (&r, ref);
1634   return stmt_kills_ref_p_1 (stmt, &r);
1635 }
1636
1637
1638 /* Walk the virtual use-def chain of VUSE until hitting the virtual operand
1639    TARGET or a statement clobbering the memory reference REF in which
1640    case false is returned.  The walk starts with VUSE, one argument of PHI.  */
1641
1642 static bool
1643 maybe_skip_until (gimple phi, tree target, ao_ref *ref,
1644                   tree vuse, bitmap *visited)
1645 {
1646   if (!*visited)
1647     *visited = BITMAP_ALLOC (NULL);
1648
1649   bitmap_set_bit (*visited, SSA_NAME_VERSION (PHI_RESULT (phi)));
1650
1651   /* Walk until we hit the target.  */
1652   while (vuse != target)
1653     {
1654       gimple def_stmt = SSA_NAME_DEF_STMT (vuse);
1655       /* Recurse for PHI nodes.  */
1656       if (gimple_code (def_stmt) == GIMPLE_PHI)
1657         {
1658           /* An already visited PHI node ends the walk successfully.  */
1659           if (bitmap_bit_p (*visited, SSA_NAME_VERSION (PHI_RESULT (def_stmt))))
1660             return true;
1661           vuse = get_continuation_for_phi (def_stmt, ref, visited);
1662           if (!vuse)
1663             return false;
1664           continue;
1665         }
1666       /* A clobbering statement or the end of the IL ends it failing.  */
1667       else if (gimple_nop_p (def_stmt)
1668                || stmt_may_clobber_ref_p_1 (def_stmt, ref))
1669         return false;
1670       vuse = gimple_vuse (def_stmt);
1671     }
1672   return true;
1673 }
1674
1675 /* Starting from a PHI node for the virtual operand of the memory reference
1676    REF find a continuation virtual operand that allows to continue walking
1677    statements dominating PHI skipping only statements that cannot possibly
1678    clobber REF.  Returns NULL_TREE if no suitable virtual operand can
1679    be found.  */
1680
1681 tree
1682 get_continuation_for_phi (gimple phi, ao_ref *ref, bitmap *visited)
1683 {
1684   unsigned nargs = gimple_phi_num_args (phi);
1685
1686   /* Through a single-argument PHI we can simply look through.  */
1687   if (nargs == 1)
1688     return PHI_ARG_DEF (phi, 0);
1689
1690   /* For two arguments try to skip non-aliasing code until we hit
1691      the phi argument definition that dominates the other one.  */
1692   if (nargs == 2)
1693     {
1694       tree arg0 = PHI_ARG_DEF (phi, 0);
1695       tree arg1 = PHI_ARG_DEF (phi, 1);
1696       gimple def0 = SSA_NAME_DEF_STMT (arg0);
1697       gimple def1 = SSA_NAME_DEF_STMT (arg1);
1698       tree common_vuse;
1699
1700       if (arg0 == arg1)
1701         return arg0;
1702       else if (gimple_nop_p (def0)
1703                || (!gimple_nop_p (def1)
1704                    && dominated_by_p (CDI_DOMINATORS,
1705                                       gimple_bb (def1), gimple_bb (def0))))
1706         {
1707           if (maybe_skip_until (phi, arg0, ref, arg1, visited))
1708             return arg0;
1709         }
1710       else if (gimple_nop_p (def1)
1711                || dominated_by_p (CDI_DOMINATORS,
1712                                   gimple_bb (def0), gimple_bb (def1)))
1713         {
1714           if (maybe_skip_until (phi, arg1, ref, arg0, visited))
1715             return arg1;
1716         }
1717       /* Special case of a diamond:
1718            MEM_1 = ...
1719            goto (cond) ? L1 : L2
1720            L1: store1 = ...    #MEM_2 = vuse(MEM_1)
1721                goto L3
1722            L2: store2 = ...    #MEM_3 = vuse(MEM_1)
1723            L3: MEM_4 = PHI<MEM_2, MEM_3>
1724          We were called with the PHI at L3, MEM_2 and MEM_3 don't
1725          dominate each other, but still we can easily skip this PHI node
1726          if we recognize that the vuse MEM operand is the same for both,
1727          and that we can skip both statements (they don't clobber us).
1728          This is still linear.  Don't use maybe_skip_until, that might
1729          potentially be slow.  */
1730       else if ((common_vuse = gimple_vuse (def0))
1731                && common_vuse == gimple_vuse (def1))
1732         {
1733           if (!stmt_may_clobber_ref_p_1 (def0, ref)
1734               && !stmt_may_clobber_ref_p_1 (def1, ref))
1735             return common_vuse;
1736         }
1737     }
1738
1739   return NULL_TREE;
1740 }
1741
1742 /* Based on the memory reference REF and its virtual use VUSE call
1743    WALKER for each virtual use that is equivalent to VUSE, including VUSE
1744    itself.  That is, for each virtual use for which its defining statement
1745    does not clobber REF.
1746
1747    WALKER is called with REF, the current virtual use and DATA.  If
1748    WALKER returns non-NULL the walk stops and its result is returned.
1749    At the end of a non-successful walk NULL is returned.
1750
1751    TRANSLATE if non-NULL is called with a pointer to REF, the virtual
1752    use which definition is a statement that may clobber REF and DATA.
1753    If TRANSLATE returns (void *)-1 the walk stops and NULL is returned.
1754    If TRANSLATE returns non-NULL the walk stops and its result is returned.
1755    If TRANSLATE returns NULL the walk continues and TRANSLATE is supposed
1756    to adjust REF and *DATA to make that valid.
1757
1758    TODO: Cache the vector of equivalent vuses per ref, vuse pair.  */
1759
1760 void *
1761 walk_non_aliased_vuses (ao_ref *ref, tree vuse,
1762                         void *(*walker)(ao_ref *, tree, void *),
1763                         void *(*translate)(ao_ref *, tree, void *), void *data)
1764 {
1765   bitmap visited = NULL;
1766   void *res;
1767
1768   timevar_push (TV_ALIAS_STMT_WALK);
1769
1770   do
1771     {
1772       gimple def_stmt;
1773
1774       /* ???  Do we want to account this to TV_ALIAS_STMT_WALK?  */
1775       res = (*walker) (ref, vuse, data);
1776       if (res)
1777         break;
1778
1779       def_stmt = SSA_NAME_DEF_STMT (vuse);
1780       if (gimple_nop_p (def_stmt))
1781         break;
1782       else if (gimple_code (def_stmt) == GIMPLE_PHI)
1783         vuse = get_continuation_for_phi (def_stmt, ref, &visited);
1784       else
1785         {
1786           if (stmt_may_clobber_ref_p_1 (def_stmt, ref))
1787             {
1788               if (!translate)
1789                 break;
1790               res = (*translate) (ref, vuse, data);
1791               /* Failed lookup and translation.  */
1792               if (res == (void *)-1)
1793                 {
1794                   res = NULL;
1795                   break;
1796                 }
1797               /* Lookup succeeded.  */
1798               else if (res != NULL)
1799                 break;
1800               /* Translation succeeded, continue walking.  */
1801             }
1802           vuse = gimple_vuse (def_stmt);
1803         }
1804     }
1805   while (vuse);
1806
1807   if (visited)
1808     BITMAP_FREE (visited);
1809
1810   timevar_pop (TV_ALIAS_STMT_WALK);
1811
1812   return res;
1813 }
1814
1815
1816 /* Based on the memory reference REF call WALKER for each vdef which
1817    defining statement may clobber REF, starting with VDEF.  If REF
1818    is NULL_TREE, each defining statement is visited.
1819
1820    WALKER is called with REF, the current vdef and DATA.  If WALKER
1821    returns true the walk is stopped, otherwise it continues.
1822
1823    At PHI nodes walk_aliased_vdefs forks into one walk for reach
1824    PHI argument (but only one walk continues on merge points), the
1825    return value is true if any of the walks was successful.
1826
1827    The function returns the number of statements walked.  */
1828
1829 static unsigned int
1830 walk_aliased_vdefs_1 (ao_ref *ref, tree vdef,
1831                       bool (*walker)(ao_ref *, tree, void *), void *data,
1832                       bitmap *visited, unsigned int cnt)
1833 {
1834   do
1835     {
1836       gimple def_stmt = SSA_NAME_DEF_STMT (vdef);
1837
1838       if (*visited
1839           && !bitmap_set_bit (*visited, SSA_NAME_VERSION (vdef)))
1840         return cnt;
1841
1842       if (gimple_nop_p (def_stmt))
1843         return cnt;
1844       else if (gimple_code (def_stmt) == GIMPLE_PHI)
1845         {
1846           unsigned i;
1847           if (!*visited)
1848             *visited = BITMAP_ALLOC (NULL);
1849           for (i = 0; i < gimple_phi_num_args (def_stmt); ++i)
1850             cnt += walk_aliased_vdefs_1 (ref, gimple_phi_arg_def (def_stmt, i),
1851                                          walker, data, visited, 0);
1852           return cnt;
1853         }
1854
1855       /* ???  Do we want to account this to TV_ALIAS_STMT_WALK?  */
1856       cnt++;
1857       if ((!ref
1858            || stmt_may_clobber_ref_p_1 (def_stmt, ref))
1859           && (*walker) (ref, vdef, data))
1860         return cnt;
1861
1862       vdef = gimple_vuse (def_stmt);
1863     }
1864   while (1);
1865 }
1866
1867 unsigned int
1868 walk_aliased_vdefs (ao_ref *ref, tree vdef,
1869                     bool (*walker)(ao_ref *, tree, void *), void *data,
1870                     bitmap *visited)
1871 {
1872   bitmap local_visited = NULL;
1873   unsigned int ret;
1874
1875   timevar_push (TV_ALIAS_STMT_WALK);
1876
1877   ret = walk_aliased_vdefs_1 (ref, vdef, walker, data,
1878                               visited ? visited : &local_visited, 0);
1879   if (local_visited)
1880     BITMAP_FREE (local_visited);
1881
1882   timevar_pop (TV_ALIAS_STMT_WALK);
1883
1884   return ret;
1885 }
1886