]> gcc.gnu.org Git - gcc.git/blame - gcc/tree-ssa.c
config.sub: Import latest version from master repository.
[gcc.git] / gcc / tree-ssa.c
CommitLineData
6de9cd9a
DN
1/* Miscellaneous SSA utility functions.
2 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GCC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING. If not, write to
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "tm.h"
25#include "tree.h"
26#include "flags.h"
27#include "rtl.h"
28#include "tm_p.h"
29#include "ggc.h"
30#include "langhooks.h"
31#include "hard-reg-set.h"
32#include "basic-block.h"
33#include "output.h"
34#include "errors.h"
35#include "expr.h"
36#include "function.h"
37#include "diagnostic.h"
38#include "bitmap.h"
39#include "tree-flow.h"
eadf906f 40#include "tree-gimple.h"
6de9cd9a
DN
41#include "tree-inline.h"
42#include "varray.h"
43#include "timevar.h"
44#include "tree-alias-common.h"
45#include "hashtab.h"
46#include "tree-dump.h"
47#include "tree-pass.h"
48
49
50/* Remove edge E and remove the corresponding arguments from the PHI nodes
51 in E's destination block. */
52
53void
54ssa_remove_edge (edge e)
55{
56 tree phi, next;
57
58 /* Remove the appropriate PHI arguments in E's destination block. */
59 for (phi = phi_nodes (e->dest); phi; phi = next)
60 {
17192884 61 next = PHI_CHAIN (phi);
6de9cd9a
DN
62 remove_phi_arg (phi, e->src);
63 }
64
65 remove_edge (e);
66}
67
f6144c34
BE
68/* Remove the corresponding arguments from the PHI nodes in E's
69 destination block and redirect it to DEST. Return redirected edge.
6de9cd9a
DN
70 The list of removed arguments is stored in PENDING_STMT (e). */
71
72edge
73ssa_redirect_edge (edge e, basic_block dest)
74{
75 tree phi, next;
76 tree list = NULL, *last = &list;
77 tree src, dst, node;
78 int i;
79
80 /* Remove the appropriate PHI arguments in E's destination block. */
81 for (phi = phi_nodes (e->dest); phi; phi = next)
82 {
17192884 83 next = PHI_CHAIN (phi);
6de9cd9a
DN
84
85 i = phi_arg_from_edge (phi, e);
86 if (i < 0)
87 continue;
88
89 src = PHI_ARG_DEF (phi, i);
90 dst = PHI_RESULT (phi);
91 node = build_tree_list (dst, src);
92 *last = node;
93 last = &TREE_CHAIN (node);
94
95 remove_phi_arg_num (phi, i);
96 }
97
98 e = redirect_edge_succ_nodup (e, dest);
99 PENDING_STMT (e) = list;
100
101 return e;
102}
103
104
53b4bf74 105/* Return true if SSA_NAME is malformed and mark it visited.
6de9cd9a 106
53b4bf74
DN
107 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
108 operand. */
6de9cd9a
DN
109
110static bool
53b4bf74 111verify_ssa_name (tree ssa_name, bool is_virtual)
6de9cd9a 112{
53b4bf74 113 TREE_VISITED (ssa_name) = 1;
6de9cd9a
DN
114
115 if (TREE_CODE (ssa_name) != SSA_NAME)
116 {
117 error ("Expected an SSA_NAME object");
53b4bf74 118 return true;
6de9cd9a
DN
119 }
120
bbc630f5
DN
121 if (TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
122 {
123 error ("Type mismatch between an SSA_NAME and its symbol.");
124 return true;
125 }
126
53b4bf74
DN
127 if (SSA_NAME_IN_FREE_LIST (ssa_name))
128 {
129 error ("Found an SSA_NAME that had been released into the free pool");
130 return true;
131 }
132
133 if (is_virtual && is_gimple_reg (ssa_name))
134 {
135 error ("Found a virtual definition for a GIMPLE register");
136 return true;
137 }
138
139 if (!is_virtual && !is_gimple_reg (ssa_name))
140 {
141 error ("Found a real definition for a non-register");
142 return true;
143 }
144
145 return false;
146}
147
148
149/* Return true if the definition of SSA_NAME at block BB is malformed.
150
151 STMT is the statement where SSA_NAME is created.
152
153 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
154 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
155 it means that the block in that array slot contains the
156 definition of SSA_NAME.
157
158 IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
159 V_MUST_DEF. */
160
161static bool
162verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
163 tree stmt, bool is_virtual)
164{
165 if (verify_ssa_name (ssa_name, is_virtual))
166 goto err;
167
6de9cd9a
DN
168 if (definition_block[SSA_NAME_VERSION (ssa_name)])
169 {
170 error ("SSA_NAME created in two different blocks %i and %i",
171 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
53b4bf74 172 goto err;
6de9cd9a
DN
173 }
174
175 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
176
177 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
178 {
179 error ("SSA_NAME_DEF_STMT is wrong");
6de9cd9a
DN
180 fprintf (stderr, "Expected definition statement:\n");
181 debug_generic_stmt (SSA_NAME_DEF_STMT (ssa_name));
182 fprintf (stderr, "\nActual definition statement:\n");
183 debug_generic_stmt (stmt);
53b4bf74 184 goto err;
6de9cd9a
DN
185 }
186
53b4bf74
DN
187 return false;
188
189err:
190 fprintf (stderr, "while verifying SSA_NAME ");
191 print_generic_expr (stderr, ssa_name, 0);
192 fprintf (stderr, " in statement\n");
193 debug_generic_stmt (stmt);
194
195 return true;
6de9cd9a
DN
196}
197
198
199/* Return true if the use of SSA_NAME at statement STMT in block BB is
200 malformed.
201
202 DEF_BB is the block where SSA_NAME was found to be created.
203
204 IDOM contains immediate dominator information for the flowgraph.
205
206 CHECK_ABNORMAL is true if the caller wants to check whether this use
207 is flowing through an abnormal edge (only used when checking PHI
53b4bf74
DN
208 arguments).
209
210 IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
211 V_MUST_DEF. */
6de9cd9a
DN
212
213static bool
214verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
53b4bf74 215 tree stmt, bool check_abnormal, bool is_virtual)
6de9cd9a
DN
216{
217 bool err = false;
218
53b4bf74
DN
219 err = verify_ssa_name (ssa_name, is_virtual);
220
221 if (IS_EMPTY_STMT (SSA_NAME_DEF_STMT (ssa_name))
222 && var_ann (SSA_NAME_VAR (ssa_name))->default_def == ssa_name)
223 ; /* Default definitions have empty statements. Nothing to do. */
6de9cd9a
DN
224 else if (!def_bb)
225 {
226 error ("Missing definition");
227 err = true;
228 }
229 else if (bb != def_bb
230 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
231 {
232 error ("Definition in block %i does not dominate use in block %i",
233 def_bb->index, bb->index);
234 err = true;
235 }
236
237 if (check_abnormal
238 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
239 {
240 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
241 err = true;
242 }
243
244 if (err)
245 {
246 fprintf (stderr, "for SSA_NAME: ");
53b4bf74 247 debug_generic_expr (ssa_name);
6de9cd9a
DN
248 fprintf (stderr, "in statement:\n");
249 debug_generic_stmt (stmt);
250 }
251
252 return err;
253}
254
255
256/* Return true if any of the arguments for PHI node PHI at block BB is
257 malformed.
258
259 IDOM contains immediate dominator information for the flowgraph.
260
261 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME version
262 numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, it means that the
263 block in that array slot contains the definition of SSA_NAME. */
264
265static bool
266verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
267{
268 edge e;
269 bool err = false;
270 int i, phi_num_args = PHI_NUM_ARGS (phi);
271
272 /* Mark all the incoming edges. */
273 for (e = bb->pred; e; e = e->pred_next)
274 e->aux = (void *) 1;
275
276 for (i = 0; i < phi_num_args; i++)
277 {
278 tree op = PHI_ARG_DEF (phi, i);
279
280 e = PHI_ARG_EDGE (phi, i);
281
282 if (TREE_CODE (op) == SSA_NAME)
53b4bf74
DN
283 err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
284 phi, e->flags & EDGE_ABNORMAL,
285 !is_gimple_reg (PHI_RESULT (phi)));
6de9cd9a
DN
286
287 if (e->dest != bb)
288 {
289 error ("Wrong edge %d->%d for PHI argument\n",
290 e->src->index, e->dest->index, bb->index);
291 err = true;
292 }
293
294 if (e->aux == (void *) 0)
295 {
296 error ("PHI argument flowing through dead edge %d->%d\n",
297 e->src->index, e->dest->index);
298 err = true;
299 }
300
301 if (e->aux == (void *) 2)
302 {
303 error ("PHI argument duplicated for edge %d->%d\n", e->src->index,
304 e->dest->index);
305 err = true;
306 }
307
308 if (err)
309 {
310 fprintf (stderr, "PHI argument\n");
311 debug_generic_stmt (op);
53b4bf74 312 goto error;
6de9cd9a
DN
313 }
314
315 e->aux = (void *) 2;
316 }
317
318 for (e = bb->pred; e; e = e->pred_next)
319 {
320 if (e->aux != (void *) 2)
321 {
322 error ("No argument flowing through edge %d->%d\n", e->src->index,
323 e->dest->index);
324 err = true;
53b4bf74 325 goto error;
6de9cd9a
DN
326 }
327 e->aux = (void *) 0;
328 }
329
53b4bf74 330error:
6de9cd9a
DN
331 if (err)
332 {
333 fprintf (stderr, "for PHI node\n");
334 debug_generic_stmt (phi);
335 }
336
337
338 return err;
339}
340
341
53b4bf74
DN
342static void
343verify_flow_insensitive_alias_info (void)
344{
345 size_t i;
346 tree var;
347 bitmap visited = BITMAP_XMALLOC ();
348
349 for (i = 0; i < num_referenced_vars; i++)
350 {
852c7b12 351 size_t j;
53b4bf74 352 var_ann_t ann;
852c7b12 353 varray_type may_aliases;
53b4bf74
DN
354
355 var = referenced_var (i);
356 ann = var_ann (var);
852c7b12 357 may_aliases = ann->may_aliases;
53b4bf74 358
852c7b12 359 for (j = 0; may_aliases && j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
53b4bf74 360 {
852c7b12 361 tree alias = VARRAY_TREE (may_aliases, j);
53b4bf74 362
852c7b12 363 bitmap_set_bit (visited, var_ann (alias)->uid);
53b4bf74 364
852c7b12
DN
365 if (!may_be_aliased (alias))
366 {
367 error ("Non-addressable variable inside an alias set.");
368 debug_variable (alias);
369 goto err;
53b4bf74
DN
370 }
371 }
372 }
373
374 for (i = 0; i < num_referenced_vars; i++)
375 {
376 var_ann_t ann;
377
378 var = referenced_var (i);
379 ann = var_ann (var);
380
381 if (ann->mem_tag_kind == NOT_A_TAG
382 && ann->is_alias_tag
383 && !bitmap_bit_p (visited, ann->uid))
384 {
385 error ("Addressable variable that is an alias tag but is not in any alias set.");
386 goto err;
387 }
388 }
389
390 BITMAP_XFREE (visited);
391 return;
392
393err:
394 debug_variable (var);
395 internal_error ("verify_flow_insensitive_alias_info failed.");
396}
397
398
399static void
400verify_flow_sensitive_alias_info (void)
401{
402 size_t i;
403 tree ptr;
404
405 for (i = 1; i < num_ssa_names; i++)
406 {
407 var_ann_t ann;
408 struct ptr_info_def *pi;
409
410 ptr = ssa_name (i);
411 ann = var_ann (SSA_NAME_VAR (ptr));
412 pi = SSA_NAME_PTR_INFO (ptr);
413
414 /* We only care for pointers that are actually referenced in the
415 program. */
416 if (!TREE_VISITED (ptr) || !POINTER_TYPE_P (TREE_TYPE (ptr)))
417 continue;
418
419 /* RESULT_DECL is special. If it's a GIMPLE register, then it
420 is only written-to only once in the return statement.
421 Otherwise, aggregate RESULT_DECLs may be written-to more than
422 once in virtual operands. */
423 if (TREE_CODE (SSA_NAME_VAR (ptr)) == RESULT_DECL
424 && is_gimple_reg (ptr))
425 continue;
426
427 if (pi == NULL)
428 continue;
429
430 if (pi->is_dereferenced && !pi->name_mem_tag && !ann->type_mem_tag)
431 {
432 error ("Dereferenced pointers should have a name or a type tag");
433 goto err;
434 }
435
53b4bf74
DN
436 if (pi->name_mem_tag
437 && !pi->pt_malloc
438 && (pi->pt_vars == NULL
439 || bitmap_first_set_bit (pi->pt_vars) < 0))
440 {
441 error ("Pointers with a memory tag, should have points-to sets or point to malloc");
442 goto err;
443 }
444
445 if (pi->value_escapes_p
446 && pi->name_mem_tag
447 && !is_call_clobbered (pi->name_mem_tag))
448 {
449 error ("Pointer escapes but its name tag is not call-clobbered.");
450 goto err;
451 }
452
453 if (pi->name_mem_tag && pi->pt_vars)
454 {
455 size_t j;
456
457 for (j = i + 1; j < num_ssa_names; j++)
458 {
459 tree ptr2 = ssa_name (j);
460 struct ptr_info_def *pi2 = SSA_NAME_PTR_INFO (ptr2);
461
118a8d02 462 if (!TREE_VISITED (ptr2) || !POINTER_TYPE_P (TREE_TYPE (ptr2)))
53b4bf74
DN
463 continue;
464
465 if (pi2
466 && pi2->name_mem_tag
467 && pi2->pt_vars
468 && bitmap_first_set_bit (pi2->pt_vars) >= 0
469 && pi->name_mem_tag != pi2->name_mem_tag
470 && bitmap_equal_p (pi->pt_vars, pi2->pt_vars))
471 {
472 error ("Two pointers with different name tags and identical points-to sets");
473 debug_variable (ptr2);
474 goto err;
475 }
476 }
477 }
478 }
479
480 return;
481
482err:
483 debug_variable (ptr);
484 internal_error ("verify_flow_sensitive_alias_info failed.");
485}
486
487
488/* Verify the consistency of aliasing information. */
489
490static void
491verify_alias_info (void)
492{
c1b763fa
DN
493 verify_flow_sensitive_alias_info ();
494 verify_flow_insensitive_alias_info ();
53b4bf74
DN
495}
496
497
6de9cd9a
DN
498/* Verify common invariants in the SSA web.
499 TODO: verify the variable annotations. */
500
501void
502verify_ssa (void)
503{
53b4bf74 504 size_t i;
6de9cd9a 505 basic_block bb;
95a3742c 506 basic_block *definition_block = xcalloc (num_ssa_names, sizeof (basic_block));
4c124b4c
AM
507 ssa_op_iter iter;
508 tree op;
6de9cd9a
DN
509
510 timevar_push (TV_TREE_SSA_VERIFY);
511
53b4bf74
DN
512 /* Keep track of SSA names present in the IL. */
513 for (i = 1; i < num_ssa_names; i++)
514 TREE_VISITED (ssa_name (i)) = 0;
515
6de9cd9a
DN
516 calculate_dominance_info (CDI_DOMINATORS);
517
518 /* Verify and register all the SSA_NAME definitions found in the
519 function. */
520 FOR_EACH_BB (bb)
521 {
522 tree phi;
523 block_stmt_iterator bsi;
524
17192884 525 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
53b4bf74
DN
526 if (verify_def (bb, definition_block, PHI_RESULT (phi), phi,
527 !is_gimple_reg (PHI_RESULT (phi))))
528 goto err;
6de9cd9a
DN
529
530 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
531 {
532 tree stmt;
6de9cd9a
DN
533
534 stmt = bsi_stmt (bsi);
6de9cd9a
DN
535 get_stmt_operands (stmt);
536
4c124b4c
AM
537 if (stmt_ann (stmt)->makes_aliased_stores
538 && NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt)) == 0)
53b4bf74
DN
539 {
540 error ("Statement makes aliased stores, but has no V_MAY_DEFS");
541 debug_generic_stmt (stmt);
542 goto err;
543 }
a32b97a2 544
4c124b4c 545 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_DEFS)
6de9cd9a 546 {
53b4bf74
DN
547 if (verify_def (bb, definition_block, op, stmt, true))
548 goto err;
6de9cd9a 549 }
a32b97a2 550
4c124b4c 551 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
a32b97a2 552 {
53b4bf74
DN
553 if (verify_def (bb, definition_block, op, stmt, false))
554 goto err;
6de9cd9a
DN
555 }
556 }
557 }
558
559
560 /* Now verify all the uses and make sure they agree with the definitions
561 found in the previous pass. */
562 FOR_EACH_BB (bb)
563 {
564 edge e;
565 tree phi;
566 block_stmt_iterator bsi;
567
568 /* Make sure that all edges have a clear 'aux' field. */
569 for (e = bb->pred; e; e = e->pred_next)
570 {
571 if (e->aux)
572 {
573 error ("AUX pointer initialized for edge %d->%d\n", e->src->index,
574 e->dest->index);
53b4bf74 575 goto err;
6de9cd9a
DN
576 }
577 }
578
579 /* Verify the arguments for every PHI node in the block. */
17192884 580 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
53b4bf74
DN
581 if (verify_phi_args (phi, bb, definition_block))
582 goto err;
6de9cd9a 583
53b4bf74 584 /* Now verify all the uses and vuses in every statement of the block. */
6de9cd9a
DN
585 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
586 {
587 tree stmt = bsi_stmt (bsi);
6de9cd9a 588
4c124b4c 589 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES)
6de9cd9a 590 {
53b4bf74
DN
591 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
592 op, stmt, false, true))
593 goto err;
6de9cd9a
DN
594 }
595
4c124b4c 596 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
6de9cd9a 597 {
53b4bf74
DN
598 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
599 op, stmt, false, false))
600 goto err;
6de9cd9a
DN
601 }
602 }
603 }
604
53b4bf74
DN
605 /* Finally, verify alias information. */
606 verify_alias_info ();
6de9cd9a 607
53b4bf74 608 free (definition_block);
6de9cd9a 609 timevar_pop (TV_TREE_SSA_VERIFY);
53b4bf74 610 return;
6de9cd9a 611
53b4bf74
DN
612err:
613 internal_error ("verify_ssa failed.");
6de9cd9a
DN
614}
615
616
6de9cd9a
DN
617/* Initialize global DFA and SSA structures. */
618
619void
620init_tree_ssa (void)
621{
622 VARRAY_TREE_INIT (referenced_vars, 20, "referenced_vars");
623 call_clobbered_vars = BITMAP_XMALLOC ();
a6d02559 624 addressable_vars = BITMAP_XMALLOC ();
6de9cd9a
DN
625 init_ssa_operands ();
626 init_ssanames ();
627 init_phinodes ();
628 global_var = NULL_TREE;
6de9cd9a
DN
629}
630
631
632/* Deallocate memory associated with SSA data structures for FNDECL. */
633
634void
635delete_tree_ssa (void)
636{
637 size_t i;
638 basic_block bb;
639 block_stmt_iterator bsi;
640
641 /* Remove annotations from every tree in the function. */
642 FOR_EACH_BB (bb)
643 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
80d8221e
JH
644 {
645 tree stmt = bsi_stmt (bsi);
646 release_defs (stmt);
647 ggc_free (stmt->common.ann);
648 stmt->common.ann = NULL;
649 }
6de9cd9a
DN
650
651 /* Remove annotations from every referenced variable. */
652 if (referenced_vars)
653 {
654 for (i = 0; i < num_referenced_vars; i++)
80d8221e
JH
655 {
656 tree var = referenced_var (i);
657 ggc_free (var->common.ann);
658 var->common.ann = NULL;
659 }
6de9cd9a
DN
660 referenced_vars = NULL;
661 }
662
663 fini_ssanames ();
664 fini_phinodes ();
665 fini_ssa_operands ();
666
667 global_var = NULL_TREE;
6b9bee8e 668 BITMAP_XFREE (call_clobbered_vars);
6de9cd9a 669 call_clobbered_vars = NULL;
a6d02559
DN
670 BITMAP_XFREE (addressable_vars);
671 addressable_vars = NULL;
6de9cd9a
DN
672}
673
674
675/* Return true if EXPR is a useless type conversion, otherwise return
676 false. */
677
678bool
679tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
680{
681 /* If the inner and outer types are effectively the same, then
682 strip the type conversion and enter the equivalence into
683 the table. */
684 if (inner_type == outer_type
685 || (lang_hooks.types_compatible_p (inner_type, outer_type)))
686 return true;
687
688 /* If both types are pointers and the outer type is a (void *), then
689 the conversion is not necessary. The opposite is not true since
690 that conversion would result in a loss of information if the
691 equivalence was used. Consider an indirect function call where
692 we need to know the exact type of the function to correctly
693 implement the ABI. */
694 else if (POINTER_TYPE_P (inner_type)
695 && POINTER_TYPE_P (outer_type)
696 && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
697 return true;
698
699 /* Pointers and references are equivalent once we get to GENERIC,
700 so strip conversions that just switch between them. */
701 else if (POINTER_TYPE_P (inner_type)
702 && POINTER_TYPE_P (outer_type)
3facc4b6
AP
703 && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
704 TREE_TYPE (outer_type)))
6de9cd9a
DN
705 return true;
706
707 /* If both the inner and outer types are integral types, then the
708 conversion is not necessary if they have the same mode and
bc15d0ef
JM
709 signedness and precision, and both or neither are boolean. Some
710 code assumes an invariant that boolean types stay boolean and do
711 not become 1-bit bit-field types. Note that types with precision
712 not using all bits of the mode (such as bit-field types in C)
713 mean that testing of precision is necessary. */
6de9cd9a
DN
714 else if (INTEGRAL_TYPE_P (inner_type)
715 && INTEGRAL_TYPE_P (outer_type)
716 && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
717 && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
718 && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
bc15d0ef
JM
719 {
720 bool first_boolean = (TREE_CODE (inner_type) == BOOLEAN_TYPE);
721 bool second_boolean = (TREE_CODE (outer_type) == BOOLEAN_TYPE);
722 if (first_boolean == second_boolean)
723 return true;
724 }
6de9cd9a
DN
725
726 /* Recurse for complex types. */
727 else if (TREE_CODE (inner_type) == COMPLEX_TYPE
728 && TREE_CODE (outer_type) == COMPLEX_TYPE
729 && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
730 TREE_TYPE (inner_type)))
731 return true;
732
733 return false;
734}
735
736/* Return true if EXPR is a useless type conversion, otherwise return
737 false. */
738
739bool
740tree_ssa_useless_type_conversion (tree expr)
741{
742 /* If we have an assignment that merely uses a NOP_EXPR to change
743 the top of the RHS to the type of the LHS and the type conversion
744 is "safe", then strip away the type conversion so that we can
745 enter LHS = RHS into the const_and_copies table. */
580d124f
RK
746 if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR
747 || TREE_CODE (expr) == VIEW_CONVERT_EXPR
748 || TREE_CODE (expr) == NON_LVALUE_EXPR)
6de9cd9a
DN
749 return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
750 TREE_TYPE (TREE_OPERAND (expr,
751 0)));
752
753
754 return false;
755}
756
757
758/* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
53b4bf74
DN
759 described in walk_use_def_chains.
760
761 VISITED is a bitmap used to mark visited SSA_NAMEs to avoid
762 infinite loops.
763
764 IS_DFS is true if the caller wants to perform a depth-first search
765 when visiting PHI nodes. A DFS will visit each PHI argument and
766 call FN after each one. Otherwise, all the arguments are
767 visited first and then FN is called with each of the visited
768 arguments in a separate pass. */
6de9cd9a
DN
769
770static bool
771walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
53b4bf74 772 bitmap visited, bool is_dfs)
6de9cd9a
DN
773{
774 tree def_stmt;
775
776 if (bitmap_bit_p (visited, SSA_NAME_VERSION (var)))
777 return false;
778
779 bitmap_set_bit (visited, SSA_NAME_VERSION (var));
780
781 def_stmt = SSA_NAME_DEF_STMT (var);
782
783 if (TREE_CODE (def_stmt) != PHI_NODE)
784 {
785 /* If we reached the end of the use-def chain, call FN. */
53b4bf74 786 return fn (var, def_stmt, data);
6de9cd9a
DN
787 }
788 else
789 {
790 int i;
791
53b4bf74
DN
792 /* When doing a breadth-first search, call FN before following the
793 use-def links for each argument. */
794 if (!is_dfs)
795 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
796 if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
797 return true;
798
799 /* Follow use-def links out of each PHI argument. */
6de9cd9a
DN
800 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
801 {
802 tree arg = PHI_ARG_DEF (def_stmt, i);
803 if (TREE_CODE (arg) == SSA_NAME
53b4bf74 804 && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs))
6de9cd9a
DN
805 return true;
806 }
53b4bf74
DN
807
808 /* When doing a depth-first search, call FN after following the
809 use-def links for each argument. */
810 if (is_dfs)
811 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
812 if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
813 return true;
6de9cd9a 814 }
53b4bf74 815
6de9cd9a
DN
816 return false;
817}
818
819
820
53b4bf74
DN
821/* Walk use-def chains starting at the SSA variable VAR. Call
822 function FN at each reaching definition found. FN takes three
823 arguments: VAR, its defining statement (DEF_STMT) and a generic
824 pointer to whatever state information that FN may want to maintain
825 (DATA). FN is able to stop the walk by returning true, otherwise
826 in order to continue the walk, FN should return false.
6de9cd9a
DN
827
828 Note, that if DEF_STMT is a PHI node, the semantics are slightly
53b4bf74
DN
829 different. The first argument to FN is no longer the original
830 variable VAR, but the PHI argument currently being examined. If FN
831 wants to get at VAR, it should call PHI_RESULT (PHI).
832
833 If IS_DFS is true, this function will:
6de9cd9a 834
53b4bf74
DN
835 1- walk the use-def chains for all the PHI arguments, and,
836 2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
837
838 If IS_DFS is false, the two steps above are done in reverse order
839 (i.e., a breadth-first search). */
6de9cd9a 840
6de9cd9a
DN
841
842void
53b4bf74
DN
843walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
844 bool is_dfs)
6de9cd9a
DN
845{
846 tree def_stmt;
847
848#if defined ENABLE_CHECKING
849 if (TREE_CODE (var) != SSA_NAME)
850 abort ();
851#endif
852
853 def_stmt = SSA_NAME_DEF_STMT (var);
854
855 /* We only need to recurse if the reaching definition comes from a PHI
856 node. */
857 if (TREE_CODE (def_stmt) != PHI_NODE)
858 (*fn) (var, def_stmt, data);
859 else
860 {
861 bitmap visited = BITMAP_XMALLOC ();
53b4bf74 862 walk_use_def_chains_1 (var, fn, data, visited, is_dfs);
6de9cd9a
DN
863 BITMAP_XFREE (visited);
864 }
865}
866
53b4bf74 867
d7621d3c
ZD
868/* Replaces VAR with REPL in memory reference expression *X in
869 statement STMT. */
870
871static void
872propagate_into_addr (tree stmt, tree var, tree *x, tree repl)
873{
874 tree new_var, ass_stmt, addr_var;
875 basic_block bb;
876 block_stmt_iterator bsi;
877
878 /* There is nothing special to handle in the other cases. */
879 if (TREE_CODE (repl) != ADDR_EXPR)
880 return;
881 addr_var = TREE_OPERAND (repl, 0);
882
0705d602
RK
883 while (handled_component_p (*x)
884 || TREE_CODE (*x) == REALPART_EXPR
885 || TREE_CODE (*x) == IMAGPART_EXPR)
d7621d3c
ZD
886 x = &TREE_OPERAND (*x, 0);
887
888 if (TREE_CODE (*x) != INDIRECT_REF
889 || TREE_OPERAND (*x, 0) != var)
890 return;
891
d7621d3c
ZD
892 if (TREE_TYPE (*x) == TREE_TYPE (addr_var))
893 {
894 *x = addr_var;
895 mark_new_vars_to_rename (stmt, vars_to_rename);
896 return;
897 }
898
68b9f53b 899
d7621d3c
ZD
900 /* Frontends sometimes produce expressions like *&a instead of a[0].
901 Create a temporary variable to handle this case. */
902 ass_stmt = build2 (MODIFY_EXPR, void_type_node, NULL_TREE, repl);
903 new_var = duplicate_ssa_name (var, ass_stmt);
904 TREE_OPERAND (*x, 0) = new_var;
905 TREE_OPERAND (ass_stmt, 0) = new_var;
906
907 bb = bb_for_stmt (stmt);
908 tree_block_label (bb);
909 bsi = bsi_after_labels (bb);
910 bsi_insert_after (&bsi, ass_stmt, BSI_NEW_STMT);
911
912 mark_new_vars_to_rename (stmt, vars_to_rename);
913}
6de9cd9a
DN
914
915/* Replaces immediate uses of VAR by REPL. */
916
917static void
918replace_immediate_uses (tree var, tree repl)
919{
6de9cd9a
DN
920 int i, j, n;
921 dataflow_t df;
922 tree stmt;
923 stmt_ann_t ann;
d7621d3c 924 bool mark_new_vars;
4c124b4c
AM
925 ssa_op_iter iter;
926 use_operand_p use_p;
6de9cd9a
DN
927
928 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
929 n = num_immediate_uses (df);
930
931 for (i = 0; i < n; i++)
932 {
933 stmt = immediate_use (df, i);
934 ann = stmt_ann (stmt);
935
936 if (TREE_CODE (stmt) == PHI_NODE)
937 {
938 for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
939 if (PHI_ARG_DEF (stmt, j) == var)
940 {
d00ad49b 941 SET_PHI_ARG_DEF (stmt, j, repl);
6de9cd9a
DN
942 if (TREE_CODE (repl) == SSA_NAME
943 && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
944 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
945 }
946
947 continue;
948 }
949
950 get_stmt_operands (stmt);
d7621d3c 951 mark_new_vars = false;
6de9cd9a
DN
952 if (is_gimple_reg (SSA_NAME_VAR (var)))
953 {
d7621d3c
ZD
954 if (TREE_CODE (stmt) == MODIFY_EXPR)
955 {
956 propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 0), repl);
957 propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 1), repl);
958 }
959
4c124b4c
AM
960 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
961 if (USE_FROM_PTR (use_p) == var)
d7621d3c 962 {
4c124b4c 963 propagate_value (use_p, repl);
d7621d3c
ZD
964 mark_new_vars = POINTER_TYPE_P (TREE_TYPE (repl));
965 }
6de9cd9a
DN
966 }
967 else
968 {
4c124b4c
AM
969 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_VIRTUAL_USES)
970 if (USE_FROM_PTR (use_p) == var)
971 propagate_value (use_p, repl);
6de9cd9a
DN
972 }
973
6de9cd9a
DN
974 /* If REPL is a pointer, it may have different memory tags associated
975 with it. For instance, VAR may have had a name tag while REPL
976 only had a type tag. In these cases, the virtual operands (if
977 any) in the statement will refer to different symbols which need
978 to be renamed. */
d7621d3c 979 if (mark_new_vars)
6de9cd9a 980 mark_new_vars_to_rename (stmt, vars_to_rename);
d7621d3c
ZD
981 else
982 modify_stmt (stmt);
6de9cd9a
DN
983 }
984}
985
048d9936
ZD
986/* Gets the value VAR is equivalent to according to EQ_TO. */
987
988static tree
989get_eq_name (tree *eq_to, tree var)
990{
991 unsigned ver;
992 tree val = var;
993
994 while (TREE_CODE (val) == SSA_NAME)
995 {
996 ver = SSA_NAME_VERSION (val);
997 if (!eq_to[ver])
998 break;
999
1000 val = eq_to[ver];
1001 }
1002
1003 while (TREE_CODE (var) == SSA_NAME)
1004 {
1005 ver = SSA_NAME_VERSION (var);
1006 if (!eq_to[ver])
1007 break;
1008
1009 var = eq_to[ver];
1010 eq_to[ver] = val;
1011 }
1012
1013 return val;
1014}
1015
1016/* Checks whether phi node PHI is redundant and if it is, records the ssa name
1017 its result is redundant to to EQ_TO array. */
6de9cd9a
DN
1018
1019static void
048d9936 1020check_phi_redundancy (tree phi, tree *eq_to)
6de9cd9a 1021{
048d9936
ZD
1022 tree val = NULL_TREE, def, res = PHI_RESULT (phi), stmt;
1023 unsigned i, ver = SSA_NAME_VERSION (res), n;
6de9cd9a
DN
1024 dataflow_t df;
1025
048d9936
ZD
1026 /* It is unlikely that such large phi node would be redundant. */
1027 if (PHI_NUM_ARGS (phi) > 16)
6de9cd9a
DN
1028 return;
1029
048d9936 1030 for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
6de9cd9a 1031 {
048d9936
ZD
1032 def = PHI_ARG_DEF (phi, i);
1033
1034 if (TREE_CODE (def) == SSA_NAME)
1035 {
1036 def = get_eq_name (eq_to, def);
1037 if (def == res)
1038 continue;
1039 }
1040
1041 if (val
1042 && !operand_equal_p (val, def, 0))
6de9cd9a
DN
1043 return;
1044
048d9936 1045 val = def;
6de9cd9a 1046 }
6de9cd9a 1047
048d9936
ZD
1048 /* At least one of the arguments should not be equal to the result, or
1049 something strange is happening. */
1050 if (!val)
1051 abort ();
1052
1053 if (get_eq_name (eq_to, res) == val)
1054 return;
1055
1056 if (!may_propagate_copy (res, val))
1057 return;
1058
1059 eq_to[ver] = val;
1060
1061 df = get_immediate_uses (SSA_NAME_DEF_STMT (res));
6de9cd9a
DN
1062 n = num_immediate_uses (df);
1063
1064 for (i = 0; i < n; i++)
1065 {
1066 stmt = immediate_use (df, i);
1067
048d9936
ZD
1068 if (TREE_CODE (stmt) == PHI_NODE)
1069 check_phi_redundancy (stmt, eq_to);
6de9cd9a
DN
1070 }
1071}
1072
1073/* Removes redundant phi nodes.
1074
1075 A redundant PHI node is a PHI node where all of its PHI arguments
1076 are the same value, excluding any PHI arguments which are the same
1077 as the PHI result.
1078
1079 A redundant PHI node is effectively a copy, so we forward copy propagate
1080 which removes all uses of the destination of the PHI node then
1081 finally we delete the redundant PHI node.
1082
1083 Note that if we can not copy propagate the PHI node, then the PHI
1084 will not be removed. Thus we do not have to worry about dependencies
1085 between PHIs and the problems serializing PHIs into copies creates.
1086
1087 The most important effect of this pass is to remove degenerate PHI
1088 nodes created by removing unreachable code. */
1089
c66b6c66 1090void
6de9cd9a
DN
1091kill_redundant_phi_nodes (void)
1092{
95a3742c 1093 tree *eq_to;
048d9936 1094 unsigned i, old_num_ssa_names;
6de9cd9a 1095 basic_block bb;
048d9936
ZD
1096 tree phi, var, repl, stmt;
1097
1098 /* The EQ_TO[VER] holds the value by that the ssa name VER should be
1099 replaced. If EQ_TO[VER] is ssa name and it is decided to replace it by
1100 other value, it may be necessary to follow the chain till the final value.
1101 We perform path shortening (replacing the entries of the EQ_TO array with
1102 heads of these chains) whenever we access the field to prevent quadratic
1103 complexity (probably would not occur in practice anyway, but let us play
1104 it safe). */
95a3742c 1105 eq_to = xcalloc (num_ssa_names, sizeof (tree));
6de9cd9a
DN
1106
1107 /* We have had cases where computing immediate uses takes a
1108 significant amount of compile time. If we run into such
1109 problems here, we may want to only compute immediate uses for
1110 a subset of all the SSA_NAMEs instead of computing it for
1111 all of the SSA_NAMEs. */
1112 compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
048d9936 1113 old_num_ssa_names = num_ssa_names;
6de9cd9a
DN
1114
1115 FOR_EACH_BB (bb)
1116 {
048d9936 1117 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
6de9cd9a
DN
1118 {
1119 var = PHI_RESULT (phi);
048d9936 1120 check_phi_redundancy (phi, eq_to);
6de9cd9a
DN
1121 }
1122 }
1123
1124 /* Now propagate the values. */
048d9936
ZD
1125 for (i = 0; i < old_num_ssa_names; i++)
1126 {
1127 if (!ssa_name (i))
1128 continue;
1129
1130 repl = get_eq_name (eq_to, ssa_name (i));
1131 if (repl != ssa_name (i))
1132 replace_immediate_uses (ssa_name (i), repl);
1133 }
6de9cd9a
DN
1134
1135 /* And remove the dead phis. */
048d9936
ZD
1136 for (i = 0; i < old_num_ssa_names; i++)
1137 {
1138 if (!ssa_name (i))
1139 continue;
1140
1141 repl = get_eq_name (eq_to, ssa_name (i));
1142 if (repl != ssa_name (i))
1143 {
1144 stmt = SSA_NAME_DEF_STMT (ssa_name (i));
1145 remove_phi_node (stmt, NULL_TREE, bb_for_stmt (stmt));
1146 }
1147 }
6de9cd9a
DN
1148
1149 free_df ();
1150 free (eq_to);
6de9cd9a
DN
1151}
1152
1153struct tree_opt_pass pass_redundant_phi =
1154{
1155 "redphi", /* name */
1156 NULL, /* gate */
1157 kill_redundant_phi_nodes, /* execute */
1158 NULL, /* sub */
1159 NULL, /* next */
1160 0, /* static_pass_number */
1161 0, /* tv_id */
c1b763fa 1162 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
6de9cd9a
DN
1163 0, /* properties_provided */
1164 0, /* properties_destroyed */
1165 0, /* todo_flags_start */
1166 TODO_dump_func | TODO_rename_vars
1167 | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
1168};
1169\f
1170/* Emit warnings for uninitialized variables. This is done in two passes.
1171
1172 The first pass notices real uses of SSA names with default definitions.
1173 Such uses are unconditionally uninitialized, and we can be certain that
1174 such a use is a mistake. This pass is run before most optimizations,
1175 so that we catch as many as we can.
1176
1177 The second pass follows PHI nodes to find uses that are potentially
1178 uninitialized. In this case we can't necessarily prove that the use
1179 is really uninitialized. This pass is run after most optimizations,
1180 so that we thread as many jumps and possible, and delete as much dead
1181 code as possible, in order to reduce false positives. We also look
1182 again for plain uninitialized variables, since optimization may have
1183 changed conditionally uninitialized to unconditionally uninitialized. */
1184
1185/* Emit a warning for T, an SSA_NAME, being uninitialized. The exact
1186 warning text is in MSGID and LOCUS may contain a location or be null. */
1187
1188static void
1189warn_uninit (tree t, const char *msgid, location_t *locus)
1190{
1191 tree var = SSA_NAME_VAR (t);
1192 tree def = SSA_NAME_DEF_STMT (t);
1193
1194 /* Default uses (indicated by an empty definition statement),
1195 are uninitialized. */
1196 if (!IS_EMPTY_STMT (def))
1197 return;
1198
1199 /* Except for PARMs of course, which are always initialized. */
1200 if (TREE_CODE (var) == PARM_DECL)
1201 return;
1202
1203 /* Hard register variables get their initial value from the ether. */
1204 if (DECL_HARD_REGISTER (var))
1205 return;
1206
1207 /* TREE_NO_WARNING either means we already warned, or the front end
1208 wishes to suppress the warning. */
1209 if (TREE_NO_WARNING (var))
1210 return;
1211
1212 if (!locus)
1213 locus = &DECL_SOURCE_LOCATION (var);
1214 warning (msgid, locus, var);
1215 TREE_NO_WARNING (var) = 1;
1216}
1217
1218/* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1219 and warn about them. */
1220
1221static tree
1222warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1223{
1224 location_t *locus = data;
1225 tree t = *tp;
1226
1227 /* We only do data flow with SSA_NAMEs, so that's all we can warn about. */
1228 if (TREE_CODE (t) == SSA_NAME)
1229 {
1230 warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
1231 *walk_subtrees = 0;
1232 }
1233 else if (DECL_P (t) || TYPE_P (t))
1234 *walk_subtrees = 0;
1235
1236 return NULL_TREE;
1237}
1238
1239/* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1240 and warn about them. */
1241
1242static void
1243warn_uninitialized_phi (tree phi)
1244{
1245 int i, n = PHI_NUM_ARGS (phi);
1246
1247 /* Don't look at memory tags. */
1248 if (!is_gimple_reg (PHI_RESULT (phi)))
1249 return;
1250
1251 for (i = 0; i < n; ++i)
1252 {
1253 tree op = PHI_ARG_DEF (phi, i);
1254 if (TREE_CODE (op) == SSA_NAME)
1255 warn_uninit (op, "%H'%D' may be used uninitialized in this function",
1256 NULL);
1257 }
1258}
1259
1260static void
1261execute_early_warn_uninitialized (void)
1262{
1263 block_stmt_iterator bsi;
1264 basic_block bb;
1265
1266 FOR_EACH_BB (bb)
1267 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1268 walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1269 EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1270}
1271
1272static void
1273execute_late_warn_uninitialized (void)
1274{
1275 basic_block bb;
1276 tree phi;
1277
1278 /* Re-do the plain uninitialized variable check, as optimization may have
1279 straightened control flow. Do this first so that we don't accidentally
1280 get a "may be" warning when we'd have seen an "is" warning later. */
1281 execute_early_warn_uninitialized ();
1282
1283 FOR_EACH_BB (bb)
17192884 1284 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
6de9cd9a
DN
1285 warn_uninitialized_phi (phi);
1286}
1287
1288static bool
1289gate_warn_uninitialized (void)
1290{
1291 return warn_uninitialized != 0;
1292}
1293
1294struct tree_opt_pass pass_early_warn_uninitialized =
1295{
1296 NULL, /* name */
1297 gate_warn_uninitialized, /* gate */
1298 execute_early_warn_uninitialized, /* execute */
1299 NULL, /* sub */
1300 NULL, /* next */
1301 0, /* static_pass_number */
1302 0, /* tv_id */
1303 PROP_ssa, /* properties_required */
1304 0, /* properties_provided */
1305 0, /* properties_destroyed */
1306 0, /* todo_flags_start */
1307 0 /* todo_flags_finish */
1308};
1309
1310struct tree_opt_pass pass_late_warn_uninitialized =
1311{
1312 NULL, /* name */
1313 gate_warn_uninitialized, /* gate */
1314 execute_late_warn_uninitialized, /* execute */
1315 NULL, /* sub */
1316 NULL, /* next */
1317 0, /* static_pass_number */
1318 0, /* tv_id */
1319 PROP_ssa, /* properties_required */
1320 0, /* properties_provided */
1321 0, /* properties_destroyed */
1322 0, /* todo_flags_start */
1323 0 /* todo_flags_finish */
1324};
This page took 0.381354 seconds and 5 git commands to generate.