1 /* Miscellaneous SSA utility functions.
2 Copyright (C) 2001-2015 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 3, 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 COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
27 #include "double-int.h"
34 #include "fold-const.h"
35 #include "stor-layout.h"
39 #include "langhooks.h"
41 #include "hard-reg-set.h"
44 #include "dominance.h"
46 #include "basic-block.h"
47 #include "gimple-pretty-print.h"
48 #include "tree-ssa-alias.h"
49 #include "internal-fn.h"
50 #include "gimple-fold.h"
51 #include "gimple-expr.h"
55 #include "gimple-iterator.h"
56 #include "gimple-walk.h"
57 #include "gimple-ssa.h"
58 #include "tree-phinodes.h"
59 #include "ssa-iterators.h"
60 #include "stringpool.h"
61 #include "tree-ssanames.h"
62 #include "tree-ssa-loop-manip.h"
63 #include "tree-into-ssa.h"
65 #include "tree-inline.h"
67 #include "tree-pass.h"
68 #include "diagnostic-core.h"
70 #include "cfgexpand.h"
72 /* Pointer map of variable mappings, keyed by edge. */
73 static hash_map
<edge
, auto_vec
<edge_var_map
> > *edge_var_maps
;
76 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
79 redirect_edge_var_map_add (edge e
, tree result
, tree def
, source_location locus
)
81 edge_var_map new_node
;
83 if (edge_var_maps
== NULL
)
84 edge_var_maps
= new hash_map
<edge
, auto_vec
<edge_var_map
> >;
86 auto_vec
<edge_var_map
> &slot
= edge_var_maps
->get_or_insert (e
);
88 new_node
.result
= result
;
89 new_node
.locus
= locus
;
91 slot
.safe_push (new_node
);
95 /* Clear the var mappings in edge E. */
98 redirect_edge_var_map_clear (edge e
)
103 auto_vec
<edge_var_map
> *head
= edge_var_maps
->get (e
);
110 /* Duplicate the redirected var mappings in OLDE in NEWE.
112 This assumes a hash_map can have multiple edges mapping to the same
113 var_map (many to one mapping), since we don't remove the previous mappings.
117 redirect_edge_var_map_dup (edge newe
, edge olde
)
122 auto_vec
<edge_var_map
> *new_head
= &edge_var_maps
->get_or_insert (newe
);
123 auto_vec
<edge_var_map
> *old_head
= edge_var_maps
->get (olde
);
127 new_head
->safe_splice (*old_head
);
131 /* Return the variable mappings for a given edge. If there is none, return
135 redirect_edge_var_map_vector (edge e
)
137 /* Hey, what kind of idiot would... you'd be surprised. */
141 auto_vec
<edge_var_map
> *slot
= edge_var_maps
->get (e
);
148 /* Clear the edge variable mappings. */
151 redirect_edge_var_map_destroy (void)
153 delete edge_var_maps
;
154 edge_var_maps
= NULL
;
158 /* Remove the corresponding arguments from the PHI nodes in E's
159 destination block and redirect it to DEST. Return redirected edge.
160 The list of removed arguments is stored in a vector accessed
161 through edge_var_maps. */
164 ssa_redirect_edge (edge e
, basic_block dest
)
169 redirect_edge_var_map_clear (e
);
171 /* Remove the appropriate PHI arguments in E's destination block. */
172 for (gsi
= gsi_start_phis (e
->dest
); !gsi_end_p (gsi
); gsi_next (&gsi
))
175 source_location locus
;
178 def
= gimple_phi_arg_def (phi
, e
->dest_idx
);
179 locus
= gimple_phi_arg_location (phi
, e
->dest_idx
);
181 if (def
== NULL_TREE
)
184 redirect_edge_var_map_add (e
, gimple_phi_result (phi
), def
, locus
);
187 e
= redirect_edge_succ_nodup (e
, dest
);
193 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
197 flush_pending_stmts (edge e
)
204 vec
<edge_var_map
> *v
= redirect_edge_var_map_vector (e
);
208 for (gsi
= gsi_start_phis (e
->dest
), i
= 0;
209 !gsi_end_p (gsi
) && v
->iterate (i
, &vm
);
210 gsi_next (&gsi
), i
++)
215 def
= redirect_edge_var_map_def (vm
);
216 add_phi_arg (phi
, def
, e
, redirect_edge_var_map_location (vm
));
219 redirect_edge_var_map_clear (e
);
222 /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
223 GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
224 expression with a different value.
226 This will update any annotations (say debug bind stmts) referring
227 to the original LHS, so that they use the RHS instead. This is
228 done even if NLHS and LHS are the same, for it is understood that
229 the RHS will be modified afterwards, and NLHS will not be assigned
232 Adjusting any non-annotation uses of the LHS, if needed, is a
233 responsibility of the caller.
235 The effect of this call should be pretty much the same as that of
236 inserting a copy of STMT before STMT, and then removing the
237 original stmt, at which time gsi_remove() would have update
238 annotations, but using this function saves all the inserting,
239 copying and removing. */
242 gimple_replace_ssa_lhs (gimple stmt
, tree nlhs
)
244 if (MAY_HAVE_DEBUG_STMTS
)
246 tree lhs
= gimple_get_lhs (stmt
);
248 gcc_assert (SSA_NAME_DEF_STMT (lhs
) == stmt
);
250 insert_debug_temp_for_var_def (NULL
, lhs
);
253 gimple_set_lhs (stmt
, nlhs
);
257 /* Given a tree for an expression for which we might want to emit
258 locations or values in debug information (generally a variable, but
259 we might deal with other kinds of trees in the future), return the
260 tree that should be used as the variable of a DEBUG_BIND STMT or
261 VAR_LOCATION INSN or NOTE. Return NULL if VAR is not to be tracked. */
264 target_for_debug_bind (tree var
)
266 if (!MAY_HAVE_DEBUG_STMTS
)
269 if (TREE_CODE (var
) == SSA_NAME
)
271 var
= SSA_NAME_VAR (var
);
272 if (var
== NULL_TREE
)
276 if ((TREE_CODE (var
) != VAR_DECL
277 || VAR_DECL_IS_VIRTUAL_OPERAND (var
))
278 && TREE_CODE (var
) != PARM_DECL
)
281 if (DECL_HAS_VALUE_EXPR_P (var
))
282 return target_for_debug_bind (DECL_VALUE_EXPR (var
));
284 if (DECL_IGNORED_P (var
))
287 /* var-tracking only tracks registers. */
288 if (!is_gimple_reg_type (TREE_TYPE (var
)))
294 /* Called via walk_tree, look for SSA_NAMEs that have already been
298 find_released_ssa_name (tree
*tp
, int *walk_subtrees
, void *data_
)
300 struct walk_stmt_info
*wi
= (struct walk_stmt_info
*) data_
;
302 if (wi
&& wi
->is_lhs
)
305 if (TREE_CODE (*tp
) == SSA_NAME
)
307 if (SSA_NAME_IN_FREE_LIST (*tp
))
312 else if (IS_TYPE_OR_DECL_P (*tp
))
318 /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced
319 by other DEBUG stmts, and replace uses of the DEF with the
320 newly-created debug temp. */
323 insert_debug_temp_for_var_def (gimple_stmt_iterator
*gsi
, tree var
)
325 imm_use_iterator imm_iter
;
328 gimple def_stmt
= NULL
;
332 if (!MAY_HAVE_DEBUG_STMTS
)
335 /* If this name has already been registered for replacement, do nothing
336 as anything that uses this name isn't in SSA form. */
337 if (name_registered_for_update_p (var
))
340 /* Check whether there are debug stmts that reference this variable and,
341 if there are, decide whether we should use a debug temp. */
342 FOR_EACH_IMM_USE_FAST (use_p
, imm_iter
, var
)
344 stmt
= USE_STMT (use_p
);
346 if (!gimple_debug_bind_p (stmt
))
352 if (gimple_debug_bind_get_value (stmt
) != var
)
354 /* Count this as an additional use, so as to make sure we
355 use a temp unless VAR's definition has a SINGLE_RHS that
366 def_stmt
= gsi_stmt (*gsi
);
368 def_stmt
= SSA_NAME_DEF_STMT (var
);
370 /* If we didn't get an insertion point, and the stmt has already
371 been removed, we won't be able to insert the debug bind stmt, so
372 we'll have to drop debug information. */
373 if (gimple_code (def_stmt
) == GIMPLE_PHI
)
375 value
= degenerate_phi_result (as_a
<gphi
*> (def_stmt
));
376 if (value
&& walk_tree (&value
, find_released_ssa_name
, NULL
, NULL
))
378 /* error_mark_node is what fixup_noreturn_call changes PHI arguments
380 else if (value
== error_mark_node
)
383 else if (is_gimple_assign (def_stmt
))
385 bool no_value
= false;
387 if (!dom_info_available_p (CDI_DOMINATORS
))
389 struct walk_stmt_info wi
;
391 memset (&wi
, 0, sizeof (wi
));
393 /* When removing blocks without following reverse dominance
394 order, we may sometimes encounter SSA_NAMEs that have
395 already been released, referenced in other SSA_DEFs that
396 we're about to release. Consider:
405 If we deleted BB X first, propagating the value of w_2
406 won't do us any good. It's too late to recover their
407 original definition of v_1: when it was deleted, it was
408 only referenced in other DEFs, it couldn't possibly know
409 it should have been retained, and propagating every
410 single DEF just in case it might have to be propagated
411 into a DEBUG STMT would probably be too wasteful.
413 When dominator information is not readily available, we
414 check for and accept some loss of debug information. But
415 if it is available, there's no excuse for us to remove
416 blocks in the wrong order, so we don't even check for
417 dead SSA NAMEs. SSA verification shall catch any
419 if ((!gsi
&& !gimple_bb (def_stmt
))
420 || walk_gimple_op (def_stmt
, find_released_ssa_name
, &wi
))
425 value
= gimple_assign_rhs_to_tree (def_stmt
);
430 /* If there's a single use of VAR, and VAR is the entire debug
431 expression (usecount would have been incremented again
432 otherwise), and the definition involves only constants and
433 SSA names, then we can propagate VALUE into this single use,
436 We can also avoid using a temp if VALUE can be shared and
437 propagated into all uses, without generating expressions that
438 wouldn't be valid gimple RHSs.
440 Other cases that would require unsharing or non-gimple RHSs
441 are deferred to a debug temp, although we could avoid temps
442 at the expense of duplication of expressions. */
444 if (CONSTANT_CLASS_P (value
)
445 || gimple_code (def_stmt
) == GIMPLE_PHI
447 && (!gimple_assign_single_p (def_stmt
)
448 || is_gimple_min_invariant (value
)))
449 || is_gimple_reg (value
))
454 tree vexpr
= make_node (DEBUG_EXPR_DECL
);
456 def_temp
= gimple_build_debug_bind (vexpr
,
457 unshare_expr (value
),
460 DECL_ARTIFICIAL (vexpr
) = 1;
461 TREE_TYPE (vexpr
) = TREE_TYPE (value
);
463 DECL_MODE (vexpr
) = DECL_MODE (value
);
465 DECL_MODE (vexpr
) = TYPE_MODE (TREE_TYPE (value
));
468 gsi_insert_before (gsi
, def_temp
, GSI_SAME_STMT
);
471 gimple_stmt_iterator ngsi
= gsi_for_stmt (def_stmt
);
472 gsi_insert_before (&ngsi
, def_temp
, GSI_SAME_STMT
);
479 FOR_EACH_IMM_USE_STMT (stmt
, imm_iter
, var
)
481 if (!gimple_debug_bind_p (stmt
))
486 FOR_EACH_IMM_USE_ON_STMT (use_p
, imm_iter
)
487 /* unshare_expr is not needed here. vexpr is either a
488 SINGLE_RHS, that can be safely shared, some other RHS
489 that was unshared when we found it had a single debug
490 use, or a DEBUG_EXPR_DECL, that can be safely
492 SET_USE (use_p
, unshare_expr (value
));
493 /* If we didn't replace uses with a debug decl fold the
494 resulting expression. Otherwise we end up with invalid IL. */
495 if (TREE_CODE (value
) != DEBUG_EXPR_DECL
)
497 gimple_stmt_iterator gsi
= gsi_for_stmt (stmt
);
498 fold_stmt_inplace (&gsi
);
502 gimple_debug_bind_reset_value (stmt
);
509 /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by
510 other DEBUG stmts, and replace uses of the DEF with the
511 newly-created debug temp. */
514 insert_debug_temps_for_defs (gimple_stmt_iterator
*gsi
)
520 if (!MAY_HAVE_DEBUG_STMTS
)
523 stmt
= gsi_stmt (*gsi
);
525 FOR_EACH_PHI_OR_STMT_DEF (def_p
, stmt
, op_iter
, SSA_OP_DEF
)
527 tree var
= DEF_FROM_PTR (def_p
);
529 if (TREE_CODE (var
) != SSA_NAME
)
532 insert_debug_temp_for_var_def (gsi
, var
);
536 /* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */
539 reset_debug_uses (gimple stmt
)
543 imm_use_iterator imm_iter
;
546 if (!MAY_HAVE_DEBUG_STMTS
)
549 FOR_EACH_PHI_OR_STMT_DEF (def_p
, stmt
, op_iter
, SSA_OP_DEF
)
551 tree var
= DEF_FROM_PTR (def_p
);
553 if (TREE_CODE (var
) != SSA_NAME
)
556 FOR_EACH_IMM_USE_STMT (use_stmt
, imm_iter
, var
)
558 if (!gimple_debug_bind_p (use_stmt
))
561 gimple_debug_bind_reset_value (use_stmt
);
562 update_stmt (use_stmt
);
567 /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
568 dominated stmts before their dominators, so that release_ssa_defs
569 stands a chance of propagating DEFs into debug bind stmts. */
572 release_defs_bitset (bitmap toremove
)
577 /* Performing a topological sort is probably overkill, this will
578 most likely run in slightly superlinear time, rather than the
579 pathological quadratic worst case. */
580 while (!bitmap_empty_p (toremove
))
581 EXECUTE_IF_SET_IN_BITMAP (toremove
, 0, j
, bi
)
583 bool remove_now
= true;
584 tree var
= ssa_name (j
);
586 imm_use_iterator uit
;
588 FOR_EACH_IMM_USE_STMT (stmt
, uit
, var
)
593 /* We can't propagate PHI nodes into debug stmts. */
594 if (gimple_code (stmt
) == GIMPLE_PHI
595 || is_gimple_debug (stmt
))
598 /* If we find another definition to remove that uses
599 the one we're looking at, defer the removal of this
600 one, so that it can be propagated into debug stmts
601 after the other is. */
602 FOR_EACH_SSA_DEF_OPERAND (def_p
, stmt
, dit
, SSA_OP_DEF
)
604 tree odef
= DEF_FROM_PTR (def_p
);
606 if (bitmap_bit_p (toremove
, SSA_NAME_VERSION (odef
)))
614 BREAK_FROM_IMM_USE_STMT (uit
);
619 gimple def
= SSA_NAME_DEF_STMT (var
);
620 gimple_stmt_iterator gsi
= gsi_for_stmt (def
);
622 if (gimple_code (def
) == GIMPLE_PHI
)
623 remove_phi_node (&gsi
, true);
626 gsi_remove (&gsi
, true);
630 bitmap_clear_bit (toremove
, j
);
635 /* Return true if SSA_NAME is malformed and mark it visited.
637 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
641 verify_ssa_name (tree ssa_name
, bool is_virtual
)
643 if (TREE_CODE (ssa_name
) != SSA_NAME
)
645 error ("expected an SSA_NAME object");
649 if (SSA_NAME_IN_FREE_LIST (ssa_name
))
651 error ("found an SSA_NAME that had been released into the free pool");
655 if (SSA_NAME_VAR (ssa_name
) != NULL_TREE
656 && TREE_TYPE (ssa_name
) != TREE_TYPE (SSA_NAME_VAR (ssa_name
)))
658 error ("type mismatch between an SSA_NAME and its symbol");
662 if (is_virtual
&& !virtual_operand_p (ssa_name
))
664 error ("found a virtual definition for a GIMPLE register");
668 if (is_virtual
&& SSA_NAME_VAR (ssa_name
) != gimple_vop (cfun
))
670 error ("virtual SSA name for non-VOP decl");
674 if (!is_virtual
&& virtual_operand_p (ssa_name
))
676 error ("found a real definition for a non-register");
680 if (SSA_NAME_IS_DEFAULT_DEF (ssa_name
)
681 && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name
)))
683 error ("found a default name with a non-empty defining statement");
691 /* Return true if the definition of SSA_NAME at block BB is malformed.
693 STMT is the statement where SSA_NAME is created.
695 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
696 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
697 it means that the block in that array slot contains the
698 definition of SSA_NAME.
700 IS_VIRTUAL is true if SSA_NAME is created by a VDEF. */
703 verify_def (basic_block bb
, basic_block
*definition_block
, tree ssa_name
,
704 gimple stmt
, bool is_virtual
)
706 if (verify_ssa_name (ssa_name
, is_virtual
))
709 if (SSA_NAME_VAR (ssa_name
)
710 && TREE_CODE (SSA_NAME_VAR (ssa_name
)) == RESULT_DECL
711 && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name
)))
713 error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
717 if (definition_block
[SSA_NAME_VERSION (ssa_name
)])
719 error ("SSA_NAME created in two different blocks %i and %i",
720 definition_block
[SSA_NAME_VERSION (ssa_name
)]->index
, bb
->index
);
724 definition_block
[SSA_NAME_VERSION (ssa_name
)] = bb
;
726 if (SSA_NAME_DEF_STMT (ssa_name
) != stmt
)
728 error ("SSA_NAME_DEF_STMT is wrong");
729 fprintf (stderr
, "Expected definition statement:\n");
730 print_gimple_stmt (stderr
, SSA_NAME_DEF_STMT (ssa_name
), 4, TDF_VOPS
);
731 fprintf (stderr
, "\nActual definition statement:\n");
732 print_gimple_stmt (stderr
, stmt
, 4, TDF_VOPS
);
739 fprintf (stderr
, "while verifying SSA_NAME ");
740 print_generic_expr (stderr
, ssa_name
, 0);
741 fprintf (stderr
, " in statement\n");
742 print_gimple_stmt (stderr
, stmt
, 4, TDF_VOPS
);
748 /* Return true if the use of SSA_NAME at statement STMT in block BB is
751 DEF_BB is the block where SSA_NAME was found to be created.
753 IDOM contains immediate dominator information for the flowgraph.
755 CHECK_ABNORMAL is true if the caller wants to check whether this use
756 is flowing through an abnormal edge (only used when checking PHI
759 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
760 that are defined before STMT in basic block BB. */
763 verify_use (basic_block bb
, basic_block def_bb
, use_operand_p use_p
,
764 gimple stmt
, bool check_abnormal
, bitmap names_defined_in_bb
)
767 tree ssa_name
= USE_FROM_PTR (use_p
);
769 if (!TREE_VISITED (ssa_name
))
770 if (verify_imm_links (stderr
, ssa_name
))
773 TREE_VISITED (ssa_name
) = 1;
775 if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name
))
776 && SSA_NAME_IS_DEFAULT_DEF (ssa_name
))
777 ; /* Default definitions have empty statements. Nothing to do. */
780 error ("missing definition");
783 else if (bb
!= def_bb
784 && !dominated_by_p (CDI_DOMINATORS
, bb
, def_bb
))
786 error ("definition in block %i does not dominate use in block %i",
787 def_bb
->index
, bb
->index
);
790 else if (bb
== def_bb
791 && names_defined_in_bb
!= NULL
792 && !bitmap_bit_p (names_defined_in_bb
, SSA_NAME_VERSION (ssa_name
)))
794 error ("definition in block %i follows the use", def_bb
->index
);
799 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name
))
801 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
805 /* Make sure the use is in an appropriate list by checking the previous
806 element to make sure it's the same. */
807 if (use_p
->prev
== NULL
)
809 error ("no immediate_use list");
815 if (use_p
->prev
->use
== NULL
)
816 listvar
= use_p
->prev
->loc
.ssa_name
;
818 listvar
= USE_FROM_PTR (use_p
->prev
);
819 if (listvar
!= ssa_name
)
821 error ("wrong immediate use list");
828 fprintf (stderr
, "for SSA_NAME: ");
829 print_generic_expr (stderr
, ssa_name
, TDF_VOPS
);
830 fprintf (stderr
, " in statement:\n");
831 print_gimple_stmt (stderr
, stmt
, 0, TDF_VOPS
);
838 /* Return true if any of the arguments for PHI node PHI at block BB is
841 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
842 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
843 it means that the block in that array slot contains the
844 definition of SSA_NAME. */
847 verify_phi_args (gphi
*phi
, basic_block bb
, basic_block
*definition_block
)
851 size_t i
, phi_num_args
= gimple_phi_num_args (phi
);
853 if (EDGE_COUNT (bb
->preds
) != phi_num_args
)
855 error ("incoming edge count does not match number of PHI arguments");
860 for (i
= 0; i
< phi_num_args
; i
++)
862 use_operand_p op_p
= gimple_phi_arg_imm_use_ptr (phi
, i
);
863 tree op
= USE_FROM_PTR (op_p
);
865 e
= EDGE_PRED (bb
, i
);
869 error ("PHI argument is missing for edge %d->%d",
876 if (TREE_CODE (op
) != SSA_NAME
&& !is_gimple_min_invariant (op
))
878 error ("PHI argument is not SSA_NAME, or invariant");
882 if (TREE_CODE (op
) == SSA_NAME
)
884 err
= verify_ssa_name (op
, virtual_operand_p (gimple_phi_result (phi
)));
885 err
|= verify_use (e
->src
, definition_block
[SSA_NAME_VERSION (op
)],
886 op_p
, phi
, e
->flags
& EDGE_ABNORMAL
, NULL
);
889 if (TREE_CODE (op
) == ADDR_EXPR
)
891 tree base
= TREE_OPERAND (op
, 0);
892 while (handled_component_p (base
))
893 base
= TREE_OPERAND (base
, 0);
894 if ((TREE_CODE (base
) == VAR_DECL
895 || TREE_CODE (base
) == PARM_DECL
896 || TREE_CODE (base
) == RESULT_DECL
)
897 && !TREE_ADDRESSABLE (base
))
899 error ("address taken, but ADDRESSABLE bit not set");
906 error ("wrong edge %d->%d for PHI argument",
907 e
->src
->index
, e
->dest
->index
);
913 fprintf (stderr
, "PHI argument\n");
914 print_generic_stmt (stderr
, op
, TDF_VOPS
);
922 fprintf (stderr
, "for PHI node\n");
923 print_gimple_stmt (stderr
, phi
, 0, TDF_VOPS
|TDF_MEMSYMS
);
931 /* Verify common invariants in the SSA web.
932 TODO: verify the variable annotations. */
935 verify_ssa (bool check_modified_stmt
, bool check_ssa_operands
)
939 basic_block
*definition_block
= XCNEWVEC (basic_block
, num_ssa_names
);
942 enum dom_state orig_dom_state
= dom_info_state (CDI_DOMINATORS
);
943 bitmap names_defined_in_bb
= BITMAP_ALLOC (NULL
);
945 gcc_assert (!need_ssa_update_p (cfun
));
947 timevar_push (TV_TREE_SSA_VERIFY
);
949 /* Keep track of SSA names present in the IL. */
950 for (i
= 1; i
< num_ssa_names
; i
++)
952 tree name
= ssa_name (i
);
956 TREE_VISITED (name
) = 0;
958 verify_ssa_name (name
, virtual_operand_p (name
));
960 stmt
= SSA_NAME_DEF_STMT (name
);
961 if (!gimple_nop_p (stmt
))
963 basic_block bb
= gimple_bb (stmt
);
964 if (verify_def (bb
, definition_block
,
965 name
, stmt
, virtual_operand_p (name
)))
971 calculate_dominance_info (CDI_DOMINATORS
);
973 /* Now verify all the uses and make sure they agree with the definitions
974 found in the previous pass. */
975 FOR_EACH_BB_FN (bb
, cfun
)
980 /* Make sure that all edges have a clear 'aux' field. */
981 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
985 error ("AUX pointer initialized for edge %d->%d", e
->src
->index
,
991 /* Verify the arguments for every PHI node in the block. */
992 for (gphi_iterator gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
994 gphi
*phi
= gsi
.phi ();
995 if (verify_phi_args (phi
, bb
, definition_block
))
998 bitmap_set_bit (names_defined_in_bb
,
999 SSA_NAME_VERSION (gimple_phi_result (phi
)));
1002 /* Now verify all the uses and vuses in every statement of the block. */
1003 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);
1006 gimple stmt
= gsi_stmt (gsi
);
1007 use_operand_p use_p
;
1009 if (check_modified_stmt
&& gimple_modified_p (stmt
))
1011 error ("stmt (%p) marked modified after optimization pass: ",
1013 print_gimple_stmt (stderr
, stmt
, 0, TDF_VOPS
);
1017 if (check_ssa_operands
&& verify_ssa_operands (cfun
, stmt
))
1019 print_gimple_stmt (stderr
, stmt
, 0, TDF_VOPS
);
1023 if (gimple_debug_bind_p (stmt
)
1024 && !gimple_debug_bind_has_value_p (stmt
))
1027 FOR_EACH_SSA_USE_OPERAND (use_p
, stmt
, iter
, SSA_OP_USE
|SSA_OP_VUSE
)
1029 op
= USE_FROM_PTR (use_p
);
1030 if (verify_use (bb
, definition_block
[SSA_NAME_VERSION (op
)],
1031 use_p
, stmt
, false, names_defined_in_bb
))
1035 FOR_EACH_SSA_TREE_OPERAND (op
, stmt
, iter
, SSA_OP_ALL_DEFS
)
1037 if (SSA_NAME_DEF_STMT (op
) != stmt
)
1039 error ("SSA_NAME_DEF_STMT is wrong");
1040 fprintf (stderr
, "Expected definition statement:\n");
1041 print_gimple_stmt (stderr
, stmt
, 4, TDF_VOPS
);
1042 fprintf (stderr
, "\nActual definition statement:\n");
1043 print_gimple_stmt (stderr
, SSA_NAME_DEF_STMT (op
),
1047 bitmap_set_bit (names_defined_in_bb
, SSA_NAME_VERSION (op
));
1051 bitmap_clear (names_defined_in_bb
);
1054 free (definition_block
);
1056 /* Restore the dominance information to its prior known state, so
1057 that we do not perturb the compiler's subsequent behavior. */
1058 if (orig_dom_state
== DOM_NONE
)
1059 free_dominance_info (CDI_DOMINATORS
);
1061 set_dom_info_availability (CDI_DOMINATORS
, orig_dom_state
);
1063 BITMAP_FREE (names_defined_in_bb
);
1064 timevar_pop (TV_TREE_SSA_VERIFY
);
1068 internal_error ("verify_ssa failed");
1072 /* Initialize global DFA and SSA structures. */
1075 init_tree_ssa (struct function
*fn
)
1077 fn
->gimple_df
= ggc_cleared_alloc
<gimple_df
> ();
1078 fn
->gimple_df
->default_defs
= hash_table
<ssa_name_hasher
>::create_ggc (20);
1079 pt_solution_reset (&fn
->gimple_df
->escaped
);
1080 init_ssanames (fn
, 0);
1083 /* Do the actions required to initialize internal data structures used
1084 in tree-ssa optimization passes. */
1087 execute_init_datastructures (void)
1089 /* Allocate hash tables, arrays and other structures. */
1090 gcc_assert (!cfun
->gimple_df
);
1091 init_tree_ssa (cfun
);
1097 const pass_data pass_data_init_datastructures
=
1099 GIMPLE_PASS
, /* type */
1100 "*init_datastructures", /* name */
1101 OPTGROUP_NONE
, /* optinfo_flags */
1102 TV_NONE
, /* tv_id */
1103 PROP_cfg
, /* properties_required */
1104 0, /* properties_provided */
1105 0, /* properties_destroyed */
1106 0, /* todo_flags_start */
1107 0, /* todo_flags_finish */
1110 class pass_init_datastructures
: public gimple_opt_pass
1113 pass_init_datastructures (gcc::context
*ctxt
)
1114 : gimple_opt_pass (pass_data_init_datastructures
, ctxt
)
1117 /* opt_pass methods: */
1118 virtual bool gate (function
*fun
)
1120 /* Do nothing for funcions that was produced already in SSA form. */
1121 return !(fun
->curr_properties
& PROP_ssa
);
1124 virtual unsigned int execute (function
*)
1126 return execute_init_datastructures ();
1129 }; // class pass_init_datastructures
1134 make_pass_init_datastructures (gcc::context
*ctxt
)
1136 return new pass_init_datastructures (ctxt
);
1139 /* Deallocate memory associated with SSA data structures for FNDECL. */
1142 delete_tree_ssa (void)
1146 /* We no longer maintain the SSA operand cache at this point. */
1147 if (ssa_operands_active (cfun
))
1148 fini_ssa_operands (cfun
);
1150 cfun
->gimple_df
->default_defs
->empty ();
1151 cfun
->gimple_df
->default_defs
= NULL
;
1152 pt_solution_reset (&cfun
->gimple_df
->escaped
);
1153 if (cfun
->gimple_df
->decls_to_pointers
!= NULL
)
1154 delete cfun
->gimple_df
->decls_to_pointers
;
1155 cfun
->gimple_df
->decls_to_pointers
= NULL
;
1156 cfun
->gimple_df
->modified_noreturn_calls
= NULL
;
1157 cfun
->gimple_df
= NULL
;
1159 /* We no longer need the edge variable maps. */
1160 redirect_edge_var_map_destroy ();
1163 /* Return true if EXPR is a useless type conversion, otherwise return
1167 tree_ssa_useless_type_conversion (tree expr
)
1169 /* If we have an assignment that merely uses a NOP_EXPR to change
1170 the top of the RHS to the type of the LHS and the type conversion
1171 is "safe", then strip away the type conversion so that we can
1172 enter LHS = RHS into the const_and_copies table. */
1173 if (CONVERT_EXPR_P (expr
)
1174 || TREE_CODE (expr
) == VIEW_CONVERT_EXPR
1175 || TREE_CODE (expr
) == NON_LVALUE_EXPR
)
1176 return useless_type_conversion_p
1178 TREE_TYPE (TREE_OPERAND (expr
, 0)));
1183 /* Strip conversions from EXP according to
1184 tree_ssa_useless_type_conversion and return the resulting
1188 tree_ssa_strip_useless_type_conversions (tree exp
)
1190 while (tree_ssa_useless_type_conversion (exp
))
1191 exp
= TREE_OPERAND (exp
, 0);
1196 /* Return true if T, an SSA_NAME, has an undefined value. PARTIAL is what
1197 should be returned if the value is only partially undefined. */
1200 ssa_undefined_value_p (tree t
, bool partial
)
1203 tree var
= SSA_NAME_VAR (t
);
1207 /* Parameters get their initial value from the function entry. */
1208 else if (TREE_CODE (var
) == PARM_DECL
)
1210 /* When returning by reference the return address is actually a hidden
1212 else if (TREE_CODE (var
) == RESULT_DECL
&& DECL_BY_REFERENCE (var
))
1214 /* Hard register variables get their initial value from the ether. */
1215 else if (TREE_CODE (var
) == VAR_DECL
&& DECL_HARD_REGISTER (var
))
1218 /* The value is undefined iff its definition statement is empty. */
1219 def_stmt
= SSA_NAME_DEF_STMT (t
);
1220 if (gimple_nop_p (def_stmt
))
1223 /* Check if the complex was not only partially defined. */
1224 if (partial
&& is_gimple_assign (def_stmt
)
1225 && gimple_assign_rhs_code (def_stmt
) == COMPLEX_EXPR
)
1229 rhs1
= gimple_assign_rhs1 (def_stmt
);
1230 rhs2
= gimple_assign_rhs2 (def_stmt
);
1231 return (TREE_CODE (rhs1
) == SSA_NAME
&& ssa_undefined_value_p (rhs1
))
1232 || (TREE_CODE (rhs2
) == SSA_NAME
&& ssa_undefined_value_p (rhs2
));
1238 /* If necessary, rewrite the base of the reference tree *TP from
1239 a MEM_REF to a plain or converted symbol. */
1242 maybe_rewrite_mem_ref_base (tree
*tp
, bitmap suitable_for_renaming
)
1246 while (handled_component_p (*tp
))
1247 tp
= &TREE_OPERAND (*tp
, 0);
1248 if (TREE_CODE (*tp
) == MEM_REF
1249 && TREE_CODE (TREE_OPERAND (*tp
, 0)) == ADDR_EXPR
1250 && (sym
= TREE_OPERAND (TREE_OPERAND (*tp
, 0), 0))
1252 && !TREE_ADDRESSABLE (sym
)
1253 && bitmap_bit_p (suitable_for_renaming
, DECL_UID (sym
)))
1255 if (TREE_CODE (TREE_TYPE (sym
)) == VECTOR_TYPE
1256 && useless_type_conversion_p (TREE_TYPE (*tp
),
1257 TREE_TYPE (TREE_TYPE (sym
)))
1258 && multiple_of_p (sizetype
, TREE_OPERAND (*tp
, 1),
1259 TYPE_SIZE_UNIT (TREE_TYPE (*tp
))))
1261 *tp
= build3 (BIT_FIELD_REF
, TREE_TYPE (*tp
), sym
,
1262 TYPE_SIZE (TREE_TYPE (*tp
)),
1263 int_const_binop (MULT_EXPR
,
1264 bitsize_int (BITS_PER_UNIT
),
1265 TREE_OPERAND (*tp
, 1)));
1267 else if (TREE_CODE (TREE_TYPE (sym
)) == COMPLEX_TYPE
1268 && useless_type_conversion_p (TREE_TYPE (*tp
),
1269 TREE_TYPE (TREE_TYPE (sym
))))
1271 *tp
= build1 (integer_zerop (TREE_OPERAND (*tp
, 1))
1272 ? REALPART_EXPR
: IMAGPART_EXPR
,
1273 TREE_TYPE (*tp
), sym
);
1275 else if (integer_zerop (TREE_OPERAND (*tp
, 1)))
1277 if (!useless_type_conversion_p (TREE_TYPE (*tp
),
1279 *tp
= build1 (VIEW_CONVERT_EXPR
,
1280 TREE_TYPE (*tp
), sym
);
1287 /* For a tree REF return its base if it is the base of a MEM_REF
1288 that cannot be rewritten into SSA form. Otherwise return NULL_TREE. */
1291 non_rewritable_mem_ref_base (tree ref
)
1295 /* A plain decl does not need it set. */
1299 while (handled_component_p (base
))
1300 base
= TREE_OPERAND (base
, 0);
1302 /* But watch out for MEM_REFs we cannot lower to a
1303 VIEW_CONVERT_EXPR or a BIT_FIELD_REF. */
1304 if (TREE_CODE (base
) == MEM_REF
1305 && TREE_CODE (TREE_OPERAND (base
, 0)) == ADDR_EXPR
)
1307 tree decl
= TREE_OPERAND (TREE_OPERAND (base
, 0), 0);
1308 if ((TREE_CODE (TREE_TYPE (decl
)) == VECTOR_TYPE
1309 || TREE_CODE (TREE_TYPE (decl
)) == COMPLEX_TYPE
)
1310 && useless_type_conversion_p (TREE_TYPE (base
),
1311 TREE_TYPE (TREE_TYPE (decl
)))
1312 && wi::fits_uhwi_p (mem_ref_offset (base
))
1313 && wi::gtu_p (wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl
))),
1314 mem_ref_offset (base
))
1315 && multiple_of_p (sizetype
, TREE_OPERAND (base
, 1),
1316 TYPE_SIZE_UNIT (TREE_TYPE (base
))))
1319 && (!integer_zerop (TREE_OPERAND (base
, 1))
1320 || (DECL_SIZE (decl
)
1321 != TYPE_SIZE (TREE_TYPE (base
)))
1322 || TREE_THIS_VOLATILE (decl
) != TREE_THIS_VOLATILE (base
)))
1329 /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1330 Otherwise return true. */
1333 non_rewritable_lvalue_p (tree lhs
)
1335 /* A plain decl is always rewritable. */
1339 /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
1340 a reasonably efficient manner... */
1341 if ((TREE_CODE (lhs
) == REALPART_EXPR
1342 || TREE_CODE (lhs
) == IMAGPART_EXPR
)
1343 && DECL_P (TREE_OPERAND (lhs
, 0)))
1346 /* A decl that is wrapped inside a MEM-REF that covers
1347 it full is also rewritable.
1348 ??? The following could be relaxed allowing component
1349 references that do not change the access size. */
1350 if (TREE_CODE (lhs
) == MEM_REF
1351 && TREE_CODE (TREE_OPERAND (lhs
, 0)) == ADDR_EXPR
1352 && integer_zerop (TREE_OPERAND (lhs
, 1)))
1354 tree decl
= TREE_OPERAND (TREE_OPERAND (lhs
, 0), 0);
1356 && DECL_SIZE (decl
) == TYPE_SIZE (TREE_TYPE (lhs
))
1357 && (TREE_THIS_VOLATILE (decl
) == TREE_THIS_VOLATILE (lhs
)))
1364 /* When possible, clear TREE_ADDRESSABLE bit or set DECL_GIMPLE_REG_P bit and
1365 mark the variable VAR for conversion into SSA. Return true when updating
1366 stmts is required. */
1369 maybe_optimize_var (tree var
, bitmap addresses_taken
, bitmap not_reg_needs
,
1370 bitmap suitable_for_renaming
)
1372 /* Global Variables, result decls cannot be changed. */
1373 if (is_global_var (var
)
1374 || TREE_CODE (var
) == RESULT_DECL
1375 || bitmap_bit_p (addresses_taken
, DECL_UID (var
)))
1378 if (TREE_ADDRESSABLE (var
)
1379 /* Do not change TREE_ADDRESSABLE if we need to preserve var as
1380 a non-register. Otherwise we are confused and forget to
1381 add virtual operands for it. */
1382 && (!is_gimple_reg_type (TREE_TYPE (var
))
1383 || TREE_CODE (TREE_TYPE (var
)) == VECTOR_TYPE
1384 || TREE_CODE (TREE_TYPE (var
)) == COMPLEX_TYPE
1385 || !bitmap_bit_p (not_reg_needs
, DECL_UID (var
))))
1387 TREE_ADDRESSABLE (var
) = 0;
1388 if (is_gimple_reg (var
))
1389 bitmap_set_bit (suitable_for_renaming
, DECL_UID (var
));
1392 fprintf (dump_file
, "No longer having address taken: ");
1393 print_generic_expr (dump_file
, var
, 0);
1394 fprintf (dump_file
, "\n");
1398 if (!DECL_GIMPLE_REG_P (var
)
1399 && !bitmap_bit_p (not_reg_needs
, DECL_UID (var
))
1400 && (TREE_CODE (TREE_TYPE (var
)) == COMPLEX_TYPE
1401 || TREE_CODE (TREE_TYPE (var
)) == VECTOR_TYPE
)
1402 && !TREE_THIS_VOLATILE (var
)
1403 && (TREE_CODE (var
) != VAR_DECL
|| !DECL_HARD_REGISTER (var
)))
1405 DECL_GIMPLE_REG_P (var
) = 1;
1406 bitmap_set_bit (suitable_for_renaming
, DECL_UID (var
));
1409 fprintf (dump_file
, "Now a gimple register: ");
1410 print_generic_expr (dump_file
, var
, 0);
1411 fprintf (dump_file
, "\n");
1416 /* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables. */
1419 execute_update_addresses_taken (void)
1422 bitmap addresses_taken
= BITMAP_ALLOC (NULL
);
1423 bitmap not_reg_needs
= BITMAP_ALLOC (NULL
);
1424 bitmap suitable_for_renaming
= BITMAP_ALLOC (NULL
);
1428 timevar_push (TV_ADDRESS_TAKEN
);
1430 /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1431 the function body. */
1432 FOR_EACH_BB_FN (bb
, cfun
)
1434 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);
1437 gimple stmt
= gsi_stmt (gsi
);
1438 enum gimple_code code
= gimple_code (stmt
);
1441 /* Note all addresses taken by the stmt. */
1442 gimple_ior_addresses_taken (addresses_taken
, stmt
);
1444 /* If we have a call or an assignment, see if the lhs contains
1445 a local decl that requires not to be a gimple register. */
1446 if (code
== GIMPLE_ASSIGN
|| code
== GIMPLE_CALL
)
1448 tree lhs
= gimple_get_lhs (stmt
);
1450 && TREE_CODE (lhs
) != SSA_NAME
1451 && non_rewritable_lvalue_p (lhs
))
1453 decl
= get_base_address (lhs
);
1455 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1459 if (gimple_assign_single_p (stmt
))
1461 tree rhs
= gimple_assign_rhs1 (stmt
);
1462 if ((decl
= non_rewritable_mem_ref_base (rhs
)))
1463 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1466 else if (code
== GIMPLE_CALL
)
1468 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
1470 tree arg
= gimple_call_arg (stmt
, i
);
1471 if ((decl
= non_rewritable_mem_ref_base (arg
)))
1472 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1476 else if (code
== GIMPLE_ASM
)
1478 gasm
*asm_stmt
= as_a
<gasm
*> (stmt
);
1479 for (i
= 0; i
< gimple_asm_noutputs (asm_stmt
); ++i
)
1481 tree link
= gimple_asm_output_op (asm_stmt
, i
);
1482 tree lhs
= TREE_VALUE (link
);
1483 if (TREE_CODE (lhs
) != SSA_NAME
)
1485 decl
= get_base_address (lhs
);
1487 && (non_rewritable_lvalue_p (lhs
)
1488 /* We cannot move required conversions from
1489 the lhs to the rhs in asm statements, so
1490 require we do not need any. */
1491 || !useless_type_conversion_p
1492 (TREE_TYPE (lhs
), TREE_TYPE (decl
))))
1493 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1496 for (i
= 0; i
< gimple_asm_ninputs (asm_stmt
); ++i
)
1498 tree link
= gimple_asm_input_op (asm_stmt
, i
);
1499 if ((decl
= non_rewritable_mem_ref_base (TREE_VALUE (link
))))
1500 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1505 for (gphi_iterator gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
);
1509 gphi
*phi
= gsi
.phi ();
1511 for (i
= 0; i
< gimple_phi_num_args (phi
); i
++)
1513 tree op
= PHI_ARG_DEF (phi
, i
), var
;
1514 if (TREE_CODE (op
) == ADDR_EXPR
1515 && (var
= get_base_address (TREE_OPERAND (op
, 0))) != NULL
1517 bitmap_set_bit (addresses_taken
, DECL_UID (var
));
1522 /* We cannot iterate over all referenced vars because that can contain
1523 unused vars from BLOCK trees, which causes code generation differences
1525 for (var
= DECL_ARGUMENTS (cfun
->decl
); var
; var
= DECL_CHAIN (var
))
1526 maybe_optimize_var (var
, addresses_taken
, not_reg_needs
,
1527 suitable_for_renaming
);
1529 FOR_EACH_VEC_SAFE_ELT (cfun
->local_decls
, i
, var
)
1530 maybe_optimize_var (var
, addresses_taken
, not_reg_needs
,
1531 suitable_for_renaming
);
1533 /* Operand caches need to be recomputed for operands referencing the updated
1534 variables and operands need to be rewritten to expose bare symbols. */
1535 if (!bitmap_empty_p (suitable_for_renaming
))
1537 FOR_EACH_BB_FN (bb
, cfun
)
1538 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);)
1540 gimple stmt
= gsi_stmt (gsi
);
1542 /* Re-write TARGET_MEM_REFs of symbols we want to
1543 rewrite into SSA form. */
1544 if (gimple_assign_single_p (stmt
))
1546 tree lhs
= gimple_assign_lhs (stmt
);
1547 tree rhs
, *rhsp
= gimple_assign_rhs1_ptr (stmt
);
1550 /* Rewrite LHS IMAG/REALPART_EXPR similar to
1551 gimplify_modify_expr_complex_part. */
1552 if ((TREE_CODE (lhs
) == IMAGPART_EXPR
1553 || TREE_CODE (lhs
) == REALPART_EXPR
)
1554 && DECL_P (TREE_OPERAND (lhs
, 0))
1555 && bitmap_bit_p (suitable_for_renaming
,
1556 DECL_UID (TREE_OPERAND (lhs
, 0))))
1558 tree other
= make_ssa_name (TREE_TYPE (lhs
));
1559 tree lrhs
= build1 (TREE_CODE (lhs
) == IMAGPART_EXPR
1560 ? REALPART_EXPR
: IMAGPART_EXPR
,
1562 TREE_OPERAND (lhs
, 0));
1563 gimple load
= gimple_build_assign (other
, lrhs
);
1564 location_t loc
= gimple_location (stmt
);
1565 gimple_set_location (load
, loc
);
1566 gimple_set_vuse (load
, gimple_vuse (stmt
));
1567 gsi_insert_before (&gsi
, load
, GSI_SAME_STMT
);
1568 gimple_assign_set_lhs (stmt
, TREE_OPERAND (lhs
, 0));
1569 gimple_assign_set_rhs_with_ops
1570 (&gsi
, COMPLEX_EXPR
,
1571 TREE_CODE (lhs
) == IMAGPART_EXPR
1572 ? other
: gimple_assign_rhs1 (stmt
),
1573 TREE_CODE (lhs
) == IMAGPART_EXPR
1574 ? gimple_assign_rhs1 (stmt
) : other
, NULL_TREE
);
1575 stmt
= gsi_stmt (gsi
);
1576 unlink_stmt_vdef (stmt
);
1581 /* We shouldn't have any fancy wrapping of
1582 component-refs on the LHS, but look through
1583 VIEW_CONVERT_EXPRs as that is easy. */
1584 while (TREE_CODE (lhs
) == VIEW_CONVERT_EXPR
)
1585 lhs
= TREE_OPERAND (lhs
, 0);
1586 if (TREE_CODE (lhs
) == MEM_REF
1587 && TREE_CODE (TREE_OPERAND (lhs
, 0)) == ADDR_EXPR
1588 && integer_zerop (TREE_OPERAND (lhs
, 1))
1589 && (sym
= TREE_OPERAND (TREE_OPERAND (lhs
, 0), 0))
1591 && !TREE_ADDRESSABLE (sym
)
1592 && bitmap_bit_p (suitable_for_renaming
, DECL_UID (sym
)))
1595 lhs
= gimple_assign_lhs (stmt
);
1597 /* Rewrite the RHS and make sure the resulting assignment
1598 is validly typed. */
1599 maybe_rewrite_mem_ref_base (rhsp
, suitable_for_renaming
);
1600 rhs
= gimple_assign_rhs1 (stmt
);
1601 if (gimple_assign_lhs (stmt
) != lhs
1602 && !useless_type_conversion_p (TREE_TYPE (lhs
),
1604 rhs
= fold_build1 (VIEW_CONVERT_EXPR
,
1605 TREE_TYPE (lhs
), rhs
);
1607 if (gimple_assign_lhs (stmt
) != lhs
)
1608 gimple_assign_set_lhs (stmt
, lhs
);
1610 if (gimple_assign_rhs1 (stmt
) != rhs
)
1612 gimple_stmt_iterator gsi
= gsi_for_stmt (stmt
);
1613 gimple_assign_set_rhs_from_tree (&gsi
, rhs
);
1617 else if (gimple_code (stmt
) == GIMPLE_CALL
)
1620 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
1622 tree
*argp
= gimple_call_arg_ptr (stmt
, i
);
1623 maybe_rewrite_mem_ref_base (argp
, suitable_for_renaming
);
1627 else if (gimple_code (stmt
) == GIMPLE_ASM
)
1629 gasm
*asm_stmt
= as_a
<gasm
*> (stmt
);
1631 for (i
= 0; i
< gimple_asm_noutputs (asm_stmt
); ++i
)
1633 tree link
= gimple_asm_output_op (asm_stmt
, i
);
1634 maybe_rewrite_mem_ref_base (&TREE_VALUE (link
),
1635 suitable_for_renaming
);
1637 for (i
= 0; i
< gimple_asm_ninputs (asm_stmt
); ++i
)
1639 tree link
= gimple_asm_input_op (asm_stmt
, i
);
1640 maybe_rewrite_mem_ref_base (&TREE_VALUE (link
),
1641 suitable_for_renaming
);
1645 else if (gimple_debug_bind_p (stmt
)
1646 && gimple_debug_bind_has_value_p (stmt
))
1648 tree
*valuep
= gimple_debug_bind_get_value_ptr (stmt
);
1650 maybe_rewrite_mem_ref_base (valuep
, suitable_for_renaming
);
1651 decl
= non_rewritable_mem_ref_base (*valuep
);
1653 && bitmap_bit_p (suitable_for_renaming
, DECL_UID (decl
)))
1654 gimple_debug_bind_reset_value (stmt
);
1657 if (gimple_references_memory_p (stmt
)
1658 || is_gimple_debug (stmt
))
1664 /* Update SSA form here, we are called as non-pass as well. */
1665 if (number_of_loops (cfun
) > 1
1666 && loops_state_satisfies_p (LOOP_CLOSED_SSA
))
1667 rewrite_into_loop_closed_ssa (NULL
, TODO_update_ssa
);
1669 update_ssa (TODO_update_ssa
);
1672 BITMAP_FREE (not_reg_needs
);
1673 BITMAP_FREE (addresses_taken
);
1674 BITMAP_FREE (suitable_for_renaming
);
1675 timevar_pop (TV_ADDRESS_TAKEN
);
1680 const pass_data pass_data_update_address_taken
=
1682 GIMPLE_PASS
, /* type */
1683 "addressables", /* name */
1684 OPTGROUP_NONE
, /* optinfo_flags */
1685 TV_ADDRESS_TAKEN
, /* tv_id */
1686 PROP_ssa
, /* properties_required */
1687 0, /* properties_provided */
1688 0, /* properties_destroyed */
1689 0, /* todo_flags_start */
1690 TODO_update_address_taken
, /* todo_flags_finish */
1693 class pass_update_address_taken
: public gimple_opt_pass
1696 pass_update_address_taken (gcc::context
*ctxt
)
1697 : gimple_opt_pass (pass_data_update_address_taken
, ctxt
)
1700 /* opt_pass methods: */
1702 }; // class pass_update_address_taken
1707 make_pass_update_address_taken (gcc::context
*ctxt
)
1709 return new pass_update_address_taken (ctxt
);