OSDN Git Service

libcpp/
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-alias.c
1 /* Alias analysis for trees.
2    Copyright (C) 2004, 2005 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 2, 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 COPYING.  If not, write to
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "timevar.h"
32 #include "expr.h"
33 #include "ggc.h"
34 #include "langhooks.h"
35 #include "flags.h"
36 #include "function.h"
37 #include "diagnostic.h"
38 #include "tree-dump.h"
39 #include "tree-gimple.h"
40 #include "tree-flow.h"
41 #include "tree-inline.h"
42 #include "tree-pass.h"
43 #include "tree-ssa-structalias.h"
44 #include "convert.h"
45 #include "params.h"
46 #include "ipa-type-escape.h"
47 #include "vec.h"
48 #include "bitmap.h"
49
50 /* Obstack used to hold grouping bitmaps and other temporary bitmaps used by
51    aliasing  */
52 static bitmap_obstack alias_obstack;
53
54 /* 'true' after aliases have been computed (see compute_may_aliases).  */
55 bool aliases_computed_p;
56
57 /* Structure to map a variable to its alias set and keep track of the
58    virtual operands that will be needed to represent it.  */
59 struct alias_map_d
60 {
61   /* Variable and its alias set.  */
62   tree var;
63   HOST_WIDE_INT set;
64
65   /* Total number of virtual operands that will be needed to represent
66      all the aliases of VAR.  */
67   long total_alias_vops;
68
69   /* Nonzero if the aliases for this memory tag have been grouped
70      already.  Used in group_aliases.  */
71   unsigned int grouped_p : 1;
72
73   /* Set of variables aliased with VAR.  This is the exact same
74      information contained in VAR_ANN (VAR)->MAY_ALIASES, but in
75      bitmap form to speed up alias grouping.  */
76   bitmap may_aliases;
77 };
78
79
80 /* Counters used to display statistics on alias analysis.  */
81 struct alias_stats_d
82 {
83   unsigned int alias_queries;
84   unsigned int alias_mayalias;
85   unsigned int alias_noalias;
86   unsigned int simple_queries;
87   unsigned int simple_resolved;
88   unsigned int tbaa_queries;
89   unsigned int tbaa_resolved;
90   unsigned int structnoaddress_queries;
91   unsigned int structnoaddress_resolved;
92 };
93
94
95 /* Local variables.  */
96 static struct alias_stats_d alias_stats;
97
98 /* Local functions.  */
99 static void compute_flow_insensitive_aliasing (struct alias_info *);
100 static void dump_alias_stats (FILE *);
101 static bool may_alias_p (tree, HOST_WIDE_INT, tree, HOST_WIDE_INT, bool);
102 static tree create_memory_tag (tree type, bool is_type_tag);
103 static tree get_tmt_for (tree, struct alias_info *);
104 static tree get_nmt_for (tree);
105 static void add_may_alias (tree, tree);
106 static void replace_may_alias (tree, size_t, tree);
107 static struct alias_info *init_alias_info (void);
108 static void delete_alias_info (struct alias_info *);
109 static void compute_flow_sensitive_aliasing (struct alias_info *);
110 static void setup_pointers_and_addressables (struct alias_info *);
111 static void create_global_var (void);
112 static void maybe_create_global_var (struct alias_info *ai);
113 static void group_aliases (struct alias_info *);
114 static void set_pt_anything (tree ptr);
115
116 /* Global declarations.  */
117
118 /* Call clobbered variables in the function.  If bit I is set, then
119    REFERENCED_VARS (I) is call-clobbered.  */
120 bitmap call_clobbered_vars;
121
122 /* Addressable variables in the function.  If bit I is set, then
123    REFERENCED_VARS (I) has had its address taken.  Note that
124    CALL_CLOBBERED_VARS and ADDRESSABLE_VARS are not related.  An
125    addressable variable is not necessarily call-clobbered (e.g., a
126    local addressable whose address does not escape) and not all
127    call-clobbered variables are addressable (e.g., a local static
128    variable).  */
129 bitmap addressable_vars;
130
131 /* When the program has too many call-clobbered variables and call-sites,
132    this variable is used to represent the clobbering effects of function
133    calls.  In these cases, all the call clobbered variables in the program
134    are forced to alias this variable.  This reduces compile times by not
135    having to keep track of too many V_MAY_DEF expressions at call sites.  */
136 tree global_var;
137
138
139 /* Compute may-alias information for every variable referenced in function
140    FNDECL.
141
142    Alias analysis proceeds in 3 main phases:
143
144    1- Points-to and escape analysis.
145
146    This phase walks the use-def chains in the SSA web looking for three
147    things:
148
149         * Assignments of the form P_i = &VAR
150         * Assignments of the form P_i = malloc()
151         * Pointers and ADDR_EXPR that escape the current function.
152
153    The concept of 'escaping' is the same one used in the Java world.  When
154    a pointer or an ADDR_EXPR escapes, it means that it has been exposed
155    outside of the current function.  So, assignment to global variables,
156    function arguments and returning a pointer are all escape sites, as are
157    conversions between pointers and integers.
158
159    This is where we are currently limited.  Since not everything is renamed
160    into SSA, we lose track of escape properties when a pointer is stashed
161    inside a field in a structure, for instance.  In those cases, we are
162    assuming that the pointer does escape.
163
164    We use escape analysis to determine whether a variable is
165    call-clobbered.  Simply put, if an ADDR_EXPR escapes, then the variable
166    is call-clobbered.  If a pointer P_i escapes, then all the variables
167    pointed-to by P_i (and its memory tag) also escape.
168
169    2- Compute flow-sensitive aliases
170
171    We have two classes of memory tags.  Memory tags associated with the
172    pointed-to data type of the pointers in the program.  These tags are
173    called "type memory tag" (TMT).  The other class are those associated
174    with SSA_NAMEs, called "name memory tag" (NMT). The basic idea is that
175    when adding operands for an INDIRECT_REF *P_i, we will first check
176    whether P_i has a name tag, if it does we use it, because that will have
177    more precise aliasing information.  Otherwise, we use the standard type
178    tag.
179
180    In this phase, we go through all the pointers we found in points-to
181    analysis and create alias sets for the name memory tags associated with
182    each pointer P_i.  If P_i escapes, we mark call-clobbered the variables
183    it points to and its tag.
184
185
186    3- Compute flow-insensitive aliases
187
188    This pass will compare the alias set of every type memory tag and every
189    addressable variable found in the program.  Given a type memory tag TMT
190    and an addressable variable V.  If the alias sets of TMT and V conflict
191    (as computed by may_alias_p), then V is marked as an alias tag and added
192    to the alias set of TMT.
193
194    For instance, consider the following function:
195
196             foo (int i)
197             {
198               int *p, a, b;
199             
200               if (i > 10)
201                 p = &a;
202               else
203                 p = &b;
204             
205               *p = 3;
206               a = b + 2;
207               return *p;
208             }
209
210    After aliasing analysis has finished, the type memory tag for pointer
211    'p' will have two aliases, namely variables 'a' and 'b'.  Every time
212    pointer 'p' is dereferenced, we want to mark the operation as a
213    potential reference to 'a' and 'b'.
214
215             foo (int i)
216             {
217               int *p, a, b;
218
219               if (i_2 > 10)
220                 p_4 = &a;
221               else
222                 p_6 = &b;
223               # p_1 = PHI <p_4(1), p_6(2)>;
224
225               # a_7 = V_MAY_DEF <a_3>;
226               # b_8 = V_MAY_DEF <b_5>;
227               *p_1 = 3;
228
229               # a_9 = V_MAY_DEF <a_7>
230               # VUSE <b_8>
231               a_9 = b_8 + 2;
232
233               # VUSE <a_9>;
234               # VUSE <b_8>;
235               return *p_1;
236             }
237
238    In certain cases, the list of may aliases for a pointer may grow too
239    large.  This may cause an explosion in the number of virtual operands
240    inserted in the code.  Resulting in increased memory consumption and
241    compilation time.
242
243    When the number of virtual operands needed to represent aliased
244    loads and stores grows too large (configurable with @option{--param
245    max-aliased-vops}), alias sets are grouped to avoid severe
246    compile-time slow downs and memory consumption.  See group_aliases.  */
247
248 static void
249 compute_may_aliases (void)
250 {
251   struct alias_info *ai;
252   
253   memset (&alias_stats, 0, sizeof (alias_stats));
254
255   /* Initialize aliasing information.  */
256   ai = init_alias_info ();
257
258   /* For each pointer P_i, determine the sets of variables that P_i may
259      point-to.  For every addressable variable V, determine whether the
260      address of V escapes the current function, making V call-clobbered
261      (i.e., whether &V is stored in a global variable or if its passed as a
262      function call argument).  */
263   compute_points_to_sets (ai);
264
265   /* Collect all pointers and addressable variables, compute alias sets,
266      create memory tags for pointers and promote variables whose address is
267      not needed anymore.  */
268   setup_pointers_and_addressables (ai);
269
270   /* Compute flow-sensitive, points-to based aliasing for all the name
271      memory tags.  Note that this pass needs to be done before flow
272      insensitive analysis because it uses the points-to information
273      gathered before to mark call-clobbered type tags.  */
274   compute_flow_sensitive_aliasing (ai);
275
276   /* Compute type-based flow-insensitive aliasing for all the type
277      memory tags.  */
278   compute_flow_insensitive_aliasing (ai);
279
280   /* If the program has too many call-clobbered variables and/or function
281      calls, create .GLOBAL_VAR and use it to model call-clobbering
282      semantics at call sites.  This reduces the number of virtual operands
283      considerably, improving compile times at the expense of lost
284      aliasing precision.  */
285   maybe_create_global_var (ai);
286
287   /* Debugging dumps.  */
288   if (dump_file)
289     {
290       dump_referenced_vars (dump_file);
291       if (dump_flags & TDF_STATS)
292         dump_alias_stats (dump_file);
293       dump_points_to_info (dump_file);
294       dump_alias_info (dump_file);
295     }
296
297   /* Deallocate memory used by aliasing data structures.  */
298   delete_alias_info (ai);
299
300   {
301     block_stmt_iterator bsi;
302     basic_block bb;
303     FOR_EACH_BB (bb)
304       {
305         for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
306           {
307             update_stmt_if_modified (bsi_stmt (bsi));
308           }
309       }
310   }
311
312 }
313
314 struct tree_opt_pass pass_may_alias = 
315 {
316   "alias",                              /* name */
317   NULL,                                 /* gate */
318   compute_may_aliases,                  /* execute */
319   NULL,                                 /* sub */
320   NULL,                                 /* next */
321   0,                                    /* static_pass_number */
322   TV_TREE_MAY_ALIAS,                    /* tv_id */
323   PROP_cfg | PROP_ssa,                  /* properties_required */
324   PROP_alias,                           /* properties_provided */
325   0,                                    /* properties_destroyed */
326   0,                                    /* todo_flags_start */
327   TODO_dump_func | TODO_update_ssa
328     | TODO_ggc_collect | TODO_verify_ssa
329     | TODO_verify_stmts,                /* todo_flags_finish */
330   0                                     /* letter */
331 };
332
333
334 /* Data structure used to count the number of dereferences to PTR
335    inside an expression.  */
336 struct count_ptr_d
337 {
338   tree ptr;
339   unsigned count;
340 };
341
342
343 /* Helper for count_uses_and_derefs.  Called by walk_tree to look for
344    (ALIGN/MISALIGNED_)INDIRECT_REF nodes for the pointer passed in DATA.  */
345
346 static tree
347 count_ptr_derefs (tree *tp, int *walk_subtrees, void *data)
348 {
349   struct count_ptr_d *count_p = (struct count_ptr_d *) data;
350
351   /* Do not walk inside ADDR_EXPR nodes.  In the expression &ptr->fld,
352      pointer 'ptr' is *not* dereferenced, it is simply used to compute
353      the address of 'fld' as 'ptr + offsetof(fld)'.  */
354   if (TREE_CODE (*tp) == ADDR_EXPR)
355     {
356       *walk_subtrees = 0;
357       return NULL_TREE;
358     }
359
360   if (INDIRECT_REF_P (*tp) && TREE_OPERAND (*tp, 0) == count_p->ptr)
361     count_p->count++;
362
363   return NULL_TREE;
364 }
365
366
367 /* Count the number of direct and indirect uses for pointer PTR in
368    statement STMT.  The two counts are stored in *NUM_USES_P and
369    *NUM_DEREFS_P respectively.  *IS_STORE_P is set to 'true' if at
370    least one of those dereferences is a store operation.  */
371
372 void
373 count_uses_and_derefs (tree ptr, tree stmt, unsigned *num_uses_p,
374                        unsigned *num_derefs_p, bool *is_store)
375 {
376   ssa_op_iter i;
377   tree use;
378
379   *num_uses_p = 0;
380   *num_derefs_p = 0;
381   *is_store = false;
382
383   /* Find out the total number of uses of PTR in STMT.  */
384   FOR_EACH_SSA_TREE_OPERAND (use, stmt, i, SSA_OP_USE)
385     if (use == ptr)
386       (*num_uses_p)++;
387
388   /* Now count the number of indirect references to PTR.  This is
389      truly awful, but we don't have much choice.  There are no parent
390      pointers inside INDIRECT_REFs, so an expression like
391      '*x_1 = foo (x_1, *x_1)' needs to be traversed piece by piece to
392      find all the indirect and direct uses of x_1 inside.  The only
393      shortcut we can take is the fact that GIMPLE only allows
394      INDIRECT_REFs inside the expressions below.  */
395   if (TREE_CODE (stmt) == MODIFY_EXPR
396       || (TREE_CODE (stmt) == RETURN_EXPR
397           && TREE_CODE (TREE_OPERAND (stmt, 0)) == MODIFY_EXPR)
398       || TREE_CODE (stmt) == ASM_EXPR
399       || TREE_CODE (stmt) == CALL_EXPR)
400     {
401       tree lhs, rhs;
402
403       if (TREE_CODE (stmt) == MODIFY_EXPR)
404         {
405           lhs = TREE_OPERAND (stmt, 0);
406           rhs = TREE_OPERAND (stmt, 1);
407         }
408       else if (TREE_CODE (stmt) == RETURN_EXPR)
409         {
410           tree e = TREE_OPERAND (stmt, 0);
411           lhs = TREE_OPERAND (e, 0);
412           rhs = TREE_OPERAND (e, 1);
413         }
414       else if (TREE_CODE (stmt) == ASM_EXPR)
415         {
416           lhs = ASM_OUTPUTS (stmt);
417           rhs = ASM_INPUTS (stmt);
418         }
419       else
420         {
421           lhs = NULL_TREE;
422           rhs = stmt;
423         }
424
425       if (lhs && (TREE_CODE (lhs) == TREE_LIST || EXPR_P (lhs)))
426         {
427           struct count_ptr_d count;
428           count.ptr = ptr;
429           count.count = 0;
430           walk_tree (&lhs, count_ptr_derefs, &count, NULL);
431           *is_store = true;
432           *num_derefs_p = count.count;
433         }
434
435       if (rhs && (TREE_CODE (rhs) == TREE_LIST || EXPR_P (rhs)))
436         {
437           struct count_ptr_d count;
438           count.ptr = ptr;
439           count.count = 0;
440           walk_tree (&rhs, count_ptr_derefs, &count, NULL);
441           *num_derefs_p += count.count;
442         }
443     }
444
445   gcc_assert (*num_uses_p >= *num_derefs_p);
446 }
447
448 /* Initialize the data structures used for alias analysis.  */
449
450 static struct alias_info *
451 init_alias_info (void)
452 {
453   struct alias_info *ai;
454   referenced_var_iterator rvi;
455   tree var;
456
457   bitmap_obstack_initialize (&alias_obstack);
458   ai = xcalloc (1, sizeof (struct alias_info));
459   ai->ssa_names_visited = sbitmap_alloc (num_ssa_names);
460   sbitmap_zero (ai->ssa_names_visited);
461   VARRAY_TREE_INIT (ai->processed_ptrs, 50, "processed_ptrs");
462   ai->written_vars = BITMAP_ALLOC (&alias_obstack);
463   ai->dereferenced_ptrs_store = BITMAP_ALLOC (&alias_obstack);
464   ai->dereferenced_ptrs_load = BITMAP_ALLOC (&alias_obstack);
465
466   /* If aliases have been computed before, clear existing information.  */
467   if (aliases_computed_p)
468     {
469       unsigned i;
470   
471       /* Similarly, clear the set of addressable variables.  In this
472          case, we can just clear the set because addressability is
473          only computed here.  */
474       bitmap_clear (addressable_vars);
475
476       /* Clear flow-insensitive alias information from each symbol.  */
477       FOR_EACH_REFERENCED_VAR (var, rvi)
478         {
479           var_ann_t ann = var_ann (var);
480           
481           ann->is_alias_tag = 0;
482           ann->may_aliases = NULL;
483           NUM_REFERENCES_CLEAR (ann);
484
485           /* Since we are about to re-discover call-clobbered
486              variables, clear the call-clobbered flag.  Variables that
487              are intrinsically call-clobbered (globals, local statics,
488              etc) will not be marked by the aliasing code, so we can't
489              remove them from CALL_CLOBBERED_VARS.  
490
491              NB: STRUCT_FIELDS are still call clobbered if they are for
492              a global variable, so we *don't* clear their call clobberedness
493              just because they are tags, though we will clear it if they
494              aren't for global variables.  */
495           if (ann->mem_tag_kind == NAME_TAG 
496               || ann->mem_tag_kind == TYPE_TAG 
497               || !is_global_var (var))
498             clear_call_clobbered (var);
499         }
500
501       /* Clear flow-sensitive points-to information from each SSA name.  */
502       for (i = 1; i < num_ssa_names; i++)
503         {
504           tree name = ssa_name (i);
505
506           if (!name || !POINTER_TYPE_P (TREE_TYPE (name)))
507             continue;
508
509           if (SSA_NAME_PTR_INFO (name))
510             {
511               struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
512
513               /* Clear all the flags but keep the name tag to
514                  avoid creating new temporaries unnecessarily.  If
515                  this pointer is found to point to a subset or
516                  superset of its former points-to set, then a new
517                  tag will need to be created in create_name_tags.  */
518               pi->pt_anything = 0;
519               pi->pt_null = 0;
520               pi->value_escapes_p = 0;
521               pi->is_dereferenced = 0;
522               if (pi->pt_vars)
523                 bitmap_clear (pi->pt_vars);
524             }
525         }
526     }
527
528   /* Next time, we will need to reset alias information.  */
529   aliases_computed_p = true;
530
531   return ai;
532 }
533
534
535 /* Deallocate memory used by alias analysis.  */
536
537 static void
538 delete_alias_info (struct alias_info *ai)
539 {
540   size_t i;
541   referenced_var_iterator rvi;
542   tree var;
543
544   sbitmap_free (ai->ssa_names_visited);
545   ai->processed_ptrs = NULL;
546
547   for (i = 0; i < ai->num_addressable_vars; i++)
548     free (ai->addressable_vars[i]);
549   
550   FOR_EACH_REFERENCED_VAR(var, rvi)
551     {
552       var_ann_t ann = var_ann (var);
553       NUM_REFERENCES_CLEAR (ann);
554     }
555
556   free (ai->addressable_vars);
557
558   for (i = 0; i < ai->num_pointers; i++)
559     free (ai->pointers[i]);
560   free (ai->pointers);
561
562   BITMAP_FREE (ai->written_vars);
563   BITMAP_FREE (ai->dereferenced_ptrs_store);
564   BITMAP_FREE (ai->dereferenced_ptrs_load);
565   bitmap_obstack_release (&alias_obstack);
566   free (ai);
567
568   delete_points_to_sets ();
569 }
570
571 /* Create name tags for all the pointers that have been dereferenced.
572    We only create a name tag for a pointer P if P is found to point to
573    a set of variables (so that we can alias them to *P) or if it is
574    the result of a call to malloc (which means that P cannot point to
575    anything else nor alias any other variable).
576
577    If two pointers P and Q point to the same set of variables, they
578    are assigned the same name tag.  */
579
580 static void
581 create_name_tags (void)
582 {
583   size_t i;
584   VEC (tree, heap) *with_ptvars = NULL;
585   tree ptr;
586
587   /* Collect the list of pointers with a non-empty points to set.  */
588   for (i = 1; i < num_ssa_names; i++)
589     {
590       tree ptr = ssa_name (i);
591       struct ptr_info_def *pi;
592
593       if (!ptr
594           || !POINTER_TYPE_P (TREE_TYPE (ptr))
595           || !SSA_NAME_PTR_INFO (ptr))
596         continue;
597
598       pi = SSA_NAME_PTR_INFO (ptr);
599
600       if (pi->pt_anything || !pi->is_dereferenced)
601         {
602           /* No name tags for pointers that have not been
603              dereferenced or point to an arbitrary location.  */
604           pi->name_mem_tag = NULL_TREE;
605           continue;
606         }
607
608       /* Set pt_anything on the pointers without pt_vars filled in so
609          that they are assigned a type tag.  */
610       
611       if (pi->pt_vars && !bitmap_empty_p (pi->pt_vars)) 
612         VEC_safe_push (tree, heap, with_ptvars, ptr);
613       else
614         set_pt_anything (ptr);
615     }
616   
617   /* If we didn't find any pointers with pt_vars set, we're done.  */
618   if (!with_ptvars)
619     return;
620
621   /* Now go through the pointers with pt_vars, and find a name tag
622      with the same pt_vars as this pointer, or create one if one
623      doesn't exist.  */
624   for (i = 0; VEC_iterate (tree, with_ptvars, i, ptr); i++)
625     {
626       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
627       size_t j;
628       tree ptr2;
629       tree old_name_tag = pi->name_mem_tag;
630       
631       /* If PTR points to a set of variables, check if we don't
632          have another pointer Q with the same points-to set before
633          creating a tag.  If so, use Q's tag instead of creating a
634          new one.
635          
636          This is important for not creating unnecessary symbols
637          and also for copy propagation.  If we ever need to
638          propagate PTR into Q or vice-versa, we would run into
639          problems if they both had different name tags because
640          they would have different SSA version numbers (which
641          would force us to take the name tags in and out of SSA).  */
642       for (j = 0; j < i && VEC_iterate (tree, with_ptvars, j, ptr2); j++)
643         {
644           struct ptr_info_def *qi = SSA_NAME_PTR_INFO (ptr2);
645           
646           if (bitmap_equal_p (pi->pt_vars, qi->pt_vars))
647             {
648               pi->name_mem_tag = qi->name_mem_tag;
649               break;
650             }
651         }
652       
653       /* If we didn't find a pointer with the same points-to set
654          as PTR, create a new name tag if needed.  */
655       if (pi->name_mem_tag == NULL_TREE)
656         pi->name_mem_tag = get_nmt_for (ptr);
657       
658       /* If the new name tag computed for PTR is different than
659          the old name tag that it used to have, then the old tag
660          needs to be removed from the IL, so we mark it for
661          renaming.  */
662       if (old_name_tag && old_name_tag != pi->name_mem_tag)
663         mark_sym_for_renaming (old_name_tag);
664       
665       TREE_THIS_VOLATILE (pi->name_mem_tag)
666         |= TREE_THIS_VOLATILE (TREE_TYPE (TREE_TYPE (ptr)));
667       
668       /* Mark the new name tag for renaming.  */
669       mark_sym_for_renaming (pi->name_mem_tag);
670     }
671
672   VEC_free (tree, heap, with_ptvars);
673 }
674
675
676 /* For every pointer P_i in AI->PROCESSED_PTRS, create may-alias sets for
677    the name memory tag (NMT) associated with P_i.  If P_i escapes, then its
678    name tag and the variables it points-to are call-clobbered.  Finally, if
679    P_i escapes and we could not determine where it points to, then all the
680    variables in the same alias set as *P_i are marked call-clobbered.  This
681    is necessary because we must assume that P_i may take the address of any
682    variable in the same alias set.  */
683
684 static void
685 compute_flow_sensitive_aliasing (struct alias_info *ai)
686 {
687   size_t i;
688   
689   for (i = 0; i < VARRAY_ACTIVE_SIZE (ai->processed_ptrs); i++)
690     {
691       tree ptr = VARRAY_TREE (ai->processed_ptrs, i);
692       if (!find_what_p_points_to (ptr))
693         set_pt_anything (ptr);
694     }
695
696   create_name_tags ();
697
698   for (i = 0; i < VARRAY_ACTIVE_SIZE (ai->processed_ptrs); i++)
699     {
700       unsigned j;
701       tree ptr = VARRAY_TREE (ai->processed_ptrs, i);
702       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
703       var_ann_t v_ann = var_ann (SSA_NAME_VAR (ptr));
704       bitmap_iterator bi;
705
706       if (pi->value_escapes_p || pi->pt_anything)
707         {
708           /* If PTR escapes or may point to anything, then its associated
709              memory tags and pointed-to variables are call-clobbered.  */
710           if (pi->name_mem_tag)
711             mark_call_clobbered (pi->name_mem_tag);
712
713           if (v_ann->type_mem_tag)
714             mark_call_clobbered (v_ann->type_mem_tag);
715
716           if (pi->pt_vars)
717             EXECUTE_IF_SET_IN_BITMAP (pi->pt_vars, 0, j, bi)
718               mark_call_clobbered (referenced_var (j));
719         }
720
721       /* Set up aliasing information for PTR's name memory tag (if it has
722          one).  Note that only pointers that have been dereferenced will
723          have a name memory tag.  */
724       if (pi->name_mem_tag && pi->pt_vars)
725         EXECUTE_IF_SET_IN_BITMAP (pi->pt_vars, 0, j, bi)
726           {
727             add_may_alias (pi->name_mem_tag, referenced_var (j));
728             add_may_alias (v_ann->type_mem_tag, referenced_var (j));
729           }
730
731       /* If the name tag is call clobbered, so is the type tag
732          associated with the base VAR_DECL.  */
733       if (pi->name_mem_tag
734           && v_ann->type_mem_tag
735           && is_call_clobbered (pi->name_mem_tag))
736         mark_call_clobbered (v_ann->type_mem_tag);
737     }
738 }
739
740
741 /* Compute type-based alias sets.  Traverse all the pointers and
742    addressable variables found in setup_pointers_and_addressables.
743    
744    For every pointer P in AI->POINTERS and addressable variable V in
745    AI->ADDRESSABLE_VARS, add V to the may-alias sets of P's type
746    memory tag (TMT) if their alias sets conflict.  V is then marked as
747    an alias tag so that the operand scanner knows that statements
748    containing V have aliased operands.  */
749
750 static void
751 compute_flow_insensitive_aliasing (struct alias_info *ai)
752 {
753   size_t i;
754
755   /* Initialize counter for the total number of virtual operands that
756      aliasing will introduce.  When AI->TOTAL_ALIAS_VOPS goes beyond the
757      threshold set by --params max-alias-vops, we enable alias
758      grouping.  */
759   ai->total_alias_vops = 0;
760
761   /* For every pointer P, determine which addressable variables may alias
762      with P's type memory tag.  */
763   for (i = 0; i < ai->num_pointers; i++)
764     {
765       size_t j;
766       struct alias_map_d *p_map = ai->pointers[i];
767       tree tag = var_ann (p_map->var)->type_mem_tag;
768       var_ann_t tag_ann = var_ann (tag);
769
770       p_map->total_alias_vops = 0;
771       p_map->may_aliases = BITMAP_ALLOC (&alias_obstack);
772
773       for (j = 0; j < ai->num_addressable_vars; j++)
774         {
775           struct alias_map_d *v_map;
776           var_ann_t v_ann;
777           tree var;
778           bool tag_stored_p, var_stored_p;
779           
780           v_map = ai->addressable_vars[j];
781           var = v_map->var;
782           v_ann = var_ann (var);
783
784           /* Skip memory tags and variables that have never been
785              written to.  We also need to check if the variables are
786              call-clobbered because they may be overwritten by
787              function calls.
788
789              Note this is effectively random accessing elements in
790              the sparse bitset, which can be highly inefficient.
791              So we first check the call_clobbered status of the
792              tag and variable before querying the bitmap.  */
793           tag_stored_p = is_call_clobbered (tag)
794                          || bitmap_bit_p (ai->written_vars, DECL_UID (tag));
795           var_stored_p = is_call_clobbered (var)
796                          || bitmap_bit_p (ai->written_vars, DECL_UID (var));
797           if (!tag_stored_p && !var_stored_p)
798             continue;
799              
800           if (may_alias_p (p_map->var, p_map->set, var, v_map->set, false))
801             {
802               subvar_t svars;
803               size_t num_tag_refs, num_var_refs;
804
805               num_tag_refs = NUM_REFERENCES (tag_ann);
806               num_var_refs = NUM_REFERENCES (v_ann);
807
808               /* Add VAR to TAG's may-aliases set.  */
809
810               /* If this is an aggregate, we may have subvariables for it
811                  that need to be pointed to.  */
812               if (var_can_have_subvars (var)
813                   && (svars = get_subvars_for_var (var)))
814                 {
815                   subvar_t sv;
816
817                   for (sv = svars; sv; sv = sv->next)
818                     {
819                       add_may_alias (tag, sv->var);
820                       /* Update the bitmap used to represent TAG's alias set
821                          in case we need to group aliases.  */
822                       bitmap_set_bit (p_map->may_aliases, DECL_UID (sv->var));
823                     }
824                 }
825               else
826                 {
827                   add_may_alias (tag, var);
828                   /* Update the bitmap used to represent TAG's alias set
829                      in case we need to group aliases.  */
830                   bitmap_set_bit (p_map->may_aliases, DECL_UID (var));
831                 }
832
833               /* Update the total number of virtual operands due to
834                  aliasing.  Since we are adding one more alias to TAG's
835                  may-aliases set, the total number of virtual operands due
836                  to aliasing will be increased by the number of references
837                  made to VAR and TAG (every reference to TAG will also
838                  count as a reference to VAR).  */
839               ai->total_alias_vops += (num_var_refs + num_tag_refs);
840               p_map->total_alias_vops += (num_var_refs + num_tag_refs);
841
842
843             }
844         }
845     }
846
847   /* Since this analysis is based exclusively on symbols, it fails to
848      handle cases where two pointers P and Q have different memory
849      tags with conflicting alias set numbers but no aliased symbols in
850      common.
851
852      For example, suppose that we have two memory tags TMT.1 and TMT.2
853      such that
854      
855                 may-aliases (TMT.1) = { a }
856                 may-aliases (TMT.2) = { b }
857
858      and the alias set number of TMT.1 conflicts with that of TMT.2.
859      Since they don't have symbols in common, loads and stores from
860      TMT.1 and TMT.2 will seem independent of each other, which will
861      lead to the optimizers making invalid transformations (see
862      testsuite/gcc.c-torture/execute/pr15262-[12].c).
863
864      To avoid this problem, we do a final traversal of AI->POINTERS
865      looking for pairs of pointers that have no aliased symbols in
866      common and yet have conflicting alias set numbers.  */
867   for (i = 0; i < ai->num_pointers; i++)
868     {
869       size_t j;
870       struct alias_map_d *p_map1 = ai->pointers[i];
871       tree tag1 = var_ann (p_map1->var)->type_mem_tag;
872       bitmap may_aliases1 = p_map1->may_aliases;
873
874       for (j = i + 1; j < ai->num_pointers; j++)
875         {
876           struct alias_map_d *p_map2 = ai->pointers[j];
877           tree tag2 = var_ann (p_map2->var)->type_mem_tag;
878           bitmap may_aliases2 = p_map2->may_aliases;
879
880           /* If the pointers may not point to each other, do nothing.  */
881           if (!may_alias_p (p_map1->var, p_map1->set, tag2, p_map2->set, true))
882             continue;
883
884           /* The two pointers may alias each other.  If they already have
885              symbols in common, do nothing.  */
886           if (bitmap_intersect_p (may_aliases1, may_aliases2))
887             continue;
888
889           if (!bitmap_empty_p (may_aliases2))
890             {
891               unsigned int k;
892               bitmap_iterator bi;
893
894               /* Add all the aliases for TAG2 into TAG1's alias set.
895                  FIXME, update grouping heuristic counters.  */
896               EXECUTE_IF_SET_IN_BITMAP (may_aliases2, 0, k, bi)
897                 add_may_alias (tag1, referenced_var (k));
898               bitmap_ior_into (may_aliases1, may_aliases2);
899             }
900           else
901             {
902               /* Since TAG2 does not have any aliases of its own, add
903                  TAG2 itself to the alias set of TAG1.  */
904               add_may_alias (tag1, tag2);
905               bitmap_set_bit (may_aliases1, DECL_UID (tag2));
906             }
907         }
908     }
909   
910   if (dump_file)
911     fprintf (dump_file, "\n%s: Total number of aliased vops: %ld\n",
912              get_name (current_function_decl),
913              ai->total_alias_vops);
914
915   /* Determine if we need to enable alias grouping.  */
916   if (ai->total_alias_vops >= MAX_ALIASED_VOPS)
917     group_aliases (ai);
918 }
919
920
921 /* Comparison function for qsort used in group_aliases.  */
922
923 static int
924 total_alias_vops_cmp (const void *p, const void *q)
925 {
926   const struct alias_map_d **p1 = (const struct alias_map_d **)p;
927   const struct alias_map_d **p2 = (const struct alias_map_d **)q;
928   long n1 = (*p1)->total_alias_vops;
929   long n2 = (*p2)->total_alias_vops;
930
931   /* We want to sort in descending order.  */
932   return (n1 > n2 ? -1 : (n1 == n2) ? 0 : 1);
933 }
934
935 /* Group all the aliases for TAG to make TAG represent all the
936    variables in its alias set.  Update the total number
937    of virtual operands due to aliasing (AI->TOTAL_ALIAS_VOPS).  This
938    function will make TAG be the unique alias tag for all the
939    variables in its may-aliases.  So, given:
940
941         may-aliases(TAG) = { V1, V2, V3 }
942
943    This function will group the variables into:
944
945         may-aliases(V1) = { TAG }
946         may-aliases(V2) = { TAG }
947         may-aliases(V2) = { TAG }  */
948
949 static void
950 group_aliases_into (tree tag, bitmap tag_aliases, struct alias_info *ai)
951 {
952   unsigned int i;
953   var_ann_t tag_ann = var_ann (tag);
954   size_t num_tag_refs = NUM_REFERENCES (tag_ann);
955   bitmap_iterator bi;
956
957   EXECUTE_IF_SET_IN_BITMAP (tag_aliases, 0, i, bi)
958     {
959       tree var = referenced_var (i);
960       var_ann_t ann = var_ann (var);
961
962       /* Make TAG the unique alias of VAR.  */
963       ann->is_alias_tag = 0;
964       ann->may_aliases = NULL;
965
966       /* Note that VAR and TAG may be the same if the function has no
967          addressable variables (see the discussion at the end of
968          setup_pointers_and_addressables).  */
969       if (var != tag)
970         add_may_alias (var, tag);
971
972       /* Reduce total number of virtual operands contributed
973          by TAG on behalf of VAR.  Notice that the references to VAR
974          itself won't be removed.  We will merely replace them with
975          references to TAG.  */
976       ai->total_alias_vops -= num_tag_refs;
977     }
978
979   /* We have reduced the number of virtual operands that TAG makes on
980      behalf of all the variables formerly aliased with it.  However,
981      we have also "removed" all the virtual operands for TAG itself,
982      so we add them back.  */
983   ai->total_alias_vops += num_tag_refs;
984
985   /* TAG no longer has any aliases.  */
986   tag_ann->may_aliases = NULL;
987 }
988
989
990 /* Group may-aliases sets to reduce the number of virtual operands due
991    to aliasing.
992
993      1- Sort the list of pointers in decreasing number of contributed
994         virtual operands.
995
996      2- Take the first entry in AI->POINTERS and revert the role of
997         the memory tag and its aliases.  Usually, whenever an aliased
998         variable Vi is found to alias with a memory tag T, we add Vi
999         to the may-aliases set for T.  Meaning that after alias
1000         analysis, we will have:
1001
1002                 may-aliases(T) = { V1, V2, V3, ..., Vn }
1003
1004         This means that every statement that references T, will get 'n'
1005         virtual operands for each of the Vi tags.  But, when alias
1006         grouping is enabled, we make T an alias tag and add it to the
1007         alias set of all the Vi variables:
1008
1009                 may-aliases(V1) = { T }
1010                 may-aliases(V2) = { T }
1011                 ...
1012                 may-aliases(Vn) = { T }
1013
1014         This has two effects: (a) statements referencing T will only get
1015         a single virtual operand, and, (b) all the variables Vi will now
1016         appear to alias each other.  So, we lose alias precision to
1017         improve compile time.  But, in theory, a program with such a high
1018         level of aliasing should not be very optimizable in the first
1019         place.
1020
1021      3- Since variables may be in the alias set of more than one
1022         memory tag, the grouping done in step (2) needs to be extended
1023         to all the memory tags that have a non-empty intersection with
1024         the may-aliases set of tag T.  For instance, if we originally
1025         had these may-aliases sets:
1026
1027                 may-aliases(T) = { V1, V2, V3 }
1028                 may-aliases(R) = { V2, V4 }
1029
1030         In step (2) we would have reverted the aliases for T as:
1031
1032                 may-aliases(V1) = { T }
1033                 may-aliases(V2) = { T }
1034                 may-aliases(V3) = { T }
1035
1036         But note that now V2 is no longer aliased with R.  We could
1037         add R to may-aliases(V2), but we are in the process of
1038         grouping aliases to reduce virtual operands so what we do is
1039         add V4 to the grouping to obtain:
1040
1041                 may-aliases(V1) = { T }
1042                 may-aliases(V2) = { T }
1043                 may-aliases(V3) = { T }
1044                 may-aliases(V4) = { T }
1045
1046      4- If the total number of virtual operands due to aliasing is
1047         still above the threshold set by max-alias-vops, go back to (2).  */
1048
1049 static void
1050 group_aliases (struct alias_info *ai)
1051 {
1052   size_t i;
1053
1054   /* Sort the POINTERS array in descending order of contributed
1055      virtual operands.  */
1056   qsort (ai->pointers, ai->num_pointers, sizeof (struct alias_map_d *),
1057          total_alias_vops_cmp);
1058
1059   /* For every pointer in AI->POINTERS, reverse the roles of its tag
1060      and the tag's may-aliases set.  */
1061   for (i = 0; i < ai->num_pointers; i++)
1062     {
1063       size_t j;
1064       tree tag1 = var_ann (ai->pointers[i]->var)->type_mem_tag;
1065       bitmap tag1_aliases = ai->pointers[i]->may_aliases;
1066
1067       /* Skip tags that have been grouped already.  */
1068       if (ai->pointers[i]->grouped_p)
1069         continue;
1070
1071       /* See if TAG1 had any aliases in common with other type tags.
1072          If we find a TAG2 with common aliases with TAG1, add TAG2's
1073          aliases into TAG1.  */
1074       for (j = i + 1; j < ai->num_pointers; j++)
1075         {
1076           bitmap tag2_aliases = ai->pointers[j]->may_aliases;
1077
1078           if (bitmap_intersect_p (tag1_aliases, tag2_aliases))
1079             {
1080               tree tag2 = var_ann (ai->pointers[j]->var)->type_mem_tag;
1081
1082               bitmap_ior_into (tag1_aliases, tag2_aliases);
1083
1084               /* TAG2 does not need its aliases anymore.  */
1085               bitmap_clear (tag2_aliases);
1086               var_ann (tag2)->may_aliases = NULL;
1087
1088               /* TAG1 is the unique alias of TAG2.  */
1089               add_may_alias (tag2, tag1);
1090
1091               ai->pointers[j]->grouped_p = true;
1092             }
1093         }
1094
1095       /* Now group all the aliases we collected into TAG1.  */
1096       group_aliases_into (tag1, tag1_aliases, ai);
1097
1098       /* If we've reduced total number of virtual operands below the
1099          threshold, stop.  */
1100       if (ai->total_alias_vops < MAX_ALIASED_VOPS)
1101         break;
1102     }
1103
1104   /* Finally, all the variables that have been grouped cannot be in
1105      the may-alias set of name memory tags.  Suppose that we have
1106      grouped the aliases in this code so that may-aliases(a) = TMT.20
1107
1108         p_5 = &a;
1109         ...
1110         # a_9 = V_MAY_DEF <a_8>
1111         p_5->field = 0
1112         ... Several modifications to TMT.20 ... 
1113         # VUSE <a_9>
1114         x_30 = p_5->field
1115
1116      Since p_5 points to 'a', the optimizers will try to propagate 0
1117      into p_5->field, but that is wrong because there have been
1118      modifications to 'TMT.20' in between.  To prevent this we have to
1119      replace 'a' with 'TMT.20' in the name tag of p_5.  */
1120   for (i = 0; i < VARRAY_ACTIVE_SIZE (ai->processed_ptrs); i++)
1121     {
1122       size_t j;
1123       tree ptr = VARRAY_TREE (ai->processed_ptrs, i);
1124       tree name_tag = SSA_NAME_PTR_INFO (ptr)->name_mem_tag;
1125       varray_type aliases;
1126       
1127       if (name_tag == NULL_TREE)
1128         continue;
1129
1130       aliases = var_ann (name_tag)->may_aliases;
1131       for (j = 0; aliases && j < VARRAY_ACTIVE_SIZE (aliases); j++)
1132         {
1133           tree alias = VARRAY_TREE (aliases, j);
1134           var_ann_t ann = var_ann (alias);
1135
1136           if ((ann->mem_tag_kind == NOT_A_TAG 
1137                || ann->mem_tag_kind == STRUCT_FIELD)
1138               && ann->may_aliases)
1139             {
1140               tree new_alias;
1141
1142               gcc_assert (VARRAY_ACTIVE_SIZE (ann->may_aliases) == 1);
1143
1144               new_alias = VARRAY_TREE (ann->may_aliases, 0);
1145               replace_may_alias (name_tag, j, new_alias);
1146             }
1147         }
1148     }
1149
1150   if (dump_file)
1151     fprintf (dump_file,
1152              "%s: Total number of aliased vops after grouping: %ld%s\n",
1153              get_name (current_function_decl),
1154              ai->total_alias_vops,
1155              (ai->total_alias_vops < 0) ? " (negative values are OK)" : "");
1156 }
1157
1158
1159 /* Create a new alias set entry for VAR in AI->ADDRESSABLE_VARS.  */
1160
1161 static void
1162 create_alias_map_for (tree var, struct alias_info *ai)
1163 {
1164   struct alias_map_d *alias_map;
1165   alias_map = xcalloc (1, sizeof (*alias_map));
1166   alias_map->var = var;
1167   alias_map->set = get_alias_set (var);
1168   ai->addressable_vars[ai->num_addressable_vars++] = alias_map;
1169 }
1170
1171
1172 /* Create memory tags for all the dereferenced pointers and build the
1173    ADDRESSABLE_VARS and POINTERS arrays used for building the may-alias
1174    sets.  Based on the address escape and points-to information collected
1175    earlier, this pass will also clear the TREE_ADDRESSABLE flag from those
1176    variables whose address is not needed anymore.  */
1177
1178 static void
1179 setup_pointers_and_addressables (struct alias_info *ai)
1180 {
1181   size_t n_vars, num_addressable_vars, num_pointers;
1182   referenced_var_iterator rvi;
1183   tree var;
1184   VEC (tree, heap) *varvec = NULL;
1185   safe_referenced_var_iterator srvi;
1186
1187   /* Size up the arrays ADDRESSABLE_VARS and POINTERS.  */
1188   num_addressable_vars = num_pointers = 0;
1189   
1190   FOR_EACH_REFERENCED_VAR (var, rvi)
1191     {
1192       if (may_be_aliased (var))
1193         num_addressable_vars++;
1194
1195       if (POINTER_TYPE_P (TREE_TYPE (var)))
1196         {
1197           /* Since we don't keep track of volatile variables, assume that
1198              these pointers are used in indirect store operations.  */
1199           if (TREE_THIS_VOLATILE (var))
1200             bitmap_set_bit (ai->dereferenced_ptrs_store, DECL_UID (var));
1201
1202           num_pointers++;
1203         }
1204     }
1205
1206   /* Create ADDRESSABLE_VARS and POINTERS.  Note that these arrays are
1207      always going to be slightly bigger than we actually need them
1208      because some TREE_ADDRESSABLE variables will be marked
1209      non-addressable below and only pointers with unique type tags are
1210      going to be added to POINTERS.  */
1211   ai->addressable_vars = xcalloc (num_addressable_vars,
1212                                   sizeof (struct alias_map_d *));
1213   ai->pointers = xcalloc (num_pointers, sizeof (struct alias_map_d *));
1214   ai->num_addressable_vars = 0;
1215   ai->num_pointers = 0;
1216
1217   /* Since we will be creating type memory tags within this loop, cache the
1218      value of NUM_REFERENCED_VARS to avoid processing the additional tags
1219      unnecessarily.  */
1220   n_vars = num_referenced_vars;
1221
1222   FOR_EACH_REFERENCED_VAR_SAFE (var, varvec, srvi)
1223     {
1224       var_ann_t v_ann = var_ann (var);
1225       subvar_t svars;
1226
1227       /* Name memory tags already have flow-sensitive aliasing
1228          information, so they need not be processed by
1229          compute_flow_insensitive_aliasing.  Similarly, type memory
1230          tags are already accounted for when we process their
1231          associated pointer. 
1232       
1233          Structure fields, on the other hand, have to have some of this
1234          information processed for them, but it's pointless to mark them
1235          non-addressable (since they are fake variables anyway).  */
1236       if (v_ann->mem_tag_kind != NOT_A_TAG
1237           && v_ann->mem_tag_kind != STRUCT_FIELD) 
1238         continue;
1239
1240       /* Remove the ADDRESSABLE flag from every addressable variable whose
1241          address is not needed anymore.  This is caused by the propagation
1242          of ADDR_EXPR constants into INDIRECT_REF expressions and the
1243          removal of dead pointer assignments done by the early scalar
1244          cleanup passes.  */
1245       if (TREE_ADDRESSABLE (var))
1246         {
1247           if (!bitmap_bit_p (addressable_vars, DECL_UID (var))
1248               && TREE_CODE (var) != RESULT_DECL
1249               && !is_global_var (var))
1250             {
1251               bool okay_to_mark = true;
1252
1253               /* Since VAR is now a regular GIMPLE register, we will need
1254                  to rename VAR into SSA afterwards.  */
1255               mark_sym_for_renaming (var);
1256
1257               /* If VAR can have sub-variables, and any of its
1258                  sub-variables has its address taken, then we cannot
1259                  remove the addressable flag from VAR.  */
1260               if (var_can_have_subvars (var)
1261                   && (svars = get_subvars_for_var (var)))
1262                 {
1263                   subvar_t sv;
1264
1265                   for (sv = svars; sv; sv = sv->next)
1266                     {         
1267                       if (bitmap_bit_p (addressable_vars, DECL_UID (sv->var)))
1268                         okay_to_mark = false;
1269                       mark_sym_for_renaming (sv->var);
1270                     }
1271                 }
1272
1273               /* The address of VAR is not needed, remove the
1274                  addressable bit, so that it can be optimized as a
1275                  regular variable.  */
1276               if (okay_to_mark)
1277                 mark_non_addressable (var);
1278             }
1279         }
1280
1281       /* Global variables and addressable locals may be aliased.  Create an
1282          entry in ADDRESSABLE_VARS for VAR.  */
1283       if (may_be_aliased (var))
1284         {
1285           create_alias_map_for (var, ai);
1286           mark_sym_for_renaming (var);
1287         }
1288
1289       /* Add pointer variables that have been dereferenced to the POINTERS
1290          array and create a type memory tag for them.  */
1291       if (POINTER_TYPE_P (TREE_TYPE (var)))
1292         {
1293           if ((bitmap_bit_p (ai->dereferenced_ptrs_store, DECL_UID (var))
1294                || bitmap_bit_p (ai->dereferenced_ptrs_load, DECL_UID (var))))
1295             {
1296               tree tag;
1297               var_ann_t t_ann;
1298
1299               /* If pointer VAR still doesn't have a memory tag
1300                  associated with it, create it now or re-use an
1301                  existing one.  */
1302               tag = get_tmt_for (var, ai);
1303               t_ann = var_ann (tag);
1304
1305               /* The type tag will need to be renamed into SSA
1306                  afterwards. Note that we cannot do this inside
1307                  get_tmt_for because aliasing may run multiple times
1308                  and we only create type tags the first time.  */
1309               mark_sym_for_renaming (tag);
1310
1311               /* Similarly, if pointer VAR used to have another type
1312                  tag, we will need to process it in the renamer to
1313                  remove the stale virtual operands.  */
1314               if (v_ann->type_mem_tag)
1315                 mark_sym_for_renaming (v_ann->type_mem_tag);
1316
1317               /* Associate the tag with pointer VAR.  */
1318               v_ann->type_mem_tag = tag;
1319
1320               /* If pointer VAR has been used in a store operation,
1321                  then its memory tag must be marked as written-to.  */
1322               if (bitmap_bit_p (ai->dereferenced_ptrs_store, DECL_UID (var)))
1323                 bitmap_set_bit (ai->written_vars, DECL_UID (tag));
1324
1325               /* If pointer VAR is a global variable or a PARM_DECL,
1326                  then its memory tag should be considered a global
1327                  variable.  */
1328               if (TREE_CODE (var) == PARM_DECL || is_global_var (var))
1329                 mark_call_clobbered (tag);
1330
1331               /* All the dereferences of pointer VAR count as
1332                  references of TAG.  Since TAG can be associated with
1333                  several pointers, add the dereferences of VAR to the
1334                  TAG.  */
1335               NUM_REFERENCES_SET (t_ann, 
1336                                   NUM_REFERENCES (t_ann)
1337                                   + NUM_REFERENCES (v_ann));
1338             }
1339           else
1340             {
1341               /* The pointer has not been dereferenced.  If it had a
1342                  type memory tag, remove it and mark the old tag for
1343                  renaming to remove it out of the IL.  */
1344               var_ann_t ann = var_ann (var);
1345               tree tag = ann->type_mem_tag;
1346               if (tag)
1347                 {
1348                   mark_sym_for_renaming (tag);
1349                   ann->type_mem_tag = NULL_TREE;
1350                 }
1351             }
1352         }
1353     }
1354   VEC_free (tree, heap, varvec);
1355 }
1356
1357
1358 /* Determine whether to use .GLOBAL_VAR to model call clobbering semantics. At
1359    every call site, we need to emit V_MAY_DEF expressions to represent the
1360    clobbering effects of the call for variables whose address escapes the
1361    current function.
1362
1363    One approach is to group all call-clobbered variables into a single
1364    representative that is used as an alias of every call-clobbered variable
1365    (.GLOBAL_VAR).  This works well, but it ties the optimizer hands because
1366    references to any call clobbered variable is a reference to .GLOBAL_VAR.
1367
1368    The second approach is to emit a clobbering V_MAY_DEF for every 
1369    call-clobbered variable at call sites.  This is the preferred way in terms 
1370    of optimization opportunities but it may create too many V_MAY_DEF operands
1371    if there are many call clobbered variables and function calls in the 
1372    function.
1373
1374    To decide whether or not to use .GLOBAL_VAR we multiply the number of
1375    function calls found by the number of call-clobbered variables.  If that
1376    product is beyond a certain threshold, as determined by the parameterized
1377    values shown below, we use .GLOBAL_VAR.
1378
1379    FIXME.  This heuristic should be improved.  One idea is to use several
1380    .GLOBAL_VARs of different types instead of a single one.  The thresholds
1381    have been derived from a typical bootstrap cycle, including all target
1382    libraries. Compile times were found increase by ~1% compared to using
1383    .GLOBAL_VAR.  */
1384
1385 static void
1386 maybe_create_global_var (struct alias_info *ai)
1387 {
1388   unsigned i, n_clobbered;
1389   bitmap_iterator bi;
1390   
1391   /* No need to create it, if we have one already.  */
1392   if (global_var == NULL_TREE)
1393     {
1394       /* Count all the call-clobbered variables.  */
1395       n_clobbered = 0;
1396       EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
1397         {
1398           n_clobbered++;
1399         }
1400
1401       /* If the number of virtual operands that would be needed to
1402          model all the call-clobbered variables is larger than
1403          GLOBAL_VAR_THRESHOLD, create .GLOBAL_VAR.
1404
1405          Also create .GLOBAL_VAR if there are no call-clobbered
1406          variables and the program contains a mixture of pure/const
1407          and regular function calls.  This is to avoid the problem
1408          described in PR 20115:
1409
1410               int X;
1411               int func_pure (void) { return X; }
1412               int func_non_pure (int a) { X += a; }
1413               int foo ()
1414               {
1415                 int a = func_pure ();
1416                 func_non_pure (a);
1417                 a = func_pure ();
1418                 return a;
1419               }
1420
1421          Since foo() has no call-clobbered variables, there is
1422          no relationship between the calls to func_pure and
1423          func_non_pure.  Since func_pure has no side-effects, value
1424          numbering optimizations elide the second call to func_pure.
1425          So, if we have some pure/const and some regular calls in the
1426          program we create .GLOBAL_VAR to avoid missing these
1427          relations.  */
1428       if (ai->num_calls_found * n_clobbered >= (size_t) GLOBAL_VAR_THRESHOLD
1429           || (n_clobbered == 0
1430               && ai->num_calls_found > 0
1431               && ai->num_pure_const_calls_found > 0
1432               && ai->num_calls_found > ai->num_pure_const_calls_found))
1433         create_global_var ();
1434     }
1435
1436   /* Mark all call-clobbered symbols for renaming.  Since the initial
1437      rewrite into SSA ignored all call sites, we may need to rename
1438      .GLOBAL_VAR and the call-clobbered variables.   */
1439   EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
1440     {
1441       tree var = referenced_var (i);
1442
1443       /* If the function has calls to clobbering functions and
1444          .GLOBAL_VAR has been created, make it an alias for all
1445          call-clobbered variables.  */
1446       if (global_var && var != global_var)
1447         {
1448           subvar_t svars;
1449           add_may_alias (var, global_var);
1450           if (var_can_have_subvars (var)
1451               && (svars = get_subvars_for_var (var)))
1452             {
1453               subvar_t sv;
1454               for (sv = svars; sv; sv = sv->next)
1455                 mark_sym_for_renaming (sv->var);
1456             }
1457         }
1458       
1459       mark_sym_for_renaming (var);
1460     }
1461 }
1462
1463
1464 /* Return TRUE if pointer PTR may point to variable VAR.
1465    
1466    MEM_ALIAS_SET is the alias set for the memory location pointed-to by PTR
1467         This is needed because when checking for type conflicts we are
1468         interested in the alias set of the memory location pointed-to by
1469         PTR.  The alias set of PTR itself is irrelevant.
1470    
1471    VAR_ALIAS_SET is the alias set for VAR.  */
1472
1473 static bool
1474 may_alias_p (tree ptr, HOST_WIDE_INT mem_alias_set,
1475              tree var, HOST_WIDE_INT var_alias_set,
1476              bool alias_set_only)
1477 {
1478   tree mem;
1479   var_ann_t m_ann;
1480
1481   alias_stats.alias_queries++;
1482   alias_stats.simple_queries++;
1483
1484   /* By convention, a variable cannot alias itself.  */
1485   mem = var_ann (ptr)->type_mem_tag;
1486   if (mem == var)
1487     {
1488       alias_stats.alias_noalias++;
1489       alias_stats.simple_resolved++;
1490       return false;
1491     }
1492   
1493   /* If -fargument-noalias-global is >1, pointer arguments may
1494      not point to global variables.  */
1495   if (flag_argument_noalias > 1 && is_global_var (var)
1496       && TREE_CODE (ptr) == PARM_DECL)
1497     {
1498       alias_stats.alias_noalias++;
1499       alias_stats.simple_resolved++;
1500       return false;
1501     }
1502
1503   /* If either MEM or VAR is a read-only global and the other one
1504      isn't, then PTR cannot point to VAR.  */
1505   if ((unmodifiable_var_p (mem) && !unmodifiable_var_p (var))
1506       || (unmodifiable_var_p (var) && !unmodifiable_var_p (mem)))
1507     {
1508       alias_stats.alias_noalias++;
1509       alias_stats.simple_resolved++;
1510       return false;
1511     }
1512
1513   m_ann = var_ann (mem);
1514
1515   gcc_assert (m_ann->mem_tag_kind == TYPE_TAG);
1516
1517   alias_stats.tbaa_queries++;
1518
1519   /* If the alias sets don't conflict then MEM cannot alias VAR.  */
1520   if (!alias_sets_conflict_p (mem_alias_set, var_alias_set))
1521     {
1522       alias_stats.alias_noalias++;
1523       alias_stats.tbaa_resolved++;
1524       return false;
1525     }
1526
1527   /* If var is a record or union type, ptr cannot point into var
1528      unless there is some operation explicit address operation in the
1529      program that can reference a field of the ptr's dereferenced
1530      type.  This also assumes that the types of both var and ptr are
1531      contained within the compilation unit, and that there is no fancy
1532      addressing arithmetic associated with any of the types
1533      involved.  */
1534
1535   if ((mem_alias_set != 0) && (var_alias_set != 0))
1536     {
1537       tree ptr_type = TREE_TYPE (ptr);
1538       tree var_type = TREE_TYPE (var);
1539       
1540       /* The star count is -1 if the type at the end of the pointer_to 
1541          chain is not a record or union type. */ 
1542       if ((!alias_set_only) && 
1543           ipa_type_escape_star_count_of_interesting_type (var_type) >= 0)
1544         {
1545           int ptr_star_count = 0;
1546           
1547           /* Ipa_type_escape_star_count_of_interesting_type is a little to
1548              restrictive for the pointer type, need to allow pointers to
1549              primitive types as long as those types cannot be pointers
1550              to everything.  */
1551           while (POINTER_TYPE_P (ptr_type))
1552             /* Strip the *'s off.  */ 
1553             {
1554               ptr_type = TREE_TYPE (ptr_type);
1555               ptr_star_count++;
1556             }
1557           
1558           /* There does not appear to be a better test to see if the 
1559              pointer type was one of the pointer to everything 
1560              types.  */
1561           
1562           if (ptr_star_count > 0)
1563             {
1564               alias_stats.structnoaddress_queries++;
1565               if (ipa_type_escape_field_does_not_clobber_p (var_type, 
1566                                                             TREE_TYPE (ptr))) 
1567                 {
1568                   alias_stats.structnoaddress_resolved++;
1569                   alias_stats.alias_noalias++;
1570                   return false;
1571                 }
1572             }
1573           else if (ptr_star_count == 0)
1574             {
1575               /* If ptr_type was not really a pointer to type, it cannot 
1576                  alias.  */ 
1577               alias_stats.structnoaddress_queries++;
1578               alias_stats.structnoaddress_resolved++;
1579               alias_stats.alias_noalias++;
1580               return false;
1581             }
1582         }
1583     }
1584
1585   alias_stats.alias_mayalias++;
1586   return true;
1587 }
1588
1589
1590 /* Add ALIAS to the set of variables that may alias VAR.  */
1591
1592 static void
1593 add_may_alias (tree var, tree alias)
1594 {
1595   size_t i;
1596   var_ann_t v_ann = get_var_ann (var);
1597   var_ann_t a_ann = get_var_ann (alias);
1598
1599   /* Don't allow self-referential aliases.  */
1600   gcc_assert (var != alias);
1601
1602   /* ALIAS must be addressable if it's being added to an alias set.  */
1603 #if 1
1604   TREE_ADDRESSABLE (alias) = 1;
1605 #else
1606   gcc_assert (may_be_aliased (alias));
1607 #endif
1608
1609   if (v_ann->may_aliases == NULL)
1610     VARRAY_TREE_INIT (v_ann->may_aliases, 2, "aliases");
1611
1612   /* Avoid adding duplicates.  */
1613   for (i = 0; i < VARRAY_ACTIVE_SIZE (v_ann->may_aliases); i++)
1614     if (alias == VARRAY_TREE (v_ann->may_aliases, i))
1615       return;
1616
1617   /* If VAR is a call-clobbered variable, so is its new ALIAS.
1618      FIXME, call-clobbering should only depend on whether an address
1619      escapes.  It should be independent of aliasing.  */
1620   if (is_call_clobbered (var))
1621     mark_call_clobbered (alias);
1622
1623   /* Likewise.  If ALIAS is call-clobbered, so is VAR.  */
1624   else if (is_call_clobbered (alias))
1625     mark_call_clobbered (var);
1626
1627   VARRAY_PUSH_TREE (v_ann->may_aliases, alias);
1628   a_ann->is_alias_tag = 1;
1629 }
1630
1631
1632 /* Replace alias I in the alias sets of VAR with NEW_ALIAS.  */
1633
1634 static void
1635 replace_may_alias (tree var, size_t i, tree new_alias)
1636 {
1637   var_ann_t v_ann = var_ann (var);
1638   VARRAY_TREE (v_ann->may_aliases, i) = new_alias;
1639
1640   /* If VAR is a call-clobbered variable, so is NEW_ALIAS.
1641      FIXME, call-clobbering should only depend on whether an address
1642      escapes.  It should be independent of aliasing.  */
1643   if (is_call_clobbered (var))
1644     mark_call_clobbered (new_alias);
1645
1646   /* Likewise.  If NEW_ALIAS is call-clobbered, so is VAR.  */
1647   else if (is_call_clobbered (new_alias))
1648     mark_call_clobbered (var);
1649 }
1650
1651
1652 /* Mark pointer PTR as pointing to an arbitrary memory location.  */
1653
1654 static void
1655 set_pt_anything (tree ptr)
1656 {
1657   struct ptr_info_def *pi = get_ptr_info (ptr);
1658
1659   pi->pt_anything = 1;
1660   pi->pt_vars = NULL;
1661
1662   /* The pointer used to have a name tag, but we now found it pointing
1663      to an arbitrary location.  The name tag needs to be renamed and
1664      disassociated from PTR.  */
1665   if (pi->name_mem_tag)
1666     {
1667       mark_sym_for_renaming (pi->name_mem_tag);
1668       pi->name_mem_tag = NULL_TREE;
1669     }
1670 }
1671
1672
1673 /* Return true if STMT is an "escape" site from the current function.  Escape
1674    sites those statements which might expose the address of a variable
1675    outside the current function.  STMT is an escape site iff:
1676
1677         1- STMT is a function call, or
1678         2- STMT is an __asm__ expression, or
1679         3- STMT is an assignment to a non-local variable, or
1680         4- STMT is a return statement.
1681
1682    AI points to the alias information collected so far.  */
1683
1684 bool
1685 is_escape_site (tree stmt, struct alias_info *ai)
1686 {
1687   tree call = get_call_expr_in (stmt);
1688   if (call != NULL_TREE)
1689     {
1690       ai->num_calls_found++;
1691
1692       if (!TREE_SIDE_EFFECTS (call))
1693         ai->num_pure_const_calls_found++;
1694
1695       return true;
1696     }
1697   else if (TREE_CODE (stmt) == ASM_EXPR)
1698     return true;
1699   else if (TREE_CODE (stmt) == MODIFY_EXPR)
1700     {
1701       tree lhs = TREE_OPERAND (stmt, 0);
1702
1703       /* Get to the base of _REF nodes.  */
1704       if (TREE_CODE (lhs) != SSA_NAME)
1705         lhs = get_base_address (lhs);
1706
1707       /* If we couldn't recognize the LHS of the assignment, assume that it
1708          is a non-local store.  */
1709       if (lhs == NULL_TREE)
1710         return true;
1711
1712       /* If the RHS is a conversion between a pointer and an integer, the
1713          pointer escapes since we can't track the integer.  */
1714       if ((TREE_CODE (TREE_OPERAND (stmt, 1)) == NOP_EXPR
1715            || TREE_CODE (TREE_OPERAND (stmt, 1)) == CONVERT_EXPR
1716            || TREE_CODE (TREE_OPERAND (stmt, 1)) == VIEW_CONVERT_EXPR)
1717           && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND
1718                                         (TREE_OPERAND (stmt, 1), 0)))
1719           && !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (stmt, 1))))
1720         return true;
1721
1722       /* If the LHS is an SSA name, it can't possibly represent a non-local
1723          memory store.  */
1724       if (TREE_CODE (lhs) == SSA_NAME)
1725         return false;
1726
1727       /* FIXME: LHS is not an SSA_NAME.  Even if it's an assignment to a
1728          local variables we cannot be sure if it will escape, because we
1729          don't have information about objects not in SSA form.  Need to
1730          implement something along the lines of
1731
1732          J.-D. Choi, M. Gupta, M. J. Serrano, V. C. Sreedhar, and S. P.
1733          Midkiff, ``Escape analysis for java,'' in Proceedings of the
1734          Conference on Object-Oriented Programming Systems, Languages, and
1735          Applications (OOPSLA), pp. 1-19, 1999.  */
1736       return true;
1737     }
1738   else if (TREE_CODE (stmt) == RETURN_EXPR)
1739     return true;
1740
1741   return false;
1742 }
1743
1744
1745 /* Create a new memory tag of type TYPE.  If IS_TYPE_TAG is true, the tag
1746    is considered to represent all the pointers whose pointed-to types are
1747    in the same alias set class.  Otherwise, the tag represents a single
1748    SSA_NAME pointer variable.  */
1749
1750 static tree
1751 create_memory_tag (tree type, bool is_type_tag)
1752 {
1753   var_ann_t ann;
1754   tree tag = create_tmp_var_raw (type, (is_type_tag) ? "TMT" : "NMT");
1755
1756   /* By default, memory tags are local variables.  Alias analysis will
1757      determine whether they should be considered globals.  */
1758   DECL_CONTEXT (tag) = current_function_decl;
1759
1760   /* Memory tags are by definition addressable.  */
1761   TREE_ADDRESSABLE (tag) = 1;
1762
1763   ann = get_var_ann (tag);
1764   ann->mem_tag_kind = (is_type_tag) ? TYPE_TAG : NAME_TAG;
1765   ann->type_mem_tag = NULL_TREE;
1766
1767   /* Add the tag to the symbol table.  */
1768   add_referenced_tmp_var (tag);
1769
1770   return tag;
1771 }
1772
1773
1774 /* Create a name memory tag to represent a specific SSA_NAME pointer P_i.
1775    This is used if P_i has been found to point to a specific set of
1776    variables or to a non-aliased memory location like the address returned
1777    by malloc functions.  */
1778
1779 static tree
1780 get_nmt_for (tree ptr)
1781 {
1782   struct ptr_info_def *pi = get_ptr_info (ptr);
1783   tree tag = pi->name_mem_tag;
1784
1785   if (tag == NULL_TREE)
1786     tag = create_memory_tag (TREE_TYPE (TREE_TYPE (ptr)), false);
1787
1788   /* If PTR is a PARM_DECL, it points to a global variable or malloc,
1789      then its name tag should be considered a global variable.  */
1790   if (TREE_CODE (SSA_NAME_VAR (ptr)) == PARM_DECL
1791       || pi->pt_global_mem)
1792     mark_call_clobbered (tag);
1793
1794   return tag;
1795 }
1796
1797
1798 /* Return the type memory tag associated to pointer PTR.  A memory tag is an
1799    artificial variable that represents the memory location pointed-to by
1800    PTR.  It is used to model the effects of pointer de-references on
1801    addressable variables.
1802    
1803    AI points to the data gathered during alias analysis.  This function
1804    populates the array AI->POINTERS.  */
1805
1806 static tree
1807 get_tmt_for (tree ptr, struct alias_info *ai)
1808 {
1809   size_t i;
1810   tree tag;
1811   tree tag_type = TREE_TYPE (TREE_TYPE (ptr));
1812   HOST_WIDE_INT tag_set = get_alias_set (tag_type);
1813
1814   /* To avoid creating unnecessary memory tags, only create one memory tag
1815      per alias set class.  Note that it may be tempting to group
1816      memory tags based on conflicting alias sets instead of
1817      equivalence.  That would be wrong because alias sets are not
1818      necessarily transitive (as demonstrated by the libstdc++ test
1819      23_containers/vector/cons/4.cc).  Given three alias sets A, B, C
1820      such that conflicts (A, B) == true and conflicts (A, C) == true,
1821      it does not necessarily follow that conflicts (B, C) == true.  */
1822   for (i = 0, tag = NULL_TREE; i < ai->num_pointers; i++)
1823     {
1824       struct alias_map_d *curr = ai->pointers[i];
1825       tree curr_tag = var_ann (curr->var)->type_mem_tag;
1826       if (tag_set == curr->set
1827           && TYPE_READONLY (tag_type) == TYPE_READONLY (TREE_TYPE (curr_tag)))
1828         {
1829           tag = curr_tag;
1830           break;
1831         }
1832     }
1833
1834   /* If VAR cannot alias with any of the existing memory tags, create a new
1835      tag for PTR and add it to the POINTERS array.  */
1836   if (tag == NULL_TREE)
1837     {
1838       struct alias_map_d *alias_map;
1839
1840       /* If PTR did not have a type tag already, create a new TMT.*
1841          artificial variable representing the memory location
1842          pointed-to by PTR.  */
1843       if (var_ann (ptr)->type_mem_tag == NULL_TREE)
1844         tag = create_memory_tag (tag_type, true);
1845       else
1846         tag = var_ann (ptr)->type_mem_tag;
1847
1848       /* Add PTR to the POINTERS array.  Note that we are not interested in
1849          PTR's alias set.  Instead, we cache the alias set for the memory that
1850          PTR points to.  */
1851       alias_map = xcalloc (1, sizeof (*alias_map));
1852       alias_map->var = ptr;
1853       alias_map->set = tag_set;
1854       ai->pointers[ai->num_pointers++] = alias_map;
1855     }
1856
1857   /* If the pointed-to type is volatile, so is the tag.  */
1858   TREE_THIS_VOLATILE (tag) |= TREE_THIS_VOLATILE (tag_type);
1859
1860   /* Make sure that the type tag has the same alias set as the
1861      pointed-to type.  */
1862   gcc_assert (tag_set == get_alias_set (tag));
1863
1864   /* If PTR's pointed-to type is read-only, then TAG's type must also
1865      be read-only.  */
1866   gcc_assert (TYPE_READONLY (tag_type) == TYPE_READONLY (TREE_TYPE (tag)));
1867
1868   return tag;
1869 }
1870
1871
1872 /* Create GLOBAL_VAR, an artificial global variable to act as a
1873    representative of all the variables that may be clobbered by function
1874    calls.  */
1875
1876 static void
1877 create_global_var (void)
1878 {
1879   global_var = build_decl (VAR_DECL, get_identifier (".GLOBAL_VAR"),
1880                            void_type_node);
1881   DECL_ARTIFICIAL (global_var) = 1;
1882   TREE_READONLY (global_var) = 0;
1883   DECL_EXTERNAL (global_var) = 1;
1884   TREE_STATIC (global_var) = 1;
1885   TREE_USED (global_var) = 1;
1886   DECL_CONTEXT (global_var) = NULL_TREE;
1887   TREE_THIS_VOLATILE (global_var) = 0;
1888   TREE_ADDRESSABLE (global_var) = 0;
1889
1890   add_referenced_tmp_var (global_var);
1891   mark_sym_for_renaming (global_var);
1892 }
1893
1894
1895 /* Dump alias statistics on FILE.  */
1896
1897 static void 
1898 dump_alias_stats (FILE *file)
1899 {
1900   const char *funcname
1901     = lang_hooks.decl_printable_name (current_function_decl, 2);
1902   fprintf (file, "\nAlias statistics for %s\n\n", funcname);
1903   fprintf (file, "Total alias queries:\t%u\n", alias_stats.alias_queries);
1904   fprintf (file, "Total alias mayalias results:\t%u\n", 
1905            alias_stats.alias_mayalias);
1906   fprintf (file, "Total alias noalias results:\t%u\n",
1907            alias_stats.alias_noalias);
1908   fprintf (file, "Total simple queries:\t%u\n",
1909            alias_stats.simple_queries);
1910   fprintf (file, "Total simple resolved:\t%u\n",
1911            alias_stats.simple_resolved);
1912   fprintf (file, "Total TBAA queries:\t%u\n",
1913            alias_stats.tbaa_queries);
1914   fprintf (file, "Total TBAA resolved:\t%u\n",
1915            alias_stats.tbaa_resolved);
1916   fprintf (file, "Total non-addressable structure type queries:\t%u\n",
1917            alias_stats.structnoaddress_queries);
1918   fprintf (file, "Total non-addressable structure type resolved:\t%u\n",
1919            alias_stats.structnoaddress_resolved);
1920 }
1921   
1922
1923 /* Dump alias information on FILE.  */
1924
1925 void
1926 dump_alias_info (FILE *file)
1927 {
1928   size_t i;
1929   const char *funcname
1930     = lang_hooks.decl_printable_name (current_function_decl, 2);
1931   referenced_var_iterator rvi;
1932   tree var;
1933
1934   fprintf (file, "\nFlow-insensitive alias information for %s\n\n", funcname);
1935
1936   fprintf (file, "Aliased symbols\n\n");
1937   
1938   FOR_EACH_REFERENCED_VAR (var, rvi)
1939     {
1940       if (may_be_aliased (var))
1941         dump_variable (file, var);
1942     }
1943
1944   fprintf (file, "\nDereferenced pointers\n\n");
1945
1946   FOR_EACH_REFERENCED_VAR (var, rvi)
1947     {
1948       var_ann_t ann = var_ann (var);
1949       if (ann->type_mem_tag)
1950         dump_variable (file, var);
1951     }
1952
1953   fprintf (file, "\nType memory tags\n\n");
1954   
1955   FOR_EACH_REFERENCED_VAR (var, rvi)
1956     {
1957       var_ann_t ann = var_ann (var);
1958       if (ann->mem_tag_kind == TYPE_TAG)
1959         dump_variable (file, var);
1960     }
1961
1962   fprintf (file, "\n\nFlow-sensitive alias information for %s\n\n", funcname);
1963
1964   fprintf (file, "SSA_NAME pointers\n\n");
1965   for (i = 1; i < num_ssa_names; i++)
1966     {
1967       tree ptr = ssa_name (i);
1968       struct ptr_info_def *pi;
1969       
1970       if (ptr == NULL_TREE)
1971         continue;
1972
1973       pi = SSA_NAME_PTR_INFO (ptr);
1974       if (!SSA_NAME_IN_FREE_LIST (ptr)
1975           && pi
1976           && pi->name_mem_tag)
1977         dump_points_to_info_for (file, ptr);
1978     }
1979
1980   fprintf (file, "\nName memory tags\n\n");
1981   
1982   FOR_EACH_REFERENCED_VAR (var, rvi)
1983     {
1984       var_ann_t ann = var_ann (var);
1985       if (ann->mem_tag_kind == NAME_TAG)
1986         dump_variable (file, var);
1987     }
1988
1989   fprintf (file, "\n");
1990 }
1991
1992
1993 /* Dump alias information on stderr.  */
1994
1995 void
1996 debug_alias_info (void)
1997 {
1998   dump_alias_info (stderr);
1999 }
2000
2001
2002 /* Return the alias information associated with pointer T.  It creates a
2003    new instance if none existed.  */
2004
2005 struct ptr_info_def *
2006 get_ptr_info (tree t)
2007 {
2008   struct ptr_info_def *pi;
2009
2010   gcc_assert (POINTER_TYPE_P (TREE_TYPE (t)));
2011
2012   pi = SSA_NAME_PTR_INFO (t);
2013   if (pi == NULL)
2014     {
2015       pi = ggc_alloc (sizeof (*pi));
2016       memset ((void *)pi, 0, sizeof (*pi));
2017       SSA_NAME_PTR_INFO (t) = pi;
2018     }
2019
2020   return pi;
2021 }
2022
2023
2024 /* Dump points-to information for SSA_NAME PTR into FILE.  */
2025
2026 void
2027 dump_points_to_info_for (FILE *file, tree ptr)
2028 {
2029   struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
2030
2031   print_generic_expr (file, ptr, dump_flags);
2032
2033   if (pi)
2034     {
2035       if (pi->name_mem_tag)
2036         {
2037           fprintf (file, ", name memory tag: ");
2038           print_generic_expr (file, pi->name_mem_tag, dump_flags);
2039         }
2040
2041       if (pi->is_dereferenced)
2042         fprintf (file, ", is dereferenced");
2043
2044       if (pi->value_escapes_p)
2045         fprintf (file, ", its value escapes");
2046
2047       if (pi->pt_anything)
2048         fprintf (file, ", points-to anything");
2049
2050       if (pi->pt_null)
2051         fprintf (file, ", points-to NULL");
2052
2053       if (pi->pt_vars)
2054         {
2055           unsigned ix;
2056           bitmap_iterator bi;
2057
2058           fprintf (file, ", points-to vars: { ");
2059           EXECUTE_IF_SET_IN_BITMAP (pi->pt_vars, 0, ix, bi)
2060             {
2061               print_generic_expr (file, referenced_var (ix), dump_flags);
2062               fprintf (file, " ");
2063             }
2064           fprintf (file, "}");
2065         }
2066     }
2067
2068   fprintf (file, "\n");
2069 }
2070
2071
2072 /* Dump points-to information for VAR into stderr.  */
2073
2074 void
2075 debug_points_to_info_for (tree var)
2076 {
2077   dump_points_to_info_for (stderr, var);
2078 }
2079
2080
2081 /* Dump points-to information into FILE.  NOTE: This function is slow, as
2082    it needs to traverse the whole CFG looking for pointer SSA_NAMEs.  */
2083
2084 void
2085 dump_points_to_info (FILE *file)
2086 {
2087   basic_block bb;
2088   block_stmt_iterator si;
2089   ssa_op_iter iter;
2090   const char *fname =
2091     lang_hooks.decl_printable_name (current_function_decl, 2);
2092   referenced_var_iterator rvi;
2093   tree var;
2094
2095   fprintf (file, "\n\nPointed-to sets for pointers in %s\n\n", fname);
2096
2097   /* First dump points-to information for the default definitions of
2098      pointer variables.  This is necessary because default definitions are
2099      not part of the code.  */
2100   FOR_EACH_REFERENCED_VAR (var, rvi)
2101     {
2102       if (POINTER_TYPE_P (TREE_TYPE (var)))
2103         {
2104           tree def = default_def (var);
2105           if (def)
2106             dump_points_to_info_for (file, def);
2107         }
2108     }
2109
2110   /* Dump points-to information for every pointer defined in the program.  */
2111   FOR_EACH_BB (bb)
2112     {
2113       tree phi;
2114
2115       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
2116         {
2117           tree ptr = PHI_RESULT (phi);
2118           if (POINTER_TYPE_P (TREE_TYPE (ptr)))
2119             dump_points_to_info_for (file, ptr);
2120         }
2121
2122         for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
2123           {
2124             tree stmt = bsi_stmt (si);
2125             tree def;
2126             FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
2127               if (POINTER_TYPE_P (TREE_TYPE (def)))
2128                 dump_points_to_info_for (file, def);
2129           }
2130     }
2131
2132   fprintf (file, "\n");
2133 }
2134
2135
2136 /* Dump points-to info pointed to by PTO into STDERR.  */
2137
2138 void
2139 debug_points_to_info (void)
2140 {
2141   dump_points_to_info (stderr);
2142 }
2143
2144 /* Dump to FILE the list of variables that may be aliasing VAR.  */
2145
2146 void
2147 dump_may_aliases_for (FILE *file, tree var)
2148 {
2149   varray_type aliases;
2150   
2151   if (TREE_CODE (var) == SSA_NAME)
2152     var = SSA_NAME_VAR (var);
2153
2154   aliases = var_ann (var)->may_aliases;
2155   if (aliases)
2156     {
2157       size_t i;
2158       fprintf (file, "{ ");
2159       for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
2160         {
2161           print_generic_expr (file, VARRAY_TREE (aliases, i), dump_flags);
2162           fprintf (file, " ");
2163         }
2164       fprintf (file, "}");
2165     }
2166 }
2167
2168
2169 /* Dump to stderr the list of variables that may be aliasing VAR.  */
2170
2171 void
2172 debug_may_aliases_for (tree var)
2173 {
2174   dump_may_aliases_for (stderr, var);
2175 }
2176
2177 /* Return true if VAR may be aliased.  */
2178
2179 bool
2180 may_be_aliased (tree var)
2181 {
2182   /* Obviously.  */
2183   if (TREE_ADDRESSABLE (var))
2184     return true;
2185
2186   /* Globally visible variables can have their addresses taken by other
2187      translation units.  */
2188   if (DECL_EXTERNAL (var) || TREE_PUBLIC (var))
2189     return true;
2190
2191   /* Automatic variables can't have their addresses escape any other way.
2192      This must be after the check for global variables, as extern declarations
2193      do not have TREE_STATIC set.  */
2194   if (!TREE_STATIC (var))
2195     return false;
2196
2197   /* If we're in unit-at-a-time mode, then we must have seen all occurrences
2198      of address-of operators, and so we can trust TREE_ADDRESSABLE.  Otherwise
2199      we can only be sure the variable isn't addressable if it's local to the
2200      current function.  */
2201   if (flag_unit_at_a_time)
2202     return false;
2203   if (decl_function_context (var) == current_function_decl)
2204     return false;
2205
2206   return true;
2207 }
2208
2209
2210 /* Given two symbols return TRUE if one is in the alias set of the other.  */
2211 bool
2212 is_aliased_with (tree tag, tree sym)
2213 {
2214   size_t i;
2215   varray_type aliases;
2216
2217   if (var_ann (sym)->is_alias_tag)
2218     {
2219       aliases = var_ann (tag)->may_aliases;
2220
2221       if (aliases == NULL)
2222         return false;
2223
2224       for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
2225         if (VARRAY_TREE (aliases, i) == sym)
2226           return true;
2227     }
2228   else
2229     {
2230       aliases = var_ann (sym)->may_aliases;
2231
2232       if (aliases == NULL)
2233         return false;
2234
2235       for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
2236         if (VARRAY_TREE (aliases, i) == tag)
2237           return true;
2238     }
2239
2240   return false;
2241 }
2242
2243
2244 /* Add VAR to the list of may-aliases of PTR's type tag.  If PTR
2245    doesn't already have a type tag, create one.  */
2246
2247 void
2248 add_type_alias (tree ptr, tree var)
2249 {
2250   varray_type aliases;
2251   tree tag;
2252   var_ann_t ann = var_ann (ptr);
2253   subvar_t svars;
2254   VEC (tree, heap) *varvec = NULL;  
2255
2256   if (ann->type_mem_tag == NULL_TREE)
2257     {
2258       tree q = NULL_TREE;
2259       tree tag_type = TREE_TYPE (TREE_TYPE (ptr));
2260       HOST_WIDE_INT tag_set = get_alias_set (tag_type);
2261       safe_referenced_var_iterator rvi;
2262
2263       /* PTR doesn't have a type tag, create a new one and add VAR to
2264          the new tag's alias set.
2265
2266          FIXME, This is slower than necessary.  We need to determine
2267          whether there is another pointer Q with the same alias set as
2268          PTR.  This could be sped up by having type tags associated
2269          with types.  */
2270       FOR_EACH_REFERENCED_VAR_SAFE (q, varvec, rvi)
2271         {
2272           if (POINTER_TYPE_P (TREE_TYPE (q))
2273               && tag_set == get_alias_set (TREE_TYPE (TREE_TYPE (q))))
2274             {
2275               /* Found another pointer Q with the same alias set as
2276                  the PTR's pointed-to type.  If Q has a type tag, use
2277                  it.  Otherwise, create a new memory tag for PTR.  */
2278               var_ann_t ann1 = var_ann (q);
2279               if (ann1->type_mem_tag)
2280                 ann->type_mem_tag = ann1->type_mem_tag;
2281               else
2282                 ann->type_mem_tag = create_memory_tag (tag_type, true);
2283               goto found_tag;
2284             }
2285         }
2286
2287       /* Couldn't find any other pointer with a type tag we could use.
2288          Create a new memory tag for PTR.  */
2289       ann->type_mem_tag = create_memory_tag (tag_type, true);
2290     }
2291
2292 found_tag:
2293   /* If VAR is not already PTR's type tag, add it to the may-alias set
2294      for PTR's type tag.  */
2295   gcc_assert (var_ann (var)->type_mem_tag == NOT_A_TAG);
2296   tag = ann->type_mem_tag;
2297
2298   /* If VAR has subvars, add the subvars to the tag instead of the
2299      actual var.  */
2300   if (var_can_have_subvars (var)
2301       && (svars = get_subvars_for_var (var)))
2302     {
2303       subvar_t sv;      
2304       for (sv = svars; sv; sv = sv->next)
2305         add_may_alias (tag, sv->var);
2306     }
2307   else
2308     add_may_alias (tag, var);
2309
2310   /* TAG and its set of aliases need to be marked for renaming.  */
2311   mark_sym_for_renaming (tag);
2312   if ((aliases = var_ann (tag)->may_aliases) != NULL)
2313     {
2314       size_t i;
2315       for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
2316         mark_sym_for_renaming (VARRAY_TREE (aliases, i));
2317     }
2318
2319   /* If we had grouped aliases, VAR may have aliases of its own.  Mark
2320      them for renaming as well.  Other statements referencing the
2321      aliases of VAR will need to be updated.  */
2322   if ((aliases = var_ann (var)->may_aliases) != NULL)
2323     {
2324       size_t i;
2325       for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
2326         mark_sym_for_renaming (VARRAY_TREE (aliases, i));
2327     }
2328   VEC_free (tree, heap, varvec);
2329 }
2330
2331
2332 /* Create a new type tag for PTR.  Construct the may-alias list of this type
2333    tag so that it has the aliasing of VAR. 
2334
2335    Note, the set of aliases represented by the new type tag are not marked
2336    for renaming.  */
2337
2338 void
2339 new_type_alias (tree ptr, tree var)
2340 {
2341   var_ann_t p_ann = var_ann (ptr);
2342   tree tag_type = TREE_TYPE (TREE_TYPE (ptr));
2343   var_ann_t v_ann = var_ann (var);
2344   tree tag;
2345   subvar_t svars;
2346
2347   gcc_assert (p_ann->type_mem_tag == NULL_TREE);
2348   gcc_assert (v_ann->mem_tag_kind == NOT_A_TAG);
2349
2350   /* Add VAR to the may-alias set of PTR's new type tag.  If VAR has
2351      subvars, add the subvars to the tag instead of the actual var.  */
2352   if (var_can_have_subvars (var)
2353       && (svars = get_subvars_for_var (var)))
2354     {
2355       subvar_t sv;
2356
2357       tag = create_memory_tag (tag_type, true);
2358       p_ann->type_mem_tag = tag;
2359
2360       for (sv = svars; sv; sv = sv->next)
2361         add_may_alias (tag, sv->var);
2362     }
2363   else
2364     {
2365       /* The following is based on code in add_stmt_operand to ensure that the
2366          same defs/uses/vdefs/vuses will be found after replacing a reference
2367          to var (or ARRAY_REF to var) with an INDIRECT_REF to ptr whose value
2368          is the address of var.  */
2369       varray_type aliases = v_ann->may_aliases;
2370
2371       if ((aliases != NULL)
2372           && (VARRAY_ACTIVE_SIZE (aliases) == 1))
2373         {
2374           tree ali = VARRAY_TREE (aliases, 0);
2375
2376           if (get_var_ann (ali)->mem_tag_kind == TYPE_TAG)
2377             {
2378               p_ann->type_mem_tag = ali;
2379               return;
2380             }
2381         }
2382
2383       tag = create_memory_tag (tag_type, true);
2384       p_ann->type_mem_tag = tag;
2385
2386       if (aliases == NULL)
2387         add_may_alias (tag, var);
2388       else
2389         {
2390           size_t i;
2391
2392           for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
2393             add_may_alias (tag, VARRAY_TREE (aliases, i));
2394         }
2395     }    
2396 }
2397
2398
2399
2400 /* This represents the used range of a variable.  */
2401
2402 typedef struct used_part
2403 {
2404   HOST_WIDE_INT minused;
2405   HOST_WIDE_INT maxused;
2406   /* True if we have an explicit use/def of some portion of this variable,
2407      even if it is all of it. i.e. a.b = 5 or temp = a.b.  */
2408   bool explicit_uses;
2409   /* True if we have an implicit use/def of some portion of this
2410      variable.  Implicit uses occur when we can't tell what part we
2411      are referencing, and have to make conservative assumptions.  */
2412   bool implicit_uses;
2413 } *used_part_t;
2414
2415 /* An array of used_part structures, indexed by variable uid.  */
2416
2417 static htab_t used_portions;
2418
2419 struct used_part_map
2420 {
2421   unsigned int uid;
2422   used_part_t to;
2423 };
2424
2425 /* Return true if the uid in the two used part maps are equal.  */
2426
2427 static int
2428 used_part_map_eq (const void *va, const void *vb)
2429 {
2430   const struct used_part_map  *a = va, *b = vb;
2431   return (a->uid == b->uid);
2432 }
2433
2434 /* Hash a from uid in a used_part_map.  */
2435
2436 static unsigned int
2437 used_part_map_hash (const void *item)
2438 {
2439   return ((const struct used_part_map *)item)->uid;
2440 }
2441
2442 /* Free a used part map element.  */
2443
2444 static void 
2445 free_used_part_map (void *item)
2446 {
2447   free (((struct used_part_map *)item)->to);
2448   free (item);
2449 }
2450
2451 /* Lookup a used_part structure for a UID.  */
2452
2453 static used_part_t
2454 up_lookup (unsigned int uid)
2455 {
2456   struct used_part_map *h, in;
2457   in.uid = uid;
2458   h = htab_find_with_hash (used_portions, &in, uid);
2459   if (!h)
2460     return NULL;
2461   return h->to;
2462 }
2463
2464 /* Insert the pair UID, TO into the used part hashtable.  */
2465  
2466 static void 
2467 up_insert (unsigned int uid, used_part_t to)
2468
2469   struct used_part_map *h;
2470   void **loc;
2471
2472   h = xmalloc (sizeof (struct used_part_map));
2473   h->uid = uid;
2474   h->to = to;
2475   loc = htab_find_slot_with_hash (used_portions, h,
2476                                   uid, INSERT);
2477   if (*loc != NULL)
2478     free (*loc);
2479   *(struct used_part_map **)  loc = h;
2480 }
2481
2482
2483 /* Given a variable uid, UID, get or create the entry in the used portions
2484    table for the variable.  */
2485
2486 static used_part_t
2487 get_or_create_used_part_for (size_t uid)
2488 {
2489   used_part_t up;
2490   if ((up = up_lookup (uid)) == NULL)
2491     {
2492       up = xcalloc (1, sizeof (struct used_part));
2493       up->minused = INT_MAX;
2494       up->maxused = 0;
2495       up->explicit_uses = false;
2496       up->implicit_uses = false;
2497     }
2498
2499   return up;
2500 }
2501
2502
2503 /* Create and return a structure sub-variable for field FIELD of
2504    variable VAR.  */
2505
2506 static tree
2507 create_sft (tree var, tree field)
2508 {
2509   var_ann_t ann;
2510   tree subvar = create_tmp_var_raw (TREE_TYPE (field), "SFT");
2511
2512   /* We need to copy the various flags from VAR to SUBVAR, so that
2513      they are is_global_var iff the original variable was.  */
2514   DECL_CONTEXT (subvar) = DECL_CONTEXT (var);
2515   DECL_EXTERNAL (subvar) = DECL_EXTERNAL (var);
2516   TREE_PUBLIC  (subvar) = TREE_PUBLIC (var);
2517   TREE_STATIC (subvar) = TREE_STATIC (var);
2518   TREE_READONLY (subvar) = TREE_READONLY (var);
2519
2520   /* Add the new variable to REFERENCED_VARS.  */
2521   ann = get_var_ann (subvar);
2522   ann->mem_tag_kind = STRUCT_FIELD; 
2523   ann->type_mem_tag = NULL;     
2524   add_referenced_tmp_var (subvar);
2525
2526   return subvar;
2527 }
2528
2529
2530 /* Given an aggregate VAR, create the subvariables that represent its
2531    fields.  */
2532
2533 static void
2534 create_overlap_variables_for (tree var)
2535 {
2536   VEC(fieldoff_s,heap) *fieldstack = NULL;
2537   used_part_t up;
2538   size_t uid = DECL_UID (var);
2539
2540   if (!up_lookup (uid))
2541     return;
2542
2543   up = up_lookup (uid);
2544   push_fields_onto_fieldstack (TREE_TYPE (var), &fieldstack, 0, NULL);
2545   if (VEC_length (fieldoff_s, fieldstack) != 0)
2546     {
2547       subvar_t *subvars;
2548       fieldoff_s *fo;
2549       bool notokay = false;
2550       int fieldcount = 0;
2551       int i;
2552       HOST_WIDE_INT lastfooffset = -1;
2553       HOST_WIDE_INT lastfosize = -1;
2554       tree lastfotype = NULL_TREE;
2555
2556       /* Not all fields have DECL_SIZE set, and those that don't, we don't
2557          know their size, and thus, can't handle.
2558          The same is true of fields with DECL_SIZE that is not an integer
2559          constant (such as variable sized fields).
2560          Fields with offsets which are not constant will have an offset < 0 
2561          We *could* handle fields that are constant sized arrays, but
2562          currently don't.  Doing so would require some extra changes to
2563          tree-ssa-operands.c.  */
2564
2565       for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
2566         {
2567           if (!DECL_SIZE (fo->field) 
2568               || TREE_CODE (DECL_SIZE (fo->field)) != INTEGER_CST
2569               || TREE_CODE (TREE_TYPE (fo->field)) == ARRAY_TYPE
2570               || fo->offset < 0)
2571             {
2572               notokay = true;
2573               break;
2574             }
2575           fieldcount++;
2576         }
2577
2578       /* The current heuristic we use is as follows:
2579          If the variable has no used portions in this function, no
2580          structure vars are created for it.
2581          Otherwise,
2582          If the variable has less than SALIAS_MAX_IMPLICIT_FIELDS,
2583          we always create structure vars for them.
2584          If the variable has more than SALIAS_MAX_IMPLICIT_FIELDS, and
2585          some explicit uses, we create structure vars for them.
2586          If the variable has more than SALIAS_MAX_IMPLICIT_FIELDS, and
2587          no explicit uses, we do not create structure vars for them.
2588       */
2589       
2590       if (fieldcount >= SALIAS_MAX_IMPLICIT_FIELDS
2591           && !up->explicit_uses)
2592         {
2593           if (dump_file && (dump_flags & TDF_DETAILS))
2594             {
2595               fprintf (dump_file, "Variable ");
2596               print_generic_expr (dump_file, var, 0);
2597               fprintf (dump_file, " has no explicit uses in this function, and is > SALIAS_MAX_IMPLICIT_FIELDS, so skipping\n");
2598             }
2599           notokay = true;
2600         }
2601       
2602       /* Bail out, if we can't create overlap variables.  */
2603       if (notokay)
2604         {
2605           VEC_free (fieldoff_s, heap, fieldstack);
2606           return;
2607         }
2608       
2609       /* Otherwise, create the variables.  */
2610       subvars = lookup_subvars_for_var (var);
2611       
2612       sort_fieldstack (fieldstack);
2613
2614       for (i = VEC_length (fieldoff_s, fieldstack);
2615            VEC_iterate (fieldoff_s, fieldstack, --i, fo);)
2616         {
2617           subvar_t sv;
2618           HOST_WIDE_INT fosize;
2619           tree currfotype;
2620
2621           fosize = TREE_INT_CST_LOW (DECL_SIZE (fo->field));
2622           currfotype = TREE_TYPE (fo->field);
2623
2624           /* If this field isn't in the used portion,
2625              or it has the exact same offset and size as the last
2626              field, skip it.  */
2627
2628           if (((fo->offset <= up->minused
2629                 && fo->offset + fosize <= up->minused)
2630                || fo->offset >= up->maxused)
2631               || (fo->offset == lastfooffset
2632                   && fosize == lastfosize
2633                   && currfotype == lastfotype))
2634             continue;
2635           sv = ggc_alloc (sizeof (struct subvar));
2636           sv->offset = fo->offset;
2637           sv->size = fosize;
2638           sv->next = *subvars;
2639           sv->var = create_sft (var, fo->field);
2640
2641           if (dump_file)
2642             {
2643               fprintf (dump_file, "structure field tag %s created for var %s",
2644                        get_name (sv->var), get_name (var));
2645               fprintf (dump_file, " offset " HOST_WIDE_INT_PRINT_DEC,
2646                        sv->offset);
2647               fprintf (dump_file, " size " HOST_WIDE_INT_PRINT_DEC,
2648                        sv->size);
2649               fprintf (dump_file, "\n");
2650             }
2651           
2652           lastfotype = currfotype;
2653           lastfooffset = fo->offset;
2654           lastfosize = fosize;
2655           *subvars = sv;
2656         }
2657
2658       /* Once we have created subvars, the original is no longer call
2659          clobbered on its own.  Its call clobbered status depends
2660          completely on the call clobbered status of the subvars.
2661
2662          add_referenced_var in the above loop will take care of
2663          marking subvars of global variables as call clobbered for us
2664          to start, since they are global as well.  */
2665       clear_call_clobbered (var);
2666     }
2667
2668   VEC_free (fieldoff_s, heap, fieldstack);
2669 }
2670
2671
2672 /* Find the conservative answer to the question of what portions of what 
2673    structures are used by this statement.  We assume that if we have a
2674    component ref with a known size + offset, that we only need that part
2675    of the structure.  For unknown cases, or cases where we do something
2676    to the whole structure, we assume we need to create fields for the 
2677    entire structure.  */
2678
2679 static tree
2680 find_used_portions (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
2681 {
2682   switch (TREE_CODE (*tp))
2683     {
2684     case COMPONENT_REF:
2685       {
2686         HOST_WIDE_INT bitsize;
2687         HOST_WIDE_INT bitpos;
2688         tree offset;
2689         enum machine_mode mode;
2690         int unsignedp;
2691         int volatilep;  
2692         tree ref;
2693         ref = get_inner_reference (*tp, &bitsize, &bitpos, &offset, &mode,
2694                                    &unsignedp, &volatilep, false);
2695         if (DECL_P (ref) && offset == NULL && bitsize != -1)
2696           {         
2697             size_t uid = DECL_UID (ref);
2698             used_part_t up;
2699
2700             up = get_or_create_used_part_for (uid);         
2701
2702             if (bitpos <= up->minused)
2703               up->minused = bitpos;
2704             if ((bitpos + bitsize >= up->maxused))
2705               up->maxused = bitpos + bitsize;       
2706
2707             up->explicit_uses = true;
2708             up_insert (uid, up);
2709
2710             *walk_subtrees = 0;
2711             return NULL_TREE;
2712           }
2713         else if (DECL_P (ref))
2714           {
2715             if (DECL_SIZE (ref)
2716                 && var_can_have_subvars (ref)
2717                 && TREE_CODE (DECL_SIZE (ref)) == INTEGER_CST)
2718               {
2719                 used_part_t up;
2720                 size_t uid = DECL_UID (ref);
2721
2722                 up = get_or_create_used_part_for (uid);
2723
2724                 up->minused = 0;
2725                 up->maxused = TREE_INT_CST_LOW (DECL_SIZE (ref));
2726
2727                 up->implicit_uses = true;
2728
2729                 up_insert (uid, up);
2730
2731                 *walk_subtrees = 0;
2732                 return NULL_TREE;
2733               }
2734           }
2735       }
2736       break;
2737       /* This is here to make sure we mark the entire base variable as used
2738          when you take its address.  Because our used portion analysis is
2739          simple, we aren't looking at casts or pointer arithmetic to see what
2740          happens when you take the address.  */
2741     case ADDR_EXPR:
2742       {
2743         tree var = get_base_address (TREE_OPERAND (*tp, 0));
2744
2745         if (var 
2746             && DECL_P (var)
2747             && DECL_SIZE (var)
2748             && var_can_have_subvars (var)
2749             && TREE_CODE (DECL_SIZE (var)) == INTEGER_CST)
2750           {
2751             used_part_t up;
2752             size_t uid = DECL_UID (var);
2753             
2754             up = get_or_create_used_part_for (uid);
2755  
2756             up->minused = 0;
2757             up->maxused = TREE_INT_CST_LOW (DECL_SIZE (var));
2758             up->implicit_uses = true;
2759
2760             up_insert (uid, up);
2761             *walk_subtrees = 0;
2762             return NULL_TREE;
2763           }
2764       }
2765       break;
2766     case VAR_DECL:
2767     case PARM_DECL:
2768       {
2769         tree var = *tp;
2770         if (DECL_SIZE (var)
2771             && var_can_have_subvars (var)
2772             && TREE_CODE (DECL_SIZE (var)) == INTEGER_CST)
2773           {
2774             used_part_t up;
2775             size_t uid = DECL_UID (var);
2776             
2777             up = get_or_create_used_part_for (uid);
2778  
2779             up->minused = 0;
2780             up->maxused = TREE_INT_CST_LOW (DECL_SIZE (var));
2781             up->implicit_uses = true;
2782
2783             up_insert (uid, up);
2784             *walk_subtrees = 0;
2785             return NULL_TREE;
2786           }
2787       }
2788       break;
2789       
2790     default:
2791       break;
2792       
2793     }
2794   return NULL_TREE;
2795 }
2796
2797 /* Create structure field variables for structures used in this function.  */
2798
2799 static void
2800 create_structure_vars (void)
2801 {
2802   basic_block bb;
2803   safe_referenced_var_iterator rvi;
2804   VEC (tree, heap) *varvec = NULL;
2805   tree var;
2806
2807   used_portions = htab_create (10, used_part_map_hash, used_part_map_eq, 
2808                                free_used_part_map);
2809   
2810   FOR_EACH_BB (bb)
2811     {
2812       block_stmt_iterator bsi;
2813       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2814         {
2815           walk_tree_without_duplicates (bsi_stmt_ptr (bsi), 
2816                                         find_used_portions,
2817                                         NULL);
2818         }
2819     }
2820   FOR_EACH_REFERENCED_VAR_SAFE (var, varvec, rvi)
2821     {
2822       /* The C++ FE creates vars without DECL_SIZE set, for some reason.  */
2823       if (var     
2824           && DECL_SIZE (var)
2825           && var_can_have_subvars (var)
2826           && var_ann (var)->mem_tag_kind == NOT_A_TAG
2827           && TREE_CODE (DECL_SIZE (var)) == INTEGER_CST)
2828         create_overlap_variables_for (var);
2829     }
2830   htab_delete (used_portions);
2831   VEC_free (tree, heap, varvec);
2832
2833 }
2834
2835 static bool
2836 gate_structure_vars (void)
2837 {
2838   return flag_tree_salias != 0;
2839 }
2840
2841 struct tree_opt_pass pass_create_structure_vars = 
2842 {
2843   "salias",              /* name */
2844   gate_structure_vars,   /* gate */
2845   create_structure_vars, /* execute */
2846   NULL,                  /* sub */
2847   NULL,                  /* next */
2848   0,                     /* static_pass_number */
2849   0,                     /* tv_id */
2850   PROP_cfg,              /* properties_required */
2851   0,                     /* properties_provided */
2852   0,                     /* properties_destroyed */
2853   0,                     /* todo_flags_start */
2854   TODO_dump_func,        /* todo_flags_finish */
2855   0                      /* letter */
2856 };