PR target/16201
[official-gcc.git] / gcc / tree-ssa.c
blobd7fa593dc2900b407d2cf25341e33f9c07693985
1 /* Miscellaneous SSA utility functions.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
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 "pointer-set.h"
40 #include "tree-flow.h"
41 #include "tree-gimple.h"
42 #include "tree-inline.h"
43 #include "varray.h"
44 #include "timevar.h"
45 #include "hashtab.h"
46 #include "tree-dump.h"
47 #include "tree-pass.h"
49 /* Remove the corresponding arguments from the PHI nodes in E's
50 destination block and redirect it to DEST. Return redirected edge.
51 The list of removed arguments is stored in PENDING_STMT (e). */
53 edge
54 ssa_redirect_edge (edge e, basic_block dest)
56 tree phi, next;
57 tree list = NULL, *last = &list;
58 tree src, dst, node;
60 /* Remove the appropriate PHI arguments in E's destination block. */
61 for (phi = phi_nodes (e->dest); phi; phi = next)
63 next = PHI_CHAIN (phi);
65 if (PHI_ARG_DEF (phi, e->dest_idx) == NULL_TREE)
66 continue;
68 src = PHI_ARG_DEF (phi, e->dest_idx);
69 dst = PHI_RESULT (phi);
70 node = build_tree_list (dst, src);
71 *last = node;
72 last = &TREE_CHAIN (node);
75 e = redirect_edge_succ_nodup (e, dest);
76 PENDING_STMT (e) = list;
78 return e;
81 /* Add PHI arguments queued in PENDINT_STMT list on edge E to edge
82 E->dest. */
84 void
85 flush_pending_stmts (edge e)
87 tree phi, arg;
89 if (!PENDING_STMT (e))
90 return;
92 for (phi = phi_nodes (e->dest), arg = PENDING_STMT (e);
93 phi;
94 phi = PHI_CHAIN (phi), arg = TREE_CHAIN (arg))
96 tree def = TREE_VALUE (arg);
97 add_phi_arg (phi, def, e);
100 PENDING_STMT (e) = NULL;
103 /* Return true if SSA_NAME is malformed and mark it visited.
105 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
106 operand. */
108 static bool
109 verify_ssa_name (tree ssa_name, bool is_virtual)
111 TREE_VISITED (ssa_name) = 1;
113 if (TREE_CODE (ssa_name) != SSA_NAME)
115 error ("Expected an SSA_NAME object");
116 return true;
119 if (TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
121 error ("Type mismatch between an SSA_NAME and its symbol.");
122 return true;
125 if (SSA_NAME_IN_FREE_LIST (ssa_name))
127 error ("Found an SSA_NAME that had been released into the free pool");
128 return true;
131 if (is_virtual && is_gimple_reg (ssa_name))
133 error ("Found a virtual definition for a GIMPLE register");
134 return true;
137 if (!is_virtual && !is_gimple_reg (ssa_name))
139 error ("Found a real definition for a non-register");
140 return true;
143 return false;
147 /* Return true if the definition of SSA_NAME at block BB is malformed.
149 STMT is the statement where SSA_NAME is created.
151 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
152 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
153 it means that the block in that array slot contains the
154 definition of SSA_NAME.
156 IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
157 V_MUST_DEF. */
159 static bool
160 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
161 tree stmt, bool is_virtual)
163 if (verify_ssa_name (ssa_name, is_virtual))
164 goto err;
166 if (definition_block[SSA_NAME_VERSION (ssa_name)])
168 error ("SSA_NAME created in two different blocks %i and %i",
169 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
170 goto err;
173 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
175 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
177 error ("SSA_NAME_DEF_STMT is wrong");
178 fprintf (stderr, "Expected definition statement:\n");
179 print_generic_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), TDF_VOPS);
180 fprintf (stderr, "\nActual definition statement:\n");
181 print_generic_stmt (stderr, stmt, TDF_VOPS);
182 goto err;
185 return false;
187 err:
188 fprintf (stderr, "while verifying SSA_NAME ");
189 print_generic_expr (stderr, ssa_name, 0);
190 fprintf (stderr, " in statement\n");
191 print_generic_stmt (stderr, stmt, TDF_VOPS);
193 return true;
197 /* Return true if the use of SSA_NAME at statement STMT in block BB is
198 malformed.
200 DEF_BB is the block where SSA_NAME was found to be created.
202 IDOM contains immediate dominator information for the flowgraph.
204 CHECK_ABNORMAL is true if the caller wants to check whether this use
205 is flowing through an abnormal edge (only used when checking PHI
206 arguments).
208 IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
209 V_MUST_DEF.
211 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
212 that are defined before STMT in basic block BB. */
214 static bool
215 verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
216 tree stmt, bool check_abnormal, bool is_virtual,
217 bitmap names_defined_in_bb)
219 bool err = false;
221 err = verify_ssa_name (ssa_name, is_virtual);
223 if (IS_EMPTY_STMT (SSA_NAME_DEF_STMT (ssa_name))
224 && var_ann (SSA_NAME_VAR (ssa_name))->default_def == ssa_name)
225 ; /* Default definitions have empty statements. Nothing to do. */
226 else if (!def_bb)
228 error ("Missing definition");
229 err = true;
231 else if (bb != def_bb
232 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
234 error ("Definition in block %i does not dominate use in block %i",
235 def_bb->index, bb->index);
236 err = true;
238 else if (bb == def_bb
239 && names_defined_in_bb != NULL
240 && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
242 error ("Definition in block %i follows the use", def_bb->index);
243 err = true;
246 if (check_abnormal
247 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
249 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
250 err = true;
253 if (err)
255 fprintf (stderr, "for SSA_NAME: ");
256 print_generic_expr (stderr, ssa_name, TDF_VOPS);
257 fprintf (stderr, "in statement:\n");
258 print_generic_stmt (stderr, stmt, TDF_VOPS);
261 return err;
265 /* Return true if any of the arguments for PHI node PHI at block BB is
266 malformed.
268 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME version
269 numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, it means that the
270 block in that array slot contains the definition of SSA_NAME. */
272 static bool
273 verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
275 edge e;
276 bool err = false;
277 unsigned i, phi_num_args = PHI_NUM_ARGS (phi);
279 if (EDGE_COUNT (bb->preds) != phi_num_args)
281 error ("Incoming edge count does not match number of PHI arguments\n");
282 err = true;
283 goto error;
286 for (i = 0; i < phi_num_args; i++)
288 tree op = PHI_ARG_DEF (phi, i);
290 e = EDGE_PRED (bb, i);
292 if (op == NULL_TREE)
294 error ("PHI argument is missing for edge %d->%d\n",
295 e->src->index,
296 e->dest->index);
297 err = true;
298 goto error;
301 if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
303 error ("PHI argument is not SSA_NAME, or invariant");
304 err = true;
307 if (TREE_CODE (op) == SSA_NAME)
308 err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
309 phi, e->flags & EDGE_ABNORMAL,
310 !is_gimple_reg (PHI_RESULT (phi)),
311 NULL);
313 if (e->dest != bb)
315 error ("Wrong edge %d->%d for PHI argument\n",
316 e->src->index, e->dest->index, bb->index);
317 err = true;
320 if (err)
322 fprintf (stderr, "PHI argument\n");
323 print_generic_stmt (stderr, op, TDF_VOPS);
324 goto error;
328 error:
329 if (err)
331 fprintf (stderr, "for PHI node\n");
332 print_generic_stmt (stderr, phi, TDF_VOPS);
336 return err;
340 static void
341 verify_flow_insensitive_alias_info (void)
343 size_t i;
344 tree var;
345 bitmap visited = BITMAP_XMALLOC ();
347 for (i = 0; i < num_referenced_vars; i++)
349 size_t j;
350 var_ann_t ann;
351 varray_type may_aliases;
353 var = referenced_var (i);
354 ann = var_ann (var);
355 may_aliases = ann->may_aliases;
357 for (j = 0; may_aliases && j < VARRAY_ACTIVE_SIZE (may_aliases); j++)
359 tree alias = VARRAY_TREE (may_aliases, j);
361 bitmap_set_bit (visited, var_ann (alias)->uid);
363 if (!may_be_aliased (alias))
365 error ("Non-addressable variable inside an alias set.");
366 debug_variable (alias);
367 goto err;
372 for (i = 0; i < num_referenced_vars; i++)
374 var_ann_t ann;
376 var = referenced_var (i);
377 ann = var_ann (var);
379 if (ann->mem_tag_kind == NOT_A_TAG
380 && ann->is_alias_tag
381 && !bitmap_bit_p (visited, ann->uid))
383 error ("Addressable variable that is an alias tag but is not in any alias set.");
384 goto err;
388 BITMAP_XFREE (visited);
389 return;
391 err:
392 debug_variable (var);
393 internal_error ("verify_flow_insensitive_alias_info failed.");
397 static void
398 verify_flow_sensitive_alias_info (void)
400 size_t i;
401 tree ptr;
403 for (i = 1; i < num_ssa_names; i++)
405 tree var;
406 var_ann_t ann;
407 struct ptr_info_def *pi;
410 ptr = ssa_name (i);
411 if (!ptr)
412 continue;
414 /* We only care for pointers that are actually referenced in the
415 program. */
416 if (!POINTER_TYPE_P (TREE_TYPE (ptr)) || !TREE_VISITED (ptr))
417 continue;
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 var = SSA_NAME_VAR (ptr);
424 if (TREE_CODE (var) == RESULT_DECL
425 && is_gimple_reg (ptr))
426 continue;
428 pi = SSA_NAME_PTR_INFO (ptr);
429 if (pi == NULL)
430 continue;
432 ann = var_ann (var);
433 if (pi->is_dereferenced && !pi->name_mem_tag && !ann->type_mem_tag)
435 error ("Dereferenced pointers should have a name or a type tag");
436 goto err;
439 if (pi->name_mem_tag
440 && !pi->pt_malloc
441 && (pi->pt_vars == NULL || bitmap_empty_p (pi->pt_vars)))
443 error ("Pointers with a memory tag, should have points-to sets or point to malloc");
444 goto err;
447 if (pi->value_escapes_p
448 && pi->name_mem_tag
449 && !is_call_clobbered (pi->name_mem_tag))
451 error ("Pointer escapes but its name tag is not call-clobbered.");
452 goto err;
456 return;
458 err:
459 debug_variable (ptr);
460 internal_error ("verify_flow_sensitive_alias_info failed.");
463 DEF_VEC_MALLOC_P (bitmap);
465 /* Verify that all name tags have different points to sets.
466 This algorithm takes advantage of the fact that every variable with the
467 same name tag must have the same points-to set.
468 So we check a single variable for each name tag, and verify that its
469 points-to set is different from every other points-to set for other name
470 tags.
472 Additionally, given a pointer P_i with name tag NMT and type tag
473 TMT, this function verified the alias set of TMT is a superset of
474 the alias set of NMT. */
476 static void
477 verify_name_tags (void)
479 size_t i;
480 size_t j;
481 bitmap first, second;
482 VEC (tree) *name_tag_reps = NULL;
483 VEC (bitmap) *pt_vars_for_reps = NULL;
484 bitmap type_aliases = BITMAP_XMALLOC ();
486 /* First we compute the name tag representatives and their points-to sets. */
487 for (i = 0; i < num_ssa_names; i++)
489 struct ptr_info_def *pi;
490 tree tmt, ptr = ssa_name (i);
492 if (ptr == NULL_TREE)
493 continue;
495 pi = SSA_NAME_PTR_INFO (ptr);
497 if (!TREE_VISITED (ptr)
498 || !POINTER_TYPE_P (TREE_TYPE (ptr))
499 || !pi
500 || !pi->name_mem_tag
501 || TREE_VISITED (pi->name_mem_tag))
502 continue;
504 TREE_VISITED (pi->name_mem_tag) = 1;
506 if (pi->pt_vars == NULL)
507 continue;
509 VEC_safe_push (tree, name_tag_reps, ptr);
510 VEC_safe_push (bitmap, pt_vars_for_reps, pi->pt_vars);
512 /* Verify that alias set of PTR's type tag is a superset of the
513 alias set of PTR's name tag. */
514 tmt = var_ann (SSA_NAME_VAR (ptr))->type_mem_tag;
515 if (tmt)
517 size_t i;
518 varray_type aliases = var_ann (tmt)->may_aliases;
519 bitmap_clear (type_aliases);
520 for (i = 0; aliases && i < VARRAY_ACTIVE_SIZE (aliases); i++)
522 tree alias = VARRAY_TREE (aliases, i);
523 bitmap_set_bit (type_aliases, var_ann (alias)->uid);
526 /* When grouping, we may have added PTR's type tag into the
527 alias set of PTR's name tag. To prevent a false
528 positive, pretend that TMT is in its own alias set. */
529 bitmap_set_bit (type_aliases, var_ann (tmt)->uid);
531 if (bitmap_equal_p (type_aliases, pi->pt_vars))
532 continue;
534 if (!bitmap_intersect_compl_p (type_aliases, pi->pt_vars))
536 error ("Alias set of a pointer's type tag should be a superset of the corresponding name tag");
537 debug_variable (tmt);
538 debug_variable (pi->name_mem_tag);
539 goto err;
544 /* Now compare all the representative bitmaps with all other representative
545 bitmaps, to verify that they are all different. */
546 for (i = 0; VEC_iterate (bitmap, pt_vars_for_reps, i, first); i++)
548 for (j = i + 1; VEC_iterate (bitmap, pt_vars_for_reps, j, second); j++)
550 if (bitmap_equal_p (first, second))
552 error ("Two different pointers with identical points-to sets but different name tags");
553 debug_variable (VEC_index (tree, name_tag_reps, j));
554 goto err;
559 /* Lastly, clear out the visited flags. */
560 for (i = 0; i < num_ssa_names; i++)
562 if (ssa_name (i))
564 tree ptr = ssa_name (i);
565 struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
566 if (!TREE_VISITED (ptr)
567 || !POINTER_TYPE_P (TREE_TYPE (ptr))
568 || !pi
569 || !pi->name_mem_tag)
570 continue;
571 TREE_VISITED (pi->name_mem_tag) = 0;
575 VEC_free (bitmap, pt_vars_for_reps);
576 BITMAP_FREE (type_aliases);
577 return;
579 err:
580 debug_variable (VEC_index (tree, name_tag_reps, i));
581 internal_error ("verify_name_tags failed");
585 /* Verify the consistency of aliasing information. */
587 static void
588 verify_alias_info (void)
590 verify_flow_sensitive_alias_info ();
591 verify_name_tags ();
592 verify_flow_insensitive_alias_info ();
596 /* Verify common invariants in the SSA web.
597 TODO: verify the variable annotations. */
599 void
600 verify_ssa (void)
602 size_t i;
603 basic_block bb;
604 basic_block *definition_block = xcalloc (num_ssa_names, sizeof (basic_block));
605 ssa_op_iter iter;
606 tree op;
607 enum dom_state orig_dom_state = dom_computed[CDI_DOMINATORS];
608 bitmap names_defined_in_bb = BITMAP_XMALLOC ();
610 timevar_push (TV_TREE_SSA_VERIFY);
612 /* Keep track of SSA names present in the IL. */
613 for (i = 1; i < num_ssa_names; i++)
615 tree name = ssa_name (i);
616 if (name)
618 tree stmt;
619 TREE_VISITED (name) = 0;
621 stmt = SSA_NAME_DEF_STMT (name);
622 if (!IS_EMPTY_STMT (stmt))
624 basic_block bb = bb_for_stmt (stmt);
625 verify_def (bb, definition_block,
626 name, stmt, !is_gimple_reg (name));
632 calculate_dominance_info (CDI_DOMINATORS);
634 /* Now verify all the uses and make sure they agree with the definitions
635 found in the previous pass. */
636 FOR_EACH_BB (bb)
638 edge e;
639 tree phi;
640 edge_iterator ei;
641 block_stmt_iterator bsi;
643 /* Make sure that all edges have a clear 'aux' field. */
644 FOR_EACH_EDGE (e, ei, bb->preds)
646 if (e->aux)
648 error ("AUX pointer initialized for edge %d->%d\n", e->src->index,
649 e->dest->index);
650 goto err;
654 /* Verify the arguments for every PHI node in the block. */
655 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
657 if (verify_phi_args (phi, bb, definition_block))
658 goto err;
659 bitmap_set_bit (names_defined_in_bb,
660 SSA_NAME_VERSION (PHI_RESULT (phi)));
663 /* Now verify all the uses and vuses in every statement of the block. */
664 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
666 tree stmt = bsi_stmt (bsi);
668 get_stmt_operands (stmt);
670 if (stmt_ann (stmt)->makes_aliased_stores
671 && NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt)) == 0)
673 error ("Statement makes aliased stores, but has no V_MAY_DEFS");
674 print_generic_stmt (stderr, stmt, TDF_VOPS);
675 goto err;
678 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_USES | SSA_OP_ALL_KILLS)
680 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
681 op, stmt, false, !is_gimple_reg (op),
682 names_defined_in_bb))
683 goto err;
686 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
688 bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
692 bitmap_clear (names_defined_in_bb);
695 /* Finally, verify alias information. */
696 verify_alias_info ();
698 free (definition_block);
699 /* Restore the dominance information to its prior known state, so
700 that we do not perturb the compiler's subsequent behavior. */
701 if (orig_dom_state == DOM_NONE)
702 free_dominance_info (CDI_DOMINATORS);
703 else
704 dom_computed[CDI_DOMINATORS] = orig_dom_state;
706 BITMAP_XFREE (names_defined_in_bb);
707 timevar_pop (TV_TREE_SSA_VERIFY);
708 return;
710 err:
711 internal_error ("verify_ssa failed.");
715 /* Initialize global DFA and SSA structures. */
717 void
718 init_tree_ssa (void)
720 VARRAY_TREE_INIT (referenced_vars, 20, "referenced_vars");
721 call_clobbered_vars = BITMAP_XMALLOC ();
722 addressable_vars = BITMAP_XMALLOC ();
723 init_ssa_operands ();
724 init_ssanames ();
725 init_phinodes ();
726 global_var = NULL_TREE;
730 /* Deallocate memory associated with SSA data structures for FNDECL. */
732 void
733 delete_tree_ssa (void)
735 size_t i;
736 basic_block bb;
737 block_stmt_iterator bsi;
739 /* Remove annotations from every tree in the function. */
740 FOR_EACH_BB (bb)
741 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
743 tree stmt = bsi_stmt (bsi);
744 release_defs (stmt);
745 ggc_free (stmt->common.ann);
746 stmt->common.ann = NULL;
749 /* Remove annotations from every referenced variable. */
750 if (referenced_vars)
752 for (i = 0; i < num_referenced_vars; i++)
754 tree var = referenced_var (i);
755 ggc_free (var->common.ann);
756 var->common.ann = NULL;
758 referenced_vars = NULL;
761 fini_ssanames ();
762 fini_phinodes ();
763 fini_ssa_operands ();
765 global_var = NULL_TREE;
766 BITMAP_XFREE (call_clobbered_vars);
767 call_clobbered_vars = NULL;
768 BITMAP_XFREE (addressable_vars);
769 addressable_vars = NULL;
773 /* Return true if EXPR is a useless type conversion, otherwise return
774 false. */
776 bool
777 tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
779 /* If the inner and outer types are effectively the same, then
780 strip the type conversion and enter the equivalence into
781 the table. */
782 if (inner_type == outer_type
783 || (lang_hooks.types_compatible_p (inner_type, outer_type)))
784 return true;
786 /* If both types are pointers and the outer type is a (void *), then
787 the conversion is not necessary. The opposite is not true since
788 that conversion would result in a loss of information if the
789 equivalence was used. Consider an indirect function call where
790 we need to know the exact type of the function to correctly
791 implement the ABI. */
792 else if (POINTER_TYPE_P (inner_type)
793 && POINTER_TYPE_P (outer_type)
794 && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
795 && TYPE_REF_CAN_ALIAS_ALL (inner_type)
796 == TYPE_REF_CAN_ALIAS_ALL (outer_type)
797 && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
798 return true;
800 /* Pointers and references are equivalent once we get to GENERIC,
801 so strip conversions that just switch between them. */
802 else if (POINTER_TYPE_P (inner_type)
803 && POINTER_TYPE_P (outer_type)
804 && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
805 && TYPE_REF_CAN_ALIAS_ALL (inner_type)
806 == TYPE_REF_CAN_ALIAS_ALL (outer_type)
807 && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
808 TREE_TYPE (outer_type)))
809 return true;
811 /* If both the inner and outer types are integral types, then the
812 conversion is not necessary if they have the same mode and
813 signedness and precision, and both or neither are boolean. Some
814 code assumes an invariant that boolean types stay boolean and do
815 not become 1-bit bit-field types. Note that types with precision
816 not using all bits of the mode (such as bit-field types in C)
817 mean that testing of precision is necessary. */
818 else if (INTEGRAL_TYPE_P (inner_type)
819 && INTEGRAL_TYPE_P (outer_type)
820 && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
821 && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
822 && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
824 bool first_boolean = (TREE_CODE (inner_type) == BOOLEAN_TYPE);
825 bool second_boolean = (TREE_CODE (outer_type) == BOOLEAN_TYPE);
826 if (first_boolean == second_boolean)
827 return true;
830 /* Recurse for complex types. */
831 else if (TREE_CODE (inner_type) == COMPLEX_TYPE
832 && TREE_CODE (outer_type) == COMPLEX_TYPE
833 && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
834 TREE_TYPE (inner_type)))
835 return true;
837 return false;
840 /* Return true if EXPR is a useless type conversion, otherwise return
841 false. */
843 bool
844 tree_ssa_useless_type_conversion (tree expr)
846 /* If we have an assignment that merely uses a NOP_EXPR to change
847 the top of the RHS to the type of the LHS and the type conversion
848 is "safe", then strip away the type conversion so that we can
849 enter LHS = RHS into the const_and_copies table. */
850 if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR
851 || TREE_CODE (expr) == VIEW_CONVERT_EXPR
852 || TREE_CODE (expr) == NON_LVALUE_EXPR)
853 return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
854 TREE_TYPE (TREE_OPERAND (expr,
855 0)));
858 return false;
861 /* Returns true if statement STMT may read memory. */
863 bool
864 stmt_references_memory_p (tree stmt)
866 stmt_ann_t ann;
868 get_stmt_operands (stmt);
869 ann = stmt_ann (stmt);
871 if (ann->has_volatile_ops)
872 return true;
874 return (NUM_VUSES (VUSE_OPS (ann)) > 0
875 || NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann)) > 0
876 || NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann)) > 0);
879 /* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
880 described in walk_use_def_chains.
882 VISITED is a pointer set used to mark visited SSA_NAMEs to avoid
883 infinite loops. We used to have a bitmap for this to just mark
884 SSA versions we had visited. But non-sparse bitmaps are way too
885 expensive, while sparse bitmaps may cause quadratic behavior.
887 IS_DFS is true if the caller wants to perform a depth-first search
888 when visiting PHI nodes. A DFS will visit each PHI argument and
889 call FN after each one. Otherwise, all the arguments are
890 visited first and then FN is called with each of the visited
891 arguments in a separate pass. */
893 static bool
894 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
895 struct pointer_set_t *visited, bool is_dfs)
897 tree def_stmt;
899 if (pointer_set_insert (visited, var))
900 return false;
902 def_stmt = SSA_NAME_DEF_STMT (var);
904 if (TREE_CODE (def_stmt) != PHI_NODE)
906 /* If we reached the end of the use-def chain, call FN. */
907 return fn (var, def_stmt, data);
909 else
911 int i;
913 /* When doing a breadth-first search, call FN before following the
914 use-def links for each argument. */
915 if (!is_dfs)
916 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
917 if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
918 return true;
920 /* Follow use-def links out of each PHI argument. */
921 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
923 tree arg = PHI_ARG_DEF (def_stmt, i);
924 if (TREE_CODE (arg) == SSA_NAME
925 && walk_use_def_chains_1 (arg, fn, data, visited, is_dfs))
926 return true;
929 /* When doing a depth-first search, call FN after following the
930 use-def links for each argument. */
931 if (is_dfs)
932 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
933 if (fn (PHI_ARG_DEF (def_stmt, i), def_stmt, data))
934 return true;
937 return false;
942 /* Walk use-def chains starting at the SSA variable VAR. Call
943 function FN at each reaching definition found. FN takes three
944 arguments: VAR, its defining statement (DEF_STMT) and a generic
945 pointer to whatever state information that FN may want to maintain
946 (DATA). FN is able to stop the walk by returning true, otherwise
947 in order to continue the walk, FN should return false.
949 Note, that if DEF_STMT is a PHI node, the semantics are slightly
950 different. The first argument to FN is no longer the original
951 variable VAR, but the PHI argument currently being examined. If FN
952 wants to get at VAR, it should call PHI_RESULT (PHI).
954 If IS_DFS is true, this function will:
956 1- walk the use-def chains for all the PHI arguments, and,
957 2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
959 If IS_DFS is false, the two steps above are done in reverse order
960 (i.e., a breadth-first search). */
963 void
964 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
965 bool is_dfs)
967 tree def_stmt;
969 gcc_assert (TREE_CODE (var) == SSA_NAME);
971 def_stmt = SSA_NAME_DEF_STMT (var);
973 /* We only need to recurse if the reaching definition comes from a PHI
974 node. */
975 if (TREE_CODE (def_stmt) != PHI_NODE)
976 (*fn) (var, def_stmt, data);
977 else
979 struct pointer_set_t *visited = pointer_set_create ();
980 walk_use_def_chains_1 (var, fn, data, visited, is_dfs);
981 pointer_set_destroy (visited);
986 /* Replaces VAR with REPL in memory reference expression *X in
987 statement STMT. */
989 static void
990 propagate_into_addr (tree stmt, tree var, tree *x, tree repl)
992 tree new_var, ass_stmt, addr_var;
993 basic_block bb;
994 block_stmt_iterator bsi;
996 /* There is nothing special to handle in the other cases. */
997 if (TREE_CODE (repl) != ADDR_EXPR)
998 return;
999 addr_var = TREE_OPERAND (repl, 0);
1001 while (handled_component_p (*x)
1002 || TREE_CODE (*x) == REALPART_EXPR
1003 || TREE_CODE (*x) == IMAGPART_EXPR)
1004 x = &TREE_OPERAND (*x, 0);
1006 if (TREE_CODE (*x) != INDIRECT_REF
1007 || TREE_OPERAND (*x, 0) != var)
1008 return;
1010 if (TREE_TYPE (*x) == TREE_TYPE (addr_var))
1012 *x = addr_var;
1013 mark_new_vars_to_rename (stmt, vars_to_rename);
1014 return;
1018 /* Frontends sometimes produce expressions like *&a instead of a[0].
1019 Create a temporary variable to handle this case. */
1020 ass_stmt = build2 (MODIFY_EXPR, void_type_node, NULL_TREE, repl);
1021 new_var = duplicate_ssa_name (var, ass_stmt);
1022 TREE_OPERAND (*x, 0) = new_var;
1023 TREE_OPERAND (ass_stmt, 0) = new_var;
1025 bb = bb_for_stmt (stmt);
1026 tree_block_label (bb);
1027 bsi = bsi_after_labels (bb);
1028 bsi_insert_after (&bsi, ass_stmt, BSI_NEW_STMT);
1030 mark_new_vars_to_rename (stmt, vars_to_rename);
1033 /* Replaces immediate uses of VAR by REPL. */
1035 static void
1036 replace_immediate_uses (tree var, tree repl)
1038 int i, j, n;
1039 dataflow_t df;
1040 tree stmt;
1041 bool mark_new_vars;
1042 ssa_op_iter iter;
1043 use_operand_p use_p;
1045 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
1046 n = num_immediate_uses (df);
1048 for (i = 0; i < n; i++)
1050 stmt = immediate_use (df, i);
1052 if (TREE_CODE (stmt) == PHI_NODE)
1054 for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
1055 if (PHI_ARG_DEF (stmt, j) == var)
1057 SET_PHI_ARG_DEF (stmt, j, repl);
1058 if (TREE_CODE (repl) == SSA_NAME
1059 && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
1060 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
1063 continue;
1066 get_stmt_operands (stmt);
1067 mark_new_vars = false;
1068 if (is_gimple_reg (SSA_NAME_VAR (var)))
1070 if (TREE_CODE (stmt) == MODIFY_EXPR)
1072 propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 0), repl);
1073 propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 1), repl);
1076 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
1077 if (USE_FROM_PTR (use_p) == var)
1079 propagate_value (use_p, repl);
1080 mark_new_vars = POINTER_TYPE_P (TREE_TYPE (repl));
1083 else
1085 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter,
1086 SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_KILLS)
1087 if (USE_FROM_PTR (use_p) == var)
1088 propagate_value (use_p, repl);
1091 /* FIXME. If REPL is a constant, we need to fold STMT.
1092 However, fold_stmt wants a pointer to the statement, because
1093 it may happen that it needs to replace the whole statement
1094 with a new expression. Since the current def-use machinery
1095 does not return pointers to statements, we call fold_stmt
1096 with the address of a local temporary, if that call changes
1097 the temporary then we fallback on looking for a proper
1098 pointer to STMT by scanning STMT's basic block.
1100 Note that all this will become unnecessary soon. This
1101 pass is being replaced with a proper copy propagation pass
1102 for 4.1 (dnovillo, 2004-09-17). */
1103 if (TREE_CODE (repl) != SSA_NAME)
1105 tree tmp = stmt;
1106 fold_stmt (&tmp);
1107 mark_new_vars = true;
1108 if (tmp != stmt)
1110 block_stmt_iterator si = bsi_for_stmt (stmt);
1111 bsi_replace (&si, tmp, true);
1112 stmt = bsi_stmt (si);
1116 /* If REPL is a pointer, it may have different memory tags associated
1117 with it. For instance, VAR may have had a name tag while REPL
1118 only had a type tag. In these cases, the virtual operands (if
1119 any) in the statement will refer to different symbols which need
1120 to be renamed. */
1121 if (mark_new_vars)
1122 mark_new_vars_to_rename (stmt, vars_to_rename);
1123 else
1124 modify_stmt (stmt);
1128 /* Gets the value VAR is equivalent to according to EQ_TO. */
1130 static tree
1131 get_eq_name (tree *eq_to, tree var)
1133 unsigned ver;
1134 tree val = var;
1136 while (TREE_CODE (val) == SSA_NAME)
1138 ver = SSA_NAME_VERSION (val);
1139 if (!eq_to[ver])
1140 break;
1142 val = eq_to[ver];
1145 while (TREE_CODE (var) == SSA_NAME)
1147 ver = SSA_NAME_VERSION (var);
1148 if (!eq_to[ver])
1149 break;
1151 var = eq_to[ver];
1152 eq_to[ver] = val;
1155 return val;
1158 /* Checks whether phi node PHI is redundant and if it is, records the ssa name
1159 its result is redundant to to EQ_TO array. */
1161 static void
1162 check_phi_redundancy (tree phi, tree *eq_to)
1164 tree val = NULL_TREE, def, res = PHI_RESULT (phi), stmt;
1165 unsigned i, ver = SSA_NAME_VERSION (res), n;
1166 dataflow_t df;
1168 /* It is unlikely that such large phi node would be redundant. */
1169 if (PHI_NUM_ARGS (phi) > 16)
1170 return;
1172 for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
1174 def = PHI_ARG_DEF (phi, i);
1176 if (TREE_CODE (def) == SSA_NAME)
1178 def = get_eq_name (eq_to, def);
1179 if (def == res)
1180 continue;
1183 if (val
1184 && !operand_equal_for_phi_arg_p (val, def))
1185 return;
1187 val = def;
1190 /* At least one of the arguments should not be equal to the result, or
1191 something strange is happening. */
1192 gcc_assert (val);
1194 if (get_eq_name (eq_to, res) == val)
1195 return;
1197 if (!may_propagate_copy (res, val))
1198 return;
1200 eq_to[ver] = val;
1202 df = get_immediate_uses (SSA_NAME_DEF_STMT (res));
1203 n = num_immediate_uses (df);
1205 for (i = 0; i < n; i++)
1207 stmt = immediate_use (df, i);
1209 if (TREE_CODE (stmt) == PHI_NODE)
1210 check_phi_redundancy (stmt, eq_to);
1214 /* Removes redundant phi nodes.
1216 A redundant PHI node is a PHI node where all of its PHI arguments
1217 are the same value, excluding any PHI arguments which are the same
1218 as the PHI result.
1220 A redundant PHI node is effectively a copy, so we forward copy propagate
1221 which removes all uses of the destination of the PHI node then
1222 finally we delete the redundant PHI node.
1224 Note that if we can not copy propagate the PHI node, then the PHI
1225 will not be removed. Thus we do not have to worry about dependencies
1226 between PHIs and the problems serializing PHIs into copies creates.
1228 The most important effect of this pass is to remove degenerate PHI
1229 nodes created by removing unreachable code. */
1231 void
1232 kill_redundant_phi_nodes (void)
1234 tree *eq_to;
1235 unsigned i, old_num_ssa_names;
1236 basic_block bb;
1237 tree phi, var, repl, stmt;
1239 /* The EQ_TO[VER] holds the value by that the ssa name VER should be
1240 replaced. If EQ_TO[VER] is ssa name and it is decided to replace it by
1241 other value, it may be necessary to follow the chain till the final value.
1242 We perform path shortening (replacing the entries of the EQ_TO array with
1243 heads of these chains) whenever we access the field to prevent quadratic
1244 complexity (probably would not occur in practice anyway, but let us play
1245 it safe). */
1246 eq_to = xcalloc (num_ssa_names, sizeof (tree));
1248 /* We have had cases where computing immediate uses takes a
1249 significant amount of compile time. If we run into such
1250 problems here, we may want to only compute immediate uses for
1251 a subset of all the SSA_NAMEs instead of computing it for
1252 all of the SSA_NAMEs. */
1253 compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
1254 old_num_ssa_names = num_ssa_names;
1256 FOR_EACH_BB (bb)
1258 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1260 var = PHI_RESULT (phi);
1261 check_phi_redundancy (phi, eq_to);
1265 /* Now propagate the values. */
1266 for (i = 0; i < old_num_ssa_names; i++)
1268 if (!ssa_name (i))
1269 continue;
1271 repl = get_eq_name (eq_to, ssa_name (i));
1272 if (repl != ssa_name (i))
1273 replace_immediate_uses (ssa_name (i), repl);
1276 /* And remove the dead phis. */
1277 for (i = 0; i < old_num_ssa_names; i++)
1279 if (!ssa_name (i))
1280 continue;
1282 repl = get_eq_name (eq_to, ssa_name (i));
1283 if (repl != ssa_name (i))
1285 stmt = SSA_NAME_DEF_STMT (ssa_name (i));
1286 remove_phi_node (stmt, NULL_TREE, bb_for_stmt (stmt));
1290 free_df ();
1291 free (eq_to);
1294 struct tree_opt_pass pass_redundant_phi =
1296 "redphi", /* name */
1297 NULL, /* gate */
1298 kill_redundant_phi_nodes, /* execute */
1299 NULL, /* sub */
1300 NULL, /* next */
1301 0, /* static_pass_number */
1302 TV_TREE_REDPHI, /* tv_id */
1303 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
1304 0, /* properties_provided */
1305 0, /* properties_destroyed */
1306 0, /* todo_flags_start */
1307 TODO_dump_func | TODO_rename_vars
1308 | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
1309 0 /* letter */
1312 /* Emit warnings for uninitialized variables. This is done in two passes.
1314 The first pass notices real uses of SSA names with default definitions.
1315 Such uses are unconditionally uninitialized, and we can be certain that
1316 such a use is a mistake. This pass is run before most optimizations,
1317 so that we catch as many as we can.
1319 The second pass follows PHI nodes to find uses that are potentially
1320 uninitialized. In this case we can't necessarily prove that the use
1321 is really uninitialized. This pass is run after most optimizations,
1322 so that we thread as many jumps and possible, and delete as much dead
1323 code as possible, in order to reduce false positives. We also look
1324 again for plain uninitialized variables, since optimization may have
1325 changed conditionally uninitialized to unconditionally uninitialized. */
1327 /* Emit a warning for T, an SSA_NAME, being uninitialized. The exact
1328 warning text is in MSGID and LOCUS may contain a location or be null. */
1330 static void
1331 warn_uninit (tree t, const char *msgid, location_t *locus)
1333 tree var = SSA_NAME_VAR (t);
1334 tree def = SSA_NAME_DEF_STMT (t);
1336 /* Default uses (indicated by an empty definition statement),
1337 are uninitialized. */
1338 if (!IS_EMPTY_STMT (def))
1339 return;
1341 /* Except for PARMs of course, which are always initialized. */
1342 if (TREE_CODE (var) == PARM_DECL)
1343 return;
1345 /* Hard register variables get their initial value from the ether. */
1346 if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1347 return;
1349 /* TREE_NO_WARNING either means we already warned, or the front end
1350 wishes to suppress the warning. */
1351 if (TREE_NO_WARNING (var))
1352 return;
1354 if (!locus)
1355 locus = &DECL_SOURCE_LOCATION (var);
1356 warning (msgid, locus, var);
1357 TREE_NO_WARNING (var) = 1;
1360 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1361 and warn about them. */
1363 static tree
1364 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1366 location_t *locus = data;
1367 tree t = *tp;
1369 /* We only do data flow with SSA_NAMEs, so that's all we can warn about. */
1370 if (TREE_CODE (t) == SSA_NAME)
1372 warn_uninit (t, "%H%qD is used uninitialized in this function", locus);
1373 *walk_subtrees = 0;
1375 else if (IS_TYPE_OR_DECL_P (t))
1376 *walk_subtrees = 0;
1378 return NULL_TREE;
1381 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1382 and warn about them. */
1384 static void
1385 warn_uninitialized_phi (tree phi)
1387 int i, n = PHI_NUM_ARGS (phi);
1389 /* Don't look at memory tags. */
1390 if (!is_gimple_reg (PHI_RESULT (phi)))
1391 return;
1393 for (i = 0; i < n; ++i)
1395 tree op = PHI_ARG_DEF (phi, i);
1396 if (TREE_CODE (op) == SSA_NAME)
1397 warn_uninit (op, "%H%qD may be used uninitialized in this function",
1398 NULL);
1402 static void
1403 execute_early_warn_uninitialized (void)
1405 block_stmt_iterator bsi;
1406 basic_block bb;
1408 FOR_EACH_BB (bb)
1409 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1410 walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1411 EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1414 static void
1415 execute_late_warn_uninitialized (void)
1417 basic_block bb;
1418 tree phi;
1420 /* Re-do the plain uninitialized variable check, as optimization may have
1421 straightened control flow. Do this first so that we don't accidentally
1422 get a "may be" warning when we'd have seen an "is" warning later. */
1423 execute_early_warn_uninitialized ();
1425 FOR_EACH_BB (bb)
1426 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1427 warn_uninitialized_phi (phi);
1430 static bool
1431 gate_warn_uninitialized (void)
1433 return warn_uninitialized != 0;
1436 struct tree_opt_pass pass_early_warn_uninitialized =
1438 NULL, /* name */
1439 gate_warn_uninitialized, /* gate */
1440 execute_early_warn_uninitialized, /* execute */
1441 NULL, /* sub */
1442 NULL, /* next */
1443 0, /* static_pass_number */
1444 0, /* tv_id */
1445 PROP_ssa, /* properties_required */
1446 0, /* properties_provided */
1447 0, /* properties_destroyed */
1448 0, /* todo_flags_start */
1449 0, /* todo_flags_finish */
1450 0 /* letter */
1453 struct tree_opt_pass pass_late_warn_uninitialized =
1455 NULL, /* name */
1456 gate_warn_uninitialized, /* gate */
1457 execute_late_warn_uninitialized, /* execute */
1458 NULL, /* sub */
1459 NULL, /* next */
1460 0, /* static_pass_number */
1461 0, /* tv_id */
1462 PROP_ssa, /* properties_required */
1463 0, /* properties_provided */
1464 0, /* properties_destroyed */
1465 0, /* todo_flags_start */
1466 0, /* todo_flags_finish */
1467 0 /* letter */