OSDN Git Service

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