OSDN Git Service

Squash commit of EH in gimple
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-alias.c
1 /* Alias analysis for trees.
2    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
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 "rtl.h"
28 #include "tm_p.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "timevar.h"
32 #include "expr.h"
33 #include "ggc.h"
34 #include "langhooks.h"
35 #include "flags.h"
36 #include "function.h"
37 #include "diagnostic.h"
38 #include "tree-dump.h"
39 #include "gimple.h"
40 #include "tree-flow.h"
41 #include "tree-inline.h"
42 #include "tree-pass.h"
43 #include "convert.h"
44 #include "params.h"
45 #include "ipa-type-escape.h"
46 #include "vec.h"
47 #include "bitmap.h"
48 #include "vecprim.h"
49 #include "pointer-set.h"
50 #include "alloc-pool.h"
51 #include "tree-ssa-alias.h"
52
53 /* Broad overview of how alias analysis on gimple works:
54
55    Statements clobbering or using memory are linked through the
56    virtual operand factored use-def chain.  The virtual operand
57    is unique per function, its symbol is accessible via gimple_vop (cfun).
58    Virtual operands are used for efficiently walking memory statements
59    in the gimple IL and are useful for things like value-numbering as
60    a generation count for memory references.
61
62    SSA_NAME pointers may have associated points-to information
63    accessible via the SSA_NAME_PTR_INFO macro.  Flow-insensitive
64    points-to information is (re-)computed by the TODO_rebuild_alias
65    pass manager todo.  Points-to information is also used for more
66    precise tracking of call-clobbered and call-used variables and
67    related disambiguations.
68
69    This file contains functions for disambiguating memory references,
70    the so called alias-oracle and tools for walking of the gimple IL.
71
72    The main alias-oracle entry-points are
73
74    bool stmt_may_clobber_ref_p (gimple, tree)
75
76      This function queries if a statement may invalidate (parts of)
77      the memory designated by the reference tree argument.
78
79    bool ref_maybe_used_by_stmt_p (gimple, tree)
80
81      This function queries if a statement may need (parts of) the
82      memory designated by the reference tree argument.
83
84    There are variants of these functions that only handle the call
85    part of a statement, call_may_clobber_ref_p and ref_maybe_used_by_call_p.
86    Note that these do not disambiguate against a possible call lhs.
87
88    bool refs_may_alias_p (tree, tree)
89
90      This function tries to disambiguate two reference trees.
91
92    bool ptr_deref_may_alias_global_p (tree)
93
94      This function queries if dereferencing a pointer variable may
95      alias global memory.
96
97    More low-level disambiguators are available and documented in
98    this file.  Low-level disambiguators dealing with points-to
99    information are in tree-ssa-structalias.c.  */
100
101
102 /* Query statistics for the different low-level disambiguators.
103    A high-level query may trigger multiple of them.  */
104
105 static struct {
106   unsigned HOST_WIDE_INT refs_may_alias_p_may_alias;
107   unsigned HOST_WIDE_INT refs_may_alias_p_no_alias;
108   unsigned HOST_WIDE_INT ref_maybe_used_by_call_p_may_alias;
109   unsigned HOST_WIDE_INT ref_maybe_used_by_call_p_no_alias;
110   unsigned HOST_WIDE_INT call_may_clobber_ref_p_may_alias;
111   unsigned HOST_WIDE_INT call_may_clobber_ref_p_no_alias;
112 } alias_stats;
113
114 void
115 dump_alias_stats (FILE *s)
116 {
117   fprintf (s, "\nAlias oracle query stats:\n");
118   fprintf (s, "  refs_may_alias_p: "
119            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
120            HOST_WIDE_INT_PRINT_DEC" queries\n",
121            alias_stats.refs_may_alias_p_no_alias,
122            alias_stats.refs_may_alias_p_no_alias
123            + alias_stats.refs_may_alias_p_may_alias);
124   fprintf (s, "  ref_maybe_used_by_call_p: "
125            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
126            HOST_WIDE_INT_PRINT_DEC" queries\n",
127            alias_stats.ref_maybe_used_by_call_p_no_alias,
128            alias_stats.refs_may_alias_p_no_alias
129            + alias_stats.ref_maybe_used_by_call_p_may_alias);
130   fprintf (s, "  call_may_clobber_ref_p: "
131            HOST_WIDE_INT_PRINT_DEC" disambiguations, "
132            HOST_WIDE_INT_PRINT_DEC" queries\n",
133            alias_stats.call_may_clobber_ref_p_no_alias,
134            alias_stats.call_may_clobber_ref_p_no_alias
135            + alias_stats.call_may_clobber_ref_p_may_alias);
136 }
137
138
139 /* Return true, if dereferencing PTR may alias with a global variable.  */
140
141 bool
142 ptr_deref_may_alias_global_p (tree ptr)
143 {
144   struct ptr_info_def *pi;
145
146   /* If we end up with a pointer constant here that may point
147      to global memory.  */
148   if (TREE_CODE (ptr) != SSA_NAME)
149     return true;
150
151   pi = SSA_NAME_PTR_INFO (ptr);
152
153   /* If we do not have points-to information for this variable,
154      we have to punt.  */
155   if (!pi)
156     return true;
157
158   /* ???  This does not use TBAA to prune globals ptr may not access.  */
159   return pt_solution_includes_global (&pi->pt);
160 }
161
162 /* Return true if dereferencing PTR may alias DECL.
163    The caller is responsible for applying TBAA to see if PTR
164    may access DECL at all.  */
165
166 static bool
167 ptr_deref_may_alias_decl_p (tree ptr, tree decl)
168 {
169   struct ptr_info_def *pi;
170
171   gcc_assert ((TREE_CODE (ptr) == SSA_NAME
172                || TREE_CODE (ptr) == ADDR_EXPR
173                || TREE_CODE (ptr) == INTEGER_CST)
174               && (TREE_CODE (decl) == VAR_DECL
175                   || TREE_CODE (decl) == PARM_DECL
176                   || TREE_CODE (decl) == RESULT_DECL));
177
178   /* Non-aliased variables can not be pointed to.  */
179   if (!may_be_aliased (decl))
180     return false;
181
182   /* ADDR_EXPR pointers either just offset another pointer or directly
183      specify the pointed-to set.  */
184   if (TREE_CODE (ptr) == ADDR_EXPR)
185     {
186       tree base = get_base_address (TREE_OPERAND (ptr, 0));
187       if (base
188           && INDIRECT_REF_P (base))
189         ptr = TREE_OPERAND (base, 0);
190       else if (base
191                && SSA_VAR_P (base))
192         return operand_equal_p (base, decl, 0);
193       else if (base
194                && CONSTANT_CLASS_P (base))
195         return false;
196       else
197         return true;
198     }
199
200   /* We can end up with dereferencing constant pointers.
201      Just bail out in this case.  */
202   if (TREE_CODE (ptr) == INTEGER_CST)
203     return true;
204
205   /* If we do not have useful points-to information for this pointer
206      we cannot disambiguate anything else.  */
207   pi = SSA_NAME_PTR_INFO (ptr);
208   if (!pi)
209     return true;
210
211   return pt_solution_includes (&pi->pt, decl);
212 }
213
214 /* Return true if dereferenced PTR1 and PTR2 may alias.
215    The caller is responsible for applying TBAA to see if accesses
216    through PTR1 and PTR2 may conflict at all.  */
217
218 static bool
219 ptr_derefs_may_alias_p (tree ptr1, tree ptr2)
220 {
221   struct ptr_info_def *pi1, *pi2;
222
223   gcc_assert ((TREE_CODE (ptr1) == SSA_NAME
224                || TREE_CODE (ptr1) == ADDR_EXPR
225                || TREE_CODE (ptr1) == INTEGER_CST)
226               && (TREE_CODE (ptr2) == SSA_NAME
227                   || TREE_CODE (ptr2) == ADDR_EXPR
228                   || TREE_CODE (ptr2) == INTEGER_CST));
229
230   /* ADDR_EXPR pointers either just offset another pointer or directly
231      specify the pointed-to set.  */
232   if (TREE_CODE (ptr1) == ADDR_EXPR)
233     {
234       tree base = get_base_address (TREE_OPERAND (ptr1, 0));
235       if (base
236           && INDIRECT_REF_P (base))
237         ptr1 = TREE_OPERAND (base, 0);
238       else if (base
239                && SSA_VAR_P (base))
240         return ptr_deref_may_alias_decl_p (ptr2, base);
241       else
242         return true;
243     }
244   if (TREE_CODE (ptr2) == ADDR_EXPR)
245     {
246       tree base = get_base_address (TREE_OPERAND (ptr2, 0));
247       if (base
248           && INDIRECT_REF_P (base))
249         ptr2 = TREE_OPERAND (base, 0);
250       else if (base
251                && SSA_VAR_P (base))
252         return ptr_deref_may_alias_decl_p (ptr1, base);
253       else
254         return true;
255     }
256
257   /* We can end up with dereferencing constant pointers.
258      Just bail out in this case.  */
259   if (TREE_CODE (ptr1) == INTEGER_CST
260       || TREE_CODE (ptr2) == INTEGER_CST)
261     return true;
262
263   /* We may end up with two empty points-to solutions for two same pointers.
264      In this case we still want to say both pointers alias, so shortcut
265      that here.  */
266   if (ptr1 == ptr2)
267     return true;
268
269   /* If we do not have useful points-to information for either pointer
270      we cannot disambiguate anything else.  */
271   pi1 = SSA_NAME_PTR_INFO (ptr1);
272   pi2 = SSA_NAME_PTR_INFO (ptr2);
273   if (!pi1 || !pi2)
274     return true;
275
276   /* If both pointers are restrict-qualified try to disambiguate
277      with restrict information.  */
278   if (TYPE_RESTRICT (TREE_TYPE (ptr1))
279       && TYPE_RESTRICT (TREE_TYPE (ptr2))
280       && !pt_solutions_same_restrict_base (&pi1->pt, &pi2->pt))
281     return false;
282
283   /* ???  This does not use TBAA to prune decls from the intersection
284      that not both pointers may access.  */
285   return pt_solutions_intersect (&pi1->pt, &pi2->pt);
286 }
287
288 /* Return true if dereferencing PTR may alias *REF.
289    The caller is responsible for applying TBAA to see if PTR
290    may access *REF at all.  */
291
292 static bool
293 ptr_deref_may_alias_ref_p_1 (tree ptr, ao_ref *ref)
294 {
295   tree base = ao_ref_base (ref);
296
297   if (INDIRECT_REF_P (base))
298     return ptr_derefs_may_alias_p (ptr, TREE_OPERAND (base, 0));
299   else if (SSA_VAR_P (base))
300     return ptr_deref_may_alias_decl_p (ptr, base);
301
302   return true;
303 }
304
305
306 /* Dump alias information on FILE.  */
307
308 void
309 dump_alias_info (FILE *file)
310 {
311   size_t i;
312   const char *funcname
313     = lang_hooks.decl_printable_name (current_function_decl, 2);
314   referenced_var_iterator rvi;
315   tree var;
316
317   fprintf (file, "\n\nAlias information for %s\n\n", funcname);
318
319   fprintf (file, "Aliased symbols\n\n");
320   
321   FOR_EACH_REFERENCED_VAR (var, rvi)
322     {
323       if (may_be_aliased (var))
324         dump_variable (file, var);
325     }
326
327   fprintf (file, "\nCall clobber information\n");
328
329   fprintf (file, "\nESCAPED");
330   dump_points_to_solution (file, &cfun->gimple_df->escaped);
331   fprintf (file, "\nCALLUSED");
332   dump_points_to_solution (file, &cfun->gimple_df->callused);
333
334   fprintf (file, "\n\nFlow-insensitive points-to information\n\n");
335
336   for (i = 1; i < num_ssa_names; i++)
337     {
338       tree ptr = ssa_name (i);
339       struct ptr_info_def *pi;
340       
341       if (ptr == NULL_TREE
342           || SSA_NAME_IN_FREE_LIST (ptr))
343         continue;
344
345       pi = SSA_NAME_PTR_INFO (ptr);
346       if (pi)
347         dump_points_to_info_for (file, ptr);
348     }
349
350   fprintf (file, "\n");
351 }
352
353
354 /* Dump alias information on stderr.  */
355
356 void
357 debug_alias_info (void)
358 {
359   dump_alias_info (stderr);
360 }
361
362
363 /* Return the alias information associated with pointer T.  It creates a
364    new instance if none existed.  */
365
366 struct ptr_info_def *
367 get_ptr_info (tree t)
368 {
369   struct ptr_info_def *pi;
370
371   gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
372
373   pi = SSA_NAME_PTR_INFO (t);
374   if (pi == NULL)
375     {
376       pi = GGC_CNEW (struct ptr_info_def);
377       pt_solution_reset (&pi->pt);
378       SSA_NAME_PTR_INFO (t) = pi;
379     }
380
381   return pi;
382 }
383
384 /* Dump the points-to set *PT into FILE.  */
385
386 void
387 dump_points_to_solution (FILE *file, struct pt_solution *pt)
388 {
389   if (pt->anything)
390     fprintf (file, ", points-to anything");
391
392   if (pt->nonlocal)
393     fprintf (file, ", points-to non-local");
394
395   if (pt->escaped)
396     fprintf (file, ", points-to escaped");
397
398   if (pt->null)
399     fprintf (file, ", points-to NULL");
400
401   if (pt->vars)
402     {
403       fprintf (file, ", points-to vars: ");
404       dump_decl_set (file, pt->vars);
405       if (pt->vars_contains_global)
406         fprintf (file, " (includes global vars)");
407     }
408 }
409
410 /* Dump points-to information for SSA_NAME PTR into FILE.  */
411
412 void
413 dump_points_to_info_for (FILE *file, tree ptr)
414 {
415   struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
416
417   print_generic_expr (file, ptr, dump_flags);
418
419   if (pi)
420     dump_points_to_solution (file, &pi->pt);
421   else
422     fprintf (file, ", points-to anything");
423
424   fprintf (file, "\n");
425 }
426
427
428 /* Dump points-to information for VAR into stderr.  */
429
430 void
431 debug_points_to_info_for (tree var)
432 {
433   dump_points_to_info_for (stderr, var);
434 }
435
436
437 /* Initializes the alias-oracle reference representation *R from REF.  */
438
439 void
440 ao_ref_init (ao_ref *r, tree ref)
441 {
442   r->ref = ref;
443   r->base = NULL_TREE;
444   r->offset = 0;
445   r->size = -1;
446   r->max_size = -1;
447   r->ref_alias_set = -1;
448   r->base_alias_set = -1;
449 }
450
451 /* Returns the base object of the memory reference *REF.  */
452
453 tree
454 ao_ref_base (ao_ref *ref)
455 {
456   if (ref->base)
457     return ref->base;
458   ref->base = get_ref_base_and_extent (ref->ref, &ref->offset, &ref->size,
459                                        &ref->max_size);
460   return ref->base;
461 }
462
463 /* Returns the base object alias set of the memory reference *REF.  */
464
465 static alias_set_type ATTRIBUTE_UNUSED
466 ao_ref_base_alias_set (ao_ref *ref)
467 {
468   if (ref->base_alias_set != -1)
469     return ref->base_alias_set;
470   ref->base_alias_set = get_alias_set (ao_ref_base (ref));
471   return ref->base_alias_set;
472 }
473
474 /* Returns the reference alias set of the memory reference *REF.  */
475
476 alias_set_type
477 ao_ref_alias_set (ao_ref *ref)
478 {
479   if (ref->ref_alias_set != -1)
480     return ref->ref_alias_set;
481   ref->ref_alias_set = get_alias_set (ref->ref);
482   return ref->ref_alias_set;
483 }
484
485 /* Init an alias-oracle reference representation from a gimple pointer
486    PTR and a gimple size SIZE in bytes.  If SIZE is NULL_TREE the the
487    size is assumed to be unknown.  The access is assumed to be only
488    to or after of the pointer target, not before it.  */
489
490 void
491 ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size)
492 {
493   HOST_WIDE_INT t1, t2;
494   ref->ref = NULL_TREE;
495   if (TREE_CODE (ptr) == ADDR_EXPR)
496     ref->base = get_ref_base_and_extent (TREE_OPERAND (ptr, 0),
497                                          &ref->offset, &t1, &t2);
498   else
499     {
500       ref->base = build1 (INDIRECT_REF, char_type_node, ptr);
501       ref->offset = 0;
502     }
503   if (size
504       && host_integerp (size, 0)
505       && TREE_INT_CST_LOW (size) * 8 / 8 == TREE_INT_CST_LOW (size))
506     ref->max_size = ref->size = TREE_INT_CST_LOW (size) * 8;
507   else
508     ref->max_size = ref->size = -1;
509   ref->ref_alias_set = 0;
510   ref->base_alias_set = 0;
511 }
512
513 /* Return 1 if TYPE1 and TYPE2 are to be considered equivalent for the
514    purpose of TBAA.  Return 0 if they are distinct and -1 if we cannot
515    decide.  */
516
517 static inline int
518 same_type_for_tbaa (tree type1, tree type2)
519 {
520   type1 = TYPE_MAIN_VARIANT (type1);
521   type2 = TYPE_MAIN_VARIANT (type2);
522
523   /* If we would have to do structural comparison bail out.  */
524   if (TYPE_STRUCTURAL_EQUALITY_P (type1)
525       || TYPE_STRUCTURAL_EQUALITY_P (type2))
526     return -1;
527
528   /* Compare the canonical types.  */
529   if (TYPE_CANONICAL (type1) == TYPE_CANONICAL (type2))
530     return 1;
531
532   /* ???  Array types are not properly unified in all cases as we have
533      spurious changes in the index types for example.  Removing this
534      causes all sorts of problems with the Fortran frontend.  */
535   if (TREE_CODE (type1) == ARRAY_TYPE
536       && TREE_CODE (type2) == ARRAY_TYPE)
537     return -1;
538
539   /* The types are known to be not equal.  */
540   return 0;
541 }
542
543 /* Determine if the two component references REF1 and REF2 which are
544    based on access types TYPE1 and TYPE2 and of which at least one is based
545    on an indirect reference may alias.  */
546
547 static bool
548 nonaliasing_component_refs_p (tree ref1, tree type1,
549                               HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
550                               tree ref2, tree type2,
551                               HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2)
552 {
553   /* If one reference is a component references through pointers try to find a
554      common base and apply offset based disambiguation.  This handles
555      for example
556        struct A { int i; int j; } *q;
557        struct B { struct A a; int k; } *p;
558      disambiguating q->i and p->a.j.  */
559   tree *refp;
560   int same_p;
561
562   /* Now search for the type1 in the access path of ref2.  This
563      would be a common base for doing offset based disambiguation on.  */
564   refp = &ref2;
565   while (handled_component_p (*refp)
566          && same_type_for_tbaa (TREE_TYPE (*refp), type1) == 0)
567     refp = &TREE_OPERAND (*refp, 0);
568   same_p = same_type_for_tbaa (TREE_TYPE (*refp), type1);
569   /* If we couldn't compare types we have to bail out.  */
570   if (same_p == -1)
571     return true;
572   else if (same_p == 1)
573     {
574       HOST_WIDE_INT offadj, sztmp, msztmp;
575       get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp);
576       offset2 -= offadj;
577       return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
578     }
579   /* If we didn't find a common base, try the other way around.  */
580   refp = &ref1;
581   while (handled_component_p (*refp)
582          && same_type_for_tbaa (TREE_TYPE (*refp), type2) == 0)
583     refp = &TREE_OPERAND (*refp, 0);
584   same_p = same_type_for_tbaa (TREE_TYPE (*refp), type2);
585   /* If we couldn't compare types we have to bail out.  */
586   if (same_p == -1)
587     return true;
588   else if (same_p == 1)
589     {
590       HOST_WIDE_INT offadj, sztmp, msztmp;
591       get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp);
592       offset1 -= offadj;
593       return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
594     }
595   /* If we have two type access paths B1.path1 and B2.path2 they may
596      only alias if either B1 is in B2.path2 or B2 is in B1.path1.  */
597   return false;
598 }
599
600 /* Return true if two memory references based on the variables BASE1
601    and BASE2 constrained to [OFFSET1, OFFSET1 + MAX_SIZE1) and
602    [OFFSET2, OFFSET2 + MAX_SIZE2) may alias.  */
603
604 static bool
605 decl_refs_may_alias_p (tree base1,
606                        HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
607                        tree base2,
608                        HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2)
609 {
610   gcc_assert (SSA_VAR_P (base1) && SSA_VAR_P (base2));
611
612   /* If both references are based on different variables, they cannot alias.  */
613   if (!operand_equal_p (base1, base2, 0))
614     return false;
615
616   /* If both references are based on the same variable, they cannot alias if
617      the accesses do not overlap.  */
618   return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
619 }
620
621 /* Return true if an indirect reference based on *PTR1 constrained
622    to [OFFSET1, OFFSET1 + MAX_SIZE1) may alias a variable based on BASE2
623    constrained to [OFFSET2, OFFSET2 + MAX_SIZE2).  *PTR1 and BASE2 have
624    the alias sets BASE1_ALIAS_SET and BASE2_ALIAS_SET which can be -1
625    in which case they are computed on-demand.  REF1 and REF2
626    if non-NULL are the complete memory reference trees.  */
627
628 static bool
629 indirect_ref_may_alias_decl_p (tree ref1, tree ptr1,
630                                HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
631                                alias_set_type base1_alias_set,
632                                tree ref2, tree base2,
633                                HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2,
634                                alias_set_type base2_alias_set)
635 {
636   /* If only one reference is based on a variable, they cannot alias if
637      the pointer access is beyond the extent of the variable access.
638      (the pointer base cannot validly point to an offset less than zero
639      of the variable).
640      They also cannot alias if the pointer may not point to the decl.  */
641   if (max_size2 != -1
642       && !ranges_overlap_p (offset1, max_size1, 0, offset2 + max_size2))
643     return false;
644   if (!ptr_deref_may_alias_decl_p (ptr1, base2))
645     return false;
646
647   /* Disambiguations that rely on strict aliasing rules follow.  */
648   if (!flag_strict_aliasing)
649     return true;
650
651   /* If the alias set for a pointer access is zero all bets are off.  */
652   if (base1_alias_set == -1)
653     base1_alias_set = get_deref_alias_set (ptr1);
654   if (base1_alias_set == 0)
655     return true;
656   if (base2_alias_set == -1)
657     base2_alias_set = get_alias_set (base2);
658
659   /* If both references are through the same type, they do not alias
660      if the accesses do not overlap.  This does extra disambiguation
661      for mixed/pointer accesses but requires strict aliasing.  */
662   if (same_type_for_tbaa (TREE_TYPE (TREE_TYPE (ptr1)),
663                           TREE_TYPE (base2)) == 1)
664     return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
665
666   /* The only way to access a variable is through a pointer dereference
667      of the same alias set or a subset of it.  */
668   if (base1_alias_set != base2_alias_set
669       && !alias_set_subset_of (base1_alias_set, base2_alias_set))
670     return false;
671
672   /* Do access-path based disambiguation.  */
673   if (ref1 && ref2
674       && handled_component_p (ref1)
675       && handled_component_p (ref2))
676     return nonaliasing_component_refs_p (ref1, TREE_TYPE (TREE_TYPE (ptr1)),
677                                          offset1, max_size1,
678                                          ref2, TREE_TYPE (base2),
679                                          offset2, max_size2);
680
681   return true;
682 }
683
684 /* Return true if two indirect references based on *PTR1
685    and *PTR2 constrained to [OFFSET1, OFFSET1 + MAX_SIZE1) and
686    [OFFSET2, OFFSET2 + MAX_SIZE2) may alias.  *PTR1 and *PTR2 have
687    the alias sets BASE1_ALIAS_SET and BASE2_ALIAS_SET which can be -1
688    in which case they are computed on-demand.  REF1 and REF2
689    if non-NULL are the complete memory reference trees. */
690
691 static bool
692 indirect_refs_may_alias_p (tree ref1, tree ptr1,
693                            HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
694                            alias_set_type base1_alias_set,
695                            tree ref2, tree ptr2,
696                            HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2,
697                            alias_set_type base2_alias_set)
698 {
699   /* If both bases are based on pointers they cannot alias if they may not
700      point to the same memory object or if they point to the same object
701      and the accesses do not overlap.  */
702   if (operand_equal_p (ptr1, ptr2, 0))
703     return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
704   if (!ptr_derefs_may_alias_p (ptr1, ptr2))
705     return false;
706
707   /* Disambiguations that rely on strict aliasing rules follow.  */
708   if (!flag_strict_aliasing)
709     return true;
710
711   /* If the alias set for a pointer access is zero all bets are off.  */
712   if (base1_alias_set == -1)
713     base1_alias_set = get_deref_alias_set (ptr1);
714   if (base1_alias_set == 0)
715     return true;
716   if (base2_alias_set == -1)
717     base2_alias_set = get_deref_alias_set (ptr2);
718   if (base2_alias_set == 0)
719     return true;
720
721   /* If both references are through the same type, they do not alias
722      if the accesses do not overlap.  This does extra disambiguation
723      for mixed/pointer accesses but requires strict aliasing.  */
724   if (same_type_for_tbaa (TREE_TYPE (TREE_TYPE (ptr1)),
725                           TREE_TYPE (TREE_TYPE (ptr2))) == 1)
726     return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
727
728   /* Do type-based disambiguation.  */
729   if (base1_alias_set != base2_alias_set
730       && !alias_sets_conflict_p (base1_alias_set, base2_alias_set))
731     return false;
732
733   /* Do access-path based disambiguation.  */
734   if (ref1 && ref2
735       && handled_component_p (ref1)
736       && handled_component_p (ref2))
737     return nonaliasing_component_refs_p (ref1, TREE_TYPE (TREE_TYPE (ptr1)),
738                                          offset1, max_size1,
739                                          ref2, TREE_TYPE (TREE_TYPE (ptr2)),
740                                          offset2, max_size2);
741
742   return true;
743 }
744
745 /* Return true, if the two memory references REF1 and REF2 may alias.  */
746
747 bool
748 refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p)
749 {
750   tree base1, base2;
751   HOST_WIDE_INT offset1 = 0, offset2 = 0;
752   HOST_WIDE_INT size1 = -1, size2 = -1;
753   HOST_WIDE_INT max_size1 = -1, max_size2 = -1;
754   bool var1_p, var2_p, ind1_p, ind2_p;
755   alias_set_type set;
756
757   gcc_assert ((!ref1->ref
758                || SSA_VAR_P (ref1->ref)
759                || handled_component_p (ref1->ref)
760                || INDIRECT_REF_P (ref1->ref)
761                || TREE_CODE (ref1->ref) == TARGET_MEM_REF)
762               && (!ref2->ref
763                   || SSA_VAR_P (ref2->ref)
764                   || handled_component_p (ref2->ref)
765                   || INDIRECT_REF_P (ref2->ref)
766                   || TREE_CODE (ref2->ref) == TARGET_MEM_REF));
767
768   /* Decompose the references into their base objects and the access.  */
769   base1 = ao_ref_base (ref1);
770   offset1 = ref1->offset;
771   size1 = ref1->size;
772   max_size1 = ref1->max_size;
773   base2 = ao_ref_base (ref2);
774   offset2 = ref2->offset;
775   size2 = ref2->size;
776   max_size2 = ref2->max_size;
777
778   /* We can end up with registers or constants as bases for example from
779      *D.1663_44 = VIEW_CONVERT_EXPR<struct DB_LSN>(__tmp$B0F64_59);
780      which is seen as a struct copy.  */
781   if (TREE_CODE (base1) == SSA_NAME
782       || TREE_CODE (base2) == SSA_NAME
783       || is_gimple_min_invariant (base1)
784       || is_gimple_min_invariant (base2))
785     return false;
786
787   /* We can end up refering to code via function decls.  As we likely
788      do not properly track code aliases conservatively bail out.  */
789   if (TREE_CODE (base1) == FUNCTION_DECL
790       || TREE_CODE (base2) == FUNCTION_DECL)
791     return true;
792
793   /* Defer to simple offset based disambiguation if we have
794      references based on two decls.  Do this before defering to
795      TBAA to handle must-alias cases in conformance with the
796      GCC extension of allowing type-punning through unions.  */
797   var1_p = SSA_VAR_P (base1);
798   var2_p = SSA_VAR_P (base2);
799   if (var1_p && var2_p)
800     return decl_refs_may_alias_p (base1, offset1, max_size1,
801                                   base2, offset2, max_size2);
802
803   /* First defer to TBAA if possible.  */
804   if (tbaa_p
805       && flag_strict_aliasing
806       && !alias_sets_conflict_p (ao_ref_alias_set (ref1),
807                                  ao_ref_alias_set (ref2)))
808     return false;
809
810   /* If one reference is a TARGET_MEM_REF weird things are allowed.  Still
811      TBAA disambiguation based on the access type is possible, so bail
812      out only after that check.  */
813   if ((ref1->ref && TREE_CODE (ref1->ref) == TARGET_MEM_REF)
814       || (ref2->ref && TREE_CODE (ref2->ref) == TARGET_MEM_REF))
815     return true;
816
817   /* Dispatch to the pointer-vs-decl or pointer-vs-pointer disambiguators.  */
818   ind1_p = INDIRECT_REF_P (base1);
819   ind2_p = INDIRECT_REF_P (base2);
820   set = tbaa_p ? -1 : 0;
821   if (var1_p && ind2_p)
822     return indirect_ref_may_alias_decl_p (ref2->ref, TREE_OPERAND (base2, 0),
823                                           offset2, max_size2, set,
824                                           ref1->ref, base1,
825                                           offset1, max_size1, set);
826   else if (ind1_p && var2_p)
827     return indirect_ref_may_alias_decl_p (ref1->ref, TREE_OPERAND (base1, 0),
828                                           offset1, max_size1, set,
829                                           ref2->ref, base2,
830                                           offset2, max_size2, set);
831   else if (ind1_p && ind2_p)
832     return indirect_refs_may_alias_p (ref1->ref, TREE_OPERAND (base1, 0),
833                                       offset1, max_size1, set,
834                                       ref2->ref, TREE_OPERAND (base2, 0),
835                                       offset2, max_size2, set);
836
837   gcc_unreachable ();
838 }
839
840 bool
841 refs_may_alias_p (tree ref1, tree ref2)
842 {
843   ao_ref r1, r2;
844   bool res;
845   ao_ref_init (&r1, ref1);
846   ao_ref_init (&r2, ref2);
847   res = refs_may_alias_p_1 (&r1, &r2, true);
848   if (res)
849     ++alias_stats.refs_may_alias_p_may_alias;
850   else
851     ++alias_stats.refs_may_alias_p_no_alias;
852   return res;
853 }
854
855 /* Returns true if there is a anti-dependence for the STORE that
856    executes after the LOAD.  */
857
858 bool
859 refs_anti_dependent_p (tree load, tree store)
860 {
861   ao_ref r1, r2;
862   ao_ref_init (&r1, load);
863   ao_ref_init (&r2, store);
864   return refs_may_alias_p_1 (&r1, &r2, false);
865 }
866
867 /* Returns true if there is a output dependence for the stores
868    STORE1 and STORE2.  */
869
870 bool
871 refs_output_dependent_p (tree store1, tree store2)
872 {
873   ao_ref r1, r2;
874   ao_ref_init (&r1, store1);
875   ao_ref_init (&r2, store2);
876   return refs_may_alias_p_1 (&r1, &r2, false);
877 }
878
879 /* If the call CALL may use the memory reference REF return true,
880    otherwise return false.  */
881
882 static bool
883 ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
884 {
885   tree base, callee;
886   unsigned i;
887   int flags = gimple_call_flags (call);
888
889   /* Const functions without a static chain do not implicitly use memory.  */
890   if (!gimple_call_chain (call)
891       && (flags & (ECF_CONST|ECF_NOVOPS)))
892     goto process_args;
893
894   base = ao_ref_base (ref);
895   if (!base)
896     return true;
897
898   /* If the reference is based on a decl that is not aliased the call
899      cannot possibly use it.  */
900   if (DECL_P (base)
901       && !may_be_aliased (base)
902       /* But local statics can be used through recursion.  */
903       && !is_global_var (base))
904     goto process_args;
905
906   callee = gimple_call_fndecl (call);
907
908   /* Handle those builtin functions explicitly that do not act as
909      escape points.  See tree-ssa-structalias.c:find_func_aliases
910      for the list of builtins we might need to handle here.  */
911   if (callee != NULL_TREE
912       && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
913     switch (DECL_FUNCTION_CODE (callee))
914       {
915         /* All the following functions clobber memory pointed to by
916            their first argument.  */
917         case BUILT_IN_STRCPY:
918         case BUILT_IN_STRNCPY:
919         case BUILT_IN_BCOPY:
920         case BUILT_IN_MEMCPY:
921         case BUILT_IN_MEMMOVE:
922         case BUILT_IN_MEMPCPY:
923         case BUILT_IN_STPCPY:
924         case BUILT_IN_STPNCPY:
925         case BUILT_IN_STRCAT:
926         case BUILT_IN_STRNCAT:
927           {
928             ao_ref dref;
929             tree size = NULL_TREE;
930             if (gimple_call_num_args (call) == 3)
931               size = gimple_call_arg (call, 2);
932             ao_ref_init_from_ptr_and_size (&dref,
933                                            gimple_call_arg (call, 1),
934                                            size);
935             return refs_may_alias_p_1 (&dref, ref, false);
936           }
937         /* The following builtins do not read from memory.  */
938         case BUILT_IN_FREE:
939         case BUILT_IN_MEMSET:
940         case BUILT_IN_FREXP:
941         case BUILT_IN_FREXPF:
942         case BUILT_IN_FREXPL:
943         case BUILT_IN_GAMMA_R:
944         case BUILT_IN_GAMMAF_R:
945         case BUILT_IN_GAMMAL_R:
946         case BUILT_IN_LGAMMA_R:
947         case BUILT_IN_LGAMMAF_R:
948         case BUILT_IN_LGAMMAL_R:
949         case BUILT_IN_MODF:
950         case BUILT_IN_MODFF:
951         case BUILT_IN_MODFL:
952         case BUILT_IN_REMQUO:
953         case BUILT_IN_REMQUOF:
954         case BUILT_IN_REMQUOL:
955         case BUILT_IN_SINCOS:
956         case BUILT_IN_SINCOSF:
957         case BUILT_IN_SINCOSL:
958           return false;
959
960         default:
961           /* Fallthru to general call handling.  */;
962       }
963
964   /* Check if base is a global static variable that is not read
965      by the function.  */
966   if (TREE_CODE (base) == VAR_DECL
967       && TREE_STATIC (base)
968       && !TREE_PUBLIC (base))
969     {
970       bitmap not_read;
971
972       if (callee != NULL_TREE
973           && (not_read
974                 = ipa_reference_get_not_read_global (cgraph_node (callee)))
975           && bitmap_bit_p (not_read, DECL_UID (base)))
976         goto process_args;
977     }
978
979   /* If the base variable is call-used or call-clobbered then
980      it may be used.  */
981   if (flags & (ECF_PURE|ECF_CONST|ECF_LOOPING_CONST_OR_PURE|ECF_NOVOPS))
982     {
983       if (DECL_P (base))
984         {
985           if (is_call_used (base))
986             return true;
987         }
988       else if (INDIRECT_REF_P (base)
989                && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
990         {
991           struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
992           if (!pi)
993             return true;
994
995           if (pt_solution_includes_global (&pi->pt)
996               || pt_solutions_intersect (&cfun->gimple_df->callused, &pi->pt)
997               || pt_solutions_intersect (&cfun->gimple_df->escaped, &pi->pt))
998             return true;
999         }
1000       else
1001         return true;
1002     }
1003   else
1004     {
1005       if (DECL_P (base))
1006         {
1007           if (is_call_clobbered (base))
1008             return true;
1009         }
1010       else if (INDIRECT_REF_P (base)
1011                && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
1012         {
1013           struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
1014           if (!pi)
1015             return true;
1016
1017           if (pt_solution_includes_global (&pi->pt)
1018               || pt_solutions_intersect (&cfun->gimple_df->escaped, &pi->pt))
1019             return true;
1020         }
1021       else
1022         return true;
1023     }
1024
1025   /* Inspect call arguments for passed-by-value aliases.  */
1026 process_args:
1027   for (i = 0; i < gimple_call_num_args (call); ++i)
1028     {
1029       tree op = gimple_call_arg (call, i);
1030
1031       if (TREE_CODE (op) == WITH_SIZE_EXPR)
1032         op = TREE_OPERAND (op, 0);
1033
1034       if (TREE_CODE (op) != SSA_NAME
1035           && !is_gimple_min_invariant (op))
1036         {
1037           ao_ref r;
1038           ao_ref_init (&r, op);
1039           if (refs_may_alias_p_1 (&r, ref, true))
1040             return true;
1041         }
1042     }
1043
1044   return false;
1045 }
1046
1047 static bool
1048 ref_maybe_used_by_call_p (gimple call, tree ref)
1049 {
1050   ao_ref r;
1051   bool res;
1052   ao_ref_init (&r, ref);
1053   res = ref_maybe_used_by_call_p_1 (call, &r);
1054   if (res)
1055     ++alias_stats.ref_maybe_used_by_call_p_may_alias;
1056   else
1057     ++alias_stats.ref_maybe_used_by_call_p_no_alias;
1058   return res;
1059 }
1060
1061
1062 /* If the statement STMT may use the memory reference REF return
1063    true, otherwise return false.  */
1064
1065 bool
1066 ref_maybe_used_by_stmt_p (gimple stmt, tree ref)
1067 {
1068   if (is_gimple_assign (stmt))
1069     {
1070       tree rhs;
1071
1072       /* All memory assign statements are single.  */
1073       if (!gimple_assign_single_p (stmt))
1074         return false;
1075
1076       rhs = gimple_assign_rhs1 (stmt);
1077       if (is_gimple_reg (rhs)
1078           || is_gimple_min_invariant (rhs)
1079           || gimple_assign_rhs_code (stmt) == CONSTRUCTOR)
1080         return false;
1081
1082       return refs_may_alias_p (rhs, ref);
1083     }
1084   else if (is_gimple_call (stmt))
1085     return ref_maybe_used_by_call_p (stmt, ref);
1086
1087   return true;
1088 }
1089
1090 /* If the call in statement CALL may clobber the memory reference REF
1091    return true, otherwise return false.  */
1092
1093 static bool
1094 call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
1095 {
1096   tree base;
1097   tree callee;
1098
1099   /* If the call is pure or const it cannot clobber anything.  */
1100   if (gimple_call_flags (call)
1101       & (ECF_PURE|ECF_CONST|ECF_LOOPING_CONST_OR_PURE|ECF_NOVOPS))
1102     return false;
1103
1104   base = ao_ref_base (ref);
1105   if (!base)
1106     return true;
1107
1108   if (TREE_CODE (base) == SSA_NAME
1109       || CONSTANT_CLASS_P (base))
1110     return false;
1111
1112   /* If the reference is based on a decl that is not aliased the call
1113      cannot possibly clobber it.  */
1114   if (DECL_P (base)
1115       && !may_be_aliased (base)
1116       /* But local non-readonly statics can be modified through recursion
1117          or the call may implement a threading barrier which we must
1118          treat as may-def.  */
1119       && (TREE_READONLY (base)
1120           || !is_global_var (base)))
1121     return false;
1122
1123   callee = gimple_call_fndecl (call);
1124
1125   /* Handle those builtin functions explicitly that do not act as
1126      escape points.  See tree-ssa-structalias.c:find_func_aliases
1127      for the list of builtins we might need to handle here.  */
1128   if (callee != NULL_TREE
1129       && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
1130     switch (DECL_FUNCTION_CODE (callee))
1131       {
1132         /* All the following functions clobber memory pointed to by
1133            their first argument.  */
1134         case BUILT_IN_STRCPY:
1135         case BUILT_IN_STRNCPY:
1136         case BUILT_IN_BCOPY:
1137         case BUILT_IN_MEMCPY:
1138         case BUILT_IN_MEMMOVE:
1139         case BUILT_IN_MEMPCPY:
1140         case BUILT_IN_STPCPY:
1141         case BUILT_IN_STPNCPY:
1142         case BUILT_IN_STRCAT:
1143         case BUILT_IN_STRNCAT:
1144         case BUILT_IN_MEMSET:
1145           {
1146             ao_ref dref;
1147             tree size = NULL_TREE;
1148             if (gimple_call_num_args (call) == 3)
1149               size = gimple_call_arg (call, 2);
1150             ao_ref_init_from_ptr_and_size (&dref,
1151                                            gimple_call_arg (call, 0),
1152                                            size);
1153             return refs_may_alias_p_1 (&dref, ref, false);
1154           }
1155         /* Freeing memory kills the pointed-to memory.  More importantly
1156            the call has to serve as a barrier for moving loads and stores
1157            across it.  */
1158         case BUILT_IN_FREE:
1159           {
1160             tree ptr = gimple_call_arg (call, 0);
1161             return ptr_deref_may_alias_ref_p_1 (ptr, ref);
1162           }
1163         case BUILT_IN_GAMMA_R:
1164         case BUILT_IN_GAMMAF_R:
1165         case BUILT_IN_GAMMAL_R:
1166         case BUILT_IN_LGAMMA_R:
1167         case BUILT_IN_LGAMMAF_R:
1168         case BUILT_IN_LGAMMAL_R:
1169           {
1170             tree out = gimple_call_arg (call, 1);
1171             if (ptr_deref_may_alias_ref_p_1 (out, ref))
1172               return true;
1173             if (flag_errno_math)
1174               break;
1175             return false;
1176           }
1177         case BUILT_IN_FREXP:
1178         case BUILT_IN_FREXPF:
1179         case BUILT_IN_FREXPL:
1180         case BUILT_IN_MODF:
1181         case BUILT_IN_MODFF:
1182         case BUILT_IN_MODFL:
1183           {
1184             tree out = gimple_call_arg (call, 1);
1185             return ptr_deref_may_alias_ref_p_1 (out, ref);
1186           }
1187         case BUILT_IN_REMQUO:
1188         case BUILT_IN_REMQUOF:
1189         case BUILT_IN_REMQUOL:
1190           {
1191             tree out = gimple_call_arg (call, 2);
1192             if (ptr_deref_may_alias_ref_p_1 (out, ref))
1193               return true;
1194             if (flag_errno_math)
1195               break;
1196             return false;
1197           }
1198         case BUILT_IN_SINCOS:
1199         case BUILT_IN_SINCOSF:
1200         case BUILT_IN_SINCOSL:
1201           {
1202             tree sin = gimple_call_arg (call, 1);
1203             tree cos = gimple_call_arg (call, 2);
1204             return (ptr_deref_may_alias_ref_p_1 (sin, ref)
1205                     || ptr_deref_may_alias_ref_p_1 (cos, ref));
1206           }
1207         default:
1208           /* Fallthru to general call handling.  */;
1209       }
1210
1211   /* Check if base is a global static variable that is not written
1212      by the function.  */
1213   if (callee != NULL_TREE
1214       && TREE_CODE (base) == VAR_DECL
1215       && TREE_STATIC (base)
1216       && !TREE_PUBLIC (base))
1217     {
1218       bitmap not_written;
1219
1220       if ((not_written
1221              = ipa_reference_get_not_written_global (cgraph_node (callee)))
1222           && bitmap_bit_p (not_written, DECL_UID (base)))
1223         return false;
1224     }
1225
1226   if (DECL_P (base))
1227     return is_call_clobbered (base);
1228   else if (INDIRECT_REF_P (base)
1229            && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
1230     {
1231       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0));
1232       if (!pi)
1233         return true;
1234
1235       return (pt_solution_includes_global (&pi->pt)
1236               || pt_solutions_intersect (&cfun->gimple_df->escaped, &pi->pt));
1237     }
1238
1239   return true;
1240 }
1241
1242 static bool ATTRIBUTE_UNUSED
1243 call_may_clobber_ref_p (gimple call, tree ref)
1244 {
1245   bool res;
1246   ao_ref r;
1247   ao_ref_init (&r, ref);
1248   res = call_may_clobber_ref_p_1 (call, &r);
1249   if (res)
1250     ++alias_stats.call_may_clobber_ref_p_may_alias;
1251   else
1252     ++alias_stats.call_may_clobber_ref_p_no_alias;
1253   return res;
1254 }
1255
1256
1257 /* If the statement STMT may clobber the memory reference REF return true,
1258    otherwise return false.  */
1259
1260 bool
1261 stmt_may_clobber_ref_p_1 (gimple stmt, ao_ref *ref)
1262 {
1263   if (is_gimple_call (stmt))
1264     {
1265       tree lhs = gimple_call_lhs (stmt);
1266       if (lhs
1267           && !is_gimple_reg (lhs))
1268         {
1269           ao_ref r;
1270           ao_ref_init (&r, lhs);
1271           if (refs_may_alias_p_1 (ref, &r, true))
1272             return true;
1273         }
1274
1275       return call_may_clobber_ref_p_1 (stmt, ref);
1276     }
1277   else if (is_gimple_assign (stmt))
1278     {
1279       ao_ref r;
1280       ao_ref_init (&r, gimple_assign_lhs (stmt));
1281       return refs_may_alias_p_1 (ref, &r, true);
1282     }
1283   else if (gimple_code (stmt) == GIMPLE_ASM)
1284     return true;
1285
1286   return false;
1287 }
1288
1289 bool
1290 stmt_may_clobber_ref_p (gimple stmt, tree ref)
1291 {
1292   ao_ref r;
1293   ao_ref_init (&r, ref);
1294   return stmt_may_clobber_ref_p_1 (stmt, &r);
1295 }
1296
1297
1298 static tree get_continuation_for_phi (gimple, ao_ref *, bitmap *);
1299
1300 /* Walk the virtual use-def chain of VUSE until hitting the virtual operand
1301    TARGET or a statement clobbering the memory reference REF in which
1302    case false is returned.  The walk starts with VUSE, one argument of PHI.  */
1303
1304 static bool
1305 maybe_skip_until (gimple phi, tree target, ao_ref *ref,
1306                   tree vuse, bitmap *visited)
1307 {
1308   if (!*visited)
1309     *visited = BITMAP_ALLOC (NULL);
1310
1311   bitmap_set_bit (*visited, SSA_NAME_VERSION (PHI_RESULT (phi)));
1312
1313   /* Walk until we hit the target.  */
1314   while (vuse != target)
1315     {
1316       gimple def_stmt = SSA_NAME_DEF_STMT (vuse);
1317       /* Recurse for PHI nodes.  */
1318       if (gimple_code (def_stmt) == GIMPLE_PHI)
1319         {
1320           /* An already visited PHI node ends the walk successfully.  */
1321           if (bitmap_bit_p (*visited, SSA_NAME_VERSION (PHI_RESULT (def_stmt))))
1322             return true;
1323           vuse = get_continuation_for_phi (def_stmt, ref, visited);
1324           if (!vuse)
1325             return false;
1326           continue;
1327         }
1328       /* A clobbering statement or the end of the IL ends it failing.  */
1329       else if (gimple_nop_p (def_stmt)
1330                || stmt_may_clobber_ref_p_1 (def_stmt, ref))
1331         return false;
1332       vuse = gimple_vuse (def_stmt);
1333     }
1334   return true;
1335 }
1336
1337 /* Starting from a PHI node for the virtual operand of the memory reference
1338    REF find a continuation virtual operand that allows to continue walking
1339    statements dominating PHI skipping only statements that cannot possibly
1340    clobber REF.  Returns NULL_TREE if no suitable virtual operand can
1341    be found.  */
1342
1343 static tree
1344 get_continuation_for_phi (gimple phi, ao_ref *ref, bitmap *visited)
1345 {
1346   unsigned nargs = gimple_phi_num_args (phi);
1347
1348   /* Through a single-argument PHI we can simply look through.  */
1349   if (nargs == 1)
1350     return PHI_ARG_DEF (phi, 0);
1351
1352   /* For two arguments try to skip non-aliasing code until we hit
1353      the phi argument definition that dominates the other one.  */
1354   if (nargs == 2)
1355     {
1356       tree arg0 = PHI_ARG_DEF (phi, 0);
1357       tree arg1 = PHI_ARG_DEF (phi, 1);
1358       gimple def0 = SSA_NAME_DEF_STMT (arg0);
1359       gimple def1 = SSA_NAME_DEF_STMT (arg1);
1360
1361       if (arg0 == arg1)
1362         return arg0;
1363       else if (gimple_nop_p (def0)
1364                || (!gimple_nop_p (def1)
1365                    && dominated_by_p (CDI_DOMINATORS,
1366                                       gimple_bb (def1), gimple_bb (def0))))
1367         {
1368           if (maybe_skip_until (phi, arg0, ref, arg1, visited))
1369             return arg0;
1370         }
1371       else if (gimple_nop_p (def1)
1372                || dominated_by_p (CDI_DOMINATORS,
1373                                   gimple_bb (def0), gimple_bb (def1)))
1374         {
1375           if (maybe_skip_until (phi, arg1, ref, arg0, visited))
1376             return arg1;
1377         }
1378     }
1379
1380   return NULL_TREE;
1381 }
1382
1383 /* Based on the memory reference REF and its virtual use VUSE call
1384    WALKER for each virtual use that is equivalent to VUSE, including VUSE
1385    itself.  That is, for each virtual use for which its defining statement
1386    does not clobber REF.
1387
1388    WALKER is called with REF, the current virtual use and DATA.  If
1389    WALKER returns non-NULL the walk stops and its result is returned.
1390    At the end of a non-successful walk NULL is returned.
1391
1392    TRANSLATE if non-NULL is called with a pointer to REF, the virtual
1393    use which definition is a statement that may clobber REF and DATA.
1394    If TRANSLATE returns (void *)-1 the walk stops and NULL is returned.
1395    If TRANSLATE returns non-NULL the walk stops and its result is returned.
1396    If TRANSLATE returns NULL the walk continues and TRANSLATE is supposed
1397    to adjust REF and *DATA to make that valid.
1398
1399    TODO: Cache the vector of equivalent vuses per ref, vuse pair.  */
1400
1401 void *
1402 walk_non_aliased_vuses (ao_ref *ref, tree vuse,
1403                         void *(*walker)(ao_ref *, tree, void *),
1404                         void *(*translate)(ao_ref *, tree, void *), void *data)
1405 {
1406   bitmap visited = NULL;
1407   void *res;
1408
1409   timevar_push (TV_ALIAS_STMT_WALK);
1410
1411   do
1412     {
1413       gimple def_stmt;
1414
1415       /* ???  Do we want to account this to TV_ALIAS_STMT_WALK?  */
1416       res = (*walker) (ref, vuse, data);
1417       if (res)
1418         break;
1419
1420       def_stmt = SSA_NAME_DEF_STMT (vuse);
1421       if (gimple_nop_p (def_stmt))
1422         break;
1423       else if (gimple_code (def_stmt) == GIMPLE_PHI)
1424         vuse = get_continuation_for_phi (def_stmt, ref, &visited);
1425       else
1426         {
1427           if (stmt_may_clobber_ref_p_1 (def_stmt, ref))
1428             {
1429               if (!translate)
1430                 break;
1431               res = (*translate) (ref, vuse, data);
1432               /* Failed lookup and translation.  */
1433               if (res == (void *)-1)
1434                 {
1435                   res = NULL;
1436                   break;
1437                 }
1438               /* Lookup succeeded.  */
1439               else if (res != NULL)
1440                 break;
1441               /* Translation succeeded, continue walking.  */
1442             }
1443           vuse = gimple_vuse (def_stmt);
1444         }
1445     }
1446   while (vuse);
1447
1448   if (visited)
1449     BITMAP_FREE (visited);
1450
1451   timevar_pop (TV_ALIAS_STMT_WALK);
1452
1453   return res;
1454 }
1455
1456
1457 /* Based on the memory reference REF call WALKER for each vdef which
1458    defining statement may clobber REF, starting with VDEF.  If REF
1459    is NULL_TREE, each defining statement is visited.
1460
1461    WALKER is called with REF, the current vdef and DATA.  If WALKER
1462    returns true the walk is stopped, otherwise it continues.
1463
1464    At PHI nodes walk_aliased_vdefs forks into one walk for reach
1465    PHI argument (but only one walk continues on merge points), the
1466    return value is true if any of the walks was successful.
1467
1468    The function returns the number of statements walked.  */
1469
1470 static unsigned int
1471 walk_aliased_vdefs_1 (ao_ref *ref, tree vdef,
1472                       bool (*walker)(ao_ref *, tree, void *), void *data,
1473                       bitmap *visited, unsigned int cnt)
1474 {
1475   do
1476     {
1477       gimple def_stmt = SSA_NAME_DEF_STMT (vdef);
1478
1479       if (*visited
1480           && !bitmap_set_bit (*visited, SSA_NAME_VERSION (vdef)))
1481         return cnt;
1482
1483       if (gimple_nop_p (def_stmt))
1484         return cnt;
1485       else if (gimple_code (def_stmt) == GIMPLE_PHI)
1486         {
1487           unsigned i;
1488           if (!*visited)
1489             *visited = BITMAP_ALLOC (NULL);
1490           for (i = 0; i < gimple_phi_num_args (def_stmt); ++i)
1491             cnt += walk_aliased_vdefs_1 (ref, gimple_phi_arg_def (def_stmt, i),
1492                                          walker, data, visited, 0);
1493           return cnt;
1494         }
1495
1496       /* ???  Do we want to account this to TV_ALIAS_STMT_WALK?  */
1497       cnt++;
1498       if ((!ref
1499            || stmt_may_clobber_ref_p_1 (def_stmt, ref))
1500           && (*walker) (ref, vdef, data))
1501         return cnt;
1502
1503       vdef = gimple_vuse (def_stmt);
1504     }
1505   while (1);
1506 }
1507
1508 unsigned int
1509 walk_aliased_vdefs (ao_ref *ref, tree vdef,
1510                     bool (*walker)(ao_ref *, tree, void *), void *data,
1511                     bitmap *visited)
1512 {
1513   bitmap local_visited = NULL;
1514   unsigned int ret;
1515
1516   timevar_push (TV_ALIAS_STMT_WALK);
1517
1518   ret = walk_aliased_vdefs_1 (ref, vdef, walker, data,
1519                               visited ? visited : &local_visited, 0);
1520   if (local_visited)
1521     BITMAP_FREE (local_visited);
1522
1523   timevar_pop (TV_ALIAS_STMT_WALK);
1524
1525   return ret;
1526 }
1527