]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/tree-dfa.c
backport: ChangeLog.tuples: ChangeLog from gimple-tuples-branch.
[thirdparty/gcc.git] / gcc / tree-dfa.c
1 /* Data flow functions for trees.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 Free Software
3 Foundation, Inc.
4 Contributed by Diego Novillo <dnovillo@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "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 "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_var_anns;
56 long num_defs;
57 long num_uses;
58 long num_phis;
59 long num_phi_args;
60 size_t max_num_phi_args;
61 long num_vdefs;
62 long num_vuses;
63 };
64
65
66 /* Local functions. */
67 static void collect_dfa_stats (struct dfa_stats_d *);
68 static tree find_vars_r (tree *, int *, void *);
69
70
71 /*---------------------------------------------------------------------------
72 Dataflow analysis (DFA) routines
73 ---------------------------------------------------------------------------*/
74 /* Find all the variables referenced in the function. This function
75 builds the global arrays REFERENCED_VARS and CALL_CLOBBERED_VARS.
76
77 Note that this function does not look for statement operands, it simply
78 determines what variables are referenced in the program and detects
79 various attributes for each variable used by alias analysis and the
80 optimizer. */
81
82 static unsigned int
83 find_referenced_vars (void)
84 {
85 basic_block bb;
86 gimple_stmt_iterator si;
87
88 FOR_EACH_BB (bb)
89 {
90 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
91 {
92 size_t i;
93 gimple stmt = gsi_stmt (si);
94 for (i = 0; i < gimple_num_ops (stmt); i++)
95 walk_tree (gimple_op_ptr (stmt, i), find_vars_r, NULL, NULL);
96 }
97
98 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
99 {
100 gimple phi = gsi_stmt (si);
101 size_t i, len = gimple_phi_num_args (phi);
102
103 walk_tree (gimple_phi_result_ptr (phi), find_vars_r, NULL, NULL);
104
105 for (i = 0; i < len; i++)
106 {
107 tree arg = gimple_phi_arg_def (phi, i);
108 walk_tree (&arg, find_vars_r, NULL, NULL);
109 }
110 }
111 }
112
113 return 0;
114 }
115
116 struct gimple_opt_pass pass_referenced_vars =
117 {
118 {
119 GIMPLE_PASS,
120 NULL, /* name */
121 NULL, /* gate */
122 find_referenced_vars, /* execute */
123 NULL, /* sub */
124 NULL, /* next */
125 0, /* static_pass_number */
126 TV_FIND_REFERENCED_VARS, /* tv_id */
127 PROP_gimple_leh | PROP_cfg, /* properties_required */
128 PROP_referenced_vars, /* properties_provided */
129 0, /* properties_destroyed */
130 TODO_dump_func, /* todo_flags_start */
131 TODO_dump_func /* todo_flags_finish */
132 }
133 };
134
135
136 /*---------------------------------------------------------------------------
137 Manage annotations
138 ---------------------------------------------------------------------------*/
139 /* Create a new annotation for a _DECL node T. */
140
141 var_ann_t
142 create_var_ann (tree t)
143 {
144 var_ann_t ann;
145
146 gcc_assert (t);
147 gcc_assert (DECL_P (t));
148 gcc_assert (!t->base.ann || t->base.ann->common.type == VAR_ANN);
149
150 ann = GGC_CNEW (struct var_ann_d);
151 ann->common.type = VAR_ANN;
152 t->base.ann = (tree_ann_t) ann;
153
154 return ann;
155 }
156
157 /* Create a new annotation for a FUNCTION_DECL node T. */
158
159 function_ann_t
160 create_function_ann (tree t)
161 {
162 function_ann_t ann;
163
164 gcc_assert (t);
165 gcc_assert (TREE_CODE (t) == FUNCTION_DECL);
166 gcc_assert (!t->base.ann || t->base.ann->common.type == FUNCTION_ANN);
167
168 ann = (function_ann_t) ggc_alloc (sizeof (*ann));
169 memset ((void *) ann, 0, sizeof (*ann));
170
171 ann->common.type = FUNCTION_ANN;
172
173 t->base.ann = (tree_ann_t) ann;
174
175 return ann;
176 }
177
178 /* Renumber all of the gimple stmt uids. */
179
180 void
181 renumber_gimple_stmt_uids (void)
182 {
183 basic_block bb;
184
185 set_gimple_stmt_max_uid (cfun, 0);
186 FOR_ALL_BB (bb)
187 {
188 gimple_stmt_iterator bsi;
189 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
190 {
191 gimple stmt = gsi_stmt (bsi);
192 gimple_set_uid (stmt, inc_gimple_stmt_max_uid (cfun));
193 }
194 }
195 }
196
197 /* Create a new annotation for a tree T. */
198
199 tree_ann_common_t
200 create_tree_common_ann (tree t)
201 {
202 tree_ann_common_t ann;
203
204 gcc_assert (t);
205 gcc_assert (!t->base.ann || t->base.ann->common.type == TREE_ANN_COMMON);
206
207 ann = GGC_CNEW (struct tree_ann_common_d);
208
209 ann->type = TREE_ANN_COMMON;
210 ann->rn = -1;
211 t->base.ann = (tree_ann_t) ann;
212
213 return ann;
214 }
215
216 /* Build a temporary. Make sure and register it to be renamed. */
217
218 tree
219 make_rename_temp (tree type, const char *prefix)
220 {
221 tree t = create_tmp_var (type, prefix);
222
223 if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
224 || TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
225 DECL_GIMPLE_REG_P (t) = 1;
226
227 if (gimple_referenced_vars (cfun))
228 {
229 add_referenced_var (t);
230 mark_sym_for_renaming (t);
231 }
232
233 return t;
234 }
235
236
237
238 /*---------------------------------------------------------------------------
239 Debugging functions
240 ---------------------------------------------------------------------------*/
241 /* Dump the list of all the referenced variables in the current function to
242 FILE. */
243
244 void
245 dump_referenced_vars (FILE *file)
246 {
247 tree var;
248 referenced_var_iterator rvi;
249
250 fprintf (file, "\nReferenced variables in %s: %u\n\n",
251 get_name (current_function_decl), (unsigned) num_referenced_vars);
252
253 FOR_EACH_REFERENCED_VAR (var, rvi)
254 {
255 fprintf (file, "Variable: ");
256 dump_variable (file, var);
257 fprintf (file, "\n");
258 }
259 }
260
261
262 /* Dump the list of all the referenced variables to stderr. */
263
264 void
265 debug_referenced_vars (void)
266 {
267 dump_referenced_vars (stderr);
268 }
269
270
271 /* Dump variable VAR and its may-aliases to FILE. */
272
273 void
274 dump_variable (FILE *file, tree var)
275 {
276 var_ann_t ann;
277
278 if (TREE_CODE (var) == SSA_NAME)
279 {
280 if (POINTER_TYPE_P (TREE_TYPE (var)))
281 dump_points_to_info_for (file, var);
282 var = SSA_NAME_VAR (var);
283 }
284
285 if (var == NULL_TREE)
286 {
287 fprintf (file, "<nil>");
288 return;
289 }
290
291 print_generic_expr (file, var, dump_flags);
292
293 ann = var_ann (var);
294
295 fprintf (file, ", UID D.%u", (unsigned) DECL_UID (var));
296
297 fprintf (file, ", ");
298 print_generic_expr (file, TREE_TYPE (var), dump_flags);
299
300 if (ann && ann->symbol_mem_tag)
301 {
302 fprintf (file, ", symbol memory tag: ");
303 print_generic_expr (file, ann->symbol_mem_tag, dump_flags);
304 }
305
306 if (TREE_ADDRESSABLE (var))
307 fprintf (file, ", is addressable");
308
309 if (is_global_var (var))
310 fprintf (file, ", is global");
311
312 if (TREE_THIS_VOLATILE (var))
313 fprintf (file, ", is volatile");
314
315 dump_mem_sym_stats_for_var (file, var);
316
317 if (is_call_clobbered (var))
318 {
319 const char *s = "";
320 var_ann_t va = var_ann (var);
321 unsigned int escape_mask = va->escape_mask;
322
323 fprintf (file, ", call clobbered");
324 fprintf (file, " (");
325 if (escape_mask & ESCAPE_STORED_IN_GLOBAL)
326 { fprintf (file, "%sstored in global", s); s = ", "; }
327 if (escape_mask & ESCAPE_TO_ASM)
328 { fprintf (file, "%sgoes through ASM", s); s = ", "; }
329 if (escape_mask & ESCAPE_TO_CALL)
330 { fprintf (file, "%spassed to call", s); s = ", "; }
331 if (escape_mask & ESCAPE_BAD_CAST)
332 { fprintf (file, "%sbad cast", s); s = ", "; }
333 if (escape_mask & ESCAPE_TO_RETURN)
334 { fprintf (file, "%sreturned from func", s); s = ", "; }
335 if (escape_mask & ESCAPE_TO_PURE_CONST)
336 { fprintf (file, "%spassed to pure/const", s); s = ", "; }
337 if (escape_mask & ESCAPE_IS_GLOBAL)
338 { fprintf (file, "%sis global var", s); s = ", "; }
339 if (escape_mask & ESCAPE_IS_PARM)
340 { fprintf (file, "%sis incoming pointer", s); s = ", "; }
341 if (escape_mask & ESCAPE_UNKNOWN)
342 { fprintf (file, "%sunknown escape", s); s = ", "; }
343 fprintf (file, ")");
344 }
345
346 if (ann->noalias_state == NO_ALIAS)
347 fprintf (file, ", NO_ALIAS (does not alias other NO_ALIAS symbols)");
348 else if (ann->noalias_state == NO_ALIAS_GLOBAL)
349 fprintf (file, ", NO_ALIAS_GLOBAL (does not alias other NO_ALIAS symbols"
350 " and global vars)");
351 else if (ann->noalias_state == NO_ALIAS_ANYTHING)
352 fprintf (file, ", NO_ALIAS_ANYTHING (does not alias any other symbols)");
353
354 if (gimple_default_def (cfun, var))
355 {
356 fprintf (file, ", default def: ");
357 print_generic_expr (file, gimple_default_def (cfun, var), dump_flags);
358 }
359
360 if (MTAG_P (var) && may_aliases (var))
361 {
362 fprintf (file, ", may aliases: ");
363 dump_may_aliases_for (file, var);
364 }
365
366 if (!is_gimple_reg (var))
367 {
368 if (memory_partition (var))
369 {
370 fprintf (file, ", belongs to partition: ");
371 print_generic_expr (file, memory_partition (var), dump_flags);
372 }
373
374 if (TREE_CODE (var) == MEMORY_PARTITION_TAG)
375 {
376 fprintf (file, ", partition symbols: ");
377 dump_decl_set (file, MPT_SYMBOLS (var));
378 }
379 }
380
381 fprintf (file, "\n");
382 }
383
384
385 /* Dump variable VAR and its may-aliases to stderr. */
386
387 void
388 debug_variable (tree var)
389 {
390 dump_variable (stderr, var);
391 }
392
393
394 /* Dump various DFA statistics to FILE. */
395
396 void
397 dump_dfa_stats (FILE *file)
398 {
399 struct dfa_stats_d dfa_stats;
400
401 unsigned long size, total = 0;
402 const char * const fmt_str = "%-30s%-13s%12s\n";
403 const char * const fmt_str_1 = "%-30s%13lu%11lu%c\n";
404 const char * const fmt_str_3 = "%-43s%11lu%c\n";
405 const char *funcname
406 = lang_hooks.decl_printable_name (current_function_decl, 2);
407
408 collect_dfa_stats (&dfa_stats);
409
410 fprintf (file, "\nDFA Statistics for %s\n\n", funcname);
411
412 fprintf (file, "---------------------------------------------------------\n");
413 fprintf (file, fmt_str, "", " Number of ", "Memory");
414 fprintf (file, fmt_str, "", " instances ", "used ");
415 fprintf (file, "---------------------------------------------------------\n");
416
417 size = num_referenced_vars * sizeof (tree);
418 total += size;
419 fprintf (file, fmt_str_1, "Referenced variables", (unsigned long)num_referenced_vars,
420 SCALE (size), LABEL (size));
421
422 size = dfa_stats.num_var_anns * sizeof (struct var_ann_d);
423 total += size;
424 fprintf (file, fmt_str_1, "Variables annotated", dfa_stats.num_var_anns,
425 SCALE (size), LABEL (size));
426
427 size = dfa_stats.num_uses * sizeof (tree *);
428 total += size;
429 fprintf (file, fmt_str_1, "USE operands", dfa_stats.num_uses,
430 SCALE (size), LABEL (size));
431
432 size = dfa_stats.num_defs * sizeof (tree *);
433 total += size;
434 fprintf (file, fmt_str_1, "DEF operands", dfa_stats.num_defs,
435 SCALE (size), LABEL (size));
436
437 size = dfa_stats.num_vuses * sizeof (tree *);
438 total += size;
439 fprintf (file, fmt_str_1, "VUSE operands", dfa_stats.num_vuses,
440 SCALE (size), LABEL (size));
441
442 size = dfa_stats.num_vdefs * sizeof (tree *);
443 total += size;
444 fprintf (file, fmt_str_1, "VDEF operands", dfa_stats.num_vdefs,
445 SCALE (size), LABEL (size));
446
447 size = dfa_stats.num_phis * sizeof (struct gimple_statement_phi);
448 total += size;
449 fprintf (file, fmt_str_1, "PHI nodes", dfa_stats.num_phis,
450 SCALE (size), LABEL (size));
451
452 size = dfa_stats.num_phi_args * sizeof (struct phi_arg_d);
453 total += size;
454 fprintf (file, fmt_str_1, "PHI arguments", dfa_stats.num_phi_args,
455 SCALE (size), LABEL (size));
456
457 fprintf (file, "---------------------------------------------------------\n");
458 fprintf (file, fmt_str_3, "Total memory used by DFA/SSA data", SCALE (total),
459 LABEL (total));
460 fprintf (file, "---------------------------------------------------------\n");
461 fprintf (file, "\n");
462
463 if (dfa_stats.num_phis)
464 fprintf (file, "Average number of arguments per PHI node: %.1f (max: %ld)\n",
465 (float) dfa_stats.num_phi_args / (float) dfa_stats.num_phis,
466 (long) dfa_stats.max_num_phi_args);
467
468 fprintf (file, "\n");
469 }
470
471
472 /* Dump DFA statistics on stderr. */
473
474 void
475 debug_dfa_stats (void)
476 {
477 dump_dfa_stats (stderr);
478 }
479
480
481 /* Collect DFA statistics and store them in the structure pointed to by
482 DFA_STATS_P. */
483
484 static void
485 collect_dfa_stats (struct dfa_stats_d *dfa_stats_p ATTRIBUTE_UNUSED)
486 {
487 basic_block bb;
488 referenced_var_iterator vi;
489 tree var;
490
491 gcc_assert (dfa_stats_p);
492
493 memset ((void *)dfa_stats_p, 0, sizeof (struct dfa_stats_d));
494
495 /* Count all the variable annotations. */
496 FOR_EACH_REFERENCED_VAR (var, vi)
497 if (var_ann (var))
498 dfa_stats_p->num_var_anns++;
499
500 /* Walk all the statements in the function counting references. */
501 FOR_EACH_BB (bb)
502 {
503 gimple_stmt_iterator si;
504
505 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
506 {
507 gimple phi = gsi_stmt (si);
508 dfa_stats_p->num_phis++;
509 dfa_stats_p->num_phi_args += gimple_phi_num_args (phi);
510 if (gimple_phi_num_args (phi) > dfa_stats_p->max_num_phi_args)
511 dfa_stats_p->max_num_phi_args = gimple_phi_num_args (phi);
512 }
513
514 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
515 {
516 gimple stmt = gsi_stmt (si);
517 dfa_stats_p->num_defs += NUM_SSA_OPERANDS (stmt, SSA_OP_DEF);
518 dfa_stats_p->num_uses += NUM_SSA_OPERANDS (stmt, SSA_OP_USE);
519 dfa_stats_p->num_vdefs += NUM_SSA_OPERANDS (stmt, SSA_OP_VDEF);
520 dfa_stats_p->num_vuses += NUM_SSA_OPERANDS (stmt, SSA_OP_VUSE);
521 }
522 }
523 }
524
525
526 /*---------------------------------------------------------------------------
527 Miscellaneous helpers
528 ---------------------------------------------------------------------------*/
529 /* Callback for walk_tree. Used to collect variables referenced in
530 the function. */
531
532 static tree
533 find_vars_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
534 {
535 /* If we are reading the lto info back in, we need to rescan the
536 referenced vars. */
537 if (TREE_CODE (*tp) == SSA_NAME)
538 add_referenced_var (SSA_NAME_VAR (*tp));
539
540 /* If T is a regular variable that the optimizers are interested
541 in, add it to the list of variables. */
542 else if (SSA_VAR_P (*tp))
543 add_referenced_var (*tp);
544
545 /* Type, _DECL and constant nodes have no interesting children.
546 Ignore them. */
547 else if (IS_TYPE_OR_DECL_P (*tp) || CONSTANT_CLASS_P (*tp))
548 *walk_subtrees = 0;
549
550 return NULL_TREE;
551 }
552
553 /* Lookup UID in the referenced_vars hashtable and return the associated
554 variable. */
555
556 tree
557 referenced_var_lookup (unsigned int uid)
558 {
559 tree h;
560 struct tree_decl_minimal in;
561 in.uid = uid;
562 h = (tree) htab_find_with_hash (gimple_referenced_vars (cfun), &in, uid);
563 gcc_assert (h || uid == 0);
564 return h;
565 }
566
567 /* Check if TO is in the referenced_vars hash table and insert it if not.
568 Return true if it required insertion. */
569
570 bool
571 referenced_var_check_and_insert (tree to)
572 {
573 tree h, *loc;
574 struct tree_decl_minimal in;
575 unsigned int uid = DECL_UID (to);
576
577 in.uid = uid;
578 h = (tree) htab_find_with_hash (gimple_referenced_vars (cfun), &in, uid);
579 if (h)
580 {
581 /* DECL_UID has already been entered in the table. Verify that it is
582 the same entry as TO. See PR 27793. */
583 gcc_assert (h == to);
584 return false;
585 }
586
587 loc = (tree *) htab_find_slot_with_hash (gimple_referenced_vars (cfun),
588 &in, uid, INSERT);
589 *loc = to;
590 return true;
591 }
592
593 /* Lookup VAR UID in the default_defs hashtable and return the associated
594 variable. */
595
596 tree
597 gimple_default_def (struct function *fn, tree var)
598 {
599 struct tree_decl_minimal ind;
600 struct tree_ssa_name in;
601 gcc_assert (SSA_VAR_P (var));
602 in.var = (tree)&ind;
603 ind.uid = DECL_UID (var);
604 return (tree) htab_find_with_hash (DEFAULT_DEFS (fn), &in, DECL_UID (var));
605 }
606
607 /* Insert the pair VAR's UID, DEF into the default_defs hashtable. */
608
609 void
610 set_default_def (tree var, tree def)
611 {
612 struct tree_decl_minimal ind;
613 struct tree_ssa_name in;
614 void **loc;
615
616 gcc_assert (SSA_VAR_P (var));
617 in.var = (tree)&ind;
618 ind.uid = DECL_UID (var);
619 if (!def)
620 {
621 loc = htab_find_slot_with_hash (DEFAULT_DEFS (cfun), &in,
622 DECL_UID (var), INSERT);
623 gcc_assert (*loc);
624 htab_remove_elt (DEFAULT_DEFS (cfun), *loc);
625 return;
626 }
627 gcc_assert (TREE_CODE (def) == SSA_NAME && SSA_NAME_VAR (def) == var);
628 loc = htab_find_slot_with_hash (DEFAULT_DEFS (cfun), &in,
629 DECL_UID (var), INSERT);
630
631 /* Default definition might be changed by tail call optimization. */
632 if (*loc)
633 SSA_NAME_IS_DEFAULT_DEF (*(tree *) loc) = false;
634 *(tree *) loc = def;
635
636 /* Mark DEF as the default definition for VAR. */
637 SSA_NAME_IS_DEFAULT_DEF (def) = true;
638 }
639
640 /* Add VAR to the list of referenced variables if it isn't already there. */
641
642 void
643 add_referenced_var (tree var)
644 {
645 var_ann_t v_ann;
646
647 v_ann = get_var_ann (var);
648 gcc_assert (DECL_P (var));
649
650 /* Insert VAR into the referenced_vars has table if it isn't present. */
651 if (referenced_var_check_and_insert (var))
652 {
653 /* This is the first time we found this variable, annotate it with
654 attributes that are intrinsic to the variable. */
655
656 /* Tag's don't have DECL_INITIAL. */
657 if (MTAG_P (var))
658 return;
659
660 /* Scan DECL_INITIAL for pointer variables as they may contain
661 address arithmetic referencing the address of other
662 variables.
663 Even non-constant initializers need to be walked, because
664 IPA passes might prove that their are invariant later on. */
665 if (DECL_INITIAL (var)
666 /* Initializers of external variables are not useful to the
667 optimizers. */
668 && !DECL_EXTERNAL (var))
669 walk_tree (&DECL_INITIAL (var), find_vars_r, NULL, 0);
670 }
671 }
672
673 /* Remove VAR from the list. */
674
675 void
676 remove_referenced_var (tree var)
677 {
678 var_ann_t v_ann;
679 struct tree_decl_minimal in;
680 void **loc;
681 unsigned int uid = DECL_UID (var);
682
683 clear_call_clobbered (var);
684 bitmap_clear_bit (gimple_call_used_vars (cfun), uid);
685 if ((v_ann = var_ann (var)))
686 {
687 /* Preserve var_anns of globals, but clear their alias info. */
688 if (MTAG_P (var)
689 || (!TREE_STATIC (var) && !DECL_EXTERNAL (var)))
690 {
691 ggc_free (v_ann);
692 var->base.ann = NULL;
693 }
694 else
695 {
696 v_ann->mpt = NULL_TREE;
697 v_ann->symbol_mem_tag = NULL_TREE;
698 }
699 }
700 gcc_assert (DECL_P (var));
701 in.uid = uid;
702 loc = htab_find_slot_with_hash (gimple_referenced_vars (cfun), &in, uid,
703 NO_INSERT);
704 htab_clear_slot (gimple_referenced_vars (cfun), loc);
705 }
706
707
708 /* Return the virtual variable associated to the non-scalar variable VAR. */
709
710 tree
711 get_virtual_var (tree var)
712 {
713 STRIP_NOPS (var);
714
715 if (TREE_CODE (var) == SSA_NAME)
716 var = SSA_NAME_VAR (var);
717
718 while (TREE_CODE (var) == REALPART_EXPR || TREE_CODE (var) == IMAGPART_EXPR
719 || handled_component_p (var))
720 var = TREE_OPERAND (var, 0);
721
722 /* Treating GIMPLE registers as virtual variables makes no sense.
723 Also complain if we couldn't extract a _DECL out of the original
724 expression. */
725 gcc_assert (SSA_VAR_P (var));
726 gcc_assert (!is_gimple_reg (var));
727
728 return var;
729 }
730
731 /* Mark all the naked symbols in STMT for SSA renaming.
732
733 NOTE: This function should only be used for brand new statements.
734 If the caller is modifying an existing statement, it should use the
735 combination push_stmt_changes/pop_stmt_changes. */
736
737 void
738 mark_symbols_for_renaming (gimple stmt)
739 {
740 tree op;
741 ssa_op_iter iter;
742
743 update_stmt (stmt);
744
745 /* Mark all the operands for renaming. */
746 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_OPERANDS)
747 if (DECL_P (op))
748 mark_sym_for_renaming (op);
749 }
750
751
752 /* Find all variables within the gimplified statement that were not
753 previously visible to the function and add them to the referenced
754 variables list. */
755
756 static tree
757 find_new_referenced_vars_1 (tree *tp, int *walk_subtrees,
758 void *data ATTRIBUTE_UNUSED)
759 {
760 tree t = *tp;
761
762 if (TREE_CODE (t) == VAR_DECL && !var_ann (t))
763 {
764 add_referenced_var (t);
765 mark_sym_for_renaming (t);
766 }
767
768 if (IS_TYPE_OR_DECL_P (t))
769 *walk_subtrees = 0;
770
771 return NULL;
772 }
773
774
775 /* Find any new referenced variables in STMT. */
776
777 void
778 find_new_referenced_vars (gimple stmt)
779 {
780 walk_gimple_op (stmt, find_new_referenced_vars_1, NULL);
781 }
782
783
784 /* If EXP is a handled component reference for a structure, return the
785 base variable. The access range is delimited by bit positions *POFFSET and
786 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
787 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
788 and *PMAX_SIZE are equal, the access is non-variable. */
789
790 tree
791 get_ref_base_and_extent (tree exp, HOST_WIDE_INT *poffset,
792 HOST_WIDE_INT *psize,
793 HOST_WIDE_INT *pmax_size)
794 {
795 HOST_WIDE_INT bitsize = -1;
796 HOST_WIDE_INT maxsize = -1;
797 tree size_tree = NULL_TREE;
798 HOST_WIDE_INT bit_offset = 0;
799 bool seen_variable_array_ref = false;
800
801 gcc_assert (!SSA_VAR_P (exp));
802
803 /* First get the final access size from just the outermost expression. */
804 if (TREE_CODE (exp) == COMPONENT_REF)
805 size_tree = DECL_SIZE (TREE_OPERAND (exp, 1));
806 else if (TREE_CODE (exp) == BIT_FIELD_REF)
807 size_tree = TREE_OPERAND (exp, 1);
808 else
809 {
810 enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
811 if (mode == BLKmode)
812 size_tree = TYPE_SIZE (TREE_TYPE (exp));
813 else
814 bitsize = GET_MODE_BITSIZE (mode);
815 }
816 if (size_tree != NULL_TREE)
817 {
818 if (! host_integerp (size_tree, 1))
819 bitsize = -1;
820 else
821 bitsize = TREE_INT_CST_LOW (size_tree);
822 }
823
824 /* Initially, maxsize is the same as the accessed element size.
825 In the following it will only grow (or become -1). */
826 maxsize = bitsize;
827
828 /* Compute cumulative bit-offset for nested component-refs and array-refs,
829 and find the ultimate containing object. */
830 while (1)
831 {
832 switch (TREE_CODE (exp))
833 {
834 case BIT_FIELD_REF:
835 bit_offset += tree_low_cst (TREE_OPERAND (exp, 2), 0);
836 break;
837
838 case COMPONENT_REF:
839 {
840 tree field = TREE_OPERAND (exp, 1);
841 tree this_offset = component_ref_field_offset (exp);
842
843 if (this_offset && TREE_CODE (this_offset) == INTEGER_CST)
844 {
845 HOST_WIDE_INT hthis_offset = tree_low_cst (this_offset, 0);
846
847 hthis_offset *= BITS_PER_UNIT;
848 bit_offset += hthis_offset;
849 bit_offset += tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 0);
850 }
851 else
852 {
853 tree csize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
854 /* We need to adjust maxsize to the whole structure bitsize.
855 But we can subtract any constant offset seen so far,
856 because that would get us out of the structure otherwise. */
857 if (maxsize != -1 && csize && host_integerp (csize, 1))
858 maxsize = TREE_INT_CST_LOW (csize) - bit_offset;
859 else
860 maxsize = -1;
861 }
862 }
863 break;
864
865 case ARRAY_REF:
866 case ARRAY_RANGE_REF:
867 {
868 tree index = TREE_OPERAND (exp, 1);
869 tree low_bound = array_ref_low_bound (exp);
870 tree unit_size = array_ref_element_size (exp);
871
872 /* If the resulting bit-offset is constant, track it. */
873 if (host_integerp (index, 0)
874 && host_integerp (low_bound, 0)
875 && host_integerp (unit_size, 1))
876 {
877 HOST_WIDE_INT hindex = tree_low_cst (index, 0);
878
879 hindex -= tree_low_cst (low_bound, 0);
880 hindex *= tree_low_cst (unit_size, 1);
881 hindex *= BITS_PER_UNIT;
882 bit_offset += hindex;
883
884 /* An array ref with a constant index up in the structure
885 hierarchy will constrain the size of any variable array ref
886 lower in the access hierarchy. */
887 seen_variable_array_ref = false;
888 }
889 else
890 {
891 tree asize = TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp, 0)));
892 /* We need to adjust maxsize to the whole array bitsize.
893 But we can subtract any constant offset seen so far,
894 because that would get us outside of the array otherwise. */
895 if (maxsize != -1 && asize && host_integerp (asize, 1))
896 maxsize = TREE_INT_CST_LOW (asize) - bit_offset;
897 else
898 maxsize = -1;
899
900 /* Remember that we have seen an array ref with a variable
901 index. */
902 seen_variable_array_ref = true;
903 }
904 }
905 break;
906
907 case REALPART_EXPR:
908 break;
909
910 case IMAGPART_EXPR:
911 bit_offset += bitsize;
912 break;
913
914 case VIEW_CONVERT_EXPR:
915 /* ??? We probably should give up here and bail out. */
916 break;
917
918 default:
919 goto done;
920 }
921
922 exp = TREE_OPERAND (exp, 0);
923 }
924 done:
925
926 /* We need to deal with variable arrays ending structures such as
927 struct { int length; int a[1]; } x; x.a[d]
928 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
929 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
930 where we do not know maxsize for variable index accesses to
931 the array. The simplest way to conservatively deal with this
932 is to punt in the case that offset + maxsize reaches the
933 base type boundary. */
934 if (seen_variable_array_ref
935 && maxsize != -1
936 && host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1)
937 && bit_offset + maxsize
938 == (signed)TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (exp))))
939 maxsize = -1;
940
941 /* ??? Due to negative offsets in ARRAY_REF we can end up with
942 negative bit_offset here. We might want to store a zero offset
943 in this case. */
944 *poffset = bit_offset;
945 *psize = bitsize;
946 *pmax_size = maxsize;
947
948 return exp;
949 }
950
951 /* Returns true if STMT references an SSA_NAME that has
952 SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
953
954 bool
955 stmt_references_abnormal_ssa_name (gimple stmt)
956 {
957 ssa_op_iter oi;
958 use_operand_p use_p;
959
960 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, oi, SSA_OP_USE)
961 {
962 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p)))
963 return true;
964 }
965
966 return false;
967 }
968
969 /* Return true, if the two memory references REF1 and REF2 may alias. */
970
971 bool
972 refs_may_alias_p (tree ref1, tree ref2)
973 {
974 tree base1, base2;
975 HOST_WIDE_INT offset1 = 0, offset2 = 0;
976 HOST_WIDE_INT size1 = -1, size2 = -1;
977 HOST_WIDE_INT max_size1 = -1, max_size2 = -1;
978 bool strict_aliasing_applies;
979
980 gcc_assert ((SSA_VAR_P (ref1)
981 || handled_component_p (ref1)
982 || INDIRECT_REF_P (ref1)
983 || TREE_CODE (ref1) == TARGET_MEM_REF)
984 && (SSA_VAR_P (ref2)
985 || handled_component_p (ref2)
986 || INDIRECT_REF_P (ref2)
987 || TREE_CODE (ref2) == TARGET_MEM_REF));
988
989 /* Defer to TBAA if possible. */
990 if (flag_strict_aliasing
991 && !alias_sets_conflict_p (get_alias_set (ref1), get_alias_set (ref2)))
992 return false;
993
994 /* Decompose the references into their base objects and the access. */
995 base1 = ref1;
996 if (handled_component_p (ref1))
997 base1 = get_ref_base_and_extent (ref1, &offset1, &size1, &max_size1);
998 base2 = ref2;
999 if (handled_component_p (ref2))
1000 base2 = get_ref_base_and_extent (ref2, &offset2, &size2, &max_size2);
1001
1002 /* If both references are based on different variables, they cannot alias.
1003 If both references are based on the same variable, they cannot alias if
1004 the accesses do not overlap. */
1005 if (SSA_VAR_P (base1)
1006 && SSA_VAR_P (base2))
1007 {
1008 if (!operand_equal_p (base1, base2, 0))
1009 return false;
1010 return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
1011 }
1012
1013 /* If one base is a ref-all pointer weird things are allowed. */
1014 strict_aliasing_applies = (flag_strict_aliasing
1015 && (!INDIRECT_REF_P (base1)
1016 || get_alias_set (base1) != 0)
1017 && (!INDIRECT_REF_P (base2)
1018 || get_alias_set (base2) != 0));
1019
1020 /* If strict aliasing applies the only way to access a scalar variable
1021 is through a pointer dereference or through a union (gcc extension). */
1022 if (strict_aliasing_applies
1023 && ((SSA_VAR_P (ref2)
1024 && !AGGREGATE_TYPE_P (TREE_TYPE (ref2))
1025 && !INDIRECT_REF_P (ref1)
1026 && TREE_CODE (TREE_TYPE (base1)) != UNION_TYPE)
1027 || (SSA_VAR_P (ref1)
1028 && !AGGREGATE_TYPE_P (TREE_TYPE (ref1))
1029 && !INDIRECT_REF_P (ref2)
1030 && TREE_CODE (TREE_TYPE (base2)) != UNION_TYPE)))
1031 return false;
1032
1033 /* If both references are through the same type, or if strict aliasing
1034 doesn't apply they are through two same pointers, they do not alias
1035 if the accesses do not overlap. */
1036 if ((strict_aliasing_applies
1037 && (TYPE_MAIN_VARIANT (TREE_TYPE (base1))
1038 == TYPE_MAIN_VARIANT (TREE_TYPE (base2))))
1039 || (TREE_CODE (base1) == INDIRECT_REF
1040 && TREE_CODE (base2) == INDIRECT_REF
1041 && operand_equal_p (TREE_OPERAND (base1, 0),
1042 TREE_OPERAND (base2, 0), 0)))
1043 return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
1044
1045 /* If both are component references through pointers try to find a
1046 common base and apply offset based disambiguation. This handles
1047 for example
1048 struct A { int i; int j; } *q;
1049 struct B { struct A a; int k; } *p;
1050 disambiguating q->i and p->a.j. */
1051 if (strict_aliasing_applies
1052 && (TREE_CODE (base1) == INDIRECT_REF
1053 || TREE_CODE (base2) == INDIRECT_REF)
1054 && handled_component_p (ref1)
1055 && handled_component_p (ref2))
1056 {
1057 tree *refp;
1058 /* Now search for the type of base1 in the access path of ref2. This
1059 would be a common base for doing offset based disambiguation on. */
1060 refp = &ref2;
1061 while (handled_component_p (*refp)
1062 /* Note that the following is only conservative if there are
1063 never copies of types appearing as sub-structures. */
1064 && (TYPE_MAIN_VARIANT (TREE_TYPE (*refp))
1065 != TYPE_MAIN_VARIANT (TREE_TYPE (base1))))
1066 refp = &TREE_OPERAND (*refp, 0);
1067 if (TYPE_MAIN_VARIANT (TREE_TYPE (*refp))
1068 == TYPE_MAIN_VARIANT (TREE_TYPE (base1)))
1069 {
1070 HOST_WIDE_INT offadj, sztmp, msztmp;
1071 get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp);
1072 offset2 -= offadj;
1073 return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
1074 }
1075 /* The other way around. */
1076 refp = &ref1;
1077 while (handled_component_p (*refp)
1078 && (TYPE_MAIN_VARIANT (TREE_TYPE (*refp))
1079 != TYPE_MAIN_VARIANT (TREE_TYPE (base2))))
1080 refp = &TREE_OPERAND (*refp, 0);
1081 if (TYPE_MAIN_VARIANT (TREE_TYPE (*refp))
1082 == TYPE_MAIN_VARIANT (TREE_TYPE (base2)))
1083 {
1084 HOST_WIDE_INT offadj, sztmp, msztmp;
1085 get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp);
1086 offset1 -= offadj;
1087 return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
1088 }
1089 /* If we can be sure to catch all equivalent types in the search
1090 for the common base then we could return false here. In that
1091 case we would be able to disambiguate q->i and p->k. */
1092 }
1093
1094 return true;
1095 }
1096
1097 /* Given a stmt STMT that references memory, return the single stmt
1098 that is reached by following the VUSE -> VDEF link. Returns
1099 NULL_TREE, if there is no single stmt that defines all VUSEs of
1100 STMT.
1101 Note that for a stmt with a single virtual operand this may return
1102 a PHI node as well. Note that if all VUSEs are default definitions
1103 this function will return an empty statement. */
1104
1105 gimple
1106 get_single_def_stmt (gimple stmt)
1107 {
1108 gimple def_stmt = NULL;
1109 tree use;
1110 ssa_op_iter iter;
1111
1112 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_VIRTUAL_USES)
1113 {
1114 gimple tmp = SSA_NAME_DEF_STMT (use);
1115
1116 /* ??? This is too simplistic for multiple virtual operands
1117 reaching different PHI nodes of the same basic blocks or for
1118 reaching all default definitions. */
1119 if (def_stmt
1120 && def_stmt != tmp
1121 && !(gimple_nop_p (def_stmt)
1122 && gimple_nop_p (tmp)))
1123 return NULL;
1124
1125 def_stmt = tmp;
1126 }
1127
1128 return def_stmt;
1129 }
1130
1131 /* Given a PHI node of virtual operands, tries to eliminate cyclic
1132 reached definitions if they do not alias REF and returns the
1133 defining statement of the single virtual operand that flows in
1134 from a non-backedge. Returns NULL_TREE if such statement within
1135 the above conditions cannot be found. */
1136
1137 gimple
1138 get_single_def_stmt_from_phi (tree ref, gimple phi)
1139 {
1140 tree def_arg = NULL_TREE;
1141 unsigned i;
1142
1143 /* Find the single PHI argument that is not flowing in from a
1144 back edge and verify that the loop-carried definitions do
1145 not alias the reference we look for. */
1146 for (i = 0; i < gimple_phi_num_args (phi); ++i)
1147 {
1148 tree arg = PHI_ARG_DEF (phi, i);
1149 gimple def_stmt;
1150
1151 if (!(gimple_phi_arg_edge (phi, i)->flags & EDGE_DFS_BACK))
1152 {
1153 /* Multiple non-back edges? Do not try to handle this. */
1154 if (def_arg)
1155 return NULL;
1156 def_arg = arg;
1157 continue;
1158 }
1159
1160 /* Follow the definitions back to the original PHI node. Bail
1161 out once a definition is found that may alias REF. */
1162 def_stmt = SSA_NAME_DEF_STMT (arg);
1163 do
1164 {
1165 if (!is_gimple_assign (def_stmt)
1166 || refs_may_alias_p (ref, gimple_assign_lhs (def_stmt)))
1167 return NULL;
1168 /* ??? This will only work, reaching the PHI node again if
1169 there is a single virtual operand on def_stmt. */
1170 def_stmt = get_single_def_stmt (def_stmt);
1171 if (!def_stmt)
1172 return NULL;
1173 }
1174 while (def_stmt != phi);
1175 }
1176
1177 return SSA_NAME_DEF_STMT (def_arg);
1178 }
1179
1180 /* Return the single reference statement defining all virtual uses
1181 on STMT or NULL_TREE, if there are multiple defining statements.
1182 Take into account only definitions that alias REF if following
1183 back-edges when looking through a loop PHI node. */
1184
1185 gimple
1186 get_single_def_stmt_with_phi (tree ref, gimple stmt)
1187 {
1188 switch (NUM_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_USES))
1189 {
1190 case 0:
1191 gcc_unreachable ();
1192
1193 case 1:
1194 {
1195 gimple def_stmt = SSA_NAME_DEF_STMT (SINGLE_SSA_TREE_OPERAND
1196 (stmt, SSA_OP_VIRTUAL_USES));
1197 /* We can handle lookups over PHI nodes only for a single
1198 virtual operand. */
1199 if (gimple_code (def_stmt) == GIMPLE_PHI)
1200 return get_single_def_stmt_from_phi (ref, def_stmt);
1201 return def_stmt;
1202 }
1203
1204 default:
1205 return get_single_def_stmt (stmt);
1206 }
1207 }