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
= PHI_CHAIN (phi
);
62 remove_phi_arg (phi
, e
->src
);
68 /* Remove the corresponding arguments from the PHI nodes in E's
69 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
= PHI_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 SSA_NAME is malformed and mark it visited.
107 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
111 verify_ssa_name (tree ssa_name
, bool is_virtual
)
113 TREE_VISITED (ssa_name
) = 1;
115 if (TREE_CODE (ssa_name
) != SSA_NAME
)
117 error ("Expected an SSA_NAME object");
121 if (TREE_TYPE (ssa_name
) != TREE_TYPE (SSA_NAME_VAR (ssa_name
)))
123 error ("Type mismatch between an SSA_NAME and its symbol.");
127 if (SSA_NAME_IN_FREE_LIST (ssa_name
))
129 error ("Found an SSA_NAME that had been released into the free pool");
133 if (is_virtual
&& is_gimple_reg (ssa_name
))
135 error ("Found a virtual definition for a GIMPLE register");
139 if (!is_virtual
&& !is_gimple_reg (ssa_name
))
141 error ("Found a real definition for a non-register");
149 /* Return true if the definition of SSA_NAME at block BB is malformed.
151 STMT is the statement where SSA_NAME is created.
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.
158 IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
162 verify_def (basic_block bb
, basic_block
*definition_block
, tree ssa_name
,
163 tree stmt
, bool is_virtual
)
165 if (verify_ssa_name (ssa_name
, is_virtual
))
168 if (definition_block
[SSA_NAME_VERSION (ssa_name
)])
170 error ("SSA_NAME created in two different blocks %i and %i",
171 definition_block
[SSA_NAME_VERSION (ssa_name
)]->index
, bb
->index
);
175 definition_block
[SSA_NAME_VERSION (ssa_name
)] = bb
;
177 if (SSA_NAME_DEF_STMT (ssa_name
) != stmt
)
179 error ("SSA_NAME_DEF_STMT is wrong");
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
);
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
);
199 /* Return true if the use of SSA_NAME at statement STMT in block BB is
202 DEF_BB is the block where SSA_NAME was found to be created.
204 IDOM contains immediate dominator information for the flowgraph.
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
210 IS_VIRTUAL is true if SSA_NAME is created by a V_MAY_DEF or a
214 verify_use (basic_block bb
, basic_block def_bb
, tree ssa_name
,
215 tree stmt
, bool check_abnormal
, bool is_virtual
)
219 err
= verify_ssa_name (ssa_name
, is_virtual
);
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. */
226 error ("Missing definition");
229 else if (bb
!= def_bb
230 && !dominated_by_p (CDI_DOMINATORS
, bb
, def_bb
))
232 error ("Definition in block %i does not dominate use in block %i",
233 def_bb
->index
, bb
->index
);
238 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name
))
240 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
246 fprintf (stderr
, "for SSA_NAME: ");
247 debug_generic_expr (ssa_name
);
248 fprintf (stderr
, "in statement:\n");
249 debug_generic_stmt (stmt
);
256 /* Return true if any of the arguments for PHI node PHI at block BB is
259 IDOM contains immediate dominator information for the flowgraph.
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. */
266 verify_phi_args (tree phi
, basic_block bb
, basic_block
*definition_block
)
270 int i
, phi_num_args
= PHI_NUM_ARGS (phi
);
272 /* Mark all the incoming edges. */
273 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
276 for (i
= 0; i
< phi_num_args
; i
++)
278 tree op
= PHI_ARG_DEF (phi
, i
);
280 e
= PHI_ARG_EDGE (phi
, i
);
282 if (TREE_CODE (op
) == SSA_NAME
)
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
)));
289 error ("Wrong edge %d->%d for PHI argument\n",
290 e
->src
->index
, e
->dest
->index
, bb
->index
);
294 if (e
->aux
== (void *) 0)
296 error ("PHI argument flowing through dead edge %d->%d\n",
297 e
->src
->index
, e
->dest
->index
);
301 if (e
->aux
== (void *) 2)
303 error ("PHI argument duplicated for edge %d->%d\n", e
->src
->index
,
310 fprintf (stderr
, "PHI argument\n");
311 debug_generic_stmt (op
);
318 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
320 if (e
->aux
!= (void *) 2)
322 error ("No argument flowing through edge %d->%d\n", e
->src
->index
,
333 fprintf (stderr
, "for PHI node\n");
334 debug_generic_stmt (phi
);
343 verify_flow_insensitive_alias_info (void)
347 bitmap visited
= BITMAP_XMALLOC ();
349 for (i
= 0; i
< num_referenced_vars
; i
++)
353 varray_type may_aliases
;
355 var
= referenced_var (i
);
357 may_aliases
= ann
->may_aliases
;
359 for (j
= 0; may_aliases
&& j
< VARRAY_ACTIVE_SIZE (may_aliases
); j
++)
361 tree alias
= VARRAY_TREE (may_aliases
, j
);
363 bitmap_set_bit (visited
, var_ann (alias
)->uid
);
365 if (!may_be_aliased (alias
))
367 error ("Non-addressable variable inside an alias set.");
368 debug_variable (alias
);
374 for (i
= 0; i
< num_referenced_vars
; i
++)
378 var
= referenced_var (i
);
381 if (ann
->mem_tag_kind
== NOT_A_TAG
383 && !bitmap_bit_p (visited
, ann
->uid
))
385 error ("Addressable variable that is an alias tag but is not in any alias set.");
390 BITMAP_XFREE (visited
);
394 debug_variable (var
);
395 internal_error ("verify_flow_insensitive_alias_info failed.");
400 verify_flow_sensitive_alias_info (void)
405 for (i
= 1; i
< num_ssa_names
; i
++)
408 struct ptr_info_def
*pi
;
411 ann
= var_ann (SSA_NAME_VAR (ptr
));
412 pi
= SSA_NAME_PTR_INFO (ptr
);
414 /* We only care for pointers that are actually referenced in the
416 if (!TREE_VISITED (ptr
) || !POINTER_TYPE_P (TREE_TYPE (ptr
)))
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
))
430 if (pi
->is_dereferenced
&& !pi
->name_mem_tag
&& !ann
->type_mem_tag
)
432 error ("Dereferenced pointers should have a name or a type tag");
436 if (pi
->pt_anything
&& (pi
->pt_malloc
|| pi
->pt_vars
))
438 error ("Pointers that point to anything should not point to malloc or other vars");
442 if (pi
->pt_malloc
&& pi
->pt_vars
)
444 error ("Pointers pointing to malloc get a unique tag and cannot point to other vars");
450 && (pi
->pt_vars
== NULL
451 || bitmap_first_set_bit (pi
->pt_vars
) < 0))
453 error ("Pointers with a memory tag, should have points-to sets or point to malloc");
457 if (pi
->value_escapes_p
459 && !is_call_clobbered (pi
->name_mem_tag
))
461 error ("Pointer escapes but its name tag is not call-clobbered.");
465 if (pi
->name_mem_tag
&& pi
->pt_vars
)
469 for (j
= i
+ 1; j
< num_ssa_names
; j
++)
471 tree ptr2
= ssa_name (j
);
472 struct ptr_info_def
*pi2
= SSA_NAME_PTR_INFO (ptr2
);
474 if (!TREE_VISITED (ptr2
) || !POINTER_TYPE_P (TREE_TYPE (ptr2
)))
480 && bitmap_first_set_bit (pi2
->pt_vars
) >= 0
481 && pi
->name_mem_tag
!= pi2
->name_mem_tag
482 && bitmap_equal_p (pi
->pt_vars
, pi2
->pt_vars
))
484 error ("Two pointers with different name tags and identical points-to sets");
485 debug_variable (ptr2
);
495 debug_variable (ptr
);
496 internal_error ("verify_flow_sensitive_alias_info failed.");
500 /* Verify the consistency of aliasing information. */
503 verify_alias_info (void)
505 verify_flow_sensitive_alias_info ();
506 verify_flow_insensitive_alias_info ();
510 /* Verify common invariants in the SSA web.
511 TODO: verify the variable annotations. */
518 basic_block
*definition_block
= xcalloc (num_ssa_names
, sizeof (basic_block
));
520 timevar_push (TV_TREE_SSA_VERIFY
);
522 /* Keep track of SSA names present in the IL. */
523 for (i
= 1; i
< num_ssa_names
; i
++)
524 TREE_VISITED (ssa_name (i
)) = 0;
526 calculate_dominance_info (CDI_DOMINATORS
);
528 /* Verify and register all the SSA_NAME definitions found in the
533 block_stmt_iterator bsi
;
535 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
536 if (verify_def (bb
, definition_block
, PHI_RESULT (phi
), phi
,
537 !is_gimple_reg (PHI_RESULT (phi
))))
540 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
545 v_may_def_optype v_may_defs
;
546 v_must_def_optype v_must_defs
;
549 stmt
= bsi_stmt (bsi
);
550 ann
= stmt_ann (stmt
);
551 get_stmt_operands (stmt
);
553 v_may_defs
= V_MAY_DEF_OPS (ann
);
554 if (ann
->makes_aliased_stores
&& NUM_V_MAY_DEFS (v_may_defs
) == 0)
556 error ("Statement makes aliased stores, but has no V_MAY_DEFS");
557 debug_generic_stmt (stmt
);
561 for (j
= 0; j
< NUM_V_MAY_DEFS (v_may_defs
); j
++)
563 tree op
= V_MAY_DEF_RESULT (v_may_defs
, j
);
564 if (verify_def (bb
, definition_block
, op
, stmt
, true))
568 v_must_defs
= STMT_V_MUST_DEF_OPS (stmt
);
569 for (j
= 0; j
< NUM_V_MUST_DEFS (v_must_defs
); j
++)
571 tree op
= V_MUST_DEF_OP (v_must_defs
, j
);
572 if (verify_def (bb
, definition_block
, op
, stmt
, true))
576 defs
= DEF_OPS (ann
);
577 for (j
= 0; j
< NUM_DEFS (defs
); j
++)
579 tree op
= DEF_OP (defs
, j
);
580 if (verify_def (bb
, definition_block
, op
, stmt
, false))
587 /* Now verify all the uses and make sure they agree with the definitions
588 found in the previous pass. */
593 block_stmt_iterator bsi
;
595 /* Make sure that all edges have a clear 'aux' field. */
596 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
600 error ("AUX pointer initialized for edge %d->%d\n", e
->src
->index
,
606 /* Verify the arguments for every PHI node in the block. */
607 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
608 if (verify_phi_args (phi
, bb
, definition_block
))
611 /* Now verify all the uses and vuses in every statement of the block. */
612 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
614 tree stmt
= bsi_stmt (bsi
);
615 stmt_ann_t ann
= stmt_ann (stmt
);
618 v_may_def_optype v_may_defs
;
621 vuses
= VUSE_OPS (ann
);
622 for (j
= 0; j
< NUM_VUSES (vuses
); j
++)
624 tree op
= VUSE_OP (vuses
, j
);
625 if (verify_use (bb
, definition_block
[SSA_NAME_VERSION (op
)],
626 op
, stmt
, false, true))
630 v_may_defs
= V_MAY_DEF_OPS (ann
);
631 for (j
= 0; j
< NUM_V_MAY_DEFS (v_may_defs
); j
++)
633 tree op
= V_MAY_DEF_OP (v_may_defs
, j
);
634 if (verify_use (bb
, definition_block
[SSA_NAME_VERSION (op
)],
635 op
, stmt
, false, true))
639 uses
= USE_OPS (ann
);
640 for (j
= 0; j
< NUM_USES (uses
); j
++)
642 tree op
= USE_OP (uses
, j
);
643 if (verify_use (bb
, definition_block
[SSA_NAME_VERSION (op
)],
644 op
, stmt
, false, false))
650 /* Finally, verify alias information. */
651 verify_alias_info ();
653 free (definition_block
);
654 timevar_pop (TV_TREE_SSA_VERIFY
);
658 internal_error ("verify_ssa failed.");
662 /* Initialize global DFA and SSA structures. */
667 VARRAY_TREE_INIT (referenced_vars
, 20, "referenced_vars");
668 call_clobbered_vars
= BITMAP_XMALLOC ();
669 addressable_vars
= BITMAP_XMALLOC ();
670 init_ssa_operands ();
673 global_var
= NULL_TREE
;
677 /* Deallocate memory associated with SSA data structures for FNDECL. */
680 delete_tree_ssa (void)
684 block_stmt_iterator bsi
;
686 /* Remove annotations from every tree in the function. */
688 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
689 bsi_stmt (bsi
)->common
.ann
= NULL
;
691 /* Remove annotations from every referenced variable. */
694 for (i
= 0; i
< num_referenced_vars
; i
++)
695 referenced_var (i
)->common
.ann
= NULL
;
696 referenced_vars
= NULL
;
701 fini_ssa_operands ();
703 global_var
= NULL_TREE
;
704 BITMAP_XFREE (call_clobbered_vars
);
705 call_clobbered_vars
= NULL
;
706 BITMAP_XFREE (addressable_vars
);
707 addressable_vars
= NULL
;
711 /* Return true if EXPR is a useless type conversion, otherwise return
715 tree_ssa_useless_type_conversion_1 (tree outer_type
, tree inner_type
)
717 /* If the inner and outer types are effectively the same, then
718 strip the type conversion and enter the equivalence into
720 if (inner_type
== outer_type
721 || (lang_hooks
.types_compatible_p (inner_type
, outer_type
)))
724 /* If both types are pointers and the outer type is a (void *), then
725 the conversion is not necessary. The opposite is not true since
726 that conversion would result in a loss of information if the
727 equivalence was used. Consider an indirect function call where
728 we need to know the exact type of the function to correctly
729 implement the ABI. */
730 else if (POINTER_TYPE_P (inner_type
)
731 && POINTER_TYPE_P (outer_type
)
732 && TREE_CODE (TREE_TYPE (outer_type
)) == VOID_TYPE
)
735 /* Pointers and references are equivalent once we get to GENERIC,
736 so strip conversions that just switch between them. */
737 else if (POINTER_TYPE_P (inner_type
)
738 && POINTER_TYPE_P (outer_type
)
739 && lang_hooks
.types_compatible_p (TREE_TYPE (inner_type
),
740 TREE_TYPE (outer_type
)))
743 /* If both the inner and outer types are integral types, then the
744 conversion is not necessary if they have the same mode and
745 signedness and precision, and both or neither are boolean. Some
746 code assumes an invariant that boolean types stay boolean and do
747 not become 1-bit bit-field types. Note that types with precision
748 not using all bits of the mode (such as bit-field types in C)
749 mean that testing of precision is necessary. */
750 else if (INTEGRAL_TYPE_P (inner_type
)
751 && INTEGRAL_TYPE_P (outer_type
)
752 && TYPE_MODE (inner_type
) == TYPE_MODE (outer_type
)
753 && TYPE_UNSIGNED (inner_type
) == TYPE_UNSIGNED (outer_type
)
754 && TYPE_PRECISION (inner_type
) == TYPE_PRECISION (outer_type
))
756 bool first_boolean
= (TREE_CODE (inner_type
) == BOOLEAN_TYPE
);
757 bool second_boolean
= (TREE_CODE (outer_type
) == BOOLEAN_TYPE
);
758 if (first_boolean
== second_boolean
)
762 /* Recurse for complex types. */
763 else if (TREE_CODE (inner_type
) == COMPLEX_TYPE
764 && TREE_CODE (outer_type
) == COMPLEX_TYPE
765 && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type
),
766 TREE_TYPE (inner_type
)))
772 /* Return true if EXPR is a useless type conversion, otherwise return
776 tree_ssa_useless_type_conversion (tree expr
)
778 /* If we have an assignment that merely uses a NOP_EXPR to change
779 the top of the RHS to the type of the LHS and the type conversion
780 is "safe", then strip away the type conversion so that we can
781 enter LHS = RHS into the const_and_copies table. */
782 if (TREE_CODE (expr
) == NOP_EXPR
|| TREE_CODE (expr
) == CONVERT_EXPR
783 || TREE_CODE (expr
) == VIEW_CONVERT_EXPR
784 || TREE_CODE (expr
) == NON_LVALUE_EXPR
)
785 return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr
),
786 TREE_TYPE (TREE_OPERAND (expr
,
794 /* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
795 described in walk_use_def_chains.
797 VISITED is a bitmap used to mark visited SSA_NAMEs to avoid
800 IS_DFS is true if the caller wants to perform a depth-first search
801 when visiting PHI nodes. A DFS will visit each PHI argument and
802 call FN after each one. Otherwise, all the arguments are
803 visited first and then FN is called with each of the visited
804 arguments in a separate pass. */
807 walk_use_def_chains_1 (tree var
, walk_use_def_chains_fn fn
, void *data
,
808 bitmap visited
, bool is_dfs
)
812 if (bitmap_bit_p (visited
, SSA_NAME_VERSION (var
)))
815 bitmap_set_bit (visited
, SSA_NAME_VERSION (var
));
817 def_stmt
= SSA_NAME_DEF_STMT (var
);
819 if (TREE_CODE (def_stmt
) != PHI_NODE
)
821 /* If we reached the end of the use-def chain, call FN. */
822 return fn (var
, def_stmt
, data
);
828 /* When doing a breadth-first search, call FN before following the
829 use-def links for each argument. */
831 for (i
= 0; i
< PHI_NUM_ARGS (def_stmt
); i
++)
832 if (fn (PHI_ARG_DEF (def_stmt
, i
), def_stmt
, data
))
835 /* Follow use-def links out of each PHI argument. */
836 for (i
= 0; i
< PHI_NUM_ARGS (def_stmt
); i
++)
838 tree arg
= PHI_ARG_DEF (def_stmt
, i
);
839 if (TREE_CODE (arg
) == SSA_NAME
840 && walk_use_def_chains_1 (arg
, fn
, data
, visited
, is_dfs
))
844 /* When doing a depth-first search, call FN after following the
845 use-def links for each argument. */
847 for (i
= 0; i
< PHI_NUM_ARGS (def_stmt
); i
++)
848 if (fn (PHI_ARG_DEF (def_stmt
, i
), def_stmt
, data
))
857 /* Walk use-def chains starting at the SSA variable VAR. Call
858 function FN at each reaching definition found. FN takes three
859 arguments: VAR, its defining statement (DEF_STMT) and a generic
860 pointer to whatever state information that FN may want to maintain
861 (DATA). FN is able to stop the walk by returning true, otherwise
862 in order to continue the walk, FN should return false.
864 Note, that if DEF_STMT is a PHI node, the semantics are slightly
865 different. The first argument to FN is no longer the original
866 variable VAR, but the PHI argument currently being examined. If FN
867 wants to get at VAR, it should call PHI_RESULT (PHI).
869 If IS_DFS is true, this function will:
871 1- walk the use-def chains for all the PHI arguments, and,
872 2- call (*FN) (ARG, PHI, DATA) on all the PHI arguments.
874 If IS_DFS is false, the two steps above are done in reverse order
875 (i.e., a breadth-first search). */
879 walk_use_def_chains (tree var
, walk_use_def_chains_fn fn
, void *data
,
884 #if defined ENABLE_CHECKING
885 if (TREE_CODE (var
) != SSA_NAME
)
889 def_stmt
= SSA_NAME_DEF_STMT (var
);
891 /* We only need to recurse if the reaching definition comes from a PHI
893 if (TREE_CODE (def_stmt
) != PHI_NODE
)
894 (*fn
) (var
, def_stmt
, data
);
897 bitmap visited
= BITMAP_XMALLOC ();
898 walk_use_def_chains_1 (var
, fn
, data
, visited
, is_dfs
);
899 BITMAP_XFREE (visited
);
904 /* Replaces VAR with REPL in memory reference expression *X in
908 propagate_into_addr (tree stmt
, tree var
, tree
*x
, tree repl
)
910 tree new_var
, ass_stmt
, addr_var
;
912 block_stmt_iterator bsi
;
914 /* There is nothing special to handle in the other cases. */
915 if (TREE_CODE (repl
) != ADDR_EXPR
)
917 addr_var
= TREE_OPERAND (repl
, 0);
919 while (TREE_CODE (*x
) == ARRAY_REF
920 || TREE_CODE (*x
) == COMPONENT_REF
921 || TREE_CODE (*x
) == BIT_FIELD_REF
)
922 x
= &TREE_OPERAND (*x
, 0);
924 if (TREE_CODE (*x
) != INDIRECT_REF
925 || TREE_OPERAND (*x
, 0) != var
)
929 if (TREE_TYPE (*x
) == TREE_TYPE (addr_var
))
932 mark_new_vars_to_rename (stmt
, vars_to_rename
);
936 /* Frontends sometimes produce expressions like *&a instead of a[0].
937 Create a temporary variable to handle this case. */
938 ass_stmt
= build2 (MODIFY_EXPR
, void_type_node
, NULL_TREE
, repl
);
939 new_var
= duplicate_ssa_name (var
, ass_stmt
);
940 TREE_OPERAND (*x
, 0) = new_var
;
941 TREE_OPERAND (ass_stmt
, 0) = new_var
;
943 bb
= bb_for_stmt (stmt
);
944 tree_block_label (bb
);
945 bsi
= bsi_after_labels (bb
);
946 bsi_insert_after (&bsi
, ass_stmt
, BSI_NEW_STMT
);
948 mark_new_vars_to_rename (stmt
, vars_to_rename
);
951 /* Replaces immediate uses of VAR by REPL. */
954 replace_immediate_uses (tree var
, tree repl
)
958 v_may_def_optype v_may_defs
;
965 df
= get_immediate_uses (SSA_NAME_DEF_STMT (var
));
966 n
= num_immediate_uses (df
);
968 for (i
= 0; i
< n
; i
++)
970 stmt
= immediate_use (df
, i
);
971 ann
= stmt_ann (stmt
);
973 if (TREE_CODE (stmt
) == PHI_NODE
)
975 for (j
= 0; j
< PHI_NUM_ARGS (stmt
); j
++)
976 if (PHI_ARG_DEF (stmt
, j
) == var
)
978 SET_PHI_ARG_DEF (stmt
, j
, repl
);
979 if (TREE_CODE (repl
) == SSA_NAME
980 && PHI_ARG_EDGE (stmt
, j
)->flags
& EDGE_ABNORMAL
)
981 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl
) = 1;
987 get_stmt_operands (stmt
);
988 mark_new_vars
= false;
989 if (is_gimple_reg (SSA_NAME_VAR (var
)))
991 if (TREE_CODE (stmt
) == MODIFY_EXPR
)
993 propagate_into_addr (stmt
, var
, &TREE_OPERAND (stmt
, 0), repl
);
994 propagate_into_addr (stmt
, var
, &TREE_OPERAND (stmt
, 1), repl
);
997 uses
= USE_OPS (ann
);
998 for (j
= 0; j
< (int) NUM_USES (uses
); j
++)
999 if (USE_OP (uses
, j
) == var
)
1001 propagate_value (USE_OP_PTR (uses
, j
), repl
);
1002 mark_new_vars
= POINTER_TYPE_P (TREE_TYPE (repl
));
1007 vuses
= VUSE_OPS (ann
);
1008 for (j
= 0; j
< (int) NUM_VUSES (vuses
); j
++)
1009 if (VUSE_OP (vuses
, j
) == var
)
1010 propagate_value (VUSE_OP_PTR (vuses
, j
), repl
);
1012 v_may_defs
= V_MAY_DEF_OPS (ann
);
1013 for (j
= 0; j
< (int) NUM_V_MAY_DEFS (v_may_defs
); j
++)
1014 if (V_MAY_DEF_OP (v_may_defs
, j
) == var
)
1015 propagate_value (V_MAY_DEF_OP_PTR (v_may_defs
, j
), repl
);
1018 /* If REPL is a pointer, it may have different memory tags associated
1019 with it. For instance, VAR may have had a name tag while REPL
1020 only had a type tag. In these cases, the virtual operands (if
1021 any) in the statement will refer to different symbols which need
1024 mark_new_vars_to_rename (stmt
, vars_to_rename
);
1030 /* Gets the value VAR is equivalent to according to EQ_TO. */
1033 get_eq_name (tree
*eq_to
, tree var
)
1038 while (TREE_CODE (val
) == SSA_NAME
)
1040 ver
= SSA_NAME_VERSION (val
);
1047 while (TREE_CODE (var
) == SSA_NAME
)
1049 ver
= SSA_NAME_VERSION (var
);
1060 /* Checks whether phi node PHI is redundant and if it is, records the ssa name
1061 its result is redundant to to EQ_TO array. */
1064 check_phi_redundancy (tree phi
, tree
*eq_to
)
1066 tree val
= NULL_TREE
, def
, res
= PHI_RESULT (phi
), stmt
;
1067 unsigned i
, ver
= SSA_NAME_VERSION (res
), n
;
1070 /* It is unlikely that such large phi node would be redundant. */
1071 if (PHI_NUM_ARGS (phi
) > 16)
1074 for (i
= 0; i
< (unsigned) PHI_NUM_ARGS (phi
); i
++)
1076 def
= PHI_ARG_DEF (phi
, i
);
1078 if (TREE_CODE (def
) == SSA_NAME
)
1080 def
= get_eq_name (eq_to
, def
);
1086 && !operand_equal_p (val
, def
, 0))
1092 /* At least one of the arguments should not be equal to the result, or
1093 something strange is happening. */
1097 if (get_eq_name (eq_to
, res
) == val
)
1100 if (!may_propagate_copy (res
, val
))
1105 df
= get_immediate_uses (SSA_NAME_DEF_STMT (res
));
1106 n
= num_immediate_uses (df
);
1108 for (i
= 0; i
< n
; i
++)
1110 stmt
= immediate_use (df
, i
);
1112 if (TREE_CODE (stmt
) == PHI_NODE
)
1113 check_phi_redundancy (stmt
, eq_to
);
1117 /* Removes redundant phi nodes.
1119 A redundant PHI node is a PHI node where all of its PHI arguments
1120 are the same value, excluding any PHI arguments which are the same
1123 A redundant PHI node is effectively a copy, so we forward copy propagate
1124 which removes all uses of the destination of the PHI node then
1125 finally we delete the redundant PHI node.
1127 Note that if we can not copy propagate the PHI node, then the PHI
1128 will not be removed. Thus we do not have to worry about dependencies
1129 between PHIs and the problems serializing PHIs into copies creates.
1131 The most important effect of this pass is to remove degenerate PHI
1132 nodes created by removing unreachable code. */
1135 kill_redundant_phi_nodes (void)
1138 unsigned i
, old_num_ssa_names
;
1140 tree phi
, var
, repl
, stmt
;
1142 /* The EQ_TO[VER] holds the value by that the ssa name VER should be
1143 replaced. If EQ_TO[VER] is ssa name and it is decided to replace it by
1144 other value, it may be necessary to follow the chain till the final value.
1145 We perform path shortening (replacing the entries of the EQ_TO array with
1146 heads of these chains) whenever we access the field to prevent quadratic
1147 complexity (probably would not occur in practice anyway, but let us play
1149 eq_to
= xcalloc (num_ssa_names
, sizeof (tree
));
1151 /* We have had cases where computing immediate uses takes a
1152 significant amount of compile time. If we run into such
1153 problems here, we may want to only compute immediate uses for
1154 a subset of all the SSA_NAMEs instead of computing it for
1155 all of the SSA_NAMEs. */
1156 compute_immediate_uses (TDFA_USE_OPS
| TDFA_USE_VOPS
, NULL
);
1157 old_num_ssa_names
= num_ssa_names
;
1161 for (phi
= phi_nodes (bb
); phi
; phi
= TREE_CHAIN (phi
))
1163 var
= PHI_RESULT (phi
);
1164 check_phi_redundancy (phi
, eq_to
);
1168 /* Now propagate the values. */
1169 for (i
= 0; i
< old_num_ssa_names
; i
++)
1174 repl
= get_eq_name (eq_to
, ssa_name (i
));
1175 if (repl
!= ssa_name (i
))
1176 replace_immediate_uses (ssa_name (i
), repl
);
1179 /* And remove the dead phis. */
1180 for (i
= 0; i
< old_num_ssa_names
; i
++)
1185 repl
= get_eq_name (eq_to
, ssa_name (i
));
1186 if (repl
!= ssa_name (i
))
1188 stmt
= SSA_NAME_DEF_STMT (ssa_name (i
));
1189 remove_phi_node (stmt
, NULL_TREE
, bb_for_stmt (stmt
));
1197 struct tree_opt_pass pass_redundant_phi
=
1199 "redphi", /* name */
1201 kill_redundant_phi_nodes
, /* execute */
1204 0, /* static_pass_number */
1206 PROP_cfg
| PROP_ssa
| PROP_alias
, /* properties_required */
1207 0, /* properties_provided */
1208 0, /* properties_destroyed */
1209 0, /* todo_flags_start */
1210 TODO_dump_func
| TODO_rename_vars
1211 | TODO_ggc_collect
| TODO_verify_ssa
/* todo_flags_finish */
1214 /* Emit warnings for uninitialized variables. This is done in two passes.
1216 The first pass notices real uses of SSA names with default definitions.
1217 Such uses are unconditionally uninitialized, and we can be certain that
1218 such a use is a mistake. This pass is run before most optimizations,
1219 so that we catch as many as we can.
1221 The second pass follows PHI nodes to find uses that are potentially
1222 uninitialized. In this case we can't necessarily prove that the use
1223 is really uninitialized. This pass is run after most optimizations,
1224 so that we thread as many jumps and possible, and delete as much dead
1225 code as possible, in order to reduce false positives. We also look
1226 again for plain uninitialized variables, since optimization may have
1227 changed conditionally uninitialized to unconditionally uninitialized. */
1229 /* Emit a warning for T, an SSA_NAME, being uninitialized. The exact
1230 warning text is in MSGID and LOCUS may contain a location or be null. */
1233 warn_uninit (tree t
, const char *msgid
, location_t
*locus
)
1235 tree var
= SSA_NAME_VAR (t
);
1236 tree def
= SSA_NAME_DEF_STMT (t
);
1238 /* Default uses (indicated by an empty definition statement),
1239 are uninitialized. */
1240 if (!IS_EMPTY_STMT (def
))
1243 /* Except for PARMs of course, which are always initialized. */
1244 if (TREE_CODE (var
) == PARM_DECL
)
1247 /* Hard register variables get their initial value from the ether. */
1248 if (DECL_HARD_REGISTER (var
))
1251 /* TREE_NO_WARNING either means we already warned, or the front end
1252 wishes to suppress the warning. */
1253 if (TREE_NO_WARNING (var
))
1257 locus
= &DECL_SOURCE_LOCATION (var
);
1258 warning (msgid
, locus
, var
);
1259 TREE_NO_WARNING (var
) = 1;
1262 /* Called via walk_tree, look for SSA_NAMEs that have empty definitions
1263 and warn about them. */
1266 warn_uninitialized_var (tree
*tp
, int *walk_subtrees
, void *data
)
1268 location_t
*locus
= data
;
1271 /* We only do data flow with SSA_NAMEs, so that's all we can warn about. */
1272 if (TREE_CODE (t
) == SSA_NAME
)
1274 warn_uninit (t
, "%H'%D' is used uninitialized in this function", locus
);
1277 else if (DECL_P (t
) || TYPE_P (t
))
1283 /* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1284 and warn about them. */
1287 warn_uninitialized_phi (tree phi
)
1289 int i
, n
= PHI_NUM_ARGS (phi
);
1291 /* Don't look at memory tags. */
1292 if (!is_gimple_reg (PHI_RESULT (phi
)))
1295 for (i
= 0; i
< n
; ++i
)
1297 tree op
= PHI_ARG_DEF (phi
, i
);
1298 if (TREE_CODE (op
) == SSA_NAME
)
1299 warn_uninit (op
, "%H'%D' may be used uninitialized in this function",
1305 execute_early_warn_uninitialized (void)
1307 block_stmt_iterator bsi
;
1311 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
1312 walk_tree (bsi_stmt_ptr (bsi
), warn_uninitialized_var
,
1313 EXPR_LOCUS (bsi_stmt (bsi
)), NULL
);
1317 execute_late_warn_uninitialized (void)
1322 /* Re-do the plain uninitialized variable check, as optimization may have
1323 straightened control flow. Do this first so that we don't accidentally
1324 get a "may be" warning when we'd have seen an "is" warning later. */
1325 execute_early_warn_uninitialized ();
1328 for (phi
= phi_nodes (bb
); phi
; phi
= PHI_CHAIN (phi
))
1329 warn_uninitialized_phi (phi
);
1333 gate_warn_uninitialized (void)
1335 return warn_uninitialized
!= 0;
1338 struct tree_opt_pass pass_early_warn_uninitialized
=
1341 gate_warn_uninitialized
, /* gate */
1342 execute_early_warn_uninitialized
, /* execute */
1345 0, /* static_pass_number */
1347 PROP_ssa
, /* properties_required */
1348 0, /* properties_provided */
1349 0, /* properties_destroyed */
1350 0, /* todo_flags_start */
1351 0 /* todo_flags_finish */
1354 struct tree_opt_pass pass_late_warn_uninitialized
=
1357 gate_warn_uninitialized
, /* gate */
1358 execute_late_warn_uninitialized
, /* execute */
1361 0, /* static_pass_number */
1363 PROP_ssa
, /* properties_required */
1364 0, /* properties_provided */
1365 0, /* properties_destroyed */
1366 0, /* todo_flags_start */
1367 0 /* todo_flags_finish */