1 /* Miscellaneous SSA utility functions.
2 Copyright (C) 2001, 2002, 2003, 2004 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)
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. */
23 #include "coretypes.h"
30 #include "langhooks.h"
31 #include "hard-reg-set.h"
32 #include "basic-block.h"
37 #include "diagnostic.h"
39 #include "tree-flow.h"
40 #include "tree-gimple.h"
41 #include "tree-inline.h"
44 #include "tree-alias-common.h"
46 #include "tree-dump.h"
47 #include "tree-pass.h"
50 /* Remove edge E and remove the corresponding arguments from the PHI nodes
51 in E's destination block. */
54 ssa_remove_edge (edge e)
58 /* Remove the appropriate PHI arguments in E's destination block. */
59 for (phi = phi_nodes (e->dest); phi; phi = next)
61 next = TREE_CHAIN (phi);
62 remove_phi_arg (phi, e->src);
68 /* Remove remove the corresponding arguments from the PHI nodes
69 in E's destination block and redirect it to DEST. Return redirected edge.
70 The list of removed arguments is stored in PENDING_STMT (e). */
73 ssa_redirect_edge (edge e, basic_block dest)
76 tree list = NULL, *last = &list;
80 /* Remove the appropriate PHI arguments in E's destination block. */
81 for (phi = phi_nodes (e->dest); phi; phi = next)
83 next = TREE_CHAIN (phi);
85 i = phi_arg_from_edge (phi, e);
89 src = PHI_ARG_DEF (phi, i);
90 dst = PHI_RESULT (phi);
91 node = build_tree_list (dst, src);
93 last = &TREE_CHAIN (node);
95 remove_phi_arg_num (phi, i);
98 e = redirect_edge_succ_nodup (e, dest);
99 PENDING_STMT (e) = list;
105 /* Return true if the definition of SSA_NAME at block BB is malformed.
107 STMT is the statement where SSA_NAME is created.
109 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME version
110 numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, it means that the
111 block in that array slot contains the definition of SSA_NAME. */
114 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
119 if (TREE_CODE (ssa_name) != SSA_NAME)
121 error ("Expected an SSA_NAME object");
122 debug_generic_stmt (ssa_name);
123 debug_generic_stmt (stmt);
126 if (definition_block[SSA_NAME_VERSION (ssa_name)])
128 error ("SSA_NAME created in two different blocks %i and %i",
129 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
130 fprintf (stderr, "SSA_NAME: ");
131 debug_generic_stmt (ssa_name);
132 debug_generic_stmt (stmt);
136 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
138 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
140 error ("SSA_NAME_DEF_STMT is wrong");
141 fprintf (stderr, "SSA_NAME: ");
142 debug_generic_stmt (ssa_name);
143 fprintf (stderr, "Expected definition statement:\n");
144 debug_generic_stmt (SSA_NAME_DEF_STMT (ssa_name));
145 fprintf (stderr, "\nActual definition statement:\n");
146 debug_generic_stmt (stmt);
154 /* Return true if the use of SSA_NAME at statement STMT in block BB is
157 DEF_BB is the block where SSA_NAME was found to be created.
159 IDOM contains immediate dominator information for the flowgraph.
161 CHECK_ABNORMAL is true if the caller wants to check whether this use
162 is flowing through an abnormal edge (only used when checking PHI
166 verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
167 tree stmt, bool check_abnormal)
171 if (IS_EMPTY_STMT (SSA_NAME_DEF_STMT (ssa_name)))
172 ; /* Nothing to do. */
175 error ("Missing definition");
178 else if (bb != def_bb
179 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
181 error ("Definition in block %i does not dominate use in block %i",
182 def_bb->index, bb->index);
187 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
189 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
195 fprintf (stderr, "for SSA_NAME: ");
196 debug_generic_stmt (ssa_name);
197 fprintf (stderr, "in statement:\n");
198 debug_generic_stmt (stmt);
205 /* Return true if any of the arguments for PHI node PHI at block BB is
208 IDOM contains immediate dominator information for the flowgraph.
210 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME version
211 numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, it means that the
212 block in that array slot contains the definition of SSA_NAME. */
215 verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
219 int i, phi_num_args = PHI_NUM_ARGS (phi);
221 /* Mark all the incoming edges. */
222 for (e = bb->pred; e; e = e->pred_next)
225 for (i = 0; i < phi_num_args; i++)
227 tree op = PHI_ARG_DEF (phi, i);
229 e = PHI_ARG_EDGE (phi, i);
231 if (TREE_CODE (op) == SSA_NAME)
232 err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
233 phi, e->flags & EDGE_ABNORMAL);
237 error ("Wrong edge %d->%d for PHI argument\n",
238 e->src->index, e->dest->index, bb->index);
242 if (e->aux == (void *) 0)
244 error ("PHI argument flowing through dead edge %d->%d\n",
245 e->src->index, e->dest->index);
249 if (e->aux == (void *) 2)
251 error ("PHI argument duplicated for edge %d->%d\n", e->src->index,
258 fprintf (stderr, "PHI argument\n");
259 debug_generic_stmt (op);
265 for (e = bb->pred; e; e = e->pred_next)
267 if (e->aux != (void *) 2)
269 error ("No argument flowing through edge %d->%d\n", e->src->index,
278 fprintf (stderr, "for PHI node\n");
279 debug_generic_stmt (phi);
287 /* Verify common invariants in the SSA web.
288 TODO: verify the variable annotations. */
295 basic_block *definition_block = xcalloc (highest_ssa_version,
296 sizeof (basic_block));
298 timevar_push (TV_TREE_SSA_VERIFY);
300 calculate_dominance_info (CDI_DOMINATORS);
302 /* Verify and register all the SSA_NAME definitions found in the
307 block_stmt_iterator bsi;
309 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
310 err |= verify_def (bb, definition_block, PHI_RESULT (phi), phi);
312 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
320 stmt = bsi_stmt (bsi);
321 ann = stmt_ann (stmt);
322 get_stmt_operands (stmt);
324 vdefs = VDEF_OPS (ann);
325 if (ann->makes_aliased_stores && NUM_VDEFS (vdefs) == 0)
326 error ("Makes aliased stores, but no VDEFS");
328 for (j = 0; j < NUM_VDEFS (vdefs); j++)
330 tree op = VDEF_RESULT (vdefs, j);
331 if (is_gimple_reg (op))
333 error ("Found a virtual definition for a GIMPLE register");
334 debug_generic_stmt (op);
335 debug_generic_stmt (stmt);
338 err |= verify_def (bb, definition_block, op, stmt);
341 defs = DEF_OPS (ann);
342 for (j = 0; j < NUM_DEFS (defs); j++)
344 tree op = DEF_OP (defs, j);
345 if (TREE_CODE (op) == SSA_NAME && !is_gimple_reg (op))
347 error ("Found a real definition for a non-GIMPLE register");
348 debug_generic_stmt (op);
349 debug_generic_stmt (stmt);
352 err |= verify_def (bb, definition_block, op, stmt);
358 /* Now verify all the uses and make sure they agree with the definitions
359 found in the previous pass. */
364 block_stmt_iterator bsi;
366 /* Make sure that all edges have a clear 'aux' field. */
367 for (e = bb->pred; e; e = e->pred_next)
371 error ("AUX pointer initialized for edge %d->%d\n", e->src->index,
377 /* Verify the arguments for every PHI node in the block. */
378 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
379 err |= verify_phi_args (phi, bb, definition_block);
381 /* Now verify all the uses and vuses in every statement of the block.
383 Remember, the RHS of a VDEF is a use as well. */
384 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
386 tree stmt = bsi_stmt (bsi);
387 stmt_ann_t ann = stmt_ann (stmt);
393 vuses = VUSE_OPS (ann);
394 for (j = 0; j < NUM_VUSES (vuses); j++)
396 tree op = VUSE_OP (vuses, j);
398 if (is_gimple_reg (op))
400 error ("Found a virtual use for a GIMPLE register");
401 debug_generic_stmt (op);
402 debug_generic_stmt (stmt);
405 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
409 vdefs = VDEF_OPS (ann);
410 for (j = 0; j < NUM_VDEFS (vdefs); j++)
412 tree op = VDEF_OP (vdefs, j);
414 if (is_gimple_reg (op))
416 error ("Found a virtual use for a GIMPLE register");
417 debug_generic_stmt (op);
418 debug_generic_stmt (stmt);
421 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
425 uses = USE_OPS (ann);
426 for (j = 0; j < NUM_USES (uses); j++)
428 tree op = USE_OP (uses, j);
430 if (TREE_CODE (op) == SSA_NAME && !is_gimple_reg (op))
432 error ("Found a real use of a non-GIMPLE register");
433 debug_generic_stmt (op);
434 debug_generic_stmt (stmt);
437 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
443 free (definition_block);
445 timevar_pop (TV_TREE_SSA_VERIFY);
448 internal_error ("verify_ssa failed.");
452 /* Set the USED bit in the annotation for T. */
462 switch (TREE_CODE (t))
470 t = TREE_OPERAND (t, 0);
478 if (TREE_CODE (t) == SSA_NAME)
479 t = SSA_NAME_VAR (t);
481 var_ann (t)->used = 1;
485 /* Initialize global DFA and SSA structures. */
490 VARRAY_TREE_INIT (referenced_vars, 20, "referenced_vars");
491 call_clobbered_vars = BITMAP_XMALLOC ();
492 init_ssa_operands ();
495 global_var = NULL_TREE;
496 aliases_computed_p = false;
500 /* Deallocate memory associated with SSA data structures for FNDECL. */
503 delete_tree_ssa (void)
507 block_stmt_iterator bsi;
509 /* Remove annotations from every tree in the function. */
511 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
512 bsi_stmt (bsi)->common.ann = NULL;
514 /* Remove annotations from every referenced variable. */
517 for (i = 0; i < num_referenced_vars; i++)
518 referenced_var (i)->common.ann = NULL;
519 referenced_vars = NULL;
524 fini_ssa_operands ();
526 global_var = NULL_TREE;
527 BITMAP_XFREE (call_clobbered_vars);
528 call_clobbered_vars = NULL;
529 aliases_computed_p = false;
533 /* Return true if EXPR is a useless type conversion, otherwise return
537 tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
539 /* If the inner and outer types are effectively the same, then
540 strip the type conversion and enter the equivalence into
542 if (inner_type == outer_type
543 || (lang_hooks.types_compatible_p (inner_type, outer_type)))
546 /* If both types are pointers and the outer type is a (void *), then
547 the conversion is not necessary. The opposite is not true since
548 that conversion would result in a loss of information if the
549 equivalence was used. Consider an indirect function call where
550 we need to know the exact type of the function to correctly
551 implement the ABI. */
552 else if (POINTER_TYPE_P (inner_type)
553 && POINTER_TYPE_P (outer_type)
554 && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
557 /* Pointers and references are equivalent once we get to GENERIC,
558 so strip conversions that just switch between them. */
559 else if (POINTER_TYPE_P (inner_type)
560 && POINTER_TYPE_P (outer_type)
561 && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
562 TREE_TYPE (outer_type)))
565 /* If both the inner and outer types are integral types, then the
566 conversion is not necessary if they have the same mode and
567 signedness and precision. Note that type _Bool can have size of
568 4 (only happens on powerpc-darwin right now but can happen on any
569 target that defines BOOL_TYPE_SIZE to be INT_TYPE_SIZE) and a
570 precision of 1 while unsigned int is the same expect for a
571 precision of 4 so testing of precision is necessary. */
572 else if (INTEGRAL_TYPE_P (inner_type)
573 && INTEGRAL_TYPE_P (outer_type)
574 && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
575 && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
576 && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
579 /* Recurse for complex types. */
580 else if (TREE_CODE (inner_type) == COMPLEX_TYPE
581 && TREE_CODE (outer_type) == COMPLEX_TYPE
582 && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
583 TREE_TYPE (inner_type)))
589 /* Return true if EXPR is a useless type conversion, otherwise return
593 tree_ssa_useless_type_conversion (tree expr)
595 /* If we have an assignment that merely uses a NOP_EXPR to change
596 the top of the RHS to the type of the LHS and the type conversion
597 is "safe", then strip away the type conversion so that we can
598 enter LHS = RHS into the const_and_copies table. */
599 if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR)
600 return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
601 TREE_TYPE (TREE_OPERAND (expr,
609 /* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
610 described in walk_use_def_chains. VISITED is a bitmap used to mark
611 visited SSA_NAMEs to avoid infinite loops. */
614 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
619 if (bitmap_bit_p (visited, SSA_NAME_VERSION (var)))
622 bitmap_set_bit (visited, SSA_NAME_VERSION (var));
624 def_stmt = SSA_NAME_DEF_STMT (var);
626 if (TREE_CODE (def_stmt) != PHI_NODE)
628 /* If we reached the end of the use-def chain, call FN. */
629 return (*fn) (var, def_stmt, data);
635 /* Otherwise, follow use-def links out of each PHI argument and call
636 FN after visiting each one. */
637 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
639 tree arg = PHI_ARG_DEF (def_stmt, i);
640 if (TREE_CODE (arg) == SSA_NAME
641 && walk_use_def_chains_1 (arg, fn, data, visited))
644 if ((*fn) (arg, def_stmt, data))
653 /* Walk use-def chains starting at the SSA variable VAR. Call function FN
654 at each reaching definition found. FN takes three arguments: VAR, its
655 defining statement (DEF_STMT) and a generic pointer to whatever state
656 information that FN may want to maintain (DATA). FN is able to stop the
657 walk by returning true, otherwise in order to continue the walk, FN
660 Note, that if DEF_STMT is a PHI node, the semantics are slightly
661 different. For each argument ARG of the PHI node, this function will:
663 1- Walk the use-def chains for ARG.
664 2- Call (*FN) (ARG, PHI, DATA).
666 Note how the first argument to FN is no longer the original variable
667 VAR, but the PHI argument currently being examined. If FN wants to get
668 at VAR, it should call PHI_RESULT (PHI). */
671 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data)
675 #if defined ENABLE_CHECKING
676 if (TREE_CODE (var) != SSA_NAME)
680 def_stmt = SSA_NAME_DEF_STMT (var);
682 /* We only need to recurse if the reaching definition comes from a PHI
684 if (TREE_CODE (def_stmt) != PHI_NODE)
685 (*fn) (var, def_stmt, data);
688 bitmap visited = BITMAP_XMALLOC ();
689 walk_use_def_chains_1 (var, fn, data, visited);
690 BITMAP_XFREE (visited);
695 /* Replaces immediate uses of VAR by REPL. */
698 replace_immediate_uses (tree var, tree repl)
708 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
709 n = num_immediate_uses (df);
711 for (i = 0; i < n; i++)
713 stmt = immediate_use (df, i);
714 ann = stmt_ann (stmt);
716 if (TREE_CODE (stmt) == PHI_NODE)
718 for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
719 if (PHI_ARG_DEF (stmt, j) == var)
721 PHI_ARG_DEF (stmt, j) = repl;
722 if (TREE_CODE (repl) == SSA_NAME
723 && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
724 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
730 get_stmt_operands (stmt);
731 if (is_gimple_reg (SSA_NAME_VAR (var)))
733 uses = USE_OPS (ann);
734 for (j = 0; j < (int) NUM_USES (uses); j++)
735 if (USE_OP (uses, j) == var)
736 propagate_value (USE_OP_PTR (uses, j), repl);
740 vuses = VUSE_OPS (ann);
741 for (j = 0; j < (int) NUM_VUSES (vuses); j++)
742 if (VUSE_OP (vuses, j) == var)
743 propagate_value (VUSE_OP_PTR (vuses, j), repl);
745 vdefs = VDEF_OPS (ann);
746 for (j = 0; j < (int) NUM_VDEFS (vdefs); j++)
747 if (VDEF_OP (vdefs, j) == var)
748 propagate_value (VDEF_OP_PTR (vdefs, j), repl);
753 /* If REPL is a pointer, it may have different memory tags associated
754 with it. For instance, VAR may have had a name tag while REPL
755 only had a type tag. In these cases, the virtual operands (if
756 any) in the statement will refer to different symbols which need
758 if (POINTER_TYPE_P (TREE_TYPE (repl)))
759 mark_new_vars_to_rename (stmt, vars_to_rename);
763 /* Raises value of phi node PHI by joining it with VAL. Processes immediate
764 uses of PHI recursively. */
767 raise_value (tree phi, tree val, tree *eq_to)
770 tree var = PHI_RESULT (phi), stmt;
771 int ver = SSA_NAME_VERSION (var);
774 if (eq_to[ver] == var)
777 switch (TREE_CODE (val))
784 if (TREE_CODE (TREE_TYPE (var)) != POINTER_TYPE)
788 /* Do not propagate pointer constants. This might require folding
789 things like *&foo and rewriting the ssa, which is not worth the
796 if (operand_equal_p (eq_to[ver], val, 0))
804 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
805 n = num_immediate_uses (df);
807 for (i = 0; i < n; i++)
809 stmt = immediate_use (df, i);
811 if (TREE_CODE (stmt) != PHI_NODE)
814 raise_value (stmt, eq_to[ver], eq_to);
818 /* Removes redundant phi nodes.
820 A redundant PHI node is a PHI node where all of its PHI arguments
821 are the same value, excluding any PHI arguments which are the same
824 A redundant PHI node is effectively a copy, so we forward copy propagate
825 which removes all uses of the destination of the PHI node then
826 finally we delete the redundant PHI node.
828 Note that if we can not copy propagate the PHI node, then the PHI
829 will not be removed. Thus we do not have to worry about dependencies
830 between PHIs and the problems serializing PHIs into copies creates.
832 The most important effect of this pass is to remove degenerate PHI
833 nodes created by removing unreachable code. */
836 kill_redundant_phi_nodes (void)
838 tree *eq_to, *ssa_names;
839 unsigned i, ver, aver;
841 tree phi, t, stmt, var;
843 /* The EQ_TO array holds the current value of the ssa name in the
852 Bottom is represented by NULL and top by the variable itself.
854 Once the dataflow stabilizes, we know that the phi nodes we need to keep
855 are exactly those with top as their result.
857 The remaining phi nodes have their uses replaced with their value
858 in the lattice and the phi node itself is removed. */
859 eq_to = xcalloc (highest_ssa_version, sizeof (tree));
861 /* The SSA_NAMES array holds each SSA_NAME node we encounter
862 in a PHI node (indexed by ssa version number).
864 One could argue that the SSA_NAME manager ought to provide a
865 generic interface to get at the SSA_NAME node for a given
866 ssa version number. */
867 ssa_names = xcalloc (highest_ssa_version, sizeof (tree));
869 /* We have had cases where computing immediate uses takes a
870 significant amount of compile time. If we run into such
871 problems here, we may want to only compute immediate uses for
872 a subset of all the SSA_NAMEs instead of computing it for
873 all of the SSA_NAMEs. */
874 compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
878 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
880 var = PHI_RESULT (phi);
881 ver = SSA_NAME_VERSION (var);
882 ssa_names[ver] = var;
884 for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
886 t = PHI_ARG_DEF (phi, i);
888 if (TREE_CODE (t) != SSA_NAME)
890 raise_value (phi, t, eq_to);
894 stmt = SSA_NAME_DEF_STMT (t);
895 aver = SSA_NAME_VERSION (t);
898 /* If the defining statement for this argument is not a
899 phi node or the argument is associated with an abnormal
900 edge, then we need to recursively start the forward
901 dataflow starting with PHI. */
902 if (TREE_CODE (stmt) != PHI_NODE
903 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (t))
906 raise_value (phi, t, eq_to);
912 /* Now propagate the values. */
913 for (i = 0; i < highest_ssa_version; i++)
915 && eq_to[i] != ssa_names[i])
916 replace_immediate_uses (ssa_names[i], eq_to[i]);
918 /* And remove the dead phis. */
919 for (i = 0; i < highest_ssa_version; i++)
921 && eq_to[i] != ssa_names[i])
923 stmt = SSA_NAME_DEF_STMT (ssa_names[i]);
924 remove_phi_node (stmt, 0, bb_for_stmt (stmt));
932 struct tree_opt_pass pass_redundant_phi =
936 kill_redundant_phi_nodes, /* execute */
939 0, /* static_pass_number */
941 PROP_cfg | PROP_ssa, /* properties_required */
942 0, /* properties_provided */
943 0, /* properties_destroyed */
944 0, /* todo_flags_start */
945 TODO_dump_func | TODO_rename_vars
946 | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
949 /* Emit warnings for uninitialized variables. This is done in two passes.
951 The first pass notices real uses of SSA names with default definitions.
952 Such uses are unconditionally uninitialized, and we can be certain that
953 such a use is a mistake. This pass is run before most optimizations,
954 so that we catch as many as we can.
956 The second pass follows PHI nodes to find uses that are potentially
957 uninitialized. In this case we can't necessarily prove that the use
958 is really uninitialized. This pass is run after most optimizations,
959 so that we thread as many jumps and possible, and delete as much dead
960 code as possible, in order to reduce false positives. We also look
961 again for plain uninitialized variables, since optimization may have
962 changed conditionally uninitialized to unconditionally uninitialized. */
964 /* Emit a warning for T, an SSA_NAME, being uninitialized. The exact
965 warning text is in MSGID and LOCUS may contain a location or be null. */
968 warn_uninit (tree t, const char *msgid, location_t *locus)
970 tree var = SSA_NAME_VAR (t);
971 tree def = SSA_NAME_DEF_STMT (t);
973 /* Default uses (indicated by an empty definition statement),
974 are uninitialized. */
975 if (!IS_EMPTY_STMT (def))
978 /* Except for PARMs of course, which are always initialized. */
979 if (TREE_CODE (var) == PARM_DECL)
982 /* Hard register variables get their initial value from the ether. */
983 if (DECL_HARD_REGISTER (var))
986 /* TREE_NO_WARNING either means we already warned, or the front end
987 wishes to suppress the warning. */
988 if (TREE_NO_WARNING (var))
992 locus = &DECL_SOURCE_LOCATION (var);
993 warning (msgid, locus, var);
994 TREE_NO_WARNING (var) = 1;
997 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
998 and warn about them. */
1001 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1003 location_t *locus = data;
1006 /* We only do data flow with SSA_NAMEs, so that's all we can warn about. */
1007 if (TREE_CODE (t) == SSA_NAME)
1009 warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
1012 else if (DECL_P (t) || TYPE_P (t))
1018 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1019 and warn about them. */
1022 warn_uninitialized_phi (tree phi)
1024 int i, n = PHI_NUM_ARGS (phi);
1026 /* Don't look at memory tags. */
1027 if (!is_gimple_reg (PHI_RESULT (phi)))
1030 for (i = 0; i < n; ++i)
1032 tree op = PHI_ARG_DEF (phi, i);
1033 if (TREE_CODE (op) == SSA_NAME)
1034 warn_uninit (op, "%H'%D' may be used uninitialized in this function",
1040 execute_early_warn_uninitialized (void)
1042 block_stmt_iterator bsi;
1046 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1047 walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1048 EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1052 execute_late_warn_uninitialized (void)
1057 /* Re-do the plain uninitialized variable check, as optimization may have
1058 straightened control flow. Do this first so that we don't accidentally
1059 get a "may be" warning when we'd have seen an "is" warning later. */
1060 execute_early_warn_uninitialized ();
1063 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
1064 warn_uninitialized_phi (phi);
1068 gate_warn_uninitialized (void)
1070 return warn_uninitialized != 0;
1073 struct tree_opt_pass pass_early_warn_uninitialized =
1076 gate_warn_uninitialized, /* gate */
1077 execute_early_warn_uninitialized, /* execute */
1080 0, /* static_pass_number */
1082 PROP_ssa, /* properties_required */
1083 0, /* properties_provided */
1084 0, /* properties_destroyed */
1085 0, /* todo_flags_start */
1086 0 /* todo_flags_finish */
1089 struct tree_opt_pass pass_late_warn_uninitialized =
1092 gate_warn_uninitialized, /* gate */
1093 execute_late_warn_uninitialized, /* execute */
1096 0, /* static_pass_number */
1098 PROP_ssa, /* properties_required */
1099 0, /* properties_provided */
1100 0, /* properties_destroyed */
1101 0, /* todo_flags_start */
1102 0 /* todo_flags_finish */