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 for (j = 0; j < NUM_VDEFS (vdefs); j++)
327 tree op = VDEF_RESULT (vdefs, j);
328 if (is_gimple_reg (op))
330 error ("Found a virtual definition for a GIMPLE register");
331 debug_generic_stmt (op);
332 debug_generic_stmt (stmt);
335 err |= verify_def (bb, definition_block, op, stmt);
338 defs = DEF_OPS (ann);
339 for (j = 0; j < NUM_DEFS (defs); j++)
341 tree op = DEF_OP (defs, j);
342 if (TREE_CODE (op) == SSA_NAME && !is_gimple_reg (op))
344 error ("Found a real definition for a non-GIMPLE register");
345 debug_generic_stmt (op);
346 debug_generic_stmt (stmt);
349 err |= verify_def (bb, definition_block, op, stmt);
355 /* Now verify all the uses and make sure they agree with the definitions
356 found in the previous pass. */
361 block_stmt_iterator bsi;
363 /* Make sure that all edges have a clear 'aux' field. */
364 for (e = bb->pred; e; e = e->pred_next)
368 error ("AUX pointer initialized for edge %d->%d\n", e->src->index,
374 /* Verify the arguments for every PHI node in the block. */
375 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
376 err |= verify_phi_args (phi, bb, definition_block);
378 /* Now verify all the uses and vuses in every statement of the block.
380 Remember, the RHS of a VDEF is a use as well. */
381 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
383 tree stmt = bsi_stmt (bsi);
384 stmt_ann_t ann = stmt_ann (stmt);
390 vuses = VUSE_OPS (ann);
391 for (j = 0; j < NUM_VUSES (vuses); j++)
393 tree op = VUSE_OP (vuses, j);
395 if (is_gimple_reg (op))
397 error ("Found a virtual use for a GIMPLE register");
398 debug_generic_stmt (op);
399 debug_generic_stmt (stmt);
402 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
406 vdefs = VDEF_OPS (ann);
407 for (j = 0; j < NUM_VDEFS (vdefs); j++)
409 tree op = VDEF_OP (vdefs, j);
411 if (is_gimple_reg (op))
413 error ("Found a virtual use for a GIMPLE register");
414 debug_generic_stmt (op);
415 debug_generic_stmt (stmt);
418 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
422 uses = USE_OPS (ann);
423 for (j = 0; j < NUM_USES (uses); j++)
425 tree op = USE_OP (uses, j);
427 if (TREE_CODE (op) == SSA_NAME && !is_gimple_reg (op))
429 error ("Found a real use of a non-GIMPLE register");
430 debug_generic_stmt (op);
431 debug_generic_stmt (stmt);
434 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
440 free (definition_block);
442 timevar_pop (TV_TREE_SSA_VERIFY);
445 internal_error ("verify_ssa failed.");
449 /* Set the USED bit in the annotation for T. */
459 switch (TREE_CODE (t))
467 t = TREE_OPERAND (t, 0);
475 if (TREE_CODE (t) == SSA_NAME)
476 t = SSA_NAME_VAR (t);
478 var_ann (t)->used = 1;
482 /* Initialize global DFA and SSA structures. */
487 VARRAY_TREE_INIT (referenced_vars, 20, "referenced_vars");
488 call_clobbered_vars = BITMAP_XMALLOC ();
489 init_ssa_operands ();
492 global_var = NULL_TREE;
493 aliases_computed_p = false;
497 /* Deallocate memory associated with SSA data structures for FNDECL. */
500 delete_tree_ssa (void)
504 block_stmt_iterator bsi;
506 /* Remove annotations from every tree in the function. */
508 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
509 bsi_stmt (bsi)->common.ann = NULL;
511 /* Remove annotations from every referenced variable. */
514 for (i = 0; i < num_referenced_vars; i++)
515 referenced_var (i)->common.ann = NULL;
516 referenced_vars = NULL;
521 fini_ssa_operands ();
523 global_var = NULL_TREE;
524 BITMAP_XFREE (call_clobbered_vars);
525 call_clobbered_vars = NULL;
526 aliases_computed_p = false;
530 /* Return true if EXPR is a useless type conversion, otherwise return
534 tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
536 /* If the inner and outer types are effectively the same, then
537 strip the type conversion and enter the equivalence into
539 if (inner_type == outer_type
540 || (lang_hooks.types_compatible_p (inner_type, outer_type)))
543 /* If both types are pointers and the outer type is a (void *), then
544 the conversion is not necessary. The opposite is not true since
545 that conversion would result in a loss of information if the
546 equivalence was used. Consider an indirect function call where
547 we need to know the exact type of the function to correctly
548 implement the ABI. */
549 else if (POINTER_TYPE_P (inner_type)
550 && POINTER_TYPE_P (outer_type)
551 && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
554 /* Pointers and references are equivalent once we get to GENERIC,
555 so strip conversions that just switch between them. */
556 else if (POINTER_TYPE_P (inner_type)
557 && POINTER_TYPE_P (outer_type)
558 && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
559 TREE_TYPE (outer_type)))
562 /* If both the inner and outer types are integral types, then the
563 conversion is not necessary if they have the same mode and
564 signedness and precision. Note that type _Bool can have size of
565 4 (only happens on powerpc-darwin right now but can happen on any
566 target that defines BOOL_TYPE_SIZE to be INT_TYPE_SIZE) and a
567 precision of 1 while unsigned int is the same expect for a
568 precision of 4 so testing of precision is necessary. */
569 else if (INTEGRAL_TYPE_P (inner_type)
570 && INTEGRAL_TYPE_P (outer_type)
571 && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
572 && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
573 && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
576 /* Recurse for complex types. */
577 else if (TREE_CODE (inner_type) == COMPLEX_TYPE
578 && TREE_CODE (outer_type) == COMPLEX_TYPE
579 && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
580 TREE_TYPE (inner_type)))
586 /* Return true if EXPR is a useless type conversion, otherwise return
590 tree_ssa_useless_type_conversion (tree expr)
592 /* If we have an assignment that merely uses a NOP_EXPR to change
593 the top of the RHS to the type of the LHS and the type conversion
594 is "safe", then strip away the type conversion so that we can
595 enter LHS = RHS into the const_and_copies table. */
596 if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR)
597 return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
598 TREE_TYPE (TREE_OPERAND (expr,
606 /* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
607 described in walk_use_def_chains. VISITED is a bitmap used to mark
608 visited SSA_NAMEs to avoid infinite loops. */
611 walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
616 if (bitmap_bit_p (visited, SSA_NAME_VERSION (var)))
619 bitmap_set_bit (visited, SSA_NAME_VERSION (var));
621 def_stmt = SSA_NAME_DEF_STMT (var);
623 if (TREE_CODE (def_stmt) != PHI_NODE)
625 /* If we reached the end of the use-def chain, call FN. */
626 return (*fn) (var, def_stmt, data);
632 /* Otherwise, follow use-def links out of each PHI argument and call
633 FN after visiting each one. */
634 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
636 tree arg = PHI_ARG_DEF (def_stmt, i);
637 if (TREE_CODE (arg) == SSA_NAME
638 && walk_use_def_chains_1 (arg, fn, data, visited))
641 if ((*fn) (arg, def_stmt, data))
650 /* Walk use-def chains starting at the SSA variable VAR. Call function FN
651 at each reaching definition found. FN takes three arguments: VAR, its
652 defining statement (DEF_STMT) and a generic pointer to whatever state
653 information that FN may want to maintain (DATA). FN is able to stop the
654 walk by returning true, otherwise in order to continue the walk, FN
657 Note, that if DEF_STMT is a PHI node, the semantics are slightly
658 different. For each argument ARG of the PHI node, this function will:
660 1- Walk the use-def chains for ARG.
661 2- Call (*FN) (ARG, PHI, DATA).
663 Note how the first argument to FN is no longer the original variable
664 VAR, but the PHI argument currently being examined. If FN wants to get
665 at VAR, it should call PHI_RESULT (PHI). */
668 walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data)
672 #if defined ENABLE_CHECKING
673 if (TREE_CODE (var) != SSA_NAME)
677 def_stmt = SSA_NAME_DEF_STMT (var);
679 /* We only need to recurse if the reaching definition comes from a PHI
681 if (TREE_CODE (def_stmt) != PHI_NODE)
682 (*fn) (var, def_stmt, data);
685 bitmap visited = BITMAP_XMALLOC ();
686 walk_use_def_chains_1 (var, fn, data, visited);
687 BITMAP_XFREE (visited);
692 /* Replaces immediate uses of VAR by REPL. */
695 replace_immediate_uses (tree var, tree repl)
705 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
706 n = num_immediate_uses (df);
708 for (i = 0; i < n; i++)
710 stmt = immediate_use (df, i);
711 ann = stmt_ann (stmt);
713 if (TREE_CODE (stmt) == PHI_NODE)
715 for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
716 if (PHI_ARG_DEF (stmt, j) == var)
718 PHI_ARG_DEF (stmt, j) = repl;
719 if (TREE_CODE (repl) == SSA_NAME
720 && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
721 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
727 get_stmt_operands (stmt);
728 if (is_gimple_reg (SSA_NAME_VAR (var)))
730 uses = USE_OPS (ann);
731 for (j = 0; j < (int) NUM_USES (uses); j++)
732 if (USE_OP (uses, j) == var)
733 propagate_value (USE_OP_PTR (uses, j), repl);
737 vuses = VUSE_OPS (ann);
738 for (j = 0; j < (int) NUM_VUSES (vuses); j++)
739 if (VUSE_OP (vuses, j) == var)
740 propagate_value (VUSE_OP_PTR (vuses, j), repl);
742 vdefs = VDEF_OPS (ann);
743 for (j = 0; j < (int) NUM_VDEFS (vdefs); j++)
744 if (VDEF_OP (vdefs, j) == var)
745 propagate_value (VDEF_OP_PTR (vdefs, j), repl);
750 /* If REPL is a pointer, it may have different memory tags associated
751 with it. For instance, VAR may have had a name tag while REPL
752 only had a type tag. In these cases, the virtual operands (if
753 any) in the statement will refer to different symbols which need
755 if (POINTER_TYPE_P (TREE_TYPE (repl)))
756 mark_new_vars_to_rename (stmt, vars_to_rename);
760 /* Raises value of phi node PHI by joining it with VAL. Processes immediate
761 uses of PHI recursively. */
764 raise_value (tree phi, tree val, tree *eq_to)
767 tree var = PHI_RESULT (phi), stmt;
768 int ver = SSA_NAME_VERSION (var);
771 if (eq_to[ver] == var)
774 switch (TREE_CODE (val))
781 if (TREE_CODE (TREE_TYPE (var)) != POINTER_TYPE)
785 /* Do not propagate pointer constants. This might require folding
786 things like *&foo and rewriting the ssa, which is not worth the
793 if (operand_equal_p (eq_to[ver], val, 0))
801 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
802 n = num_immediate_uses (df);
804 for (i = 0; i < n; i++)
806 stmt = immediate_use (df, i);
808 if (TREE_CODE (stmt) != PHI_NODE)
811 raise_value (stmt, eq_to[ver], eq_to);
815 /* Removes redundant phi nodes.
817 A redundant PHI node is a PHI node where all of its PHI arguments
818 are the same value, excluding any PHI arguments which are the same
821 A redundant PHI node is effectively a copy, so we forward copy propagate
822 which removes all uses of the destination of the PHI node then
823 finally we delete the redundant PHI node.
825 Note that if we can not copy propagate the PHI node, then the PHI
826 will not be removed. Thus we do not have to worry about dependencies
827 between PHIs and the problems serializing PHIs into copies creates.
829 The most important effect of this pass is to remove degenerate PHI
830 nodes created by removing unreachable code. */
833 kill_redundant_phi_nodes (void)
835 tree *eq_to, *ssa_names;
836 unsigned i, ver, aver;
838 tree phi, t, stmt, var;
840 /* The EQ_TO array holds the current value of the ssa name in the
849 Bottom is represented by NULL and top by the variable itself.
851 Once the dataflow stabilizes, we know that the phi nodes we need to keep
852 are exactly those with top as their result.
854 The remaining phi nodes have their uses replaced with their value
855 in the lattice and the phi node itself is removed. */
856 eq_to = xcalloc (highest_ssa_version, sizeof (tree));
858 /* The SSA_NAMES array holds each SSA_NAME node we encounter
859 in a PHI node (indexed by ssa version number).
861 One could argue that the SSA_NAME manager ought to provide a
862 generic interface to get at the SSA_NAME node for a given
863 ssa version number. */
864 ssa_names = xcalloc (highest_ssa_version, sizeof (tree));
866 /* We have had cases where computing immediate uses takes a
867 significant amount of compile time. If we run into such
868 problems here, we may want to only compute immediate uses for
869 a subset of all the SSA_NAMEs instead of computing it for
870 all of the SSA_NAMEs. */
871 compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
875 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
877 var = PHI_RESULT (phi);
878 ver = SSA_NAME_VERSION (var);
879 ssa_names[ver] = var;
881 for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
883 t = PHI_ARG_DEF (phi, i);
885 if (TREE_CODE (t) != SSA_NAME)
887 raise_value (phi, t, eq_to);
891 stmt = SSA_NAME_DEF_STMT (t);
892 aver = SSA_NAME_VERSION (t);
895 /* If the defining statement for this argument is not a
896 phi node or the argument is associated with an abnormal
897 edge, then we need to recursively start the forward
898 dataflow starting with PHI. */
899 if (TREE_CODE (stmt) != PHI_NODE
900 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (t))
903 raise_value (phi, t, eq_to);
909 /* Now propagate the values. */
910 for (i = 0; i < highest_ssa_version; i++)
912 && eq_to[i] != ssa_names[i])
913 replace_immediate_uses (ssa_names[i], eq_to[i]);
915 /* And remove the dead phis. */
916 for (i = 0; i < highest_ssa_version; i++)
918 && eq_to[i] != ssa_names[i])
920 stmt = SSA_NAME_DEF_STMT (ssa_names[i]);
921 remove_phi_node (stmt, 0, bb_for_stmt (stmt));
929 struct tree_opt_pass pass_redundant_phi =
933 kill_redundant_phi_nodes, /* execute */
936 0, /* static_pass_number */
938 PROP_cfg | PROP_ssa, /* properties_required */
939 0, /* properties_provided */
940 0, /* properties_destroyed */
941 0, /* todo_flags_start */
942 TODO_dump_func | TODO_rename_vars
943 | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
946 /* Emit warnings for uninitialized variables. This is done in two passes.
948 The first pass notices real uses of SSA names with default definitions.
949 Such uses are unconditionally uninitialized, and we can be certain that
950 such a use is a mistake. This pass is run before most optimizations,
951 so that we catch as many as we can.
953 The second pass follows PHI nodes to find uses that are potentially
954 uninitialized. In this case we can't necessarily prove that the use
955 is really uninitialized. This pass is run after most optimizations,
956 so that we thread as many jumps and possible, and delete as much dead
957 code as possible, in order to reduce false positives. We also look
958 again for plain uninitialized variables, since optimization may have
959 changed conditionally uninitialized to unconditionally uninitialized. */
961 /* Emit a warning for T, an SSA_NAME, being uninitialized. The exact
962 warning text is in MSGID and LOCUS may contain a location or be null. */
965 warn_uninit (tree t, const char *msgid, location_t *locus)
967 tree var = SSA_NAME_VAR (t);
968 tree def = SSA_NAME_DEF_STMT (t);
970 /* Default uses (indicated by an empty definition statement),
971 are uninitialized. */
972 if (!IS_EMPTY_STMT (def))
975 /* Except for PARMs of course, which are always initialized. */
976 if (TREE_CODE (var) == PARM_DECL)
979 /* Hard register variables get their initial value from the ether. */
980 if (DECL_HARD_REGISTER (var))
983 /* TREE_NO_WARNING either means we already warned, or the front end
984 wishes to suppress the warning. */
985 if (TREE_NO_WARNING (var))
989 locus = &DECL_SOURCE_LOCATION (var);
990 warning (msgid, locus, var);
991 TREE_NO_WARNING (var) = 1;
994 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
995 and warn about them. */
998 warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
1000 location_t *locus = data;
1003 /* We only do data flow with SSA_NAMEs, so that's all we can warn about. */
1004 if (TREE_CODE (t) == SSA_NAME)
1006 warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
1009 else if (DECL_P (t) || TYPE_P (t))
1015 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1016 and warn about them. */
1019 warn_uninitialized_phi (tree phi)
1021 int i, n = PHI_NUM_ARGS (phi);
1023 /* Don't look at memory tags. */
1024 if (!is_gimple_reg (PHI_RESULT (phi)))
1027 for (i = 0; i < n; ++i)
1029 tree op = PHI_ARG_DEF (phi, i);
1030 if (TREE_CODE (op) == SSA_NAME)
1031 warn_uninit (op, "%H'%D' may be used uninitialized in this function",
1037 execute_early_warn_uninitialized (void)
1039 block_stmt_iterator bsi;
1043 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1044 walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1045 EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1049 execute_late_warn_uninitialized (void)
1054 /* Re-do the plain uninitialized variable check, as optimization may have
1055 straightened control flow. Do this first so that we don't accidentally
1056 get a "may be" warning when we'd have seen an "is" warning later. */
1057 execute_early_warn_uninitialized ();
1060 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
1061 warn_uninitialized_phi (phi);
1065 gate_warn_uninitialized (void)
1067 return warn_uninitialized != 0;
1070 struct tree_opt_pass pass_early_warn_uninitialized =
1073 gate_warn_uninitialized, /* gate */
1074 execute_early_warn_uninitialized, /* execute */
1077 0, /* static_pass_number */
1079 PROP_ssa, /* properties_required */
1080 0, /* properties_provided */
1081 0, /* properties_destroyed */
1082 0, /* todo_flags_start */
1083 0 /* todo_flags_finish */
1086 struct tree_opt_pass pass_late_warn_uninitialized =
1089 gate_warn_uninitialized, /* gate */
1090 execute_late_warn_uninitialized, /* execute */
1093 0, /* static_pass_number */
1095 PROP_ssa, /* properties_required */
1096 0, /* properties_provided */
1097 0, /* properties_destroyed */
1098 0, /* todo_flags_start */
1099 0 /* todo_flags_finish */