Merge branch 'vendor/OPENSSL'
[dragonfly.git] / contrib / gcc-4.4 / 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 "tree-ssa-structalias.h"
44 #include "convert.h"
45 #include "params.h"
46 #include "ipa-type-escape.h"
47 #include "vec.h"
48 #include "bitmap.h"
49 #include "vecprim.h"
50 #include "pointer-set.h"
51 #include "alloc-pool.h"
52
53 /* Broad overview of how aliasing works:
54    
55    First we compute points-to sets, which is done in
56    tree-ssa-structalias.c
57       
58    During points-to set constraint finding, a bunch of little bits of
59    information is collected.
60    This is not done because it is necessary for points-to, but because
61    points-to has to walk every statement anyway.  The function performing
62    this collecting is update_alias_info.
63
64    Bits update_alias_info collects include:
65    1. Directly escaping variables and variables whose value escapes
66    (using is_escape_site).  This is the set of variables and values that
67    escape prior to transitive closure of the clobbers.
68    2.  The set of variables dereferenced on the LHS (into
69    dereferenced_ptr_stores) 
70    3. The set of variables dereferenced on the RHS (into
71    dereferenced_ptr_loads) 
72    4. The set of all pointers we saw.
73    5. The number of loads and stores for each variable
74    6. The number of statements touching memory
75    7. The set of address taken variables.
76    
77    
78    #1 is computed by a combination of is_escape_site, and counting the
79    number of uses/deref operators.  This function properly accounts for
80    situations like &ptr->field, which is *not* a dereference.
81    
82    After points-to sets are computed, the sets themselves still
83    contain points-to specific variables, such as a variable that says
84    the pointer points to anything, a variable that says the pointer
85    points to readonly memory, etc.
86
87    These are eliminated in a later phase, as we will see.
88
89    The rest of the phases are located in tree-ssa-alias.c
90
91    The next phase after points-to set computation is called
92    "setup_pointers_and_addressables"
93
94    This pass does 3 main things:
95    
96    1. All variables that can have TREE_ADDRESSABLE removed safely (IE
97    non-globals whose address is not taken), have TREE_ADDRESSABLE
98    removed.
99    2. All variables that may be aliased (which is the set of addressable
100    variables and globals) at all, are marked for renaming, and have
101    symbol memory tags created for them.
102    3. All variables which are stored into have their SMT's added to
103    written vars. 
104
105
106    After this function is run, all variables that will ever have an
107    SMT, have one, though its aliases are not filled in.
108
109    The next phase is to compute flow-insensitive aliasing, which in
110    our case, is a misnomer.  it is really computing aliasing that
111    requires no transitive closure to be correct.  In particular, it
112    uses stack vs non-stack, TBAA, etc, to determine whether two
113    symbols could *ever* alias .  This phase works by going through all
114    the pointers we collected during update_alias_info, and for every
115    addressable variable in the program, seeing if they alias.  If so,
116    the addressable variable is added to the symbol memory tag for the
117    pointer.
118
119    As part of this, we handle symbol memory tags that conflict but
120    have no aliases in common, by forcing them to have a symbol in
121    common (through unioning alias sets or adding one as an alias of
122    the other), or by adding one as an alias of another.  The case of
123    conflicts with no aliases in common occurs mainly due to aliasing
124    we cannot see.  In particular, it generally means we have a load
125    through a pointer whose value came from outside the function.
126    Without an addressable symbol to point to, they would get the wrong
127    answer.
128
129    After flow insensitive aliasing is computed, we compute name tags
130    (called compute_flow_sensitive_info).  We walk each pointer we
131    collected and see if it has a usable points-to set.  If so, we
132    generate a name tag using that pointer, and make an alias bitmap for
133    it.  Name tags are shared between all things with the same alias
134    bitmap.  The alias bitmap will be translated from what points-to
135    computed.  In particular, the "anything" variable in points-to will be
136    transformed into a pruned set of SMT's and their aliases that
137    compute_flow_insensitive_aliasing computed.
138    Note that since 4.3, every pointer that points-to computed a solution for
139    will get a name tag (whereas before 4.3, only those whose set did
140    *not* include the anything variable would).  At the point where name
141    tags are all assigned, symbol memory tags are dead, and could be
142    deleted, *except* on global variables.  Global variables still use
143    symbol memory tags as of right now.
144
145    After name tags are computed, the set of clobbered variables is
146    transitively closed.  In particular, we compute the set of clobbered
147    variables based on the initial set of clobbers, plus the aliases of
148    pointers which either escape, or have their value escape.
149
150    After this, maybe_create_global_var is run, which handles a corner
151    case where we have no call clobbered variables, but have pure and
152    non-pure functions.
153    
154    Staring at this function, I now remember it is a hack for the fact
155    that we do not mark all globals in the program as call clobbered for a
156    function unless they are actually used in that function.  Instead,  we
157    only mark the set that is actually clobbered.  As a result, you can
158    end up with situations where you have no call clobbered vars set.
159    
160    After maybe_create_global_var, we set pointers with the REF_ALL flag
161    to have alias sets that include all clobbered
162    memory tags and variables.
163    
164    After this, memory partitioning is computed (by the function
165    compute_memory_partitions) and alias sets are reworked accordingly.
166
167    Lastly, we delete partitions with no symbols, and clean up after
168    ourselves.  */
169
170
171 /* Alias information used by compute_may_aliases and its helpers.  */
172 struct alias_info
173 {
174   /* SSA names visited while collecting points-to information.  If bit I
175      is set, it means that SSA variable with version I has already been
176      visited.  */
177   sbitmap ssa_names_visited;
178
179   /* Array of SSA_NAME pointers processed by the points-to collector.  */
180   VEC(tree,heap) *processed_ptrs;
181
182   /* ADDRESSABLE_VARS contains all the global variables and locals that
183      have had their address taken.  */
184   struct alias_map_d **addressable_vars;
185   size_t num_addressable_vars;
186
187   /* POINTERS contains all the _DECL pointers with unique memory tags
188      that have been referenced in the program.  */
189   struct alias_map_d **pointers;
190   size_t num_pointers;
191
192   /* Pointers that have been used in an indirect load/store operation.  */
193   struct pointer_set_t *dereferenced_ptrs;
194 };
195
196
197 /* Structure to map a variable to its alias set.  */
198 struct alias_map_d
199 {
200   /* Variable and its alias set.  */
201   tree var;
202   alias_set_type set;
203 };
204
205
206 /* Counters used to display statistics on alias analysis.  */
207 struct alias_stats_d
208 {
209   unsigned int alias_queries;
210   unsigned int alias_mayalias;
211   unsigned int alias_noalias;
212   unsigned int simple_queries;
213   unsigned int simple_resolved;
214   unsigned int tbaa_queries;
215   unsigned int tbaa_resolved;
216   unsigned int structnoaddress_queries;
217   unsigned int structnoaddress_resolved;
218 };
219
220
221 /* Local variables.  */
222 static struct alias_stats_d alias_stats;
223 static bitmap_obstack alias_bitmap_obstack;
224
225 /* Local functions.  */
226 static void compute_flow_insensitive_aliasing (struct alias_info *);
227 static void dump_alias_stats (FILE *);
228 static tree create_memory_tag (tree type, bool is_type_tag);
229 static tree get_smt_for (tree, struct alias_info *);
230 static tree get_nmt_for (tree);
231 static void add_may_alias (tree, tree);
232 static struct alias_info *init_alias_info (void);
233 static void delete_alias_info (struct alias_info *);
234 static void compute_flow_sensitive_aliasing (struct alias_info *);
235 static void setup_pointers_and_addressables (struct alias_info *);
236 static void update_alias_info (struct alias_info *);
237 static void create_global_var (void);
238 static void maybe_create_global_var (void);
239 static void set_pt_anything (tree);
240
241 void debug_mp_info (VEC(mem_sym_stats_t,heap) *);
242
243 static alloc_pool mem_sym_stats_pool;
244
245 /* Return memory reference stats for symbol VAR.  Create a new slot in
246    cfun->gimple_df->mem_sym_stats if needed.  */
247
248 static struct mem_sym_stats_d *
249 get_mem_sym_stats_for (tree var)
250 {
251   void **slot;
252   struct mem_sym_stats_d *stats;
253   struct pointer_map_t *map = gimple_mem_ref_stats (cfun)->mem_sym_stats;
254   
255   gcc_assert (map);
256
257   slot = pointer_map_insert (map, var);
258   if (*slot == NULL)
259     {
260       stats = (struct mem_sym_stats_d *) pool_alloc (mem_sym_stats_pool);
261       memset (stats, 0, sizeof (*stats));
262       stats->var = var;
263       *slot = (void *) stats;
264     }
265   else
266     stats = (struct mem_sym_stats_d *) *slot;
267
268   return stats;
269 }
270
271
272 /* Return memory reference statistics for variable VAR in function FN.
273    This is computed by alias analysis, but it is not kept
274    incrementally up-to-date.  So, these stats are only accurate if
275    pass_may_alias has been run recently.  If no alias information
276    exists, this function returns NULL.  */
277
278 static mem_sym_stats_t
279 mem_sym_stats (struct function *fn, tree var)
280 {
281   void **slot;
282   struct pointer_map_t *stats_map = gimple_mem_ref_stats (fn)->mem_sym_stats;
283
284   if (stats_map == NULL)
285     return NULL;
286
287   slot = pointer_map_contains (stats_map, var);
288   if (slot == NULL)
289     return NULL;
290
291   return (mem_sym_stats_t) *slot;
292 }
293
294
295 /* Set MPT to be the memory partition associated with symbol SYM.  */
296
297 static inline void
298 set_memory_partition (tree sym, tree mpt)
299 {
300 #if defined ENABLE_CHECKING
301   if (mpt)
302     gcc_assert (TREE_CODE (mpt) == MEMORY_PARTITION_TAG
303                 && !is_gimple_reg (sym));
304 #endif
305
306   var_ann (sym)->mpt = mpt;
307   if (mpt)
308     {
309       if (MPT_SYMBOLS (mpt) == NULL)
310         MPT_SYMBOLS (mpt) = BITMAP_ALLOC (&alias_bitmap_obstack);
311
312       bitmap_set_bit (MPT_SYMBOLS (mpt), DECL_UID (sym));
313
314       /* MPT inherits the call-clobbering attributes from SYM.  */
315       if (is_call_clobbered (sym))
316         {
317           MTAG_GLOBAL (mpt) = 1;
318           mark_call_clobbered (mpt, ESCAPE_IS_GLOBAL);
319         }
320     }
321 }
322
323
324 /* Mark variable VAR as being non-addressable.  */
325
326 static void
327 mark_non_addressable (tree var)
328 {
329   tree mpt;
330
331   if (!TREE_ADDRESSABLE (var))
332     return;
333
334   mpt = memory_partition (var);
335
336   clear_call_clobbered (var);
337   TREE_ADDRESSABLE (var) = 0;
338
339   if (mpt)
340     {
341       /* Note that it's possible for a symbol to have an associated
342          MPT and the MPT have a NULL empty set.  During
343          init_alias_info, all MPTs get their sets cleared out, but the
344          symbols still point to the old MPTs that used to hold them.
345          This is done so that compute_memory_partitions can now which
346          symbols are losing or changing partitions and mark them for
347          renaming.  */
348       if (MPT_SYMBOLS (mpt))
349         bitmap_clear_bit (MPT_SYMBOLS (mpt), DECL_UID (var));
350       set_memory_partition (var, NULL_TREE);
351     }
352 }
353
354
355 /* qsort comparison function to sort type/name tags by DECL_UID.  */
356
357 static int
358 sort_tags_by_id (const void *pa, const void *pb)
359 {
360   const_tree const a = *(const_tree const *)pa;
361   const_tree const b = *(const_tree const *)pb;
362  
363   return DECL_UID (a) - DECL_UID (b);
364 }
365
366 /* Initialize WORKLIST to contain those memory tags that are marked call
367    clobbered.  Initialized WORKLIST2 to contain the reasons these
368    memory tags escaped.  */
369
370 static void
371 init_transitive_clobber_worklist (VEC (tree, heap) **worklist,
372                                   VEC (int, heap) **worklist2,
373                                   bitmap on_worklist)
374 {
375   referenced_var_iterator rvi;
376   tree curr;
377
378   FOR_EACH_REFERENCED_VAR (curr, rvi)
379     {
380       if (MTAG_P (curr) && is_call_clobbered (curr))
381         {
382           VEC_safe_push (tree, heap, *worklist, curr);
383           VEC_safe_push (int, heap, *worklist2,
384                          var_ann (curr)->escape_mask);
385           bitmap_set_bit (on_worklist, DECL_UID (curr));
386         }
387     }
388 }
389
390 /* Add ALIAS to WORKLIST (and the reason for escaping REASON to WORKLIST2) if
391    ALIAS is not already marked call clobbered, and is a memory
392    tag.  */
393
394 static void
395 add_to_worklist (tree alias, VEC (tree, heap) **worklist,
396                  VEC (int, heap) **worklist2, int reason,
397                  bitmap on_worklist)
398 {
399   if (MTAG_P (alias) && !is_call_clobbered (alias)
400       && !bitmap_bit_p (on_worklist, DECL_UID (alias)))
401     {
402       VEC_safe_push (tree, heap, *worklist, alias);
403       VEC_safe_push (int, heap, *worklist2, reason);
404       bitmap_set_bit (on_worklist, DECL_UID (alias));
405     }
406 }
407
408 /* Mark aliases of TAG as call clobbered, and place any tags on the
409    alias list that were not already call clobbered on WORKLIST.  */
410
411 static void
412 mark_aliases_call_clobbered (tree tag, VEC (tree, heap) **worklist,
413                              VEC (int, heap) **worklist2, bitmap on_worklist)
414 {
415   bitmap aliases;
416   bitmap_iterator bi;
417   unsigned int i;
418   tree entry;
419   var_ann_t ta = var_ann (tag);
420
421   if (!MTAG_P (tag))
422     return;
423   aliases = may_aliases (tag);
424   if (!aliases)
425     return;
426
427   EXECUTE_IF_SET_IN_BITMAP (aliases, 0, i, bi)
428     {
429       entry = referenced_var (i);
430       /* If you clobber one part of a structure, you
431          clobber the entire thing.  While this does not make
432          the world a particularly nice place, it is necessary
433          in order to allow C/C++ tricks that involve
434          pointer arithmetic to work.  */
435       if (!unmodifiable_var_p (entry))
436         {
437           add_to_worklist (entry, worklist, worklist2, ta->escape_mask,
438                            on_worklist);
439           mark_call_clobbered (entry, ta->escape_mask);
440         }
441     }
442 }
443
444 /* Tags containing global vars need to be marked as global.
445    Tags containing call clobbered vars need to be marked as call
446    clobbered. */
447
448 static void
449 compute_tag_properties (void)
450 {
451   referenced_var_iterator rvi;
452   tree tag;
453   bool changed = true;
454   VEC (tree, heap) *taglist = NULL;
455
456   FOR_EACH_REFERENCED_VAR (tag, rvi)
457     {
458       if (!MTAG_P (tag))
459         continue;
460       VEC_safe_push (tree, heap, taglist, tag);
461     }
462
463   /* We sort the taglist by DECL_UID, for two reasons.
464      1. To get a sequential ordering to make the bitmap accesses
465      faster.
466      2. Because of the way we compute aliases, it's more likely that
467      an earlier tag is included in a later tag, and this will reduce
468      the number of iterations.
469
470      If we had a real tag graph, we would just topo-order it and be
471      done with it.  */
472   qsort (VEC_address (tree, taglist),
473          VEC_length (tree, taglist),
474          sizeof (tree),
475          sort_tags_by_id);
476
477   /* Go through each tag not marked as global, and if it aliases
478      global vars, mark it global. 
479      
480      If the tag contains call clobbered vars, mark it call
481      clobbered.  
482
483      This loop iterates because tags may appear in the may-aliases
484      list of other tags when we group.  */
485
486   while (changed)
487     {
488       unsigned int k;
489
490       changed = false;      
491       for (k = 0; VEC_iterate (tree, taglist, k, tag); k++)
492         {
493           bitmap ma;
494           bitmap_iterator bi;
495           unsigned int i;
496           tree entry;
497           bool tagcc = is_call_clobbered (tag);
498           bool tagglobal = MTAG_GLOBAL (tag);
499           
500           if (tagcc && tagglobal)
501             continue;
502           
503           ma = may_aliases (tag);
504           if (!ma)
505             continue;
506
507           EXECUTE_IF_SET_IN_BITMAP (ma, 0, i, bi)
508             {
509               entry = referenced_var (i);
510               /* Call clobbered entries cause the tag to be marked
511                  call clobbered.  */
512               if (!tagcc && is_call_clobbered (entry))
513                 {
514                   mark_call_clobbered (tag, var_ann (entry)->escape_mask);
515                   tagcc = true;
516                   changed = true;
517                 }
518
519               /* Global vars cause the tag to be marked global.  */
520               if (!tagglobal && is_global_var (entry))
521                 {
522                   MTAG_GLOBAL (tag) = true;
523                   changed = true;
524                   tagglobal = true;
525                 }
526
527               /* Early exit once both global and cc are set, since the
528                  loop can't do any more than that.  */
529               if (tagcc && tagglobal)
530                 break;
531             }
532         }
533     }
534   VEC_free (tree, heap, taglist);
535 }
536
537 /* Set up the initial variable clobbers, call-uses and globalness.
538    When this function completes, only tags whose aliases need to be
539    clobbered will be set clobbered.  Tags clobbered because they   
540    contain call clobbered vars are handled in compute_tag_properties.  */
541
542 static void
543 set_initial_properties (struct alias_info *ai)
544 {
545   unsigned int i;
546   referenced_var_iterator rvi;
547   tree var;
548   tree ptr;
549   bool any_pt_anything = false;
550   enum escape_type pt_anything_mask = 0;
551
552   FOR_EACH_REFERENCED_VAR (var, rvi)
553     {
554       if (is_global_var (var))
555         {
556           if (!unmodifiable_var_p (var))
557             mark_call_clobbered (var, ESCAPE_IS_GLOBAL);
558         }
559       else if (TREE_CODE (var) == PARM_DECL
560                && gimple_default_def (cfun, var)
561                && POINTER_TYPE_P (TREE_TYPE (var)))
562         {
563           tree def = gimple_default_def (cfun, var);
564           get_ptr_info (def)->value_escapes_p = 1;
565           get_ptr_info (def)->escape_mask |= ESCAPE_IS_PARM;      
566         }
567     }
568
569   if (!clobber_what_escaped ())
570     {
571       any_pt_anything = true;
572       pt_anything_mask |= ESCAPE_TO_CALL;
573     }
574
575   compute_call_used_vars ();
576
577   for (i = 0; VEC_iterate (tree, ai->processed_ptrs, i, ptr); i++)
578     {
579       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
580       tree tag = symbol_mem_tag (SSA_NAME_VAR (ptr));
581
582       /* A pointer that only escapes via a function return does not
583          add to the call clobber or call used solution.
584          To exclude ESCAPE_TO_PURE_CONST we would need to track
585          call used variables separately or compute those properly
586          in the operand scanner.  */
587       if (pi->value_escapes_p
588           && pi->escape_mask & ~ESCAPE_TO_RETURN)
589         {
590           /* If PTR escapes then its associated memory tags and
591              pointed-to variables are call-clobbered.  */
592           if (pi->name_mem_tag)
593             mark_call_clobbered (pi->name_mem_tag, pi->escape_mask);
594
595           if (tag)
596             mark_call_clobbered (tag, pi->escape_mask);
597         }
598
599       /* If the name tag is call clobbered, so is the symbol tag
600          associated with the base VAR_DECL.  */
601       if (pi->name_mem_tag
602           && tag
603           && is_call_clobbered (pi->name_mem_tag))
604         mark_call_clobbered (tag, pi->escape_mask);
605
606       /* Name tags and symbol tags that we don't know where they point
607          to, might point to global memory, and thus, are clobbered.
608
609          FIXME:  This is not quite right.  They should only be
610          clobbered if value_escapes_p is true, regardless of whether
611          they point to global memory or not.
612          So removing this code and fixing all the bugs would be nice.
613          It is the cause of a bunch of clobbering.  */
614       if ((pi->pt_global_mem || pi->pt_anything) 
615           && pi->memory_tag_needed && pi->name_mem_tag)
616         {
617           mark_call_clobbered (pi->name_mem_tag, ESCAPE_IS_GLOBAL);
618           MTAG_GLOBAL (pi->name_mem_tag) = true;
619         }
620       
621       if ((pi->pt_global_mem || pi->pt_anything) 
622           && pi->memory_tag_needed
623           && tag)
624         {
625           mark_call_clobbered (tag, ESCAPE_IS_GLOBAL);
626           MTAG_GLOBAL (tag) = true;
627         }
628     }
629
630   /* If a pt_anything pointer escaped we need to mark all addressable
631      variables call clobbered.  */
632   if (any_pt_anything)
633     {
634       bitmap_iterator bi;
635       unsigned int j;
636
637       EXECUTE_IF_SET_IN_BITMAP (gimple_addressable_vars (cfun), 0, j, bi)
638         {
639           tree var = referenced_var (j);
640           if (!unmodifiable_var_p (var))
641             mark_call_clobbered (var, pt_anything_mask);
642         }
643     }
644 }
645
646 /* Compute which variables need to be marked call clobbered because
647    their tag is call clobbered, and which tags need to be marked
648    global because they contain global variables.  */
649
650 static void
651 compute_call_clobbered (struct alias_info *ai)
652 {
653   VEC (tree, heap) *worklist = NULL;
654   VEC (int,heap) *worklist2 = NULL;
655   bitmap on_worklist;
656
657   timevar_push (TV_CALL_CLOBBER);
658   on_worklist = BITMAP_ALLOC (NULL);
659     
660   set_initial_properties (ai);
661   init_transitive_clobber_worklist (&worklist, &worklist2, on_worklist);
662   while (VEC_length (tree, worklist) != 0)
663     {
664       tree curr = VEC_pop (tree, worklist);
665       int reason = VEC_pop (int, worklist2);
666
667       bitmap_clear_bit (on_worklist, DECL_UID (curr));
668       mark_call_clobbered (curr, reason);
669       mark_aliases_call_clobbered (curr, &worklist, &worklist2, on_worklist);
670     }
671   VEC_free (tree, heap, worklist);
672   VEC_free (int, heap, worklist2);
673   BITMAP_FREE (on_worklist);
674   compute_tag_properties ();
675   timevar_pop (TV_CALL_CLOBBER);
676 }
677
678
679 /* Dump memory partition information to FILE.  */
680
681 static void
682 dump_memory_partitions (FILE *file)
683 {
684   unsigned i, npart;
685   unsigned long nsyms;
686   tree mpt;
687
688   fprintf (file, "\nMemory partitions\n\n");
689   for (i = 0, npart = 0, nsyms = 0;
690        VEC_iterate (tree, gimple_ssa_operands (cfun)->mpt_table, i, mpt);
691        i++)
692     {
693       if (mpt)
694         {
695           bitmap syms = MPT_SYMBOLS (mpt);
696           unsigned long n = (syms) ? bitmap_count_bits (syms) : 0;
697
698           fprintf (file, "#%u: ", i);
699           print_generic_expr (file, mpt, 0);
700           fprintf (file, ": %lu elements: ", n);
701           dump_decl_set (file, syms);
702           npart++;
703           nsyms += n;
704         }
705     }
706
707   fprintf (file, "\n%u memory partitions holding %lu symbols\n", npart, nsyms);
708 }
709
710
711 /* Dump memory partition information to stderr.  */
712
713 void
714 debug_memory_partitions (void)
715 {
716   dump_memory_partitions (stderr);
717 }
718
719
720 /* Return true if memory partitioning is required given the memory
721    reference estimates in STATS.  */
722
723 static inline bool
724 need_to_partition_p (struct mem_ref_stats_d *stats)
725 {
726   long num_vops = stats->num_vuses + stats->num_vdefs;
727   long avg_vops = CEIL (num_vops, stats->num_mem_stmts);
728   return (num_vops > (long) MAX_ALIASED_VOPS
729           && avg_vops > (long) AVG_ALIASED_VOPS);
730 }
731
732
733 /* Count the actual number of virtual operators in CFUN.  Note that
734    this is only meaningful after virtual operands have been populated,
735    so it should be invoked at the end of compute_may_aliases.
736
737    The number of virtual operators are stored in *NUM_VDEFS_P and
738    *NUM_VUSES_P, the number of partitioned symbols in
739    *NUM_PARTITIONED_P and the number of unpartitioned symbols in
740    *NUM_UNPARTITIONED_P.
741
742    If any of these pointers is NULL the corresponding count is not
743    computed.  */
744
745 static void
746 count_mem_refs (long *num_vuses_p, long *num_vdefs_p,
747                 long *num_partitioned_p, long *num_unpartitioned_p)
748 {
749   gimple_stmt_iterator gsi;
750   basic_block bb;
751   long num_vdefs, num_vuses, num_partitioned, num_unpartitioned;
752   referenced_var_iterator rvi;
753   tree sym;
754
755   num_vuses = num_vdefs = num_partitioned = num_unpartitioned = 0;
756
757   if (num_vuses_p || num_vdefs_p)
758     FOR_EACH_BB (bb)
759       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
760         {
761           gimple stmt = gsi_stmt (gsi);
762           if (gimple_references_memory_p (stmt))
763             {
764               num_vuses += NUM_SSA_OPERANDS (stmt, SSA_OP_VUSE);
765               num_vdefs += NUM_SSA_OPERANDS (stmt, SSA_OP_VDEF);
766             }
767         }
768
769   if (num_partitioned_p || num_unpartitioned_p)
770     FOR_EACH_REFERENCED_VAR (sym, rvi)
771       {
772         if (is_gimple_reg (sym))
773           continue;
774
775         if (memory_partition (sym))
776           num_partitioned++;
777         else
778           num_unpartitioned++;
779       }
780
781   if (num_vdefs_p)
782     *num_vdefs_p = num_vdefs;
783
784   if (num_vuses_p)
785     *num_vuses_p = num_vuses;
786
787   if (num_partitioned_p)
788     *num_partitioned_p = num_partitioned;
789
790   if (num_unpartitioned_p)
791     *num_unpartitioned_p = num_unpartitioned;
792 }
793
794
795 /* The list is sorted by increasing partitioning score (PSCORE).
796    This score is computed such that symbols with high scores are
797    those that are least likely to be partitioned.  Given a symbol
798    MP->VAR, PSCORE(S) is the result of the following weighted sum
799
800    PSCORE(S) =   FW * 64 + FR * 32
801                + DW * 16 + DR *  8 
802                + IW *  4 + IR *  2
803                + NO_ALIAS
804
805    where
806
807    FW           Execution frequency of writes to S
808    FR           Execution frequency of reads from S
809    DW           Number of direct writes to S
810    DR           Number of direct reads from S
811    IW           Number of indirect writes to S
812    IR           Number of indirect reads from S
813    NO_ALIAS     State of the NO_ALIAS* flags
814
815    The basic idea here is that symbols that are frequently
816    written-to in hot paths of the code are the last to be considered
817    for partitioning.  */
818
819 static inline long
820 mem_sym_score (mem_sym_stats_t mp)
821 {
822   return mp->frequency_writes * 64 + mp->frequency_reads * 32
823          + mp->num_direct_writes * 16 + mp->num_direct_reads * 8
824          + mp->num_indirect_writes * 4 + mp->num_indirect_reads * 2
825          + var_ann (mp->var)->noalias_state;
826 }
827
828
829 /* Dump memory reference stats for function CFUN to FILE.  */
830
831 void
832 dump_mem_ref_stats (FILE *file)
833 {
834   long actual_num_vuses, actual_num_vdefs;
835   long num_partitioned, num_unpartitioned;
836   struct mem_ref_stats_d *stats;
837   
838   stats = gimple_mem_ref_stats (cfun);
839
840   count_mem_refs (&actual_num_vuses, &actual_num_vdefs, &num_partitioned,
841                   &num_unpartitioned);
842
843   fprintf (file, "\nMemory reference statistics for %s\n\n", 
844            lang_hooks.decl_printable_name (current_function_decl, 2));
845
846   fprintf (file, "Number of memory statements:     %ld\n",
847            stats->num_mem_stmts);
848   fprintf (file, "Number of call sites:            %ld\n",
849            stats->num_call_sites);
850   fprintf (file, "Number of pure/const call sites: %ld\n",
851            stats->num_pure_const_call_sites);
852   fprintf (file, "Number of asm sites:             %ld\n",
853            stats->num_asm_sites);
854   fprintf (file, "Estimated number of loads:       %ld (%ld/stmt)\n",
855            stats->num_vuses,
856            (stats->num_mem_stmts)
857            ? CEIL (stats->num_vuses, stats->num_mem_stmts)
858            : 0);
859   fprintf (file, "Actual number of loads:          %ld (%ld/stmt)\n",
860            actual_num_vuses, 
861            (stats->num_mem_stmts)
862            ? CEIL (actual_num_vuses, stats->num_mem_stmts)
863            : 0);
864
865   if (actual_num_vuses > stats->num_vuses + (stats->num_vuses / 25))
866     fprintf (file, "\t(warning: estimation is lower by more than 25%%)\n");
867
868   fprintf (file, "Estimated number of stores:      %ld (%ld/stmt)\n",
869            stats->num_vdefs,
870            (stats->num_mem_stmts)
871            ? CEIL (stats->num_vdefs, stats->num_mem_stmts)
872            : 0);
873   fprintf (file, "Actual number of stores:         %ld (%ld/stmt)\n",
874            actual_num_vdefs, 
875            (stats->num_mem_stmts)
876            ? CEIL (actual_num_vdefs, stats->num_mem_stmts)
877            : 0);
878
879   if (actual_num_vdefs > stats->num_vdefs + (stats->num_vdefs / 25))
880     fprintf (file, "\t(warning: estimation is lower by more than 25%%)\n");
881
882   fprintf (file, "Partitioning thresholds:         MAX = %d   AVG = %d "
883            "(%sNEED TO PARTITION)\n", MAX_ALIASED_VOPS, AVG_ALIASED_VOPS,
884            stats->num_mem_stmts && need_to_partition_p (stats) ? "" : "NO ");
885   fprintf (file, "Number of partitioned symbols:   %ld\n", num_partitioned);
886   fprintf (file, "Number of unpartitioned symbols: %ld\n", num_unpartitioned);
887 }
888
889
890 /* Dump memory reference stats for function FN to stderr.  */
891
892 void
893 debug_mem_ref_stats (void)
894 {
895   dump_mem_ref_stats (stderr);
896 }
897
898
899 /* Dump memory reference stats for variable VAR to FILE.  */
900
901 static void
902 dump_mem_sym_stats (FILE *file, tree var)
903 {
904   mem_sym_stats_t stats = mem_sym_stats (cfun, var);
905
906   if (stats == NULL)
907     return;
908
909   fprintf (file, "read frequency: %6ld, write frequency: %6ld, "
910            "direct reads: %3ld, direct writes: %3ld, "
911            "indirect reads: %4ld, indirect writes: %4ld, symbol: ",
912            stats->frequency_reads, stats->frequency_writes,
913            stats->num_direct_reads, stats->num_direct_writes,
914            stats->num_indirect_reads, stats->num_indirect_writes);
915   print_generic_expr (file, stats->var, 0);
916   fprintf (file, ", tags: ");
917   dump_decl_set (file, stats->parent_tags);
918 }
919
920
921 /* Dump memory reference stats for variable VAR to stderr.  */
922
923 void
924 debug_mem_sym_stats (tree var)
925 {
926   dump_mem_sym_stats (stderr, var);
927 }
928
929 /* Dump memory reference stats for variable VAR to FILE.  For use
930    of tree-dfa.c:dump_variable.  */
931
932 void
933 dump_mem_sym_stats_for_var (FILE *file, tree var)
934 {
935   mem_sym_stats_t stats = mem_sym_stats (cfun, var);
936
937   if (stats == NULL)
938     return;
939
940   fprintf (file, ", score: %ld", mem_sym_score (stats));
941   fprintf (file, ", direct reads: %ld", stats->num_direct_reads);
942   fprintf (file, ", direct writes: %ld", stats->num_direct_writes);
943   fprintf (file, ", indirect reads: %ld", stats->num_indirect_reads);
944   fprintf (file, ", indirect writes: %ld", stats->num_indirect_writes);
945 }
946
947 /* Dump memory reference stats for all memory symbols to FILE.  */
948
949 static void
950 dump_all_mem_sym_stats (FILE *file)
951 {
952   referenced_var_iterator rvi;
953   tree sym;
954
955   FOR_EACH_REFERENCED_VAR (sym, rvi)
956     {
957       if (is_gimple_reg (sym))
958         continue;
959
960       dump_mem_sym_stats (file, sym);
961     }
962 }
963
964
965 /* Dump memory reference stats for all memory symbols to stderr.  */
966
967 void
968 debug_all_mem_sym_stats (void)
969 {
970   dump_all_mem_sym_stats (stderr);
971 }
972
973
974 /* Dump the MP_INFO array to FILE.  */
975
976 static void
977 dump_mp_info (FILE *file, VEC(mem_sym_stats_t,heap) *mp_info)
978 {
979   unsigned i;
980   mem_sym_stats_t mp_p;
981
982   for (i = 0; VEC_iterate (mem_sym_stats_t, mp_info, i, mp_p); i++)
983     if (!mp_p->partitioned_p)
984       dump_mem_sym_stats (file, mp_p->var);
985 }
986
987
988 /* Dump the MP_INFO array to stderr.  */
989
990 void
991 debug_mp_info (VEC(mem_sym_stats_t,heap) *mp_info)
992 {
993   dump_mp_info (stderr, mp_info);
994 }
995
996
997 /* Update memory reference stats for symbol VAR in statement STMT.
998    NUM_DIRECT_READS and NUM_DIRECT_WRITES specify the number of times
999    that VAR is read/written in STMT (indirect reads/writes are not
1000    recorded by this function, see compute_memory_partitions).  */
1001
1002 void
1003 update_mem_sym_stats_from_stmt (tree var, gimple stmt, long num_direct_reads,
1004                                 long num_direct_writes)
1005 {
1006   mem_sym_stats_t stats;
1007
1008   gcc_assert (num_direct_reads >= 0 && num_direct_writes >= 0);
1009
1010   stats = get_mem_sym_stats_for (var);
1011
1012   stats->num_direct_reads += num_direct_reads;
1013   stats->frequency_reads += ((long) gimple_bb (stmt)->frequency
1014                              * num_direct_reads);
1015
1016   stats->num_direct_writes += num_direct_writes;
1017   stats->frequency_writes += ((long) gimple_bb (stmt)->frequency
1018                               * num_direct_writes);
1019 }
1020
1021
1022 /* Given two MP_INFO entries MP1 and MP2, return -1 if MP1->VAR should
1023    be partitioned before MP2->VAR, 0 if they are the same or 1 if
1024    MP1->VAR should be partitioned after MP2->VAR.  */
1025
1026 static inline int
1027 compare_mp_info_entries (mem_sym_stats_t mp1, mem_sym_stats_t mp2)
1028 {
1029   long pscore1 = mem_sym_score (mp1);
1030   long pscore2 = mem_sym_score (mp2);
1031
1032   if (pscore1 < pscore2)
1033     return -1;
1034   else if (pscore1 > pscore2)
1035     return 1;
1036   else
1037     return DECL_UID (mp1->var) - DECL_UID (mp2->var);
1038 }
1039
1040
1041 /* Comparison routine for qsort.  The list is sorted by increasing
1042    partitioning score (PSCORE).  This score is computed such that
1043    symbols with high scores are those that are least likely to be
1044    partitioned.  */
1045
1046 static int
1047 mp_info_cmp (const void *p, const void *q)
1048 {
1049   mem_sym_stats_t e1 = *((const mem_sym_stats_t *) p);
1050   mem_sym_stats_t e2 = *((const mem_sym_stats_t *) q);
1051   return compare_mp_info_entries (e1, e2);
1052 }
1053
1054
1055 /* Sort the array of reference counts used to compute memory partitions.
1056    Elements are sorted in ascending order of execution frequency and 
1057    descending order of virtual operators needed.  */
1058
1059 static inline void
1060 sort_mp_info (VEC(mem_sym_stats_t,heap) *list)
1061 {
1062   unsigned num = VEC_length (mem_sym_stats_t, list);
1063
1064   if (num < 2)
1065     return;
1066
1067   if (num == 2)
1068     {
1069       if (compare_mp_info_entries (VEC_index (mem_sym_stats_t, list, 0),
1070                                    VEC_index (mem_sym_stats_t, list, 1)) > 0)
1071         {  
1072           /* Swap elements if they are in the wrong order.  */
1073           mem_sym_stats_t tmp = VEC_index (mem_sym_stats_t, list, 0);
1074           VEC_replace (mem_sym_stats_t, list, 0,
1075                        VEC_index (mem_sym_stats_t, list, 1));
1076           VEC_replace (mem_sym_stats_t, list, 1, tmp);
1077         }
1078
1079       return;
1080     }
1081
1082   /* There are 3 or more elements, call qsort.  */
1083   qsort (VEC_address (mem_sym_stats_t, list),
1084          VEC_length (mem_sym_stats_t, list), 
1085          sizeof (mem_sym_stats_t),
1086          mp_info_cmp);
1087 }
1088
1089
1090 /* Return the memory partition tag (MPT) associated with memory
1091    symbol SYM.  */
1092
1093 static tree
1094 get_mpt_for (tree sym)
1095 {
1096   tree mpt;
1097
1098   /* Don't create a new tag unnecessarily.  */
1099   mpt = memory_partition (sym);
1100   if (mpt == NULL_TREE)
1101     {
1102       mpt = create_tag_raw (MEMORY_PARTITION_TAG, TREE_TYPE (sym), "MPT");
1103       TREE_ADDRESSABLE (mpt) = 0;
1104       add_referenced_var (mpt);
1105       VEC_safe_push (tree, heap, gimple_ssa_operands (cfun)->mpt_table, mpt);
1106       gcc_assert (MPT_SYMBOLS (mpt) == NULL);
1107       set_memory_partition (sym, mpt);
1108     }
1109
1110   return mpt;
1111 }
1112
1113
1114 /* Add MP_P->VAR to a memory partition and return the partition.  */
1115
1116 static tree
1117 find_partition_for (mem_sym_stats_t mp_p)
1118 {
1119   unsigned i;
1120   VEC(tree,heap) *mpt_table;
1121   tree mpt;
1122
1123   mpt_table = gimple_ssa_operands (cfun)->mpt_table;
1124   mpt = NULL_TREE;
1125
1126   /* Find an existing partition for MP_P->VAR.  */
1127   for (i = 0; VEC_iterate (tree, mpt_table, i, mpt); i++)
1128     {
1129       mem_sym_stats_t mpt_stats;
1130
1131       /* If MPT does not have any symbols yet, use it.  */
1132       if (MPT_SYMBOLS (mpt) == NULL)
1133         break;
1134
1135       /* Otherwise, see if MPT has common parent tags with MP_P->VAR,
1136          but avoid grouping clobbered variables with non-clobbered
1137          variables (otherwise, this tends to creates a single memory
1138          partition because other call-clobbered variables may have
1139          common parent tags with non-clobbered ones).  */
1140       mpt_stats = get_mem_sym_stats_for (mpt);
1141       if (mp_p->parent_tags
1142           && mpt_stats->parent_tags
1143           && is_call_clobbered (mpt) == is_call_clobbered (mp_p->var)
1144           && bitmap_intersect_p (mpt_stats->parent_tags, mp_p->parent_tags))
1145         break;
1146
1147       /* If no common parent tags are found, see if both MPT and
1148          MP_P->VAR are call-clobbered.  */
1149       if (is_call_clobbered (mpt) && is_call_clobbered (mp_p->var))
1150         break;
1151     }
1152
1153   if (mpt == NULL_TREE)
1154     mpt = get_mpt_for (mp_p->var);
1155   else
1156     set_memory_partition (mp_p->var, mpt);
1157
1158   mp_p->partitioned_p = true;
1159
1160   mark_sym_for_renaming (mp_p->var);
1161   mark_sym_for_renaming (mpt);
1162
1163   return mpt;
1164 }
1165
1166
1167 /* Rewrite the alias set for TAG to use the newly created partitions.
1168    If TAG is NULL, rewrite the set of call-clobbered variables.
1169    NEW_ALIASES is a scratch bitmap to build the new set of aliases for
1170    TAG.  */
1171
1172 static void
1173 rewrite_alias_set_for (tree tag, bitmap new_aliases)
1174 {
1175   bitmap_iterator bi;
1176   unsigned i;
1177   tree mpt, sym;
1178
1179   EXECUTE_IF_SET_IN_BITMAP (MTAG_ALIASES (tag), 0, i, bi)
1180     {
1181       sym = referenced_var (i);
1182       mpt = memory_partition (sym);
1183       if (mpt)
1184         bitmap_set_bit (new_aliases, DECL_UID (mpt));
1185       else
1186         bitmap_set_bit (new_aliases, DECL_UID (sym));
1187     }
1188
1189   /* Rebuild the may-alias array for TAG.  */
1190   bitmap_copy (MTAG_ALIASES (tag), new_aliases);
1191 }
1192
1193
1194 /* Determine how many virtual operands can be saved by partitioning
1195    MP_P->VAR into MPT.  When a symbol S is thrown inside a partition
1196    P, every virtual operand that used to reference S will now
1197    reference P.  Whether it reduces the number of virtual operands
1198    depends on:
1199
1200    1- Direct references to S are never saved.  Instead of the virtual
1201       operand to S, we will now have a virtual operand to P.
1202
1203    2- Indirect references to S are reduced only for those memory tags
1204       holding S that already had other symbols partitioned into P.
1205       For instance, if a memory tag T has the alias set { a b S c },
1206       the first time we partition S into P, the alias set will become
1207       { a b P c }, so no virtual operands will be saved. However, if
1208       we now partition symbol 'c' into P, then the alias set for T
1209       will become { a b P }, so we will be saving one virtual operand
1210       for every indirect reference to 'c'.
1211
1212    3- Is S is call-clobbered, we save as many virtual operands as
1213       call/asm sites exist in the code, but only if other
1214       call-clobbered symbols have been grouped into P.  The first
1215       call-clobbered symbol that we group does not produce any
1216       savings.
1217
1218    MEM_REF_STATS points to CFUN's memory reference information.  */
1219
1220 static void
1221 estimate_vop_reduction (struct mem_ref_stats_d *mem_ref_stats,
1222                         mem_sym_stats_t mp_p, tree mpt)
1223 {
1224   unsigned i;
1225   bitmap_iterator bi;
1226   mem_sym_stats_t mpt_stats;
1227
1228   /* We should only get symbols with indirect references here.  */
1229   gcc_assert (mp_p->num_indirect_reads > 0 || mp_p->num_indirect_writes > 0);
1230
1231   /* Note that the only statistics we keep for MPT is the set of
1232      parent tags to know which memory tags have had alias members
1233      partitioned, and the indicator has_call_clobbered_vars.
1234      Reference counts are not important for MPT.  */
1235   mpt_stats = get_mem_sym_stats_for (mpt);
1236
1237   /* Traverse all the parent tags for MP_P->VAR.  For every tag T, if
1238      partition P is already grouping aliases of T, then reduce the
1239      number of virtual operands by the number of direct references
1240      to T.  */
1241   if (mp_p->parent_tags)
1242     {
1243       if (mpt_stats->parent_tags == NULL)
1244         mpt_stats->parent_tags = BITMAP_ALLOC (&alias_bitmap_obstack);
1245
1246       EXECUTE_IF_SET_IN_BITMAP (mp_p->parent_tags, 0, i, bi)
1247         {
1248           if (bitmap_bit_p (mpt_stats->parent_tags, i))
1249             {
1250               /* Partition MPT is already partitioning symbols in the
1251                  alias set for TAG.  This means that we are now saving
1252                  1 virtual operand for every direct reference to TAG.  */
1253               tree tag = referenced_var (i);
1254               mem_sym_stats_t tag_stats = mem_sym_stats (cfun, tag);
1255               mem_ref_stats->num_vuses -= tag_stats->num_direct_reads;
1256               mem_ref_stats->num_vdefs -= tag_stats->num_direct_writes;
1257             }
1258           else
1259             {
1260               /* This is the first symbol in tag I's alias set that is
1261                  being grouped under MPT.  We will not save any
1262                  virtual operands this time, but record that MPT is
1263                  grouping a symbol from TAG's alias set so that the
1264                  next time we get the savings.  */
1265               bitmap_set_bit (mpt_stats->parent_tags, i);
1266             }
1267         }
1268     }
1269
1270   /* If MP_P->VAR is call-clobbered, and MPT is already grouping
1271      call-clobbered symbols, then we will save as many virtual
1272      operands as asm/call sites there are.  */
1273   if (is_call_clobbered (mp_p->var))
1274     {
1275       if (mpt_stats->has_call_clobbered_vars)
1276         mem_ref_stats->num_vdefs -= mem_ref_stats->num_call_sites
1277                                     + mem_ref_stats->num_asm_sites;
1278       else
1279         mpt_stats->has_call_clobbered_vars = true;
1280     }
1281 }
1282
1283
1284 /* Helper for compute_memory_partitions.  Transfer reference counts
1285    from pointers to their pointed-to sets.  Counters for pointers were
1286    computed by update_alias_info.  MEM_REF_STATS points to CFUN's
1287    memory reference information.  */
1288
1289 static void
1290 update_reference_counts (struct mem_ref_stats_d *mem_ref_stats)
1291 {
1292   unsigned i;
1293   bitmap_iterator bi;
1294   mem_sym_stats_t sym_stats;
1295
1296   for (i = 1; i < num_ssa_names; i++)
1297     {
1298       tree ptr;
1299       struct ptr_info_def *pi;
1300
1301       ptr = ssa_name (i);
1302       if (ptr
1303           && POINTER_TYPE_P (TREE_TYPE (ptr))
1304           && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
1305           && pi->memory_tag_needed)
1306         {
1307           unsigned j;
1308           bitmap_iterator bj;
1309           tree tag;
1310           mem_sym_stats_t ptr_stats, tag_stats;
1311
1312           /* If PTR has flow-sensitive points-to information, use
1313              PTR's name tag, otherwise use the symbol tag associated
1314              with PTR's symbol.  */
1315           if (pi->name_mem_tag)
1316             tag = pi->name_mem_tag;
1317           else
1318             tag = symbol_mem_tag (SSA_NAME_VAR (ptr));
1319
1320           ptr_stats = get_mem_sym_stats_for (ptr);
1321           tag_stats = get_mem_sym_stats_for (tag);
1322
1323           /* TAG has as many direct references as dereferences we
1324              found for its parent pointer.  */
1325           tag_stats->num_direct_reads += ptr_stats->num_direct_reads;
1326           tag_stats->num_direct_writes += ptr_stats->num_direct_writes;
1327
1328           /* All the dereferences of pointer PTR are considered direct
1329              references to PTR's memory tag (TAG).  In turn,
1330              references to TAG will become virtual operands for every
1331              symbol in TAG's alias set.  So, for every symbol ALIAS in
1332              TAG's alias set, add as many indirect references to ALIAS
1333              as direct references there are for TAG.  */
1334           if (MTAG_ALIASES (tag))
1335             EXECUTE_IF_SET_IN_BITMAP (MTAG_ALIASES (tag), 0, j, bj)
1336               {
1337                 tree alias = referenced_var (j);
1338                 sym_stats = get_mem_sym_stats_for (alias);
1339
1340                 /* All the direct references to TAG are indirect references
1341                    to ALIAS.  */
1342                 sym_stats->num_indirect_reads += ptr_stats->num_direct_reads;
1343                 sym_stats->num_indirect_writes += ptr_stats->num_direct_writes;
1344                 sym_stats->frequency_reads += ptr_stats->frequency_reads;
1345                 sym_stats->frequency_writes += ptr_stats->frequency_writes;
1346
1347                 /* Indicate that TAG is one of ALIAS's parent tags.  */
1348                 if (sym_stats->parent_tags == NULL)
1349                   sym_stats->parent_tags = BITMAP_ALLOC (&alias_bitmap_obstack);
1350                 bitmap_set_bit (sym_stats->parent_tags, DECL_UID (tag));
1351               }
1352         }
1353     }
1354
1355   /* Call-clobbered symbols are indirectly written at every
1356      call/asm site.  */
1357   EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, i, bi)
1358     {
1359       tree sym = referenced_var (i);
1360       sym_stats = get_mem_sym_stats_for (sym);
1361       sym_stats->num_indirect_writes += mem_ref_stats->num_call_sites
1362                                         + mem_ref_stats->num_asm_sites;
1363     }
1364
1365   /* Addressable symbols are indirectly written at some ASM sites.
1366      Since only ASM sites that clobber memory actually affect
1367      addressable symbols, this is an over-estimation.  */
1368   EXECUTE_IF_SET_IN_BITMAP (gimple_addressable_vars (cfun), 0, i, bi)
1369     {
1370       tree sym = referenced_var (i);
1371       sym_stats = get_mem_sym_stats_for (sym);
1372       sym_stats->num_indirect_writes += mem_ref_stats->num_asm_sites;
1373     }
1374 }
1375
1376
1377 /* Helper for compute_memory_partitions.  Add all memory symbols to
1378    *MP_INFO_P and compute the initial estimate for the total number of
1379    virtual operands needed.  MEM_REF_STATS points to CFUN's memory
1380    reference information.  On exit, *TAGS_P will contain the list of
1381    memory tags whose alias set need to be rewritten after
1382    partitioning.  */
1383
1384 static void
1385 build_mp_info (struct mem_ref_stats_d *mem_ref_stats,
1386                VEC(mem_sym_stats_t,heap) **mp_info_p,
1387                VEC(tree,heap) **tags_p)
1388 {
1389   tree var;
1390   referenced_var_iterator rvi;
1391
1392   FOR_EACH_REFERENCED_VAR (var, rvi)
1393     {
1394       mem_sym_stats_t sym_stats;
1395       tree old_mpt;
1396
1397       /* We are only interested in memory symbols other than MPTs.  */
1398       if (is_gimple_reg (var) || TREE_CODE (var) == MEMORY_PARTITION_TAG)
1399         continue;
1400
1401       /* Collect memory tags into the TAGS array so that we can
1402          rewrite their alias sets after partitioning.  */
1403       if (MTAG_P (var) && MTAG_ALIASES (var))
1404         VEC_safe_push (tree, heap, *tags_p, var);
1405
1406       /* Since we are going to re-compute partitions, any symbols that
1407          used to belong to a partition must be detached from it and
1408          marked for renaming.  */
1409       if ((old_mpt = memory_partition (var)) != NULL)
1410         {
1411           mark_sym_for_renaming (old_mpt);
1412           set_memory_partition (var, NULL_TREE);
1413           mark_sym_for_renaming (var);
1414         }
1415
1416       sym_stats = get_mem_sym_stats_for (var);
1417
1418       /* Add VAR's reference info to MP_INFO.  Note that the only
1419          symbols that make sense to partition are those that have
1420          indirect references.  If a symbol S is always directly
1421          referenced, partitioning it will not reduce the number of
1422          virtual operators.  The only symbols that are profitable to
1423          partition are those that belong to alias sets and/or are
1424          call-clobbered.  */
1425       if (sym_stats->num_indirect_reads > 0
1426           || sym_stats->num_indirect_writes > 0)
1427         VEC_safe_push (mem_sym_stats_t, heap, *mp_info_p, sym_stats);
1428
1429       /* Update the number of estimated VOPS.  Note that direct
1430          references to memory tags are always counted as indirect
1431          references to their alias set members, so if a memory tag has
1432          aliases, do not count its direct references to avoid double
1433          accounting.  */
1434       if (!MTAG_P (var) || !MTAG_ALIASES (var))
1435         {
1436           mem_ref_stats->num_vuses += sym_stats->num_direct_reads;
1437           mem_ref_stats->num_vdefs += sym_stats->num_direct_writes;
1438         }
1439
1440       mem_ref_stats->num_vuses += sym_stats->num_indirect_reads;
1441       mem_ref_stats->num_vdefs += sym_stats->num_indirect_writes;
1442     }
1443 }
1444
1445
1446 /* Compute memory partitions.  A memory partition (MPT) is an
1447    arbitrary grouping of memory symbols, such that references to one
1448    member of the group is considered a reference to all the members of
1449    the group.
1450    
1451    As opposed to alias sets in memory tags, the grouping into
1452    partitions is completely arbitrary and only done to reduce the
1453    number of virtual operands.  The only rule that needs to be
1454    observed when creating memory partitions is that given two memory
1455    partitions MPT.i and MPT.j, they must not contain symbols in
1456    common.
1457
1458    Memory partitions are used when putting the program into Memory-SSA
1459    form.  In particular, in Memory-SSA PHI nodes are not computed for
1460    individual memory symbols.  They are computed for memory
1461    partitions.  This reduces the amount of PHI nodes in the SSA graph
1462    at the expense of precision (i.e., it makes unrelated stores affect
1463    each other).
1464    
1465    However, it is possible to increase precision by changing this
1466    partitioning scheme.  For instance, if the partitioning scheme is
1467    such that get_mpt_for is the identity function (that is,
1468    get_mpt_for (s) = s), this will result in ultimate precision at the
1469    expense of huge SSA webs.
1470
1471    At the other extreme, a partitioning scheme that groups all the
1472    symbols in the same set results in minimal SSA webs and almost
1473    total loss of precision.
1474
1475    There partitioning heuristic uses three parameters to decide the
1476    order in which symbols are processed.  The list of symbols is
1477    sorted so that symbols that are more likely to be partitioned are
1478    near the top of the list:
1479
1480    - Execution frequency.  If a memory references is in a frequently
1481      executed code path, grouping it into a partition may block useful
1482      transformations and cause sub-optimal code generation.  So, the
1483      partition heuristic tries to avoid grouping symbols with high
1484      execution frequency scores.  Execution frequency is taken
1485      directly from the basic blocks where every reference is made (see
1486      update_mem_sym_stats_from_stmt), which in turn uses the
1487      profile guided machinery, so if the program is compiled with PGO
1488      enabled, more accurate partitioning decisions will be made.
1489
1490    - Number of references.  Symbols with few references in the code,
1491      are partitioned before symbols with many references.
1492
1493    - NO_ALIAS attributes.  Symbols with any of the NO_ALIAS*
1494      attributes are partitioned after symbols marked MAY_ALIAS.
1495
1496    Once the list is sorted, the partitioning proceeds as follows:
1497
1498    1- For every symbol S in MP_INFO, create a new memory partition MP,
1499       if necessary.  To avoid memory partitions that contain symbols
1500       from non-conflicting alias sets, memory partitions are
1501       associated to the memory tag that holds S in its alias set.  So,
1502       when looking for a memory partition for S, the memory partition
1503       associated with one of the memory tags holding S is chosen.  If
1504       none exists, a new one is created.
1505
1506    2- Add S to memory partition MP.
1507
1508    3- Reduce by 1 the number of VOPS for every memory tag holding S.
1509
1510    4- If the total number of VOPS is less than MAX_ALIASED_VOPS or the
1511       average number of VOPS per statement is less than
1512       AVG_ALIASED_VOPS, stop.  Otherwise, go to the next symbol in the
1513       list.  */
1514
1515 static void
1516 compute_memory_partitions (void)
1517 {
1518   tree tag;
1519   unsigned i;
1520   mem_sym_stats_t mp_p;
1521   VEC(mem_sym_stats_t,heap) *mp_info;
1522   bitmap new_aliases;
1523   VEC(tree,heap) *tags;
1524   struct mem_ref_stats_d *mem_ref_stats;
1525   int prev_max_aliased_vops;
1526
1527   mem_ref_stats = gimple_mem_ref_stats (cfun);
1528   gcc_assert (mem_ref_stats->num_vuses == 0 && mem_ref_stats->num_vdefs == 0);
1529
1530   if (mem_ref_stats->num_mem_stmts == 0)
1531     return;
1532
1533   timevar_push (TV_MEMORY_PARTITIONING);
1534
1535   mp_info = NULL;
1536   tags = NULL;
1537   prev_max_aliased_vops = MAX_ALIASED_VOPS;
1538
1539   /* Since we clearly cannot lower the number of virtual operators
1540      below the total number of memory statements in the function, we
1541      may need to adjust MAX_ALIASED_VOPS beforehand.  */
1542   if (MAX_ALIASED_VOPS < mem_ref_stats->num_mem_stmts)
1543     MAX_ALIASED_VOPS = mem_ref_stats->num_mem_stmts;
1544
1545   /* Update reference stats for all the pointed-to variables and
1546      memory tags.  */
1547   update_reference_counts (mem_ref_stats);
1548
1549   /* Add all the memory symbols to MP_INFO.  */
1550   build_mp_info (mem_ref_stats, &mp_info, &tags);
1551
1552   /* No partitions required if we are below the threshold.  */
1553   if (!need_to_partition_p (mem_ref_stats))
1554     {
1555       if (dump_file)
1556         fprintf (dump_file, "\nMemory partitioning NOT NEEDED for %s\n",
1557                  get_name (current_function_decl));
1558       goto done;
1559     }
1560
1561   /* Sort the MP_INFO array so that symbols that should be partitioned
1562      first are near the top of the list.  */
1563   sort_mp_info (mp_info);
1564
1565   if (dump_file)
1566     {
1567       fprintf (dump_file, "\nMemory partitioning NEEDED for %s\n\n",
1568                get_name (current_function_decl));
1569       fprintf (dump_file, "Memory symbol references before partitioning:\n");
1570       dump_mp_info (dump_file, mp_info);
1571     }
1572
1573   /* Create partitions for variables in MP_INFO until we have enough
1574      to lower the total number of VOPS below MAX_ALIASED_VOPS or if
1575      the average number of VOPS per statement is below
1576      AVG_ALIASED_VOPS.  */
1577   for (i = 0; VEC_iterate (mem_sym_stats_t, mp_info, i, mp_p); i++)
1578     {
1579       tree mpt;
1580
1581       /* If we are below the threshold, stop.  */
1582       if (!need_to_partition_p (mem_ref_stats))
1583         break;
1584
1585       mpt = find_partition_for (mp_p);
1586       estimate_vop_reduction (mem_ref_stats, mp_p, mpt);
1587     }
1588
1589   /* After partitions have been created, rewrite alias sets to use
1590      them instead of the original symbols.  This way, if the alias set
1591      was computed as { a b c d e f }, and the subset { b e f } was
1592      grouped into partition MPT.3, then the new alias set for the tag
1593      will be  { a c d MPT.3 }.
1594      
1595      Note that this is not strictly necessary.  The operand scanner
1596      will always check if a symbol belongs to a partition when adding
1597      virtual operands.  However, by reducing the size of the alias
1598      sets to be scanned, the work needed inside the operand scanner is
1599      significantly reduced.  */
1600   new_aliases = BITMAP_ALLOC (&alias_bitmap_obstack);
1601
1602   for (i = 0; VEC_iterate (tree, tags, i, tag); i++)
1603     {
1604       rewrite_alias_set_for (tag, new_aliases);
1605       bitmap_clear (new_aliases);
1606     }
1607
1608   BITMAP_FREE (new_aliases);
1609
1610   if (dump_file)
1611     {
1612       fprintf (dump_file, "\nMemory symbol references after partitioning:\n");
1613       dump_mp_info (dump_file, mp_info);
1614     }
1615
1616 done:
1617   /* Free allocated memory.  */
1618   VEC_free (mem_sym_stats_t, heap, mp_info);
1619   VEC_free (tree, heap, tags);
1620
1621   MAX_ALIASED_VOPS = prev_max_aliased_vops;
1622
1623   timevar_pop (TV_MEMORY_PARTITIONING);
1624 }
1625
1626 /* Compute may-alias information for every variable referenced in function
1627    FNDECL.
1628
1629    Alias analysis proceeds in 3 main phases:
1630
1631    1- Points-to and escape analysis.
1632
1633    This phase walks the use-def chains in the SSA web looking for three
1634    things:
1635
1636         * Assignments of the form P_i = &VAR
1637         * Assignments of the form P_i = malloc()
1638         * Pointers and ADDR_EXPR that escape the current function.
1639
1640    The concept of 'escaping' is the same one used in the Java world.  When
1641    a pointer or an ADDR_EXPR escapes, it means that it has been exposed
1642    outside of the current function.  So, assignment to global variables,
1643    function arguments and returning a pointer are all escape sites, as are
1644    conversions between pointers and integers.
1645
1646    This is where we are currently limited.  Since not everything is renamed
1647    into SSA, we lose track of escape properties when a pointer is stashed
1648    inside a field in a structure, for instance.  In those cases, we are
1649    assuming that the pointer does escape.
1650
1651    We use escape analysis to determine whether a variable is
1652    call-clobbered.  Simply put, if an ADDR_EXPR escapes, then the variable
1653    is call-clobbered.  If a pointer P_i escapes, then all the variables
1654    pointed-to by P_i (and its memory tag) also escape.
1655
1656    2- Compute flow-sensitive aliases
1657
1658    We have two classes of memory tags.  Memory tags associated with the
1659    pointed-to data type of the pointers in the program.  These tags are
1660    called "symbol memory tag" (SMT).  The other class are those associated
1661    with SSA_NAMEs, called "name memory tag" (NMT). The basic idea is that
1662    when adding operands for an INDIRECT_REF *P_i, we will first check
1663    whether P_i has a name tag, if it does we use it, because that will have
1664    more precise aliasing information.  Otherwise, we use the standard symbol
1665    tag.
1666
1667    In this phase, we go through all the pointers we found in points-to
1668    analysis and create alias sets for the name memory tags associated with
1669    each pointer P_i.  If P_i escapes, we mark call-clobbered the variables
1670    it points to and its tag.
1671
1672
1673    3- Compute flow-insensitive aliases
1674
1675    This pass will compare the alias set of every symbol memory tag and
1676    every addressable variable found in the program.  Given a symbol
1677    memory tag SMT and an addressable variable V.  If the alias sets of
1678    SMT and V conflict (as computed by may_alias_p), then V is marked
1679    as an alias tag and added to the alias set of SMT.
1680
1681    For instance, consider the following function:
1682
1683             foo (int i)
1684             {
1685               int *p, a, b;
1686             
1687               if (i > 10)
1688                 p = &a;
1689               else
1690                 p = &b;
1691             
1692               *p = 3;
1693               a = b + 2;
1694               return *p;
1695             }
1696
1697    After aliasing analysis has finished, the symbol memory tag for pointer
1698    'p' will have two aliases, namely variables 'a' and 'b'.  Every time
1699    pointer 'p' is dereferenced, we want to mark the operation as a
1700    potential reference to 'a' and 'b'.
1701
1702             foo (int i)
1703             {
1704               int *p, a, b;
1705
1706               if (i_2 > 10)
1707                 p_4 = &a;
1708               else
1709                 p_6 = &b;
1710               # p_1 = PHI <p_4(1), p_6(2)>;
1711
1712               # a_7 = VDEF <a_3>;
1713               # b_8 = VDEF <b_5>;
1714               *p_1 = 3;
1715
1716               # a_9 = VDEF <a_7>
1717               # VUSE <b_8>
1718               a_9 = b_8 + 2;
1719
1720               # VUSE <a_9>;
1721               # VUSE <b_8>;
1722               return *p_1;
1723             }
1724
1725    In certain cases, the list of may aliases for a pointer may grow too
1726    large.  This may cause an explosion in the number of virtual operands
1727    inserted in the code.  Resulting in increased memory consumption and
1728    compilation time.
1729
1730    When the number of virtual operands needed to represent aliased
1731    loads and stores grows too large (configurable with option --param
1732    max-aliased-vops and --param avg-aliased-vops), alias sets are
1733    grouped to avoid severe compile-time slow downs and memory
1734    consumption. See compute_memory_partitions.  */
1735
1736 unsigned int
1737 compute_may_aliases (void)
1738 {
1739   struct alias_info *ai;
1740
1741   timevar_push (TV_TREE_MAY_ALIAS);
1742   
1743   memset (&alias_stats, 0, sizeof (alias_stats));
1744
1745   /* Initialize aliasing information.  */
1746   ai = init_alias_info ();
1747
1748   /* For each pointer P_i, determine the sets of variables that P_i may
1749      point-to.  For every addressable variable V, determine whether the
1750      address of V escapes the current function, making V call-clobbered
1751      (i.e., whether &V is stored in a global variable or if its passed as a
1752      function call argument).  */
1753   compute_points_to_sets ();
1754
1755   /* Update various related attributes like escaped addresses,
1756      pointer dereferences for loads and stores.  This is used
1757      when creating name tags and alias sets.  */
1758   update_alias_info (ai);
1759
1760   /* Collect all pointers and addressable variables, compute alias sets,
1761      create memory tags for pointers and promote variables whose address is
1762      not needed anymore.  */
1763   setup_pointers_and_addressables (ai);
1764
1765   /* Compute type-based flow-insensitive aliasing for all the type
1766      memory tags.  */
1767   compute_flow_insensitive_aliasing (ai);
1768
1769   /* Compute flow-sensitive, points-to based aliasing for all the name
1770      memory tags.  */
1771   compute_flow_sensitive_aliasing (ai);
1772   
1773   /* Compute call clobbering information.  */
1774   compute_call_clobbered (ai);
1775
1776   /* If the program makes no reference to global variables, but it
1777      contains a mixture of pure and non-pure functions, then we need
1778      to create use-def and def-def links between these functions to
1779      avoid invalid transformations on them.  */
1780   maybe_create_global_var ();
1781
1782   /* Compute memory partitions for every memory variable.  */
1783   compute_memory_partitions ();
1784
1785   /* Remove partitions with no symbols.  Partitions may end up with an
1786      empty MPT_SYMBOLS set if a previous round of alias analysis
1787      needed to partition more symbols.  Since we don't need those
1788      partitions anymore, remove them to free up the space.  */
1789   {
1790     tree mpt;
1791     unsigned i;
1792     VEC(tree,heap) *mpt_table;
1793
1794     mpt_table = gimple_ssa_operands (cfun)->mpt_table;
1795     i = 0;
1796     while (i < VEC_length (tree, mpt_table))
1797       {
1798         mpt = VEC_index (tree, mpt_table, i);
1799         if (MPT_SYMBOLS (mpt) == NULL)
1800           VEC_unordered_remove (tree, mpt_table, i);
1801         else
1802           i++;
1803       }
1804   }
1805
1806   /* Populate all virtual operands and newly promoted register operands.  */
1807   {
1808     gimple_stmt_iterator gsi;
1809     basic_block bb;
1810     FOR_EACH_BB (bb)
1811       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1812         update_stmt_if_modified (gsi_stmt (gsi));
1813   }
1814
1815   /* Debugging dumps.  */
1816   if (dump_file)
1817     {
1818       dump_mem_ref_stats (dump_file);
1819       dump_alias_info (dump_file);
1820       dump_points_to_info (dump_file);
1821
1822       if (dump_flags & TDF_STATS)
1823         dump_alias_stats (dump_file);
1824
1825       if (dump_flags & TDF_DETAILS)
1826         dump_referenced_vars (dump_file);
1827     }
1828
1829   /* Deallocate memory used by aliasing data structures.  */
1830   delete_alias_info (ai);
1831
1832   if (need_ssa_update_p ())
1833     update_ssa (TODO_update_ssa);
1834
1835   timevar_pop (TV_TREE_MAY_ALIAS);
1836   
1837   return 0;
1838 }
1839
1840 /* Data structure used to count the number of dereferences to PTR
1841    inside an expression.  */
1842 struct count_ptr_d
1843 {
1844   tree ptr;
1845   unsigned num_stores;
1846   unsigned num_loads;
1847 };
1848
1849
1850 /* Helper for count_uses_and_derefs.  Called by walk_tree to look for
1851    (ALIGN/MISALIGNED_)INDIRECT_REF nodes for the pointer passed in DATA.  */
1852
1853 static tree
1854 count_ptr_derefs (tree *tp, int *walk_subtrees, void *data)
1855 {
1856   struct walk_stmt_info *wi_p = (struct walk_stmt_info *) data;
1857   struct count_ptr_d *count_p = (struct count_ptr_d *) wi_p->info;
1858
1859   /* Do not walk inside ADDR_EXPR nodes.  In the expression &ptr->fld,
1860      pointer 'ptr' is *not* dereferenced, it is simply used to compute
1861      the address of 'fld' as 'ptr + offsetof(fld)'.  */
1862   if (TREE_CODE (*tp) == ADDR_EXPR)
1863     {
1864       *walk_subtrees = 0;
1865       return NULL_TREE;
1866     }
1867
1868   if (INDIRECT_REF_P (*tp) && TREE_OPERAND (*tp, 0) == count_p->ptr)
1869     {
1870       if (wi_p->is_lhs)
1871         count_p->num_stores++;
1872       else
1873         count_p->num_loads++;
1874     }
1875
1876   return NULL_TREE;
1877 }
1878
1879
1880 /* Count the number of direct and indirect uses for pointer PTR in
1881    statement STMT.  The number of direct uses is stored in
1882    *NUM_USES_P.  Indirect references are counted separately depending
1883    on whether they are store or load operations.  The counts are
1884    stored in *NUM_STORES_P and *NUM_LOADS_P.  */
1885
1886 void
1887 count_uses_and_derefs (tree ptr, gimple stmt, unsigned *num_uses_p,
1888                        unsigned *num_loads_p, unsigned *num_stores_p)
1889 {
1890   ssa_op_iter i;
1891   tree use;
1892
1893   *num_uses_p = 0;
1894   *num_loads_p = 0;
1895   *num_stores_p = 0;
1896
1897   /* Find out the total number of uses of PTR in STMT.  */
1898   FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
1899     if (use == ptr)
1900       (*num_uses_p)++;
1901
1902   /* Now count the number of indirect references to PTR.  This is
1903      truly awful, but we don't have much choice.  There are no parent
1904      pointers inside INDIRECT_REFs, so an expression like
1905      '*x_1 = foo (x_1, *x_1)' needs to be traversed piece by piece to
1906      find all the indirect and direct uses of x_1 inside.  The only
1907      shortcut we can take is the fact that GIMPLE only allows
1908      INDIRECT_REFs inside the expressions below.  */
1909   if (is_gimple_assign (stmt)
1910       || gimple_code (stmt) == GIMPLE_RETURN
1911       || gimple_code (stmt) == GIMPLE_ASM
1912       || is_gimple_call (stmt))
1913     {
1914       struct walk_stmt_info wi;
1915       struct count_ptr_d count;
1916
1917       count.ptr = ptr;
1918       count.num_stores = 0;
1919       count.num_loads = 0;
1920
1921       memset (&wi, 0, sizeof (wi));
1922       wi.info = &count;
1923       walk_gimple_op (stmt, count_ptr_derefs, &wi);
1924
1925       *num_stores_p = count.num_stores;
1926       *num_loads_p = count.num_loads;
1927     }
1928
1929   gcc_assert (*num_uses_p >= *num_loads_p + *num_stores_p);
1930 }
1931
1932 /* Remove memory references stats for function FN.  */
1933
1934 void
1935 delete_mem_ref_stats (struct function *fn)
1936 {
1937   if (gimple_mem_ref_stats (fn)->mem_sym_stats)
1938     {
1939       free_alloc_pool (mem_sym_stats_pool);
1940       pointer_map_destroy (gimple_mem_ref_stats (fn)->mem_sym_stats);
1941     }
1942   gimple_mem_ref_stats (fn)->mem_sym_stats = NULL;
1943 }
1944
1945
1946 /* Initialize memory reference stats.  */
1947
1948 static void
1949 init_mem_ref_stats (void)
1950 {
1951   struct mem_ref_stats_d *mem_ref_stats = gimple_mem_ref_stats (cfun);
1952
1953   mem_sym_stats_pool = create_alloc_pool ("Mem sym stats",
1954                                           sizeof (struct mem_sym_stats_d),
1955                                           100);
1956   memset (mem_ref_stats, 0, sizeof (struct mem_ref_stats_d));
1957   mem_ref_stats->mem_sym_stats = pointer_map_create ();
1958 }
1959
1960
1961 /* Helper for init_alias_info.  Reset existing aliasing information.  */
1962
1963 static void
1964 reset_alias_info (void)
1965 {
1966   referenced_var_iterator rvi;
1967   tree var;
1968   unsigned i;
1969   bitmap active_nmts, all_nmts;
1970
1971   /* Clear the set of addressable variables.  We do not need to clear
1972      the TREE_ADDRESSABLE bit on every symbol because we are going to
1973      re-compute addressability here.  */
1974   bitmap_clear (gimple_addressable_vars (cfun));
1975
1976   active_nmts = BITMAP_ALLOC (&alias_bitmap_obstack);
1977   all_nmts = BITMAP_ALLOC (&alias_bitmap_obstack);
1978
1979   /* Clear flow-insensitive alias information from each symbol.  */
1980   FOR_EACH_REFERENCED_VAR (var, rvi)
1981     {
1982       if (is_gimple_reg (var))
1983         continue;
1984
1985       if (MTAG_P (var))
1986         MTAG_ALIASES (var) = NULL;
1987
1988       /* Memory partition information will be computed from scratch.  */
1989       if (TREE_CODE (var) == MEMORY_PARTITION_TAG)
1990         MPT_SYMBOLS (var) = NULL;
1991
1992       /* Collect all the name tags to determine if we have any
1993          orphaned that need to be removed from the IL.  A name tag
1994          will be orphaned if it is not associated with any active SSA
1995          name.  */
1996       if (TREE_CODE (var) == NAME_MEMORY_TAG)
1997         bitmap_set_bit (all_nmts, DECL_UID (var));
1998
1999       /* Since we are about to re-discover call-clobbered
2000          variables, clear the call-clobbered flag.  */
2001       clear_call_clobbered (var);
2002     }
2003
2004   /* There should be no call-clobbered variable left.  */
2005   gcc_assert (bitmap_empty_p (gimple_call_clobbered_vars (cfun)));
2006
2007   /* Clear the call-used variables.  */
2008   bitmap_clear (gimple_call_used_vars (cfun));
2009
2010   /* Clear flow-sensitive points-to information from each SSA name.  */
2011   for (i = 1; i < num_ssa_names; i++)
2012     {
2013       tree name = ssa_name (i);
2014
2015       if (!name || !POINTER_TYPE_P (TREE_TYPE (name)))
2016         continue;
2017
2018       if (SSA_NAME_PTR_INFO (name))
2019         {
2020           struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
2021
2022           /* Clear all the flags but keep the name tag to
2023              avoid creating new temporaries unnecessarily.  If
2024              this pointer is found to point to a subset or
2025              superset of its former points-to set, then a new
2026              tag will need to be created in create_name_tags.  */
2027           pi->pt_anything = 0;
2028           pi->pt_null = 0;
2029           pi->value_escapes_p = 0;
2030           pi->memory_tag_needed = 0;
2031           pi->is_dereferenced = 0;
2032           if (pi->pt_vars)
2033             bitmap_clear (pi->pt_vars);
2034
2035           /* Add NAME's name tag to the set of active tags.  */
2036           if (pi->name_mem_tag)
2037             bitmap_set_bit (active_nmts, DECL_UID (pi->name_mem_tag));
2038         }
2039     }
2040
2041   /* Name memory tags that are no longer associated with an SSA name
2042      are considered stale and should be removed from the IL.  All the
2043      name tags that are in the set ALL_NMTS but not in ACTIVE_NMTS are
2044      considered stale and marked for renaming.  */
2045   bitmap_and_compl_into (all_nmts, active_nmts);
2046   mark_set_for_renaming (all_nmts);
2047
2048   BITMAP_FREE (all_nmts);
2049   BITMAP_FREE (active_nmts);
2050 }
2051
2052
2053 /* Initialize the data structures used for alias analysis.  */
2054
2055 static struct alias_info *
2056 init_alias_info (void)
2057 {
2058   struct alias_info *ai;
2059   referenced_var_iterator rvi;
2060   tree var;
2061   static bool alias_bitmap_obstack_initialized;
2062
2063   ai = XCNEW (struct alias_info);
2064   ai->ssa_names_visited = sbitmap_alloc (num_ssa_names);
2065   sbitmap_zero (ai->ssa_names_visited);
2066   ai->processed_ptrs = VEC_alloc (tree, heap, 50);
2067   ai->dereferenced_ptrs = pointer_set_create ();
2068
2069   /* Clear out all memory reference stats.  */
2070   init_mem_ref_stats ();
2071
2072   /* If aliases have been computed before, clear existing information.  */
2073   if (gimple_aliases_computed_p (cfun))
2074     reset_alias_info ();
2075   else
2076     {
2077       /* If this is the first time we compute aliasing information,
2078          every non-register symbol will need to be put into SSA form
2079          (the initial SSA form only operates on GIMPLE registers).  */
2080       FOR_EACH_REFERENCED_VAR (var, rvi)
2081         if (!is_gimple_reg (var))
2082           mark_sym_for_renaming (var);
2083     }
2084
2085   /* Next time, we will need to reset alias information.  */
2086   cfun->gimple_df->aliases_computed_p = true;
2087   if (alias_bitmap_obstack_initialized)
2088     bitmap_obstack_release (&alias_bitmap_obstack);    
2089   bitmap_obstack_initialize (&alias_bitmap_obstack);
2090   alias_bitmap_obstack_initialized = true;
2091
2092   return ai;
2093 }
2094
2095
2096 /* Deallocate memory used by alias analysis.  */
2097
2098 static void
2099 delete_alias_info (struct alias_info *ai)
2100 {
2101   size_t i;
2102
2103   sbitmap_free (ai->ssa_names_visited);
2104
2105   VEC_free (tree, heap, ai->processed_ptrs);
2106
2107   for (i = 0; i < ai->num_addressable_vars; i++)
2108     free (ai->addressable_vars[i]);
2109   free (ai->addressable_vars);
2110   
2111   for (i = 0; i < ai->num_pointers; i++)
2112     free (ai->pointers[i]);
2113   free (ai->pointers);
2114
2115   pointer_set_destroy (ai->dereferenced_ptrs);
2116   free (ai);
2117
2118   delete_mem_ref_stats (cfun);
2119   delete_points_to_sets ();
2120 }
2121
2122
2123 /* Used for hashing to identify pointer infos with identical
2124    pt_vars bitmaps.  */
2125
2126 static int
2127 eq_ptr_info (const void *p1, const void *p2)
2128 {
2129   const struct ptr_info_def *n1 = (const struct ptr_info_def *) p1;
2130   const struct ptr_info_def *n2 = (const struct ptr_info_def *) p2;
2131   return bitmap_equal_p (n1->pt_vars, n2->pt_vars);
2132 }
2133
2134 static hashval_t
2135 ptr_info_hash (const void *p)
2136 {
2137   const struct ptr_info_def *n = (const struct ptr_info_def *) p;
2138   return bitmap_hash (n->pt_vars);
2139 }
2140
2141
2142 /* Create name tags for all the pointers that have been dereferenced.
2143    We only create a name tag for a pointer P if P is found to point to
2144    a set of variables (so that we can alias them to *P) or if it is
2145    the result of a call to malloc (which means that P cannot point to
2146    anything else nor alias any other variable).
2147
2148    If two pointers P and Q point to the same set of variables, they
2149    are assigned the same name tag.  */
2150
2151 static void
2152 create_name_tags (void)
2153 {
2154   size_t i;
2155   VEC (tree, heap) *with_ptvars = NULL;
2156   tree ptr;
2157   htab_t ptr_hash;
2158
2159   /* Collect the list of pointers with a non-empty points to set.  */
2160   for (i = 1; i < num_ssa_names; i++)
2161     {
2162       tree ptr = ssa_name (i);
2163       struct ptr_info_def *pi;
2164
2165       if (!ptr
2166           || !POINTER_TYPE_P (TREE_TYPE (ptr))
2167           || !SSA_NAME_PTR_INFO (ptr))
2168         continue;
2169
2170       pi = SSA_NAME_PTR_INFO (ptr);
2171
2172       if (pi->pt_anything || !pi->memory_tag_needed)
2173         {
2174           /* No name tags for pointers that have not been
2175              dereferenced or point to an arbitrary location.  */
2176           pi->name_mem_tag = NULL_TREE;
2177           continue;
2178         }
2179
2180       /* Set pt_anything on the pointers without pt_vars filled in so
2181          that they are assigned a symbol tag.  */
2182       if (pi->pt_vars && !bitmap_empty_p (pi->pt_vars)) 
2183         VEC_safe_push (tree, heap, with_ptvars, ptr);
2184       else
2185         set_pt_anything (ptr);
2186     }
2187   
2188   /* If we didn't find any pointers with pt_vars set, we're done.  */
2189   if (!with_ptvars)
2190     return;
2191
2192   ptr_hash = htab_create (10, ptr_info_hash, eq_ptr_info, NULL);
2193
2194   /* Now go through the pointers with pt_vars, and find a name tag
2195      with the same pt_vars as this pointer, or create one if one
2196      doesn't exist.  */
2197   for (i = 0; VEC_iterate (tree, with_ptvars, i, ptr); i++)
2198     {
2199       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
2200       tree old_name_tag = pi->name_mem_tag;
2201       struct ptr_info_def **slot;
2202       
2203       /* If PTR points to a set of variables, check if we don't
2204          have another pointer Q with the same points-to set before
2205          creating a tag.  If so, use Q's tag instead of creating a
2206          new one.
2207          
2208          This is important for not creating unnecessary symbols
2209          and also for copy propagation.  If we ever need to
2210          propagate PTR into Q or vice-versa, we would run into
2211          problems if they both had different name tags because
2212          they would have different SSA version numbers (which
2213          would force us to take the name tags in and out of SSA).  */
2214       slot = (struct ptr_info_def **) htab_find_slot (ptr_hash, pi, INSERT);
2215       if (*slot)
2216         pi->name_mem_tag = (*slot)->name_mem_tag;
2217       else
2218         {
2219           *slot = pi;
2220
2221           /* If we didn't find a pointer with the same points-to set
2222              as PTR, create a new name tag if needed.  */
2223           if (pi->name_mem_tag == NULL_TREE)
2224             pi->name_mem_tag = get_nmt_for (ptr);
2225         }
2226       
2227       /* If the new name tag computed for PTR is different than
2228          the old name tag that it used to have, then the old tag
2229          needs to be removed from the IL, so we mark it for
2230          renaming.  */
2231       if (old_name_tag && old_name_tag != pi->name_mem_tag)
2232         mark_sym_for_renaming (old_name_tag);
2233
2234       /* Inherit volatility from the pointed-to type.  */
2235       TREE_THIS_VOLATILE (pi->name_mem_tag)
2236         |= TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (ptr)));
2237       
2238       /* Mark the new name tag for renaming.  */
2239       mark_sym_for_renaming (pi->name_mem_tag);
2240     }
2241
2242   htab_delete (ptr_hash);
2243
2244   VEC_free (tree, heap, with_ptvars);
2245 }
2246
2247
2248 /* Union the alias set SET into the may-aliases for TAG.  */
2249
2250 static void
2251 union_alias_set_into (tree tag, bitmap set)
2252 {
2253   bitmap ma = MTAG_ALIASES (tag);
2254   
2255   if (bitmap_empty_p (set))
2256     return;
2257   
2258   if (!ma)
2259     ma = MTAG_ALIASES (tag) = BITMAP_ALLOC (&alias_bitmap_obstack);
2260   bitmap_ior_into (ma, set);
2261 }
2262
2263
2264 /* For every pointer P_i in AI->PROCESSED_PTRS, create may-alias sets for
2265    the name memory tag (NMT) associated with P_i.  If P_i escapes, then its
2266    name tag and the variables it points-to are call-clobbered.  Finally, if
2267    P_i escapes and we could not determine where it points to, then all the
2268    variables in the same alias set as *P_i are marked call-clobbered.  This
2269    is necessary because we must assume that P_i may take the address of any
2270    variable in the same alias set.  */
2271
2272 static void
2273 compute_flow_sensitive_aliasing (struct alias_info *ai)
2274 {
2275   size_t i;
2276   tree ptr;
2277   
2278   timevar_push (TV_FLOW_SENSITIVE);
2279   
2280   for (i = 0; VEC_iterate (tree, ai->processed_ptrs, i, ptr); i++)
2281     {
2282       if (!find_what_p_points_to (ptr))
2283         set_pt_anything (ptr);
2284     }
2285
2286   create_name_tags ();
2287
2288   for (i = 0; VEC_iterate (tree, ai->processed_ptrs, i, ptr); i++)
2289     {
2290       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
2291
2292       /* Set up aliasing information for PTR's name memory tag (if it has
2293          one).  Note that only pointers that have been dereferenced will
2294          have a name memory tag.  */
2295       if (pi->name_mem_tag && pi->pt_vars)
2296         {
2297           if (!bitmap_empty_p (pi->pt_vars))
2298             union_alias_set_into (pi->name_mem_tag, pi->pt_vars);
2299         }
2300     }
2301   timevar_pop (TV_FLOW_SENSITIVE);
2302 }
2303
2304
2305 /* Return TRUE if at least one symbol in TAG2's alias set is also
2306    present in TAG1's alias set.  */
2307
2308 static bool
2309 have_common_aliases_p (bitmap tag1aliases, bitmap tag2aliases)
2310 {
2311
2312   /* This is the old behavior of have_common_aliases_p, which is to
2313      return false if both sets are empty, or one set is and the other
2314      isn't.  */
2315   if (tag1aliases == NULL || tag2aliases == NULL)
2316     return false;
2317
2318   return bitmap_intersect_p (tag1aliases, tag2aliases);
2319 }
2320
2321 /* Compute type-based alias sets.  Traverse all the pointers and
2322    addressable variables found in setup_pointers_and_addressables.
2323    
2324    For every pointer P in AI->POINTERS and addressable variable V in
2325    AI->ADDRESSABLE_VARS, add V to the may-alias sets of P's symbol
2326    memory tag (SMT) if their alias sets conflict.  V is then marked as
2327    an aliased symbol so that the operand scanner knows that statements
2328    containing V have aliased operands.  */
2329
2330 static void
2331 compute_flow_insensitive_aliasing (struct alias_info *ai)
2332 {
2333   referenced_var_iterator rvi;
2334   tree var;
2335   size_t i;
2336
2337   timevar_push (TV_FLOW_INSENSITIVE);
2338   /* For every pointer P, determine which addressable variables may alias
2339      with P's symbol memory tag.  */
2340   for (i = 0; i < ai->num_pointers; i++)
2341     {
2342       size_t j;
2343       struct alias_map_d *p_map = ai->pointers[i];
2344       tree tag = symbol_mem_tag (p_map->var);
2345       tree var;
2346
2347       for (j = 0; j < ai->num_addressable_vars; j++)
2348         {
2349           struct alias_map_d *v_map;
2350           var_ann_t v_ann;
2351           
2352           v_map = ai->addressable_vars[j];
2353           var = v_map->var;
2354           v_ann = var_ann (var);
2355
2356           /* We used to skip variables that have never been written to
2357              if the memory tag has been never written to directly (or
2358              either of them were call clobbered).  This is not enough
2359              though, as this misses writes through the tags aliases.
2360              So, for correctness we need to include any aliased
2361              variable here.  */
2362
2363           if (may_alias_p (p_map->var, p_map->set, var, v_map->set, false))
2364             {
2365               /* Add VAR to TAG's may-aliases set.  */
2366               add_may_alias (tag, var);
2367             }
2368         }
2369     }
2370
2371   /* Since this analysis is based exclusively on symbols, it fails to
2372      handle cases where two pointers P and Q have different memory
2373      tags with conflicting alias set numbers but no aliased symbols in
2374      common.
2375
2376      For example, suppose that we have two memory tags SMT.1 and SMT.2
2377      such that
2378      
2379                 may-aliases (SMT.1) = { a }
2380                 may-aliases (SMT.2) = { b }
2381
2382      and the alias set number of SMT.1 conflicts with that of SMT.2.
2383      Since they don't have symbols in common, loads and stores from
2384      SMT.1 and SMT.2 will seem independent of each other, which will
2385      lead to the optimizers making invalid transformations (see
2386      testsuite/gcc.c-torture/execute/pr15262-[12].c).
2387
2388      To avoid this problem, we do a final traversal of AI->POINTERS
2389      looking for pairs of pointers that have no aliased symbols in
2390      common and yet have conflicting alias set numbers.  */
2391   for (i = 0; i < ai->num_pointers; i++)
2392     {
2393       size_t j;
2394       struct alias_map_d *p_map1 = ai->pointers[i];
2395       tree tag1 = symbol_mem_tag (p_map1->var);
2396       bitmap may_aliases1 = MTAG_ALIASES (tag1);
2397
2398       for (j = 0; j < ai->num_pointers; j++)
2399         {
2400           struct alias_map_d *p_map2 = ai->pointers[j];
2401           tree tag2 = symbol_mem_tag (p_map2->var);
2402           bitmap may_aliases2 = may_aliases (tag2);
2403
2404           /* By convention tags don't alias themselves.  */
2405           if (tag1 == tag2)
2406             continue;
2407
2408           /* If the pointers may not point to each other, do nothing.  */
2409           if (!may_alias_p (p_map1->var, p_map1->set, tag2, p_map2->set, true))
2410             continue;
2411
2412           /* The two pointers may alias each other.  If they already have
2413              symbols in common, do nothing.  */
2414           if (have_common_aliases_p (may_aliases1, may_aliases2))
2415             continue;
2416
2417           add_may_alias (tag1, tag2);
2418         }
2419     }
2420
2421   /* We have to add all HEAP variables to all SMTs aliases bitmaps.
2422      As we don't know which effective type the HEAP will have we cannot
2423      do better here and we need the conflicts with obfuscated pointers
2424      (a simple (*(int[n] *)ptr)[i] will do, with ptr from a VLA array
2425      allocation).  */
2426   for (i = 0; i < ai->num_pointers; i++)
2427     {
2428       struct alias_map_d *p_map = ai->pointers[i];
2429       tree tag = symbol_mem_tag (p_map->var);
2430
2431       FOR_EACH_REFERENCED_VAR (var, rvi)
2432         {
2433           if (var_ann (var)->is_heapvar)
2434             add_may_alias (tag, var);
2435         }
2436     }
2437
2438   timevar_pop (TV_FLOW_INSENSITIVE);
2439 }
2440
2441
2442 /* Create a new alias set entry for VAR in AI->ADDRESSABLE_VARS.  */
2443
2444 static void
2445 create_alias_map_for (tree var, struct alias_info *ai)
2446 {
2447   struct alias_map_d *alias_map;
2448   alias_map = XCNEW (struct alias_map_d);
2449   alias_map->var = var;
2450   alias_map->set = get_alias_set (var);
2451   ai->addressable_vars[ai->num_addressable_vars++] = alias_map;
2452 }
2453
2454
2455 /* Update related alias information kept in AI.  This is used when
2456    building name tags, alias sets and deciding grouping heuristics.
2457    STMT is the statement to process.  This function also updates
2458    ADDRESSABLE_VARS.  */
2459
2460 static void
2461 update_alias_info_1 (gimple stmt, struct alias_info *ai)
2462 {
2463   bitmap addr_taken;
2464   use_operand_p use_p;
2465   ssa_op_iter iter;
2466   bool stmt_dereferences_ptr_p;
2467   enum escape_type stmt_escape_type = is_escape_site (stmt);
2468   struct mem_ref_stats_d *mem_ref_stats = gimple_mem_ref_stats (cfun);
2469
2470   stmt_dereferences_ptr_p = false;
2471
2472   if (stmt_escape_type == ESCAPE_TO_CALL
2473       || stmt_escape_type == ESCAPE_TO_PURE_CONST)
2474     {
2475       mem_ref_stats->num_call_sites++;
2476       if (stmt_escape_type == ESCAPE_TO_PURE_CONST)
2477         mem_ref_stats->num_pure_const_call_sites++;
2478     }
2479   else if (stmt_escape_type == ESCAPE_TO_ASM)
2480     mem_ref_stats->num_asm_sites++;
2481
2482   /* Mark all the variables whose address are taken by the statement.  */
2483   addr_taken = gimple_addresses_taken (stmt);
2484   if (addr_taken)
2485     bitmap_ior_into (gimple_addressable_vars (cfun), addr_taken);
2486
2487   /* If we have a call or an assignment, see if the lhs contains
2488      a local decl that requires not to be a gimple register.  */
2489   if (gimple_code (stmt) == GIMPLE_ASSIGN
2490       || gimple_code (stmt) == GIMPLE_CALL)
2491     {
2492       tree lhs = gimple_get_lhs (stmt);
2493       /* A plain decl does not need it set.  */
2494       if (lhs && handled_component_p (lhs))
2495         {
2496           tree var = get_base_address (lhs);
2497           if (DECL_P (var)
2498               /* We are not going to mess with RESULT_DECL anyway.  */
2499               && TREE_CODE (var) != RESULT_DECL
2500               && is_gimple_reg_type (TREE_TYPE (var)))
2501             bitmap_set_bit (gimple_addressable_vars (cfun), DECL_UID (var));
2502         }
2503     }
2504
2505   /* Process each operand use.  For pointers, determine whether they
2506      are dereferenced by the statement, or whether their value
2507      escapes, etc.  */
2508   FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_USE)
2509     {
2510       tree op, var;
2511       var_ann_t v_ann;
2512       struct ptr_info_def *pi;
2513       unsigned num_uses, num_loads, num_stores;
2514
2515       op = USE_FROM_PTR (use_p);
2516
2517       /* If STMT is a PHI node, OP may be an ADDR_EXPR.  If so, add it
2518          to the set of addressable variables.  */
2519       if (TREE_CODE (op) == ADDR_EXPR)
2520         {
2521           bitmap addressable_vars = gimple_addressable_vars (cfun);
2522
2523           gcc_assert (gimple_code (stmt) == GIMPLE_PHI);
2524           gcc_assert (addressable_vars);
2525
2526           /* PHI nodes don't have annotations for pinning the set
2527              of addresses taken, so we collect them here.
2528
2529              FIXME, should we allow PHI nodes to have annotations
2530              so that they can be treated like regular statements?
2531              Currently, they are treated as second-class
2532              statements.  */
2533           add_to_addressable_set (TREE_OPERAND (op, 0), &addressable_vars);
2534           continue;
2535         }
2536
2537       /* Ignore constants (they may occur in PHI node arguments).  */
2538       if (TREE_CODE (op) != SSA_NAME)
2539         continue;
2540
2541       var = SSA_NAME_VAR (op);
2542       v_ann = var_ann (var);
2543
2544       /* The base variable of an SSA name must be a GIMPLE register, and thus
2545          it cannot be aliased.  */
2546       gcc_assert (!may_be_aliased (var));
2547
2548       /* We are only interested in pointers.  */
2549       if (!POINTER_TYPE_P (TREE_TYPE (op)))
2550         continue;
2551
2552       pi = get_ptr_info (op);
2553
2554       /* Add OP to AI->PROCESSED_PTRS, if it's not there already.  */
2555       if (!TEST_BIT (ai->ssa_names_visited, SSA_NAME_VERSION (op)))
2556         {
2557           SET_BIT (ai->ssa_names_visited, SSA_NAME_VERSION (op));
2558           VEC_safe_push (tree, heap, ai->processed_ptrs, op);
2559         }
2560
2561       /* If STMT is a PHI node, then it will not have pointer
2562          dereferences and it will not be an escape point.  */
2563       if (gimple_code (stmt) == GIMPLE_PHI)
2564         continue;
2565
2566       /* Determine whether OP is a dereferenced pointer, and if STMT
2567          is an escape point, whether OP escapes.  */
2568       count_uses_and_derefs (op, stmt, &num_uses, &num_loads, &num_stores);
2569
2570       /* For directly dereferenced pointers we can apply
2571          TBAA-pruning to their points-to set.  We may not count the
2572          implicit dereferences &PTR->FLD here.  */
2573       if (num_loads + num_stores > 0)
2574         pi->is_dereferenced = 1;
2575
2576       /* Handle a corner case involving address expressions of the
2577          form '&PTR->FLD'.  The problem with these expressions is that
2578          they do not represent a dereference of PTR.  However, if some
2579          other transformation propagates them into an INDIRECT_REF
2580          expression, we end up with '*(&PTR->FLD)' which is folded
2581          into 'PTR->FLD'.
2582
2583          So, if the original code had no other dereferences of PTR,
2584          the aliaser will not create memory tags for it, and when
2585          &PTR->FLD gets propagated to INDIRECT_REF expressions, the
2586          memory operations will receive no VDEF/VUSE operands.
2587
2588          One solution would be to have count_uses_and_derefs consider
2589          &PTR->FLD a dereference of PTR.  But that is wrong, since it
2590          is not really a dereference but an offset calculation.
2591
2592          What we do here is to recognize these special ADDR_EXPR
2593          nodes.  Since these expressions are never GIMPLE values (they
2594          are not GIMPLE invariants), they can only appear on the RHS
2595          of an assignment and their base address is always an
2596          INDIRECT_REF expression.  */
2597       if (is_gimple_assign (stmt)
2598           && gimple_assign_rhs_code (stmt) == ADDR_EXPR
2599           && !is_gimple_val (gimple_assign_rhs1 (stmt)))
2600         {
2601           /* If the RHS if of the form &PTR->FLD and PTR == OP, then
2602              this represents a potential dereference of PTR.  */
2603           tree rhs = gimple_assign_rhs1 (stmt);
2604           tree base = get_base_address (TREE_OPERAND (rhs, 0));
2605           if (TREE_CODE (base) == INDIRECT_REF
2606               && TREE_OPERAND (base, 0) == op)
2607             num_loads++;
2608         }
2609
2610       if (num_loads + num_stores > 0)
2611         {
2612           /* Mark OP as dereferenced.  In a subsequent pass,
2613              dereferenced pointers that point to a set of
2614              variables will be assigned a name tag to alias
2615              all the variables OP points to.  */
2616           pi->memory_tag_needed = 1;
2617
2618           /* ???  For always executed direct dereferences we can
2619              apply TBAA-pruning to their escape set.  */
2620
2621           /* Mark OP as being dereferenced.  */
2622           pointer_set_insert (ai->dereferenced_ptrs, var);
2623
2624           /* Update the frequency estimate for all the dereferences of
2625              pointer OP.  */
2626           update_mem_sym_stats_from_stmt (op, stmt, num_loads, num_stores);
2627
2628           /* Indicate that STMT contains pointer dereferences.  */
2629           stmt_dereferences_ptr_p = true;
2630         }
2631
2632       if (stmt_escape_type != NO_ESCAPE && num_loads + num_stores < num_uses)
2633         {
2634           /* If STMT is an escape point and STMT contains at
2635              least one direct use of OP, then the value of OP
2636              escapes and so the pointed-to variables need to
2637              be marked call-clobbered.  */
2638           pi->value_escapes_p = 1;
2639           pi->escape_mask |= stmt_escape_type;
2640
2641           /* If the statement makes a function call, assume
2642              that pointer OP will be dereferenced in a store
2643              operation inside the called function.  */
2644           if (is_gimple_call (stmt)
2645               || stmt_escape_type == ESCAPE_STORED_IN_GLOBAL)
2646             {
2647               pointer_set_insert (ai->dereferenced_ptrs, var);
2648               pi->memory_tag_needed = 1;
2649             }
2650         }
2651     }
2652
2653   if (gimple_code (stmt) == GIMPLE_PHI)
2654     return;
2655
2656   /* Mark stored variables in STMT as being written to and update the
2657      memory reference stats for all memory symbols referenced by STMT.  */
2658   if (gimple_references_memory_p (stmt))
2659     {
2660       unsigned i;
2661       bitmap_iterator bi;
2662
2663       mem_ref_stats->num_mem_stmts++;
2664
2665       /* Notice that we only update memory reference stats for symbols
2666          loaded and stored by the statement if the statement does not
2667          contain pointer dereferences and it is not a call/asm site.
2668          This is to avoid double accounting problems when creating
2669          memory partitions.  After computing points-to information,
2670          pointer dereference statistics are used to update the
2671          reference stats of the pointed-to variables, so here we
2672          should only update direct references to symbols.
2673
2674          Indirect references are not updated here for two reasons: (1)
2675          The first time we compute alias information, the sets
2676          LOADED/STORED are empty for pointer dereferences, (2) After
2677          partitioning, LOADED/STORED may have references to
2678          partitions, not the original pointed-to variables.  So, if we
2679          always counted LOADED/STORED here and during partitioning, we
2680          would count many symbols more than once.
2681
2682          This does cause some imprecision when a statement has a
2683          combination of direct symbol references and pointer
2684          dereferences (e.g., MEMORY_VAR = *PTR) or if a call site has
2685          memory symbols in its argument list, but these cases do not
2686          occur so frequently as to constitute a serious problem.  */
2687       if (!stmt_dereferences_ptr_p
2688           && stmt_escape_type != ESCAPE_TO_CALL
2689           && stmt_escape_type != ESCAPE_TO_PURE_CONST
2690           && stmt_escape_type != ESCAPE_TO_ASM)
2691         {
2692           if (gimple_stored_syms (stmt))
2693             EXECUTE_IF_SET_IN_BITMAP (gimple_stored_syms (stmt), 0, i, bi)
2694               update_mem_sym_stats_from_stmt (referenced_var (i), stmt, 0, 1);
2695
2696           if (gimple_loaded_syms (stmt))
2697             EXECUTE_IF_SET_IN_BITMAP (gimple_loaded_syms (stmt), 0, i, bi)
2698               update_mem_sym_stats_from_stmt (referenced_var (i), stmt, 1, 0);
2699         }
2700     }
2701 }
2702
2703 /* Update various related attributes like escaped addresses,
2704    pointer dereferences for loads and stores.  This is used
2705    when creating name tags and alias sets.  */
2706
2707 static void
2708 update_alias_info (struct alias_info *ai)
2709 {
2710   basic_block bb;
2711
2712   FOR_EACH_BB (bb)
2713     {
2714       gimple_stmt_iterator gsi;
2715       gimple phi;
2716
2717       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2718         {
2719           phi = gsi_stmt (gsi);
2720           if (is_gimple_reg (PHI_RESULT (phi)))
2721             update_alias_info_1 (phi, ai);
2722         }
2723
2724       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2725         update_alias_info_1 (gsi_stmt (gsi), ai);
2726     }
2727 }
2728
2729 /* Create memory tags for all the dereferenced pointers and build the
2730    ADDRESSABLE_VARS and POINTERS arrays used for building the may-alias
2731    sets.  Based on the address escape and points-to information collected
2732    earlier, this pass will also clear the TREE_ADDRESSABLE flag from those
2733    variables whose address is not needed anymore.  */
2734
2735 static void
2736 setup_pointers_and_addressables (struct alias_info *ai)
2737 {
2738   size_t num_addressable_vars, num_pointers;
2739   referenced_var_iterator rvi;
2740   tree var;
2741   VEC (tree, heap) *varvec = NULL;
2742   safe_referenced_var_iterator srvi;
2743
2744   /* Size up the arrays ADDRESSABLE_VARS and POINTERS.  */
2745   num_addressable_vars = num_pointers = 0;
2746   
2747   FOR_EACH_REFERENCED_VAR (var, rvi)
2748     {
2749       if (may_be_aliased (var))
2750         num_addressable_vars++;
2751
2752       if (POINTER_TYPE_P (TREE_TYPE (var)))
2753         {
2754           /* Since we don't keep track of volatile variables, assume that
2755              these pointers are used in indirect store operations.  */
2756           if (TREE_THIS_VOLATILE (var))
2757             pointer_set_insert (ai->dereferenced_ptrs, var);
2758
2759           num_pointers++;
2760         }
2761     }
2762
2763   /* Create ADDRESSABLE_VARS and POINTERS.  Note that these arrays are
2764      always going to be slightly bigger than we actually need them
2765      because some TREE_ADDRESSABLE variables will be marked
2766      non-addressable below and only pointers with unique symbol tags are
2767      going to be added to POINTERS.  */
2768   ai->addressable_vars = XCNEWVEC (struct alias_map_d *, num_addressable_vars);
2769   ai->pointers = XCNEWVEC (struct alias_map_d *, num_pointers);
2770   ai->num_addressable_vars = 0;
2771   ai->num_pointers = 0;
2772
2773   FOR_EACH_REFERENCED_VAR_SAFE (var, varvec, srvi)
2774     {
2775       /* Name memory tags already have flow-sensitive aliasing
2776          information, so they need not be processed by
2777          compute_flow_insensitive_aliasing.  Similarly, symbol memory
2778          tags are already accounted for when we process their
2779          associated pointer. 
2780       
2781          Structure fields, on the other hand, have to have some of this
2782          information processed for them, but it's pointless to mark them
2783          non-addressable (since they are fake variables anyway).  */
2784       if (MTAG_P (var))
2785         continue;
2786
2787       /* Remove the ADDRESSABLE flag from every addressable variable whose
2788          address is not needed anymore.  This is caused by the propagation
2789          of ADDR_EXPR constants into INDIRECT_REF expressions and the
2790          removal of dead pointer assignments done by the early scalar
2791          cleanup passes.  */
2792       if (TREE_ADDRESSABLE (var))
2793         {
2794           if (!bitmap_bit_p (gimple_addressable_vars (cfun), DECL_UID (var))
2795               && TREE_CODE (var) != RESULT_DECL
2796               && !is_global_var (var))
2797             {
2798               bool okay_to_mark = true;
2799
2800               /* Since VAR is now a regular GIMPLE register, we will need
2801                  to rename VAR into SSA afterwards.  */
2802               mark_sym_for_renaming (var);
2803
2804               /* The address of VAR is not needed, remove the
2805                  addressable bit, so that it can be optimized as a
2806                  regular variable.  */
2807               if (okay_to_mark)
2808                 {
2809                   /* The memory partition holding VAR will no longer
2810                      contain VAR, and statements referencing it will need
2811                      to be updated.  */
2812                   if (memory_partition (var))
2813                     mark_sym_for_renaming (memory_partition (var));
2814
2815                   mark_non_addressable (var);
2816                 }
2817             }
2818         }
2819
2820       /* Global variables and addressable locals may be aliased.  Create an
2821          entry in ADDRESSABLE_VARS for VAR.  */
2822       if (may_be_aliased (var))
2823         {
2824           create_alias_map_for (var, ai);
2825           mark_sym_for_renaming (var);
2826         }
2827
2828       /* Add pointer variables that have been dereferenced to the POINTERS
2829          array and create a symbol memory tag for them.  */
2830       if (POINTER_TYPE_P (TREE_TYPE (var)))
2831         {
2832           if (pointer_set_contains (ai->dereferenced_ptrs, var))
2833             {
2834               tree tag, old_tag;
2835               var_ann_t t_ann;
2836
2837               /* If pointer VAR still doesn't have a memory tag
2838                  associated with it, create it now or re-use an
2839                  existing one.  */
2840               tag = get_smt_for (var, ai);
2841               t_ann = var_ann (tag);
2842
2843               /* The symbol tag will need to be renamed into SSA
2844                  afterwards. Note that we cannot do this inside
2845                  get_smt_for because aliasing may run multiple times
2846                  and we only create symbol tags the first time.  */
2847               mark_sym_for_renaming (tag);
2848
2849               /* Similarly, if pointer VAR used to have another type
2850                  tag, we will need to process it in the renamer to
2851                  remove the stale virtual operands.  */
2852               old_tag = symbol_mem_tag (var);
2853               if (old_tag)
2854                 mark_sym_for_renaming (old_tag);
2855
2856               /* Associate the tag with pointer VAR.  */
2857               set_symbol_mem_tag (var, tag);
2858             }
2859           else
2860             {
2861               /* The pointer has not been dereferenced.  If it had a
2862                  symbol memory tag, remove it and mark the old tag for
2863                  renaming to remove it out of the IL.  */
2864               tree tag = symbol_mem_tag (var);
2865               if (tag)
2866                 {
2867                   mark_sym_for_renaming (tag);
2868                   set_symbol_mem_tag (var, NULL_TREE);
2869                 }
2870             }
2871         }
2872     }
2873
2874   VEC_free (tree, heap, varvec);
2875 }
2876
2877
2878 /* Determine whether to use .GLOBAL_VAR to model call clobbering
2879    semantics.  If the function makes no references to global
2880    variables and contains at least one call to a non-pure function,
2881    then we need to mark the side-effects of the call using .GLOBAL_VAR
2882    to represent all possible global memory referenced by the callee.  */
2883
2884 static void
2885 maybe_create_global_var (void)
2886 {
2887   /* No need to create it, if we have one already.  */
2888   if (gimple_global_var (cfun) == NULL_TREE)
2889     {
2890       struct mem_ref_stats_d *stats = gimple_mem_ref_stats (cfun);
2891
2892       /* Create .GLOBAL_VAR if there are no call-clobbered
2893          variables and the program contains a mixture of pure/const
2894          and regular function calls.  This is to avoid the problem
2895          described in PR 20115:
2896
2897               int X;
2898               int func_pure (void) { return X; }
2899               int func_non_pure (int a) { X += a; }
2900               int foo ()
2901               {
2902                 int a = func_pure ();
2903                 func_non_pure (a);
2904                 a = func_pure ();
2905                 return a;
2906               }
2907
2908          Since foo() has no call-clobbered variables, there is
2909          no relationship between the calls to func_pure and
2910          func_non_pure.  Since func_pure has no side-effects, value
2911          numbering optimizations elide the second call to func_pure.
2912          So, if we have some pure/const and some regular calls in the
2913          program we create .GLOBAL_VAR to avoid missing these
2914          relations.  */
2915       if (bitmap_empty_p (gimple_call_clobbered_vars (cfun))
2916           && stats->num_call_sites > 0
2917           && stats->num_pure_const_call_sites > 0
2918           && stats->num_call_sites > stats->num_pure_const_call_sites)
2919         create_global_var ();
2920     }
2921 }
2922
2923
2924 /* Return TRUE if pointer PTR may point to variable VAR.
2925    
2926    MEM_ALIAS_SET is the alias set for the memory location pointed-to by PTR
2927         This is needed because when checking for type conflicts we are
2928         interested in the alias set of the memory location pointed-to by
2929         PTR.  The alias set of PTR itself is irrelevant.
2930    
2931    VAR_ALIAS_SET is the alias set for VAR.  */
2932
2933 bool
2934 may_alias_p (tree ptr, alias_set_type mem_alias_set,
2935              tree var, alias_set_type var_alias_set,
2936              bool alias_set_only)
2937 {
2938   tree mem;
2939
2940   alias_stats.alias_queries++;
2941   alias_stats.simple_queries++;
2942
2943   /* By convention, a variable cannot alias itself.  */
2944   mem = symbol_mem_tag (ptr);
2945   if (mem == var)
2946     {
2947       alias_stats.alias_noalias++;
2948       alias_stats.simple_resolved++;
2949       return false;
2950     }
2951
2952   /* If -fargument-noalias-global is > 2, pointer arguments may
2953      not point to anything else.  */
2954   if (flag_argument_noalias > 2 && TREE_CODE (ptr) == PARM_DECL)
2955     {
2956       alias_stats.alias_noalias++;
2957       alias_stats.simple_resolved++;
2958       return false;
2959     }
2960
2961   /* If -fargument-noalias-global is > 1, pointer arguments may
2962      not point to global variables.  */
2963   if (flag_argument_noalias > 1 && is_global_var (var)
2964       && TREE_CODE (ptr) == PARM_DECL)
2965     {
2966       alias_stats.alias_noalias++;
2967       alias_stats.simple_resolved++;
2968       return false;
2969     }
2970
2971   /* If the pointed to memory has alias set zero, or the pointer
2972      is ref-all, or the pointer decl is marked that no TBAA is to
2973      be applied, the MEM can alias VAR.  */
2974   if (mem_alias_set == 0
2975       || DECL_POINTER_ALIAS_SET (ptr) == 0
2976       || TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (ptr))
2977       || DECL_NO_TBAA_P (ptr))
2978     {
2979       alias_stats.alias_mayalias++;
2980       alias_stats.simple_resolved++;
2981       return true;
2982     }
2983
2984   gcc_assert (TREE_CODE (mem) == SYMBOL_MEMORY_TAG);
2985
2986   alias_stats.tbaa_queries++;
2987
2988   /* If the alias sets don't conflict then MEM cannot alias VAR.  */
2989   if (mem_alias_set != var_alias_set
2990       && !alias_set_subset_of (mem_alias_set, var_alias_set))
2991     {
2992       alias_stats.alias_noalias++;
2993       alias_stats.tbaa_resolved++;
2994       return false;
2995     }
2996
2997   /* If VAR is a record or union type, PTR cannot point into VAR
2998      unless there is some explicit address operation in the
2999      program that can reference a field of the type pointed-to by
3000      PTR.  This also assumes that the types of both VAR and PTR
3001      are contained within the compilation unit, and that there is
3002      no fancy addressing arithmetic associated with any of the
3003      types involved.  */
3004   if (mem_alias_set != 0 && var_alias_set != 0)
3005     {
3006       tree ptr_type = TREE_TYPE (ptr);
3007       tree var_type = TREE_TYPE (var);
3008       
3009       /* The star count is -1 if the type at the end of the
3010          pointer_to chain is not a record or union type. */ 
3011       if (!alias_set_only && 
3012           0 /* FIXME tuples ipa_type_escape_star_count_of_interesting_type (var_type) >= 0*/)
3013         {
3014           int ptr_star_count = 0;
3015
3016           /* ipa_type_escape_star_count_of_interesting_type is a
3017              little too restrictive for the pointer type, need to
3018              allow pointers to primitive types as long as those
3019              types cannot be pointers to everything.  */
3020           while (POINTER_TYPE_P (ptr_type))
3021             {
3022               /* Strip the *s off.  */ 
3023               ptr_type = TREE_TYPE (ptr_type);
3024               ptr_star_count++;
3025             }
3026           
3027           /* There does not appear to be a better test to see if
3028              the pointer type was one of the pointer to everything
3029              types.  */
3030           if (ptr_star_count > 0)
3031             {
3032               alias_stats.structnoaddress_queries++;
3033               if (ipa_type_escape_field_does_not_clobber_p (var_type, 
3034                                                             TREE_TYPE (ptr)))
3035                 {
3036                   alias_stats.structnoaddress_resolved++;
3037                   alias_stats.alias_noalias++;
3038                   return false;
3039                 }
3040             }
3041           else if (ptr_star_count == 0)
3042             {
3043               /* If PTR_TYPE was not really a pointer to type, it cannot 
3044                  alias.  */ 
3045               alias_stats.structnoaddress_queries++;
3046               alias_stats.structnoaddress_resolved++;
3047               alias_stats.alias_noalias++;
3048               return false;
3049             }
3050         }
3051     }
3052
3053   alias_stats.alias_mayalias++;
3054   return true;
3055 }
3056
3057 /* Return true, if PTR may point to a global variable.  */
3058
3059 bool
3060 may_point_to_global_var (tree ptr)
3061 {
3062   struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
3063
3064   /* If we do not have points-to information for this variable,
3065      we have to punt.  */
3066   if (!pi
3067       || !pi->name_mem_tag)
3068     return true;
3069
3070   /* The name memory tag is marked as global variable if the points-to
3071      set contains a global variable.  */
3072   return is_global_var (pi->name_mem_tag);
3073 }
3074
3075 /* Add ALIAS to the set of variables that may alias VAR.  */
3076
3077 static void
3078 add_may_alias (tree var, tree alias)
3079 {
3080   /* Don't allow self-referential aliases.  */
3081   gcc_assert (var != alias);
3082
3083   /* ALIAS must be addressable if it's being added to an alias set.  */
3084 #if 1
3085   TREE_ADDRESSABLE (alias) = 1;
3086 #else
3087   gcc_assert (may_be_aliased (alias));
3088 #endif
3089
3090   /* VAR must be a symbol or a name tag.  */
3091   gcc_assert (TREE_CODE (var) == SYMBOL_MEMORY_TAG
3092               || TREE_CODE (var) == NAME_MEMORY_TAG);
3093
3094   if (MTAG_ALIASES (var) == NULL)
3095     MTAG_ALIASES (var) = BITMAP_ALLOC (&alias_bitmap_obstack);
3096   
3097   bitmap_set_bit (MTAG_ALIASES (var), DECL_UID (alias));
3098 }
3099
3100
3101 /* Mark pointer PTR as pointing to an arbitrary memory location.  */
3102
3103 static void
3104 set_pt_anything (tree ptr)
3105 {
3106   struct ptr_info_def *pi = get_ptr_info (ptr);
3107
3108   pi->pt_anything = 1;
3109   /* Anything includes global memory.  */
3110   pi->pt_global_mem = 1;
3111   pi->pt_vars = NULL;
3112
3113   /* The pointer used to have a name tag, but we now found it pointing
3114      to an arbitrary location.  The name tag needs to be renamed and
3115      disassociated from PTR.  */
3116   if (pi->name_mem_tag)
3117     {
3118       mark_sym_for_renaming (pi->name_mem_tag);
3119       pi->name_mem_tag = NULL_TREE;
3120     }
3121 }
3122
3123
3124 /* Return true if STMT is an "escape" site from the current function.  Escape
3125    sites those statements which might expose the address of a variable
3126    outside the current function.  STMT is an escape site iff:
3127
3128         1- STMT is a function call, or
3129         2- STMT is an __asm__ expression, or
3130         3- STMT is an assignment to a non-local variable, or
3131         4- STMT is a return statement.
3132
3133    Return the type of escape site found, if we found one, or NO_ESCAPE
3134    if none.  */
3135
3136 enum escape_type
3137 is_escape_site (gimple stmt)
3138 {
3139   if (is_gimple_call (stmt))
3140     {
3141       if (gimple_call_flags (stmt) & (ECF_PURE | ECF_CONST))
3142         return ESCAPE_TO_PURE_CONST;
3143
3144       return ESCAPE_TO_CALL;
3145     }
3146   else if (gimple_code (stmt) == GIMPLE_ASM)
3147     return ESCAPE_TO_ASM;
3148   else if (is_gimple_assign (stmt))
3149     {
3150       tree lhs = gimple_assign_lhs (stmt);
3151
3152       /* Get to the base of _REF nodes.  */
3153       if (TREE_CODE (lhs) != SSA_NAME)
3154         lhs = get_base_address (lhs);
3155
3156       /* If we couldn't recognize the LHS of the assignment, assume that it
3157          is a non-local store.  */
3158       if (lhs == NULL_TREE)
3159         return ESCAPE_UNKNOWN;
3160
3161       if (gimple_assign_cast_p (stmt))
3162         {
3163           tree from = TREE_TYPE (gimple_assign_rhs1 (stmt));
3164           tree to = TREE_TYPE (lhs);
3165
3166           /* If the RHS is a conversion between a pointer and an integer, the
3167              pointer escapes since we can't track the integer.  */
3168           if (POINTER_TYPE_P (from) && !POINTER_TYPE_P (to))
3169             return ESCAPE_BAD_CAST;
3170         }
3171
3172       /* If the LHS is an SSA name, it can't possibly represent a non-local
3173          memory store.  */
3174       if (TREE_CODE (lhs) == SSA_NAME)
3175         return NO_ESCAPE;
3176
3177       /* If the LHS is a non-global decl, it isn't a non-local memory store.
3178          If the LHS escapes, the RHS escape is dealt with in the PTA solver.  */
3179       if (DECL_P (lhs)
3180           && !is_global_var (lhs))
3181         return NO_ESCAPE;
3182
3183       /* FIXME: LHS is not an SSA_NAME.  Even if it's an assignment to a
3184          local variables we cannot be sure if it will escape, because we
3185          don't have information about objects not in SSA form.  Need to
3186          implement something along the lines of
3187
3188          J.-D. Choi, M. Gupta, M. J. Serrano, V. C. Sreedhar, and S. P.
3189          Midkiff, ``Escape analysis for java,'' in Proceedings of the
3190          Conference on Object-Oriented Programming Systems, Languages, and
3191          Applications (OOPSLA), pp. 1-19, 1999.  */
3192       return ESCAPE_STORED_IN_GLOBAL;
3193     }
3194   else if (gimple_code (stmt) == GIMPLE_RETURN)
3195     return ESCAPE_TO_RETURN;
3196
3197   return NO_ESCAPE;
3198 }
3199
3200 /* Create a new memory tag of type TYPE.
3201    Does NOT push it into the current binding.  */
3202
3203 tree
3204 create_tag_raw (enum tree_code code, tree type, const char *prefix)
3205 {
3206   tree tmp_var;
3207
3208   tmp_var = build_decl (code, create_tmp_var_name (prefix), type);
3209
3210   /* Memory tags are always writable and non-static.  */
3211   TREE_READONLY (tmp_var) = 0;
3212   TREE_STATIC (tmp_var) = 0;
3213
3214   /* It doesn't start out global.  */
3215   MTAG_GLOBAL (tmp_var) = 0;
3216   TREE_USED (tmp_var) = 1;
3217
3218   return tmp_var;
3219 }
3220
3221 /* Create a new memory tag of type TYPE.  If IS_TYPE_TAG is true, the tag
3222    is considered to represent all the pointers whose pointed-to types are
3223    in the same alias set class.  Otherwise, the tag represents a single
3224    SSA_NAME pointer variable.  */
3225
3226 static tree
3227 create_memory_tag (tree type, bool is_type_tag)
3228 {
3229   tree tag = create_tag_raw (is_type_tag ? SYMBOL_MEMORY_TAG : NAME_MEMORY_TAG,
3230                              type, (is_type_tag) ? "SMT" : "NMT");
3231
3232   /* By default, memory tags are local variables.  Alias analysis will
3233      determine whether they should be considered globals.  */
3234   DECL_CONTEXT (tag) = current_function_decl;
3235
3236   /* Memory tags are by definition addressable.  */
3237   TREE_ADDRESSABLE (tag) = 1;
3238
3239   set_symbol_mem_tag (tag, NULL_TREE);
3240
3241   /* Add the tag to the symbol table.  */
3242   add_referenced_var (tag);
3243
3244   return tag;
3245 }
3246
3247
3248 /* Create a name memory tag to represent a specific SSA_NAME pointer P_i.
3249    This is used if P_i has been found to point to a specific set of
3250    variables or to a non-aliased memory location like the address returned
3251    by malloc functions.  */
3252
3253 static tree
3254 get_nmt_for (tree ptr)
3255 {
3256   struct ptr_info_def *pi = get_ptr_info (ptr);
3257   tree tag = pi->name_mem_tag;
3258
3259   if (tag == NULL_TREE)
3260     tag = create_memory_tag (TREE_TYPE (TREE_TYPE (ptr)), false);
3261   return tag;
3262 }
3263
3264
3265 /* Return the symbol memory tag associated to pointer PTR.  A memory
3266    tag is an artificial variable that represents the memory location
3267    pointed-to by PTR.  It is used to model the effects of pointer
3268    de-references on addressable variables.
3269    
3270    AI points to the data gathered during alias analysis.  This
3271    function populates the array AI->POINTERS.  */
3272
3273 static tree
3274 get_smt_for (tree ptr, struct alias_info *ai)
3275 {
3276   size_t i;
3277   tree tag;
3278   tree tag_type = TREE_TYPE (TREE_TYPE (ptr));
3279   alias_set_type tag_set;
3280
3281   /* Get the alias set to be used for the pointed-to memory.  If that
3282      differs from what we would get from looking at the type adjust
3283      the tag_type to void to make sure we get a proper alias set from
3284      just looking at the SMT we create.  */
3285   tag_set = get_alias_set (tag_type);
3286   if (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (ptr))
3287       /* This is overly conservative but we do not want to assign
3288          restrict alias sets here (which if they are not assigned
3289          are -2 but still "known").  */
3290       || DECL_POINTER_ALIAS_SET_KNOWN_P (ptr))
3291     {
3292       tag_set = 0;
3293       tag_type = void_type_node;
3294     }
3295
3296   /* To avoid creating unnecessary memory tags, only create one memory tag
3297      per alias set class.  Note that it may be tempting to group
3298      memory tags based on conflicting alias sets instead of
3299      equivalence.  That would be wrong because alias sets are not
3300      necessarily transitive (as demonstrated by the libstdc++ test
3301      23_containers/vector/cons/4.cc).  Given three alias sets A, B, C
3302      such that conflicts (A, B) == true and conflicts (A, C) == true,
3303      it does not necessarily follow that conflicts (B, C) == true.  */
3304   for (i = 0, tag = NULL_TREE; i < ai->num_pointers; i++)
3305     {
3306       struct alias_map_d *curr = ai->pointers[i];
3307       tree curr_tag = symbol_mem_tag (curr->var);
3308       if (tag_set == curr->set)
3309         {
3310           tag = curr_tag;
3311           break;
3312         }
3313     }
3314
3315   /* If VAR cannot alias with any of the existing memory tags, create a new
3316      tag for PTR and add it to the POINTERS array.  */
3317   if (tag == NULL_TREE)
3318     {
3319       struct alias_map_d *alias_map;
3320
3321       /* If PTR did not have a symbol tag already, create a new SMT.*
3322          artificial variable representing the memory location
3323          pointed-to by PTR.  */
3324       tag = symbol_mem_tag (ptr);
3325       if (tag == NULL_TREE
3326           || tag_set != get_alias_set (tag))
3327         tag = create_memory_tag (tag_type, true);
3328
3329       /* Add PTR to the POINTERS array.  Note that we are not interested in
3330          PTR's alias set.  Instead, we cache the alias set for the memory that
3331          PTR points to.  */
3332       alias_map = XCNEW (struct alias_map_d);
3333       alias_map->var = ptr;
3334       alias_map->set = tag_set;
3335       ai->pointers[ai->num_pointers++] = alias_map;
3336     }
3337
3338   /* If the pointed-to type is volatile, so is the tag.  */
3339   TREE_THIS_VOLATILE (tag) |= TREE_THIS_VOLATILE (tag_type);
3340
3341   /* Make sure that the symbol tag has the same alias set as the
3342      pointed-to type or at least accesses through the pointer will
3343      alias that set.  The latter can happen after the vectorizer
3344      created pointers of vector type.  */
3345   gcc_assert (tag_set == get_alias_set (tag)
3346               || alias_set_subset_of (tag_set, get_alias_set (tag)));
3347
3348   return tag;
3349 }
3350
3351
3352 /* Create GLOBAL_VAR, an artificial global variable to act as a
3353    representative of all the variables that may be clobbered by function
3354    calls.  */
3355
3356 static void
3357 create_global_var (void)
3358 {
3359   tree global_var = build_decl (VAR_DECL, get_identifier (".GLOBAL_VAR"),
3360                                 void_type_node);
3361   DECL_ARTIFICIAL (global_var) = 1;
3362   TREE_READONLY (global_var) = 0;
3363   DECL_EXTERNAL (global_var) = 1;
3364   TREE_STATIC (global_var) = 1;
3365   TREE_USED (global_var) = 1;
3366   DECL_CONTEXT (global_var) = NULL_TREE;
3367   TREE_THIS_VOLATILE (global_var) = 0;
3368   TREE_ADDRESSABLE (global_var) = 0;
3369
3370   create_var_ann (global_var);
3371   mark_call_clobbered (global_var, ESCAPE_UNKNOWN);
3372   add_referenced_var (global_var);
3373   mark_sym_for_renaming (global_var);
3374   cfun->gimple_df->global_var = global_var;
3375 }
3376
3377
3378 /* Dump alias statistics on FILE.  */
3379
3380 static void 
3381 dump_alias_stats (FILE *file)
3382 {
3383   const char *funcname
3384     = lang_hooks.decl_printable_name (current_function_decl, 2);
3385   fprintf (file, "\nAlias statistics for %s\n\n", funcname);
3386   fprintf (file, "Total alias queries:\t%u\n", alias_stats.alias_queries);
3387   fprintf (file, "Total alias mayalias results:\t%u\n", 
3388            alias_stats.alias_mayalias);
3389   fprintf (file, "Total alias noalias results:\t%u\n",
3390            alias_stats.alias_noalias);
3391   fprintf (file, "Total simple queries:\t%u\n",
3392            alias_stats.simple_queries);
3393   fprintf (file, "Total simple resolved:\t%u\n",
3394            alias_stats.simple_resolved);
3395   fprintf (file, "Total TBAA queries:\t%u\n",
3396            alias_stats.tbaa_queries);
3397   fprintf (file, "Total TBAA resolved:\t%u\n",
3398            alias_stats.tbaa_resolved);
3399   fprintf (file, "Total non-addressable structure type queries:\t%u\n",
3400            alias_stats.structnoaddress_queries);
3401   fprintf (file, "Total non-addressable structure type resolved:\t%u\n",
3402            alias_stats.structnoaddress_resolved);
3403 }
3404   
3405
3406 /* Dump alias information on FILE.  */
3407
3408 void
3409 dump_alias_info (FILE *file)
3410 {
3411   size_t i;
3412   const char *funcname
3413     = lang_hooks.decl_printable_name (current_function_decl, 2);
3414   referenced_var_iterator rvi;
3415   tree var;
3416
3417   fprintf (file, "\nAlias information for %s\n\n", funcname);
3418
3419   dump_memory_partitions (file);
3420
3421   fprintf (file, "\nFlow-insensitive alias information for %s\n\n", funcname);
3422
3423   fprintf (file, "Aliased symbols\n\n");
3424   
3425   FOR_EACH_REFERENCED_VAR (var, rvi)
3426     {
3427       if (may_be_aliased (var))
3428         dump_variable (file, var);
3429     }
3430
3431   fprintf (file, "\nDereferenced pointers\n\n");
3432
3433   FOR_EACH_REFERENCED_VAR (var, rvi)
3434     if (symbol_mem_tag (var))
3435       dump_variable (file, var);
3436
3437   fprintf (file, "\nSymbol memory tags\n\n");
3438   
3439   FOR_EACH_REFERENCED_VAR (var, rvi)
3440     {
3441       if (TREE_CODE (var) == SYMBOL_MEMORY_TAG)
3442         dump_variable (file, var);
3443     }
3444
3445   fprintf (file, "\n\nFlow-sensitive alias information for %s\n\n", funcname);
3446
3447   fprintf (file, "SSA_NAME pointers\n\n");
3448   for (i = 1; i < num_ssa_names; i++)
3449     {
3450       tree ptr = ssa_name (i);
3451       struct ptr_info_def *pi;
3452       
3453       if (ptr == NULL_TREE)
3454         continue;
3455
3456       pi = SSA_NAME_PTR_INFO (ptr);
3457       if (!SSA_NAME_IN_FREE_LIST (ptr)
3458           && pi
3459           && pi->name_mem_tag)
3460         dump_points_to_info_for (file, ptr);
3461     }
3462
3463   fprintf (file, "\nName memory tags\n\n");
3464   
3465   FOR_EACH_REFERENCED_VAR (var, rvi)
3466     {
3467       if (TREE_CODE (var) == NAME_MEMORY_TAG)
3468         dump_variable (file, var);
3469     }
3470
3471   fprintf (file, "\n");
3472 }
3473
3474
3475 /* Dump alias information on stderr.  */
3476
3477 void
3478 debug_alias_info (void)
3479 {
3480   dump_alias_info (stderr);
3481 }
3482
3483
3484 /* Return the alias information associated with pointer T.  It creates a
3485    new instance if none existed.  */
3486
3487 struct ptr_info_def *
3488 get_ptr_info (tree t)
3489 {
3490   struct ptr_info_def *pi;
3491
3492   gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
3493
3494   pi = SSA_NAME_PTR_INFO (t);
3495   if (pi == NULL)
3496     {
3497       pi = GGC_CNEW (struct ptr_info_def);
3498       SSA_NAME_PTR_INFO (t) = pi;
3499     }
3500
3501   return pi;
3502 }
3503
3504 /* Dump points-to information for SSA_NAME PTR into FILE.  */
3505
3506 void
3507 dump_points_to_info_for (FILE *file, tree ptr)
3508 {
3509   struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
3510
3511   print_generic_expr (file, ptr, dump_flags);
3512
3513   if (pi)
3514     {
3515       if (pi->name_mem_tag)
3516         {
3517           fprintf (file, ", name memory tag: ");
3518           print_generic_expr (file, pi->name_mem_tag, dump_flags);
3519         }
3520
3521       if (pi->is_dereferenced)
3522         fprintf (file, ", is dereferenced");
3523       else if (pi->memory_tag_needed)
3524         fprintf (file, ", is dereferenced in call");
3525
3526       if (pi->value_escapes_p)
3527         fprintf (file, ", its value escapes");
3528
3529       if (pi->pt_anything)
3530         fprintf (file, ", points-to anything");
3531
3532       if (pi->pt_null)
3533         fprintf (file, ", points-to NULL");
3534
3535       if (pi->pt_vars)
3536         {
3537           fprintf (file, ", points-to vars: ");
3538           dump_decl_set (file, pi->pt_vars);
3539         }
3540     }
3541
3542   fprintf (file, "\n");
3543 }
3544
3545
3546 /* Dump points-to information for VAR into stderr.  */
3547
3548 void
3549 debug_points_to_info_for (tree var)
3550 {
3551   dump_points_to_info_for (stderr, var);
3552 }
3553
3554
3555 /* Dump points-to information into FILE.  NOTE: This function is slow, as
3556    it needs to traverse the whole CFG looking for pointer SSA_NAMEs.  */
3557
3558 void
3559 dump_points_to_info (FILE *file ATTRIBUTE_UNUSED)
3560 {
3561   basic_block bb;
3562   gimple_stmt_iterator si;
3563   ssa_op_iter iter;
3564   const char *fname =
3565     lang_hooks.decl_printable_name (current_function_decl, 2);
3566   referenced_var_iterator rvi;
3567   tree var;
3568
3569   fprintf (file, "\n\nPointed-to sets for pointers in %s\n\n", fname);
3570
3571   /* First dump points-to information for the default definitions of
3572      pointer variables.  This is necessary because default definitions are
3573      not part of the code.  */
3574   FOR_EACH_REFERENCED_VAR (var, rvi)
3575     {
3576       if (POINTER_TYPE_P (TREE_TYPE (var)))
3577         {
3578           tree def = gimple_default_def (cfun, var);
3579           if (def)
3580             dump_points_to_info_for (file, def);
3581         }
3582     }
3583
3584   /* Dump points-to information for every pointer defined in the program.  */
3585   FOR_EACH_BB (bb)
3586     {
3587       for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
3588         {
3589           gimple phi = gsi_stmt (si);
3590           tree ptr = PHI_RESULT (phi);
3591           if (POINTER_TYPE_P (TREE_TYPE (ptr)))
3592             dump_points_to_info_for (file, ptr);
3593         }
3594
3595         for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
3596           {
3597             gimple stmt = gsi_stmt (si);
3598             tree def;
3599             FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
3600               if (TREE_CODE (def) == SSA_NAME
3601                   && POINTER_TYPE_P (TREE_TYPE (def)))
3602                 dump_points_to_info_for (file, def);
3603           }
3604     }
3605
3606   fprintf (file, "\n");
3607 }
3608
3609
3610 /* Dump points-to info pointed to by PTO into STDERR.  */
3611
3612 void
3613 debug_points_to_info (void)
3614 {
3615   dump_points_to_info (stderr);
3616 }
3617
3618 /* Dump to FILE the list of variables that may be aliasing VAR.  */
3619
3620 void
3621 dump_may_aliases_for (FILE *file, tree var)
3622 {
3623   bitmap aliases;
3624   
3625   aliases = MTAG_ALIASES (var);
3626   if (aliases)
3627     {
3628       bitmap_iterator bi;
3629       unsigned int i;
3630       tree al;
3631
3632       fprintf (file, "{ ");
3633       EXECUTE_IF_SET_IN_BITMAP (aliases, 0, i, bi)
3634         {
3635           al = referenced_var (i);
3636           print_generic_expr (file, al, dump_flags);
3637           fprintf (file, " ");
3638         }
3639       fprintf (file, "}");
3640     }
3641 }
3642
3643
3644 /* Dump to stderr the list of variables that may be aliasing VAR.  */
3645
3646 void
3647 debug_may_aliases_for (tree var)
3648 {
3649   dump_may_aliases_for (stderr, var);
3650 }
3651
3652 /* Return true if VAR may be aliased.  */
3653
3654 bool
3655 may_be_aliased (tree var)
3656 {
3657   /* Obviously.  */
3658   if (TREE_ADDRESSABLE (var))
3659     return true;
3660
3661   /* Globally visible variables can have their addresses taken by other
3662      translation units.  */
3663   if (MTAG_P (var)
3664       && MTAG_GLOBAL (var))
3665     return true;
3666   else if (!MTAG_P (var)
3667            && (DECL_EXTERNAL (var) || TREE_PUBLIC (var)))
3668     return true;
3669
3670   /* Automatic variables can't have their addresses escape any other
3671      way.  This must be after the check for global variables, as
3672      extern declarations do not have TREE_STATIC set.  */
3673   if (!TREE_STATIC (var))
3674     return false;
3675
3676   return false;
3677 }
3678
3679 /* The following is based on code in add_stmt_operand to ensure that the
3680    same defs/uses/vdefs/vuses will be found after replacing a reference
3681    to var (or ARRAY_REF to var) with an INDIRECT_REF to ptr whose value
3682    is the address of var.  Return a memtag for the ptr, after adding the 
3683    proper may_aliases to it (which are the aliases of var, if it has any,
3684    or var itself).  */
3685
3686 static tree
3687 add_may_alias_for_new_tag (tree tag, tree var)
3688 {
3689   bitmap aliases = NULL;
3690   
3691   if (MTAG_P (var))
3692     aliases = may_aliases (var);
3693
3694   /* Case 1: |aliases| == 1  */
3695   if (aliases
3696       && bitmap_single_bit_set_p (aliases))
3697     {
3698       tree ali = referenced_var (bitmap_first_set_bit (aliases));
3699       if (TREE_CODE (ali) == SYMBOL_MEMORY_TAG)
3700         return ali;
3701     }
3702
3703   /* Case 2: |aliases| == 0  */
3704   if (aliases == NULL)
3705     add_may_alias (tag, var);
3706   else
3707     {
3708       /* Case 3: |aliases| > 1  */
3709       union_alias_set_into (tag, aliases);
3710     }
3711   return tag;
3712 }
3713
3714 /* Create a new symbol tag for PTR.  Construct the may-alias list of
3715    this type tag so that it has the aliasing of VAR according to the
3716    location accessed by EXPR.
3717
3718    Note, the set of aliases represented by the new symbol tag are not
3719    marked for renaming.  */
3720
3721 void
3722 new_type_alias (tree ptr, tree var, tree expr)
3723 {
3724   tree tag_type = TREE_TYPE (TREE_TYPE (ptr));
3725   tree tag;
3726   tree ali = NULL_TREE;
3727   HOST_WIDE_INT offset, size, maxsize;
3728   tree ref;
3729
3730   gcc_assert (symbol_mem_tag (ptr) == NULL_TREE);
3731   gcc_assert (!MTAG_P (var));
3732
3733   ref = get_ref_base_and_extent (expr, &offset, &size, &maxsize);
3734   gcc_assert (ref);
3735
3736   tag = create_memory_tag (tag_type, true);
3737   set_symbol_mem_tag (ptr, tag);
3738
3739   ali = add_may_alias_for_new_tag (tag, var);
3740
3741   set_symbol_mem_tag (ptr, ali);
3742   MTAG_GLOBAL (tag) = is_global_var (var);
3743 }
3744
3745
3746 /* Reset the call_clobbered flags on our referenced vars.  In
3747    theory, this only needs to be done for globals.  */
3748
3749 static unsigned int
3750 reset_cc_flags (void)
3751 {
3752   tree var;
3753   referenced_var_iterator rvi;
3754
3755   FOR_EACH_REFERENCED_VAR (var, rvi)
3756     var_ann (var)->call_clobbered = false;
3757   return 0;
3758 }
3759
3760 struct gimple_opt_pass pass_reset_cc_flags =
3761 {
3762  {
3763   GIMPLE_PASS,
3764   NULL,          /* name */
3765   NULL,          /* gate */
3766   reset_cc_flags, /* execute */
3767   NULL,                  /* sub */
3768   NULL,                  /* next */
3769   0,                     /* static_pass_number */
3770   0,                     /* tv_id */
3771   PROP_referenced_vars |PROP_cfg, /* properties_required */
3772   0,                     /* properties_provided */
3773   0,                     /* properties_destroyed */
3774   0,                     /* todo_flags_start */
3775   0                      /* todo_flags_finish */
3776  }
3777 };
3778
3779
3780 /* A dummy pass to cause aliases to be computed via TODO_rebuild_alias.  */
3781
3782 struct gimple_opt_pass pass_build_alias =
3783 {
3784  {
3785   GIMPLE_PASS,
3786   "alias",                  /* name */
3787   NULL,                     /* gate */
3788   NULL,                     /* execute */
3789   NULL,                     /* sub */
3790   NULL,                     /* next */
3791   0,                        /* static_pass_number */
3792   0,                        /* tv_id */
3793   PROP_cfg | PROP_ssa,      /* properties_required */
3794   PROP_alias,               /* properties_provided */
3795   0,                        /* properties_destroyed */
3796   0,                        /* todo_flags_start */
3797   TODO_rebuild_alias | TODO_dump_func  /* todo_flags_finish */
3798  }
3799 };