OSDN Git Service

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