OSDN Git Service

gcc/fortran/
[pf3gnuchains/gcc-fork.git] / gcc / tree-dfa.c
1 /* Data flow functions for trees.
2    Copyright (C) 2001, 2002, 2003, 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 "hashtab.h"
27 #include "pointer-set.h"
28 #include "tree.h"
29 #include "rtl.h"
30 #include "tm_p.h"
31 #include "hard-reg-set.h"
32 #include "basic-block.h"
33 #include "output.h"
34 #include "timevar.h"
35 #include "expr.h"
36 #include "ggc.h"
37 #include "langhooks.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "diagnostic.h"
41 #include "tree-dump.h"
42 #include "tree-gimple.h"
43 #include "tree-flow.h"
44 #include "tree-inline.h"
45 #include "tree-pass.h"
46 #include "convert.h"
47 #include "params.h"
48 #include "cgraph.h"
49
50 /* Build and maintain data flow information for trees.  */
51
52 /* Counters used to display DFA and SSA statistics.  */
53 struct dfa_stats_d
54 {
55   long num_stmt_anns;
56   long num_var_anns;
57   long num_defs;
58   long num_uses;
59   long num_phis;
60   long num_phi_args;
61   int max_num_phi_args;
62   long num_v_may_defs;
63   long num_vuses;
64   long num_v_must_defs;
65 };
66
67
68 /* State information for find_vars_r.  */
69 struct walk_state
70 {
71   /* Hash table used to avoid adding the same variable more than once.  */
72   htab_t vars_found;
73 };
74
75
76 /* Local functions.  */
77 static void collect_dfa_stats (struct dfa_stats_d *);
78 static tree collect_dfa_stats_r (tree *, int *, void *);
79 static tree find_vars_r (tree *, int *, void *);
80 static void add_referenced_var (tree, struct walk_state *);
81
82
83 /* Global declarations.  */
84
85 /* Array of all variables referenced in the function.  */
86 htab_t referenced_vars;
87
88 /* Default definition for this symbols.  If set for symbol, it
89    means that the first reference to this variable in the function is a
90    USE or a VUSE.  In those cases, the SSA renamer creates an SSA name
91    for this variable with an empty defining statement.  */
92 htab_t default_defs;
93
94
95 /*---------------------------------------------------------------------------
96                         Dataflow analysis (DFA) routines
97 ---------------------------------------------------------------------------*/
98 /* Find all the variables referenced in the function.  This function
99    builds the global arrays REFERENCED_VARS and CALL_CLOBBERED_VARS.
100
101    Note that this function does not look for statement operands, it simply
102    determines what variables are referenced in the program and detects
103    various attributes for each variable used by alias analysis and the
104    optimizer.  */
105
106 static unsigned int
107 find_referenced_vars (void)
108 {
109   htab_t vars_found;
110   basic_block bb;
111   block_stmt_iterator si;
112   struct walk_state walk_state;
113
114   vars_found = htab_create (50, htab_hash_pointer, htab_eq_pointer, NULL);
115   memset (&walk_state, 0, sizeof (walk_state));
116   walk_state.vars_found = vars_found;
117
118   FOR_EACH_BB (bb)
119     for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
120       {
121         tree *stmt_p = bsi_stmt_ptr (si);
122         walk_tree (stmt_p, find_vars_r, &walk_state, NULL);
123       }
124
125   htab_delete (vars_found);
126   return 0;
127 }
128
129 struct tree_opt_pass pass_referenced_vars =
130 {
131   NULL,                                 /* name */
132   NULL,                                 /* gate */
133   find_referenced_vars,                 /* execute */
134   NULL,                                 /* sub */
135   NULL,                                 /* next */
136   0,                                    /* static_pass_number */
137   TV_FIND_REFERENCED_VARS,              /* tv_id */
138   PROP_gimple_leh | PROP_cfg,           /* properties_required */
139   PROP_referenced_vars,                 /* properties_provided */
140   0,                                    /* properties_destroyed */
141   0,                                    /* todo_flags_start */
142   0,                                    /* todo_flags_finish */
143   0                                     /* letter */
144 };
145
146
147 /*---------------------------------------------------------------------------
148                             Manage annotations
149 ---------------------------------------------------------------------------*/
150 /* Create a new annotation for a _DECL node T.  */
151
152 var_ann_t
153 create_var_ann (tree t)
154 {
155   var_ann_t ann;
156
157   gcc_assert (t);
158   gcc_assert (DECL_P (t));
159   gcc_assert (!t->common.ann || t->common.ann->common.type == VAR_ANN);
160
161   ann = GGC_NEW (struct var_ann_d);
162   memset ((void *) ann, 0, sizeof (*ann));
163
164   ann->common.type = VAR_ANN;
165
166   t->common.ann = (tree_ann_t) ann;
167
168   return ann;
169 }
170
171 /* Create a new annotation for a FUNCTION_DECL node T.  */
172
173 function_ann_t
174 create_function_ann (tree t)
175 {
176   function_ann_t ann;
177
178   gcc_assert (t);
179   gcc_assert (TREE_CODE (t) == FUNCTION_DECL);
180   gcc_assert (!t->common.ann || t->common.ann->common.type == FUNCTION_ANN);
181
182   ann = ggc_alloc (sizeof (*ann));
183   memset ((void *) ann, 0, sizeof (*ann));
184
185   ann->common.type = FUNCTION_ANN;
186
187   t->common.ann = (tree_ann_t) ann;
188
189   return ann;
190 }
191
192 /* Create a new annotation for a statement node T.  */
193
194 stmt_ann_t
195 create_stmt_ann (tree t)
196 {
197   stmt_ann_t ann;
198
199   gcc_assert (is_gimple_stmt (t));
200   gcc_assert (!t->common.ann || t->common.ann->common.type == STMT_ANN);
201
202   ann = GGC_NEW (struct stmt_ann_d);
203   memset ((void *) ann, 0, sizeof (*ann));
204
205   ann->common.type = STMT_ANN;
206
207   /* Since we just created the annotation, mark the statement modified.  */
208   ann->modified = true;
209
210   t->common.ann = (tree_ann_t) ann;
211
212   return ann;
213 }
214
215 /* Create a new annotation for a tree T.  */
216
217 tree_ann_t
218 create_tree_ann (tree t)
219 {
220   tree_ann_t ann;
221
222   gcc_assert (t);
223   gcc_assert (!t->common.ann || t->common.ann->common.type == TREE_ANN_COMMON);
224
225   ann = GGC_NEW (union tree_ann_d);
226   memset ((void *) ann, 0, sizeof (*ann));
227
228   ann->common.type = TREE_ANN_COMMON;
229   t->common.ann = ann;
230
231   return ann;
232 }
233
234 /* Build a temporary.  Make sure and register it to be renamed.  */
235
236 tree
237 make_rename_temp (tree type, const char *prefix)
238 {
239   tree t = create_tmp_var (type, prefix);
240
241   if (TREE_CODE (type) == COMPLEX_TYPE)
242     DECL_COMPLEX_GIMPLE_REG_P (t) = 1;
243
244   if (referenced_vars)
245     {
246       add_referenced_tmp_var (t);
247       mark_sym_for_renaming (t);
248     }
249
250   return t;
251 }
252
253
254
255 /*---------------------------------------------------------------------------
256                               Debugging functions
257 ---------------------------------------------------------------------------*/
258 /* Dump the list of all the referenced variables in the current function to
259    FILE.  */
260
261 void
262 dump_referenced_vars (FILE *file)
263 {
264   tree var;
265   referenced_var_iterator rvi;
266   
267   fprintf (file, "\nReferenced variables in %s: %u\n\n",
268            get_name (current_function_decl), (unsigned) num_referenced_vars);
269   
270   FOR_EACH_REFERENCED_VAR (var, rvi)
271     {
272       fprintf (file, "Variable: ");
273       dump_variable (file, var);
274       fprintf (file, "\n");
275     }
276 }
277
278
279 /* Dump the list of all the referenced variables to stderr.  */
280
281 void
282 debug_referenced_vars (void)
283 {
284   dump_referenced_vars (stderr);
285 }
286
287
288 /* Dump sub-variables for VAR to FILE.  */
289
290 void
291 dump_subvars_for (FILE *file, tree var)
292 {
293   subvar_t sv = get_subvars_for_var (var);
294
295   if (!sv)
296     return;
297
298   fprintf (file, "{ ");
299
300   for (; sv; sv = sv->next)
301     {
302       print_generic_expr (file, sv->var, dump_flags);
303       fprintf (file, " ");
304     }
305
306   fprintf (file, "}");
307 }
308
309
310 /* Dumb sub-variables for VAR to stderr.  */
311
312 void
313 debug_subvars_for (tree var)
314 {
315   dump_subvars_for (stderr, var);
316 }
317
318
319 /* Dump variable VAR and its may-aliases to FILE.  */
320
321 void
322 dump_variable (FILE *file, tree var)
323 {
324   var_ann_t ann;
325
326   if (TREE_CODE (var) == SSA_NAME)
327     {
328       if (POINTER_TYPE_P (TREE_TYPE (var)))
329         dump_points_to_info_for (file, var);
330       var = SSA_NAME_VAR (var);
331     }
332
333   if (var == NULL_TREE)
334     {
335       fprintf (file, "<nil>");
336       return;
337     }
338
339   print_generic_expr (file, var, dump_flags);
340
341   ann = var_ann (var);
342
343   fprintf (file, ", UID %u", (unsigned) DECL_UID (var));
344
345   fprintf (file, ", ");
346   print_generic_expr (file, TREE_TYPE (var), dump_flags);
347
348   if (ann && ann->symbol_mem_tag)
349     {
350       fprintf (file, ", symbol memory tag: ");
351       print_generic_expr (file, ann->symbol_mem_tag, dump_flags);
352     }
353
354   if (ann && ann->is_aliased)
355     fprintf (file, ", is aliased");
356
357   if (TREE_ADDRESSABLE (var))
358     fprintf (file, ", is addressable");
359   
360   if (is_global_var (var))
361     fprintf (file, ", is global");
362
363   if (TREE_THIS_VOLATILE (var))
364     fprintf (file, ", is volatile");
365
366   if (is_call_clobbered (var))
367     {
368       fprintf (file, ", call clobbered");
369       if (dump_flags & TDF_DETAILS)
370         {
371           var_ann_t va = var_ann (var);
372           unsigned int escape_mask = va->escape_mask;
373           
374           fprintf (file, " (");
375           if (escape_mask & ESCAPE_STORED_IN_GLOBAL)
376             fprintf (file, ", stored in global");
377           if (escape_mask & ESCAPE_TO_ASM)
378             fprintf (file, ", goes through ASM");
379           if (escape_mask & ESCAPE_TO_CALL)
380             fprintf (file, ", passed to call");
381           if (escape_mask & ESCAPE_BAD_CAST)
382             fprintf (file, ", bad cast");
383           if (escape_mask & ESCAPE_TO_RETURN)
384             fprintf (file, ", returned from func");
385           if (escape_mask & ESCAPE_TO_PURE_CONST)
386             fprintf (file, ", passed to pure/const");
387           if (escape_mask & ESCAPE_IS_GLOBAL)
388             fprintf (file, ", is global var");
389           if (escape_mask & ESCAPE_IS_PARM)
390             fprintf (file, ", is incoming pointer");
391           if (escape_mask & ESCAPE_UNKNOWN)
392             fprintf (file, ", unknown escape");
393           fprintf (file, " )");
394         }
395     }
396
397   if (default_def (var))
398     {
399       fprintf (file, ", default def: ");
400       print_generic_expr (file, default_def (var), dump_flags);
401     }
402
403   if (may_aliases (var))
404     {
405       fprintf (file, ", may aliases: ");
406       dump_may_aliases_for (file, var);
407     }
408
409   if (get_subvars_for_var (var))
410     {
411       fprintf (file, ", sub-vars: ");
412       dump_subvars_for (file, var);
413     }
414
415   fprintf (file, "\n");
416 }
417
418
419 /* Dump variable VAR and its may-aliases to stderr.  */
420
421 void
422 debug_variable (tree var)
423 {
424   dump_variable (stderr, var);
425 }
426
427
428 /* Dump various DFA statistics to FILE.  */
429
430 void
431 dump_dfa_stats (FILE *file)
432 {
433   struct dfa_stats_d dfa_stats;
434
435   unsigned long size, total = 0;
436   const char * const fmt_str   = "%-30s%-13s%12s\n";
437   const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
438   const char * const fmt_str_3 = "%-43s%11lu%c\n";
439   const char *funcname
440     = lang_hooks.decl_printable_name (current_function_decl, 2);
441
442   collect_dfa_stats (&dfa_stats);
443
444   fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
445
446   fprintf (file, "---------------------------------------------------------\n");
447   fprintf (file, fmt_str, "", "  Number of  ", "Memory");
448   fprintf (file, fmt_str, "", "  instances  ", "used ");
449   fprintf (file, "---------------------------------------------------------\n");
450
451   size = num_referenced_vars * sizeof (tree);
452   total += size;
453   fprintf (file, fmt_str_1, "Referenced variables", (unsigned long)num_referenced_vars,
454            SCALE (size), LABEL (size));
455
456   size = dfa_stats.num_stmt_anns * sizeof (struct stmt_ann_d);
457   total += size;
458   fprintf (file, fmt_str_1, "Statements annotated", dfa_stats.num_stmt_anns,
459            SCALE (size), LABEL (size));
460
461   size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
462   total += size;
463   fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
464            SCALE (size), LABEL (size));
465
466   size = dfa_stats.num_uses * sizeof (tree *);
467   total += size;
468   fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
469            SCALE (size), LABEL (size));
470
471   size = dfa_stats.num_defs * sizeof (tree *);
472   total += size;
473   fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
474            SCALE (size), LABEL (size));
475
476   size = dfa_stats.num_vuses * sizeof (tree *);
477   total += size;
478   fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
479            SCALE (size), LABEL (size));
480
481   size = dfa_stats.num_v_may_defs * sizeof (tree *);
482   total += size;
483   fprintf (file, fmt_str_1, "V_MAY_DEF operands", dfa_stats.num_v_may_defs,
484            SCALE (size), LABEL (size));
485
486   size = dfa_stats.num_v_must_defs * sizeof (tree *);
487   total += size;
488   fprintf (file, fmt_str_1, "V_MUST_DEF operands", dfa_stats.num_v_must_defs,
489            SCALE (size), LABEL (size));
490
491   size = dfa_stats.num_phis * sizeof (struct tree_phi_node);
492   total += size;
493   fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
494            SCALE (size), LABEL (size));
495
496   size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
497   total += size;
498   fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
499            SCALE (size), LABEL (size));
500
501   fprintf (file, "---------------------------------------------------------\n");
502   fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
503            LABEL (total));
504   fprintf (file, "---------------------------------------------------------\n");
505   fprintf (file, "\n");
506
507   if (dfa_stats.num_phis)
508     fprintf (file, "Average number of arguments per PHI node: %.1f (max: %d)\n",
509              (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
510              dfa_stats.max_num_phi_args);
511
512   fprintf (file, "\n");
513 }
514
515
516 /* Dump DFA statistics on stderr.  */
517
518 void
519 debug_dfa_stats (void)
520 {
521   dump_dfa_stats (stderr);
522 }
523
524
525 /* Collect DFA statistics and store them in the structure pointed to by
526    DFA_STATS_P.  */
527
528 static void
529 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p)
530 {
531   struct pointer_set_t *pset;
532   basic_block bb;
533   block_stmt_iterator i;
534
535   gcc_assert (dfa_stats_p);
536
537   memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
538
539   /* Walk all the trees in the function counting references.  Start at
540      basic block NUM_FIXED_BLOCKS, but don't stop at block boundaries.  */
541   pset = pointer_set_create ();
542
543   for (i = bsi_start (BASIC_BLOCK (NUM_FIXED_BLOCKS));
544        !bsi_end_p (i); bsi_next (&i))
545     walk_tree (bsi_stmt_ptr (i), collect_dfa_stats_r, (void *) dfa_stats_p,
546                pset);
547
548   pointer_set_destroy (pset);
549
550   FOR_EACH_BB (bb)
551     {
552       tree phi;
553       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
554         {
555           dfa_stats_p->num_phis++;
556           dfa_stats_p->num_phi_args += PHI_NUM_ARGS (phi);
557           if (PHI_NUM_ARGS (phi) > dfa_stats_p->max_num_phi_args)
558             dfa_stats_p->max_num_phi_args = PHI_NUM_ARGS (phi);
559         }
560     }
561 }
562
563
564 /* Callback for walk_tree to collect DFA statistics for a tree and its
565    children.  */
566
567 static tree
568 collect_dfa_stats_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
569                      void *data)
570 {
571   tree t = *tp;
572   struct dfa_stats_d *dfa_stats_p = (struct dfa_stats_d *)data;
573
574   if (t->common.ann)
575     {
576       switch (ann_type (t->common.ann))
577         {
578         case STMT_ANN:
579           {
580             dfa_stats_p->num_stmt_anns++;
581             dfa_stats_p->num_defs += NUM_SSA_OPERANDS (t, SSA_OP_DEF);
582             dfa_stats_p->num_uses += NUM_SSA_OPERANDS (t, SSA_OP_USE);
583             dfa_stats_p->num_v_may_defs += NUM_SSA_OPERANDS (t, SSA_OP_VMAYDEF);
584             dfa_stats_p->num_vuses += NUM_SSA_OPERANDS (t, SSA_OP_VUSE);
585             dfa_stats_p->num_v_must_defs += 
586                                   NUM_SSA_OPERANDS (t, SSA_OP_VMUSTDEF);
587             break;
588           }
589
590         case VAR_ANN:
591           dfa_stats_p->num_var_anns++;
592           break;
593
594         default:
595           break;
596         }
597     }
598
599   return NULL;
600 }
601
602
603 /*---------------------------------------------------------------------------
604                              Miscellaneous helpers
605 ---------------------------------------------------------------------------*/
606 /* Callback for walk_tree.  Used to collect variables referenced in
607    the function.  */
608
609 static tree
610 find_vars_r (tree *tp, int *walk_subtrees, void *data)
611 {
612   struct walk_state *walk_state = (struct walk_state *) data;
613
614   /* If T is a regular variable that the optimizers are interested
615      in, add it to the list of variables.  */
616   if (SSA_VAR_P (*tp))
617     add_referenced_var (*tp, walk_state);
618
619   /* Type, _DECL and constant nodes have no interesting children.
620      Ignore them.  */
621   else if (IS_TYPE_OR_DECL_P (*tp) || CONSTANT_CLASS_P (*tp))
622     *walk_subtrees = 0;
623
624   return NULL_TREE;
625 }
626
627
628 /* Lookup UID in the referenced_vars hashtable and return the associated
629    variable.  */
630
631 tree 
632 referenced_var_lookup (unsigned int uid)
633 {
634   struct int_tree_map *h, in;
635   in.uid = uid;
636   h = (struct int_tree_map *) htab_find_with_hash (referenced_vars, &in, uid);
637   gcc_assert (h || uid == 0);
638   if (h)
639     return h->to;
640   return NULL_TREE;
641 }
642
643 /* Insert the pair UID, TO into the referenced_vars hashtable.  */
644
645 static void
646 referenced_var_insert (unsigned int uid, tree to)
647
648   struct int_tree_map *h;
649   void **loc;
650
651   h = GGC_NEW (struct int_tree_map);
652   h->uid = uid;
653   h->to = to;
654   loc = htab_find_slot_with_hash (referenced_vars, h, uid, INSERT);
655   *(struct int_tree_map **)  loc = h;
656 }
657
658 /* Lookup VAR UID in the default_defs hashtable and return the associated
659    variable.  */
660
661 tree 
662 default_def (tree var)
663 {
664   struct int_tree_map *h, in;
665   gcc_assert (SSA_VAR_P (var));
666   in.uid = DECL_UID (var);
667   h = (struct int_tree_map *) htab_find_with_hash (default_defs, &in,
668                                                    DECL_UID (var));
669   if (h)
670     return h->to;
671   return NULL_TREE;
672 }
673
674 /* Insert the pair VAR's UID, DEF into the default_defs hashtable.  */
675
676 void
677 set_default_def (tree var, tree def)
678
679   struct int_tree_map in;
680   struct int_tree_map *h;
681   void **loc;
682
683   gcc_assert (SSA_VAR_P (var));
684   in.uid = DECL_UID (var);
685   if (!def && default_def (var))
686     {
687       loc = htab_find_slot_with_hash (default_defs, &in, DECL_UID (var), INSERT);
688       htab_remove_elt (default_defs, *loc);
689       return;
690     }
691   gcc_assert (TREE_CODE (def) == SSA_NAME);
692   loc = htab_find_slot_with_hash (default_defs, &in, DECL_UID (var), INSERT);
693   /* Default definition might be changed by tail call optimization.  */
694   if (!*loc)
695     {
696       h = GGC_NEW (struct int_tree_map);
697       h->uid = DECL_UID (var);
698       h->to = def;
699       *(struct int_tree_map **)  loc = h;
700     }
701    else
702     {
703       h = (struct int_tree_map *) *loc;
704       h->to = def;
705     }
706 }
707
708 /* Add VAR to the list of dereferenced variables.
709
710    WALK_STATE contains a hash table used to avoid adding the same
711       variable more than once. Note that this function assumes that
712       VAR is a valid SSA variable.  If WALK_STATE is NULL, no
713       duplicate checking is done.  */
714
715 static void
716 add_referenced_var (tree var, struct walk_state *walk_state)
717 {
718   void **slot;
719   var_ann_t v_ann;
720
721   v_ann = get_var_ann (var);
722
723   if (walk_state)
724     slot = htab_find_slot (walk_state->vars_found, (void *) var, INSERT);
725   else
726     slot = NULL;
727
728   if (slot == NULL || *slot == NULL)
729     {
730       /* This is the first time we find this variable, add it to the
731          REFERENCED_VARS array and annotate it with attributes that are
732          intrinsic to the variable.  */
733       if (slot)
734         *slot = (void *) var;
735       
736       referenced_var_insert (DECL_UID (var), var);
737       
738       /* Tag's don't have DECL_INITIAL.  */
739       if (MTAG_P (var))
740         return;
741
742       /* Scan DECL_INITIAL for pointer variables as they may contain
743          address arithmetic referencing the address of other
744          variables.  */
745       if (DECL_INITIAL (var)
746           /* Initializers of external variables are not useful to the
747              optimizers.  */
748           && !DECL_EXTERNAL (var)
749           /* It's not necessary to walk the initial value of non-constant
750              variables because it cannot be propagated by the
751              optimizers.  */
752           && (TREE_CONSTANT (var) || TREE_READONLY (var)))
753         walk_tree (&DECL_INITIAL (var), find_vars_r, walk_state, 0);
754     }
755 }
756
757
758 /* Return the virtual variable associated to the non-scalar variable VAR.  */
759
760 tree
761 get_virtual_var (tree var)
762 {
763   STRIP_NOPS (var);
764
765   if (TREE_CODE (var) == SSA_NAME)
766     var = SSA_NAME_VAR (var);
767
768   while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
769          || handled_component_p (var))
770     var = TREE_OPERAND (var, 0);
771
772   /* Treating GIMPLE registers as virtual variables makes no sense.
773      Also complain if we couldn't extract a _DECL out of the original
774      expression.  */
775   gcc_assert (SSA_VAR_P (var));
776   gcc_assert (!is_gimple_reg (var));
777
778   return var;
779 }
780
781 /* Add a temporary variable to REFERENCED_VARS.  This is similar to
782    add_referenced_var, but is used by passes that need to add new temps to
783    the REFERENCED_VARS array after the program has been scanned for
784    variables.  The variable will just receive a new UID and be added
785    to the REFERENCED_VARS array without checking for duplicates.  */
786
787 void
788 add_referenced_tmp_var (tree var)
789 {
790   add_referenced_var (var, NULL);
791 }
792
793
794 /* Mark all the non-SSA variables found in STMT's operands to be
795    processed by update_ssa.  */
796
797 void
798 mark_new_vars_to_rename (tree stmt)
799 {
800   ssa_op_iter iter;
801   tree val;
802   bitmap vars_in_vops_to_rename;
803   bool found_exposed_symbol = false;
804   int v_may_defs_before, v_may_defs_after;
805   int v_must_defs_before, v_must_defs_after;
806
807   if (TREE_CODE (stmt) == PHI_NODE)
808     return;
809
810   get_stmt_ann (stmt);
811   vars_in_vops_to_rename = BITMAP_ALLOC (NULL);
812
813   /* Before re-scanning the statement for operands, mark the existing
814      virtual operands to be renamed again.  We do this because when new
815      symbols are exposed, the virtual operands that were here before due to
816      aliasing will probably be removed by the call to get_stmt_operand.
817      Therefore, we need to flag them to be renamed beforehand.
818
819      We flag them in a separate bitmap because we don't really want to
820      rename them if there are not any newly exposed symbols in the
821      statement operands.  */
822   v_may_defs_before = NUM_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF);
823   v_must_defs_before = NUM_SSA_OPERANDS (stmt, SSA_OP_VMUSTDEF);
824
825   FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, 
826                              SSA_OP_VMAYDEF | SSA_OP_VUSE | SSA_OP_VMUSTDEF)
827     {
828       if (!DECL_P (val))
829         val = SSA_NAME_VAR (val);
830       bitmap_set_bit (vars_in_vops_to_rename, DECL_UID (val));
831     }
832
833   /* Now force an operand re-scan on the statement and mark any newly
834      exposed variables.  */
835   update_stmt (stmt);
836
837   v_may_defs_after = NUM_SSA_OPERANDS (stmt, SSA_OP_VMAYDEF);
838   v_must_defs_after = NUM_SSA_OPERANDS (stmt, SSA_OP_VMUSTDEF);
839
840   FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_ALL_OPERANDS)
841     if (DECL_P (val))
842       {
843         found_exposed_symbol = true;
844         mark_sym_for_renaming (val);
845       }
846
847   /* If we found any newly exposed symbols, or if there are fewer VDEF
848      operands in the statement, add the variables we had set in
849      VARS_IN_VOPS_TO_RENAME to VARS_TO_RENAME.  We need to check for
850      vanishing VDEFs because in those cases, the names that were formerly
851      generated by this statement are not going to be available anymore.  */
852   if (found_exposed_symbol
853       || v_may_defs_before > v_may_defs_after
854       || v_must_defs_before > v_must_defs_after)
855     mark_set_for_renaming (vars_in_vops_to_rename);
856
857   BITMAP_FREE (vars_in_vops_to_rename);
858 }
859
860 /* Find all variables within the gimplified statement that were not previously
861    visible to the function and add them to the referenced variables list.  */
862
863 static tree
864 find_new_referenced_vars_1 (tree *tp, int *walk_subtrees,
865                             void *data ATTRIBUTE_UNUSED)
866 {
867   tree t = *tp;
868
869   if (TREE_CODE (t) == VAR_DECL && !var_ann (t))
870     {
871       add_referenced_tmp_var (t);
872       mark_sym_for_renaming (t);
873     }
874
875   if (IS_TYPE_OR_DECL_P (t))
876     *walk_subtrees = 0;
877
878   return NULL;
879 }
880
881 void
882 find_new_referenced_vars (tree *stmt_p)
883 {
884   walk_tree (stmt_p, find_new_referenced_vars_1, NULL, NULL);
885 }
886
887
888 /* If REF is a handled component reference for a structure, return the
889    base variable.  The access range is delimited by bit positions *POFFSET and
890    *POFFSET + *PMAX_SIZE.  The access size is *PSIZE bits.  If either
891    *PSIZE or *PMAX_SIZE is -1, they could not be determined.  If *PSIZE
892    and *PMAX_SIZE are equal, the access is non-variable.  */
893
894 tree
895 get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
896                          HOST_WIDE_INT *psize,
897                          HOST_WIDE_INT *pmax_size)
898 {
899   HOST_WIDE_INT bitsize = -1;
900   HOST_WIDE_INT maxsize = -1;
901   tree size_tree = NULL_TREE;
902   tree bit_offset = bitsize_zero_node;
903   bool seen_variable_array_ref = false;
904
905   gcc_assert (!SSA_VAR_P (exp));
906
907   /* First get the final access size from just the outermost expression.  */
908   if (TREE_CODE (exp) == COMPONENT_REF)
909     size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
910   else if (TREE_CODE (exp) == BIT_FIELD_REF)
911     size_tree = TREE_OPERAND (exp, 1);
912   else
913     {
914       enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
915       if (mode == BLKmode)
916         size_tree = TYPE_SIZE (TREE_TYPE (exp));
917       else
918         bitsize = GET_MODE_BITSIZE (mode);
919     }
920   if (size_tree != NULL_TREE)
921     {
922       if (! host_integerp (size_tree, 1))
923         bitsize = -1;
924       else
925         bitsize = TREE_INT_CST_LOW (size_tree);
926     }
927
928   /* Initially, maxsize is the same as the accessed element size.
929      In the following it will only grow (or become -1).  */
930   maxsize = bitsize;
931
932   /* Compute cumulative bit-offset for nested component-refs and array-refs,
933      and find the ultimate containing object.  */
934   while (1)
935     {
936       switch (TREE_CODE (exp))
937         {
938         case BIT_FIELD_REF:
939           bit_offset = size_binop (PLUS_EXPR, bit_offset,
940                                    TREE_OPERAND (exp, 2));
941           break;
942
943         case COMPONENT_REF:
944           {
945             tree field = TREE_OPERAND (exp, 1);
946             tree this_offset = component_ref_field_offset (exp);
947
948             if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
949               {
950                 this_offset = size_binop (MULT_EXPR,
951                                           fold_convert (bitsizetype,
952                                                         this_offset),
953                                           bitsize_unit_node);
954                 bit_offset = size_binop (PLUS_EXPR,
955                                          bit_offset, this_offset);
956                 bit_offset = size_binop (PLUS_EXPR, bit_offset,
957                                          DECL_FIELD_BIT_OFFSET (field));
958               }
959             else
960               {
961                 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
962                 /* We need to adjust maxsize to the whole structure bitsize.
963                    But we can subtract any constant offset seen sofar,
964                    because that would get us out of the structure otherwise.  */
965                 if (maxsize != -1
966                     && csize && host_integerp (csize, 1))
967                   {
968                     maxsize = (TREE_INT_CST_LOW (csize)
969                                - TREE_INT_CST_LOW (bit_offset));
970                   }
971                 else
972                   maxsize = -1;
973               }
974           }
975           break;
976
977         case ARRAY_REF:
978         case ARRAY_RANGE_REF:
979           {
980             tree index = TREE_OPERAND (exp, 1);
981             tree low_bound = array_ref_low_bound (exp);
982             tree unit_size = array_ref_element_size (exp);
983
984             if (! integer_zerop (low_bound))
985               index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
986                                    index, low_bound);
987             index = size_binop (MULT_EXPR,
988                                 fold_convert (sizetype, index), unit_size);
989             if (TREE_CODE (index) == INTEGER_CST)
990               {
991                 index = size_binop (MULT_EXPR,
992                                     fold_convert (bitsizetype, index),
993                                     bitsize_unit_node);
994                 bit_offset = size_binop (PLUS_EXPR, bit_offset, index);
995
996                 /* An array ref with a constant index up in the structure
997                    hierarchy will constrain the size of any variable array ref
998                    lower in the access hierarchy.  */
999                 seen_variable_array_ref = false;
1000               }
1001             else
1002               {
1003                 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
1004                 /* We need to adjust maxsize to the whole array bitsize.
1005                    But we can subtract any constant offset seen sofar,
1006                    because that would get us outside of the array otherwise.  */
1007                 if (maxsize != -1
1008                     && asize && host_integerp (asize, 1))
1009                   {
1010                     maxsize = (TREE_INT_CST_LOW (asize)
1011                                - TREE_INT_CST_LOW (bit_offset));
1012                   }
1013                 else
1014                   maxsize = -1;
1015
1016                 /* Remember that we have seen an array ref with a variable
1017                    index.  */
1018                 seen_variable_array_ref = true;
1019               }
1020           }
1021           break;
1022
1023         case REALPART_EXPR:
1024           break;
1025
1026         case IMAGPART_EXPR:
1027           bit_offset = size_binop (PLUS_EXPR, bit_offset,
1028                                    bitsize_int (bitsize));
1029           break;
1030
1031         case VIEW_CONVERT_EXPR:
1032           /* ???  We probably should give up here and bail out.  */
1033           break;
1034
1035         default:
1036           goto done;
1037         }
1038
1039       exp = TREE_OPERAND (exp, 0);
1040     }
1041  done:
1042
1043   /* We need to deal with variable arrays ending structures such as
1044        struct { int length; int a[1]; } x;           x.a[d]
1045        struct { struct { int a; int b; } a[1]; } x;  x.a[d].a
1046        struct { struct { int a[1]; } a[1]; } x;      x.a[0][d], x.a[d][0]
1047      where we do not know maxsize for variable index accesses to
1048      the array.  The simplest way to conservatively deal with this
1049      is to punt in the case that offset + maxsize reaches the
1050      base type boundary.  */
1051   if (seen_variable_array_ref
1052       && maxsize != -1
1053       && host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1)
1054       && TREE_INT_CST_LOW (bit_offset) + maxsize
1055          == TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (exp))))
1056     maxsize = -1;
1057
1058   /* ???  Due to negative offsets in ARRAY_REF we can end up with
1059      negative bit_offset here.  We might want to store a zero offset
1060      in this case.  */
1061   *poffset = TREE_INT_CST_LOW (bit_offset);
1062   *psize = bitsize;
1063   *pmax_size = maxsize;
1064
1065   return exp;
1066 }