1 /* Miscellaneous SSA utility functions.
2 Copyright (C) 2001-2013 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"
29 #include "langhooks.h"
30 #include "basic-block.h"
32 #include "gimple-pretty-print.h"
33 #include "pointer-set.h"
36 #include "gimple-iterator.h"
37 #include "gimple-walk.h"
38 #include "gimple-ssa.h"
39 #include "tree-phinodes.h"
40 #include "ssa-iterators.h"
41 #include "tree-ssanames.h"
42 #include "tree-ssa-loop-manip.h"
43 #include "tree-into-ssa.h"
45 #include "tree-inline.h"
47 #include "tree-pass.h"
48 #include "diagnostic-core.h"
50 #include "cfgexpand.h"
52 /* Pointer map of variable mappings, keyed by edge. */
53 static struct pointer_map_t
*edge_var_maps
;
56 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
59 redirect_edge_var_map_add (edge e
, tree result
, tree def
, source_location locus
)
62 edge_var_map_vector
*head
;
63 edge_var_map new_node
;
65 if (edge_var_maps
== NULL
)
66 edge_var_maps
= pointer_map_create ();
68 slot
= pointer_map_insert (edge_var_maps
, e
);
69 head
= (edge_var_map_vector
*) *slot
;
71 vec_safe_reserve (head
, 5);
73 new_node
.result
= result
;
74 new_node
.locus
= locus
;
76 vec_safe_push (head
, new_node
);
81 /* Clear the var mappings in edge E. */
84 redirect_edge_var_map_clear (edge e
)
87 edge_var_map_vector
*head
;
92 slot
= pointer_map_contains (edge_var_maps
, e
);
96 head
= (edge_var_map_vector
*) *slot
;
103 /* Duplicate the redirected var mappings in OLDE in NEWE.
105 Since we can't remove a mapping, let's just duplicate it. This assumes a
106 pointer_map can have multiple edges mapping to the same var_map (many to
107 one mapping), since we don't remove the previous mappings. */
110 redirect_edge_var_map_dup (edge newe
, edge olde
)
112 void **new_slot
, **old_slot
;
113 edge_var_map_vector
*head
;
118 new_slot
= pointer_map_insert (edge_var_maps
, newe
);
119 old_slot
= pointer_map_contains (edge_var_maps
, olde
);
122 head
= (edge_var_map_vector
*) *old_slot
;
124 edge_var_map_vector
*new_head
= NULL
;
126 new_head
= vec_safe_copy (head
);
128 vec_safe_reserve (new_head
, 5);
129 *new_slot
= new_head
;
133 /* Return the variable mappings for a given edge. If there is none, return
136 edge_var_map_vector
*
137 redirect_edge_var_map_vector (edge e
)
141 /* Hey, what kind of idiot would... you'd be surprised. */
145 slot
= pointer_map_contains (edge_var_maps
, e
);
149 return (edge_var_map_vector
*) *slot
;
152 /* Used by redirect_edge_var_map_destroy to free all memory. */
155 free_var_map_entry (const void *key ATTRIBUTE_UNUSED
,
157 void *data ATTRIBUTE_UNUSED
)
159 edge_var_map_vector
*head
= (edge_var_map_vector
*) *value
;
164 /* Clear the edge variable mappings. */
167 redirect_edge_var_map_destroy (void)
171 pointer_map_traverse (edge_var_maps
, free_var_map_entry
, NULL
);
172 pointer_map_destroy (edge_var_maps
);
173 edge_var_maps
= NULL
;
178 /* Remove the corresponding arguments from the PHI nodes in E's
179 destination block and redirect it to DEST. Return redirected edge.
180 The list of removed arguments is stored in a vector accessed
181 through edge_var_maps. */
184 ssa_redirect_edge (edge e
, basic_block dest
)
186 gimple_stmt_iterator gsi
;
189 redirect_edge_var_map_clear (e
);
191 /* Remove the appropriate PHI arguments in E's destination block. */
192 for (gsi
= gsi_start_phis (e
->dest
); !gsi_end_p (gsi
); gsi_next (&gsi
))
195 source_location locus
;
197 phi
= gsi_stmt (gsi
);
198 def
= gimple_phi_arg_def (phi
, e
->dest_idx
);
199 locus
= gimple_phi_arg_location (phi
, e
->dest_idx
);
201 if (def
== NULL_TREE
)
204 redirect_edge_var_map_add (e
, gimple_phi_result (phi
), def
, locus
);
207 e
= redirect_edge_succ_nodup (e
, dest
);
213 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
217 flush_pending_stmts (edge e
)
220 edge_var_map_vector
*v
;
223 gimple_stmt_iterator gsi
;
225 v
= redirect_edge_var_map_vector (e
);
229 for (gsi
= gsi_start_phis (e
->dest
), i
= 0;
230 !gsi_end_p (gsi
) && v
->iterate (i
, &vm
);
231 gsi_next (&gsi
), i
++)
235 phi
= gsi_stmt (gsi
);
236 def
= redirect_edge_var_map_def (vm
);
237 add_phi_arg (phi
, def
, e
, redirect_edge_var_map_location (vm
));
240 redirect_edge_var_map_clear (e
);
243 /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
244 GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
245 expression with a different value.
247 This will update any annotations (say debug bind stmts) referring
248 to the original LHS, so that they use the RHS instead. This is
249 done even if NLHS and LHS are the same, for it is understood that
250 the RHS will be modified afterwards, and NLHS will not be assigned
253 Adjusting any non-annotation uses of the LHS, if needed, is a
254 responsibility of the caller.
256 The effect of this call should be pretty much the same as that of
257 inserting a copy of STMT before STMT, and then removing the
258 original stmt, at which time gsi_remove() would have update
259 annotations, but using this function saves all the inserting,
260 copying and removing. */
263 gimple_replace_ssa_lhs (gimple stmt
, tree nlhs
)
265 if (MAY_HAVE_DEBUG_STMTS
)
267 tree lhs
= gimple_get_lhs (stmt
);
269 gcc_assert (SSA_NAME_DEF_STMT (lhs
) == stmt
);
271 insert_debug_temp_for_var_def (NULL
, lhs
);
274 gimple_set_lhs (stmt
, nlhs
);
278 /* Given a tree for an expression for which we might want to emit
279 locations or values in debug information (generally a variable, but
280 we might deal with other kinds of trees in the future), return the
281 tree that should be used as the variable of a DEBUG_BIND STMT or
282 VAR_LOCATION INSN or NOTE. Return NULL if VAR is not to be tracked. */
285 target_for_debug_bind (tree var
)
287 if (!MAY_HAVE_DEBUG_STMTS
)
290 if (TREE_CODE (var
) == SSA_NAME
)
292 var
= SSA_NAME_VAR (var
);
293 if (var
== NULL_TREE
)
297 if ((TREE_CODE (var
) != VAR_DECL
298 || VAR_DECL_IS_VIRTUAL_OPERAND (var
))
299 && TREE_CODE (var
) != PARM_DECL
)
302 if (DECL_HAS_VALUE_EXPR_P (var
))
303 return target_for_debug_bind (DECL_VALUE_EXPR (var
));
305 if (DECL_IGNORED_P (var
))
308 /* var-tracking only tracks registers. */
309 if (!is_gimple_reg_type (TREE_TYPE (var
)))
315 /* Called via walk_tree, look for SSA_NAMEs that have already been
319 find_released_ssa_name (tree
*tp
, int *walk_subtrees
, void *data_
)
321 struct walk_stmt_info
*wi
= (struct walk_stmt_info
*) data_
;
323 if (wi
&& wi
->is_lhs
)
326 if (TREE_CODE (*tp
) == SSA_NAME
)
328 if (SSA_NAME_IN_FREE_LIST (*tp
))
333 else if (IS_TYPE_OR_DECL_P (*tp
))
339 /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced
340 by other DEBUG stmts, and replace uses of the DEF with the
341 newly-created debug temp. */
344 insert_debug_temp_for_var_def (gimple_stmt_iterator
*gsi
, tree var
)
346 imm_use_iterator imm_iter
;
349 gimple def_stmt
= NULL
;
353 if (!MAY_HAVE_DEBUG_STMTS
)
356 /* If this name has already been registered for replacement, do nothing
357 as anything that uses this name isn't in SSA form. */
358 if (name_registered_for_update_p (var
))
361 /* Check whether there are debug stmts that reference this variable and,
362 if there are, decide whether we should use a debug temp. */
363 FOR_EACH_IMM_USE_FAST (use_p
, imm_iter
, var
)
365 stmt
= USE_STMT (use_p
);
367 if (!gimple_debug_bind_p (stmt
))
373 if (gimple_debug_bind_get_value (stmt
) != var
)
375 /* Count this as an additional use, so as to make sure we
376 use a temp unless VAR's definition has a SINGLE_RHS that
387 def_stmt
= gsi_stmt (*gsi
);
389 def_stmt
= SSA_NAME_DEF_STMT (var
);
391 /* If we didn't get an insertion point, and the stmt has already
392 been removed, we won't be able to insert the debug bind stmt, so
393 we'll have to drop debug information. */
394 if (gimple_code (def_stmt
) == GIMPLE_PHI
)
396 value
= degenerate_phi_result (def_stmt
);
397 if (value
&& walk_tree (&value
, find_released_ssa_name
, NULL
, NULL
))
399 /* error_mark_node is what fixup_noreturn_call changes PHI arguments
401 else if (value
== error_mark_node
)
404 else if (is_gimple_assign (def_stmt
))
406 bool no_value
= false;
408 if (!dom_info_available_p (CDI_DOMINATORS
))
410 struct walk_stmt_info wi
;
412 memset (&wi
, 0, sizeof (wi
));
414 /* When removing blocks without following reverse dominance
415 order, we may sometimes encounter SSA_NAMEs that have
416 already been released, referenced in other SSA_DEFs that
417 we're about to release. Consider:
426 If we deleted BB X first, propagating the value of w_2
427 won't do us any good. It's too late to recover their
428 original definition of v_1: when it was deleted, it was
429 only referenced in other DEFs, it couldn't possibly know
430 it should have been retained, and propagating every
431 single DEF just in case it might have to be propagated
432 into a DEBUG STMT would probably be too wasteful.
434 When dominator information is not readily available, we
435 check for and accept some loss of debug information. But
436 if it is available, there's no excuse for us to remove
437 blocks in the wrong order, so we don't even check for
438 dead SSA NAMEs. SSA verification shall catch any
440 if ((!gsi
&& !gimple_bb (def_stmt
))
441 || walk_gimple_op (def_stmt
, find_released_ssa_name
, &wi
))
446 value
= gimple_assign_rhs_to_tree (def_stmt
);
451 /* If there's a single use of VAR, and VAR is the entire debug
452 expression (usecount would have been incremented again
453 otherwise), and the definition involves only constants and
454 SSA names, then we can propagate VALUE into this single use,
457 We can also avoid using a temp if VALUE can be shared and
458 propagated into all uses, without generating expressions that
459 wouldn't be valid gimple RHSs.
461 Other cases that would require unsharing or non-gimple RHSs
462 are deferred to a debug temp, although we could avoid temps
463 at the expense of duplication of expressions. */
465 if (CONSTANT_CLASS_P (value
)
466 || gimple_code (def_stmt
) == GIMPLE_PHI
468 && (!gimple_assign_single_p (def_stmt
)
469 || is_gimple_min_invariant (value
)))
470 || is_gimple_reg (value
))
475 tree vexpr
= make_node (DEBUG_EXPR_DECL
);
477 def_temp
= gimple_build_debug_bind (vexpr
,
478 unshare_expr (value
),
481 DECL_ARTIFICIAL (vexpr
) = 1;
482 TREE_TYPE (vexpr
) = TREE_TYPE (value
);
484 DECL_MODE (vexpr
) = DECL_MODE (value
);
486 DECL_MODE (vexpr
) = TYPE_MODE (TREE_TYPE (value
));
489 gsi_insert_before (gsi
, def_temp
, GSI_SAME_STMT
);
492 gimple_stmt_iterator ngsi
= gsi_for_stmt (def_stmt
);
493 gsi_insert_before (&ngsi
, def_temp
, GSI_SAME_STMT
);
500 FOR_EACH_IMM_USE_STMT (stmt
, imm_iter
, var
)
502 if (!gimple_debug_bind_p (stmt
))
507 FOR_EACH_IMM_USE_ON_STMT (use_p
, imm_iter
)
508 /* unshare_expr is not needed here. vexpr is either a
509 SINGLE_RHS, that can be safely shared, some other RHS
510 that was unshared when we found it had a single debug
511 use, or a DEBUG_EXPR_DECL, that can be safely
513 SET_USE (use_p
, unshare_expr (value
));
514 /* If we didn't replace uses with a debug decl fold the
515 resulting expression. Otherwise we end up with invalid IL. */
516 if (TREE_CODE (value
) != DEBUG_EXPR_DECL
)
518 gimple_stmt_iterator gsi
= gsi_for_stmt (stmt
);
519 fold_stmt_inplace (&gsi
);
523 gimple_debug_bind_reset_value (stmt
);
530 /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by
531 other DEBUG stmts, and replace uses of the DEF with the
532 newly-created debug temp. */
535 insert_debug_temps_for_defs (gimple_stmt_iterator
*gsi
)
541 if (!MAY_HAVE_DEBUG_STMTS
)
544 stmt
= gsi_stmt (*gsi
);
546 FOR_EACH_PHI_OR_STMT_DEF (def_p
, stmt
, op_iter
, SSA_OP_DEF
)
548 tree var
= DEF_FROM_PTR (def_p
);
550 if (TREE_CODE (var
) != SSA_NAME
)
553 insert_debug_temp_for_var_def (gsi
, var
);
557 /* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */
560 reset_debug_uses (gimple stmt
)
564 imm_use_iterator imm_iter
;
567 if (!MAY_HAVE_DEBUG_STMTS
)
570 FOR_EACH_PHI_OR_STMT_DEF (def_p
, stmt
, op_iter
, SSA_OP_DEF
)
572 tree var
= DEF_FROM_PTR (def_p
);
574 if (TREE_CODE (var
) != SSA_NAME
)
577 FOR_EACH_IMM_USE_STMT (use_stmt
, imm_iter
, var
)
579 if (!gimple_debug_bind_p (use_stmt
))
582 gimple_debug_bind_reset_value (use_stmt
);
583 update_stmt (use_stmt
);
588 /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
589 dominated stmts before their dominators, so that release_ssa_defs
590 stands a chance of propagating DEFs into debug bind stmts. */
593 release_defs_bitset (bitmap toremove
)
598 /* Performing a topological sort is probably overkill, this will
599 most likely run in slightly superlinear time, rather than the
600 pathological quadratic worst case. */
601 while (!bitmap_empty_p (toremove
))
602 EXECUTE_IF_SET_IN_BITMAP (toremove
, 0, j
, bi
)
604 bool remove_now
= true;
605 tree var
= ssa_name (j
);
607 imm_use_iterator uit
;
609 FOR_EACH_IMM_USE_STMT (stmt
, uit
, var
)
614 /* We can't propagate PHI nodes into debug stmts. */
615 if (gimple_code (stmt
) == GIMPLE_PHI
616 || is_gimple_debug (stmt
))
619 /* If we find another definition to remove that uses
620 the one we're looking at, defer the removal of this
621 one, so that it can be propagated into debug stmts
622 after the other is. */
623 FOR_EACH_SSA_DEF_OPERAND (def_p
, stmt
, dit
, SSA_OP_DEF
)
625 tree odef
= DEF_FROM_PTR (def_p
);
627 if (bitmap_bit_p (toremove
, SSA_NAME_VERSION (odef
)))
635 BREAK_FROM_IMM_USE_STMT (uit
);
640 gimple def
= SSA_NAME_DEF_STMT (var
);
641 gimple_stmt_iterator gsi
= gsi_for_stmt (def
);
643 if (gimple_code (def
) == GIMPLE_PHI
)
644 remove_phi_node (&gsi
, true);
647 gsi_remove (&gsi
, true);
651 bitmap_clear_bit (toremove
, j
);
656 /* Return true if SSA_NAME is malformed and mark it visited.
658 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
662 verify_ssa_name (tree ssa_name
, bool is_virtual
)
664 if (TREE_CODE (ssa_name
) != SSA_NAME
)
666 error ("expected an SSA_NAME object");
670 if (SSA_NAME_IN_FREE_LIST (ssa_name
))
672 error ("found an SSA_NAME that had been released into the free pool");
676 if (SSA_NAME_VAR (ssa_name
) != NULL_TREE
677 && TREE_TYPE (ssa_name
) != TREE_TYPE (SSA_NAME_VAR (ssa_name
)))
679 error ("type mismatch between an SSA_NAME and its symbol");
683 if (is_virtual
&& !virtual_operand_p (ssa_name
))
685 error ("found a virtual definition for a GIMPLE register");
689 if (is_virtual
&& SSA_NAME_VAR (ssa_name
) != gimple_vop (cfun
))
691 error ("virtual SSA name for non-VOP decl");
695 if (!is_virtual
&& virtual_operand_p (ssa_name
))
697 error ("found a real definition for a non-register");
701 if (SSA_NAME_IS_DEFAULT_DEF (ssa_name
)
702 && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name
)))
704 error ("found a default name with a non-empty defining statement");
712 /* Return true if the definition of SSA_NAME at block BB is malformed.
714 STMT is the statement where SSA_NAME is created.
716 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
717 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
718 it means that the block in that array slot contains the
719 definition of SSA_NAME.
721 IS_VIRTUAL is true if SSA_NAME is created by a VDEF. */
724 verify_def (basic_block bb
, basic_block
*definition_block
, tree ssa_name
,
725 gimple stmt
, bool is_virtual
)
727 if (verify_ssa_name (ssa_name
, is_virtual
))
730 if (SSA_NAME_VAR (ssa_name
)
731 && TREE_CODE (SSA_NAME_VAR (ssa_name
)) == RESULT_DECL
732 && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name
)))
734 error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
738 if (definition_block
[SSA_NAME_VERSION (ssa_name
)])
740 error ("SSA_NAME created in two different blocks %i and %i",
741 definition_block
[SSA_NAME_VERSION (ssa_name
)]->index
, bb
->index
);
745 definition_block
[SSA_NAME_VERSION (ssa_name
)] = bb
;
747 if (SSA_NAME_DEF_STMT (ssa_name
) != stmt
)
749 error ("SSA_NAME_DEF_STMT is wrong");
750 fprintf (stderr
, "Expected definition statement:\n");
751 print_gimple_stmt (stderr
, SSA_NAME_DEF_STMT (ssa_name
), 4, TDF_VOPS
);
752 fprintf (stderr
, "\nActual definition statement:\n");
753 print_gimple_stmt (stderr
, stmt
, 4, TDF_VOPS
);
760 fprintf (stderr
, "while verifying SSA_NAME ");
761 print_generic_expr (stderr
, ssa_name
, 0);
762 fprintf (stderr
, " in statement\n");
763 print_gimple_stmt (stderr
, stmt
, 4, TDF_VOPS
);
769 /* Return true if the use of SSA_NAME at statement STMT in block BB is
772 DEF_BB is the block where SSA_NAME was found to be created.
774 IDOM contains immediate dominator information for the flowgraph.
776 CHECK_ABNORMAL is true if the caller wants to check whether this use
777 is flowing through an abnormal edge (only used when checking PHI
780 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
781 that are defined before STMT in basic block BB. */
784 verify_use (basic_block bb
, basic_block def_bb
, use_operand_p use_p
,
785 gimple stmt
, bool check_abnormal
, bitmap names_defined_in_bb
)
788 tree ssa_name
= USE_FROM_PTR (use_p
);
790 if (!TREE_VISITED (ssa_name
))
791 if (verify_imm_links (stderr
, ssa_name
))
794 TREE_VISITED (ssa_name
) = 1;
796 if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name
))
797 && SSA_NAME_IS_DEFAULT_DEF (ssa_name
))
798 ; /* Default definitions have empty statements. Nothing to do. */
801 error ("missing definition");
804 else if (bb
!= def_bb
805 && !dominated_by_p (CDI_DOMINATORS
, bb
, def_bb
))
807 error ("definition in block %i does not dominate use in block %i",
808 def_bb
->index
, bb
->index
);
811 else if (bb
== def_bb
812 && names_defined_in_bb
!= NULL
813 && !bitmap_bit_p (names_defined_in_bb
, SSA_NAME_VERSION (ssa_name
)))
815 error ("definition in block %i follows the use", def_bb
->index
);
820 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name
))
822 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
826 /* Make sure the use is in an appropriate list by checking the previous
827 element to make sure it's the same. */
828 if (use_p
->prev
== NULL
)
830 error ("no immediate_use list");
836 if (use_p
->prev
->use
== NULL
)
837 listvar
= use_p
->prev
->loc
.ssa_name
;
839 listvar
= USE_FROM_PTR (use_p
->prev
);
840 if (listvar
!= ssa_name
)
842 error ("wrong immediate use list");
849 fprintf (stderr
, "for SSA_NAME: ");
850 print_generic_expr (stderr
, ssa_name
, TDF_VOPS
);
851 fprintf (stderr
, " in statement:\n");
852 print_gimple_stmt (stderr
, stmt
, 0, TDF_VOPS
);
859 /* Return true if any of the arguments for PHI node PHI at block BB is
862 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
863 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
864 it means that the block in that array slot contains the
865 definition of SSA_NAME. */
868 verify_phi_args (gimple phi
, basic_block bb
, basic_block
*definition_block
)
872 size_t i
, phi_num_args
= gimple_phi_num_args (phi
);
874 if (EDGE_COUNT (bb
->preds
) != phi_num_args
)
876 error ("incoming edge count does not match number of PHI arguments");
881 for (i
= 0; i
< phi_num_args
; i
++)
883 use_operand_p op_p
= gimple_phi_arg_imm_use_ptr (phi
, i
);
884 tree op
= USE_FROM_PTR (op_p
);
886 e
= EDGE_PRED (bb
, i
);
890 error ("PHI argument is missing for edge %d->%d",
897 if (TREE_CODE (op
) != SSA_NAME
&& !is_gimple_min_invariant (op
))
899 error ("PHI argument is not SSA_NAME, or invariant");
903 if (TREE_CODE (op
) == SSA_NAME
)
905 err
= verify_ssa_name (op
, virtual_operand_p (gimple_phi_result (phi
)));
906 err
|= verify_use (e
->src
, definition_block
[SSA_NAME_VERSION (op
)],
907 op_p
, phi
, e
->flags
& EDGE_ABNORMAL
, NULL
);
910 if (TREE_CODE (op
) == ADDR_EXPR
)
912 tree base
= TREE_OPERAND (op
, 0);
913 while (handled_component_p (base
))
914 base
= TREE_OPERAND (base
, 0);
915 if ((TREE_CODE (base
) == VAR_DECL
916 || TREE_CODE (base
) == PARM_DECL
917 || TREE_CODE (base
) == RESULT_DECL
)
918 && !TREE_ADDRESSABLE (base
))
920 error ("address taken, but ADDRESSABLE bit not set");
927 error ("wrong edge %d->%d for PHI argument",
928 e
->src
->index
, e
->dest
->index
);
934 fprintf (stderr
, "PHI argument\n");
935 print_generic_stmt (stderr
, op
, TDF_VOPS
);
943 fprintf (stderr
, "for PHI node\n");
944 print_gimple_stmt (stderr
, phi
, 0, TDF_VOPS
|TDF_MEMSYMS
);
952 /* Verify common invariants in the SSA web.
953 TODO: verify the variable annotations. */
956 verify_ssa (bool check_modified_stmt
)
960 basic_block
*definition_block
= XCNEWVEC (basic_block
, num_ssa_names
);
963 enum dom_state orig_dom_state
= dom_info_state (CDI_DOMINATORS
);
964 bitmap names_defined_in_bb
= BITMAP_ALLOC (NULL
);
966 gcc_assert (!need_ssa_update_p (cfun
));
968 timevar_push (TV_TREE_SSA_VERIFY
);
970 /* Keep track of SSA names present in the IL. */
971 for (i
= 1; i
< num_ssa_names
; i
++)
973 tree name
= ssa_name (i
);
977 TREE_VISITED (name
) = 0;
979 verify_ssa_name (name
, virtual_operand_p (name
));
981 stmt
= SSA_NAME_DEF_STMT (name
);
982 if (!gimple_nop_p (stmt
))
984 basic_block bb
= gimple_bb (stmt
);
985 verify_def (bb
, definition_block
,
986 name
, stmt
, virtual_operand_p (name
));
992 calculate_dominance_info (CDI_DOMINATORS
);
994 /* Now verify all the uses and make sure they agree with the definitions
995 found in the previous pass. */
1001 gimple_stmt_iterator gsi
;
1003 /* Make sure that all edges have a clear 'aux' field. */
1004 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1008 error ("AUX pointer initialized for edge %d->%d", e
->src
->index
,
1014 /* Verify the arguments for every PHI node in the block. */
1015 for (gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
1017 phi
= gsi_stmt (gsi
);
1018 if (verify_phi_args (phi
, bb
, definition_block
))
1021 bitmap_set_bit (names_defined_in_bb
,
1022 SSA_NAME_VERSION (gimple_phi_result (phi
)));
1025 /* Now verify all the uses and vuses in every statement of the block. */
1026 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
1028 gimple stmt
= gsi_stmt (gsi
);
1029 use_operand_p use_p
;
1031 if (check_modified_stmt
&& gimple_modified_p (stmt
))
1033 error ("stmt (%p) marked modified after optimization pass: ",
1035 print_gimple_stmt (stderr
, stmt
, 0, TDF_VOPS
);
1039 if (verify_ssa_operands (stmt
))
1041 print_gimple_stmt (stderr
, stmt
, 0, TDF_VOPS
);
1045 if (gimple_debug_bind_p (stmt
)
1046 && !gimple_debug_bind_has_value_p (stmt
))
1049 FOR_EACH_SSA_USE_OPERAND (use_p
, stmt
, iter
, SSA_OP_USE
|SSA_OP_VUSE
)
1051 op
= USE_FROM_PTR (use_p
);
1052 if (verify_use (bb
, definition_block
[SSA_NAME_VERSION (op
)],
1053 use_p
, stmt
, false, names_defined_in_bb
))
1057 FOR_EACH_SSA_TREE_OPERAND (op
, stmt
, iter
, SSA_OP_ALL_DEFS
)
1059 if (SSA_NAME_DEF_STMT (op
) != stmt
)
1061 error ("SSA_NAME_DEF_STMT is wrong");
1062 fprintf (stderr
, "Expected definition statement:\n");
1063 print_gimple_stmt (stderr
, stmt
, 4, TDF_VOPS
);
1064 fprintf (stderr
, "\nActual definition statement:\n");
1065 print_gimple_stmt (stderr
, SSA_NAME_DEF_STMT (op
),
1069 bitmap_set_bit (names_defined_in_bb
, SSA_NAME_VERSION (op
));
1073 bitmap_clear (names_defined_in_bb
);
1076 free (definition_block
);
1078 /* Restore the dominance information to its prior known state, so
1079 that we do not perturb the compiler's subsequent behavior. */
1080 if (orig_dom_state
== DOM_NONE
)
1081 free_dominance_info (CDI_DOMINATORS
);
1083 set_dom_info_availability (CDI_DOMINATORS
, orig_dom_state
);
1085 BITMAP_FREE (names_defined_in_bb
);
1086 timevar_pop (TV_TREE_SSA_VERIFY
);
1090 internal_error ("verify_ssa failed");
1093 /* Return true if the DECL_UID in both trees are equal. */
1096 uid_ssaname_map_eq (const void *va
, const void *vb
)
1098 const_tree a
= (const_tree
) va
;
1099 const_tree b
= (const_tree
) vb
;
1100 return (a
->ssa_name
.var
->decl_minimal
.uid
== b
->ssa_name
.var
->decl_minimal
.uid
);
1103 /* Hash a tree in a uid_decl_map. */
1106 uid_ssaname_map_hash (const void *item
)
1108 return ((const_tree
)item
)->ssa_name
.var
->decl_minimal
.uid
;
1112 /* Initialize global DFA and SSA structures. */
1115 init_tree_ssa (struct function
*fn
)
1117 fn
->gimple_df
= ggc_alloc_cleared_gimple_df ();
1118 fn
->gimple_df
->default_defs
= htab_create_ggc (20, uid_ssaname_map_hash
,
1119 uid_ssaname_map_eq
, NULL
);
1120 pt_solution_reset (&fn
->gimple_df
->escaped
);
1121 init_ssanames (fn
, 0);
1124 /* Do the actions required to initialize internal data structures used
1125 in tree-ssa optimization passes. */
1128 execute_init_datastructures (void)
1130 /* Allocate hash tables, arrays and other structures. */
1131 gcc_assert (!cfun
->gimple_df
);
1132 init_tree_ssa (cfun
);
1136 /* Gate for IPCP optimization. */
1139 gate_init_datastructures (void)
1141 /* Do nothing for funcions that was produced already in SSA form. */
1142 return !(cfun
->curr_properties
& PROP_ssa
);
1147 const pass_data pass_data_init_datastructures
=
1149 GIMPLE_PASS
, /* type */
1150 "*init_datastructures", /* name */
1151 OPTGROUP_NONE
, /* optinfo_flags */
1152 true, /* has_gate */
1153 true, /* has_execute */
1154 TV_NONE
, /* tv_id */
1155 PROP_cfg
, /* properties_required */
1156 0, /* properties_provided */
1157 0, /* properties_destroyed */
1158 0, /* todo_flags_start */
1159 0, /* todo_flags_finish */
1162 class pass_init_datastructures
: public gimple_opt_pass
1165 pass_init_datastructures (gcc::context
*ctxt
)
1166 : gimple_opt_pass (pass_data_init_datastructures
, ctxt
)
1169 /* opt_pass methods: */
1170 bool gate () { return gate_init_datastructures (); }
1171 unsigned int execute () { return execute_init_datastructures (); }
1173 }; // class pass_init_datastructures
1178 make_pass_init_datastructures (gcc::context
*ctxt
)
1180 return new pass_init_datastructures (ctxt
);
1183 /* Deallocate memory associated with SSA data structures for FNDECL. */
1186 delete_tree_ssa (void)
1190 /* We no longer maintain the SSA operand cache at this point. */
1191 if (ssa_operands_active (cfun
))
1192 fini_ssa_operands ();
1194 htab_delete (cfun
->gimple_df
->default_defs
);
1195 cfun
->gimple_df
->default_defs
= NULL
;
1196 pt_solution_reset (&cfun
->gimple_df
->escaped
);
1197 if (cfun
->gimple_df
->decls_to_pointers
!= NULL
)
1198 pointer_map_destroy (cfun
->gimple_df
->decls_to_pointers
);
1199 cfun
->gimple_df
->decls_to_pointers
= NULL
;
1200 cfun
->gimple_df
->modified_noreturn_calls
= NULL
;
1201 cfun
->gimple_df
= NULL
;
1203 /* We no longer need the edge variable maps. */
1204 redirect_edge_var_map_destroy ();
1207 /* Return true if EXPR is a useless type conversion, otherwise return
1211 tree_ssa_useless_type_conversion (tree expr
)
1213 /* If we have an assignment that merely uses a NOP_EXPR to change
1214 the top of the RHS to the type of the LHS and the type conversion
1215 is "safe", then strip away the type conversion so that we can
1216 enter LHS = RHS into the const_and_copies table. */
1217 if (CONVERT_EXPR_P (expr
)
1218 || TREE_CODE (expr
) == VIEW_CONVERT_EXPR
1219 || TREE_CODE (expr
) == NON_LVALUE_EXPR
)
1220 return useless_type_conversion_p
1222 TREE_TYPE (TREE_OPERAND (expr
, 0)));
1227 /* Strip conversions from EXP according to
1228 tree_ssa_useless_type_conversion and return the resulting
1232 tree_ssa_strip_useless_type_conversions (tree exp
)
1234 while (tree_ssa_useless_type_conversion (exp
))
1235 exp
= TREE_OPERAND (exp
, 0);
1240 /* Return true if T, an SSA_NAME, has an undefined value. */
1243 ssa_undefined_value_p (tree t
)
1245 tree var
= SSA_NAME_VAR (t
);
1249 /* Parameters get their initial value from the function entry. */
1250 else if (TREE_CODE (var
) == PARM_DECL
)
1252 /* When returning by reference the return address is actually a hidden
1254 else if (TREE_CODE (var
) == RESULT_DECL
&& DECL_BY_REFERENCE (var
))
1256 /* Hard register variables get their initial value from the ether. */
1257 else if (TREE_CODE (var
) == VAR_DECL
&& DECL_HARD_REGISTER (var
))
1260 /* The value is undefined iff its definition statement is empty. */
1261 return gimple_nop_p (SSA_NAME_DEF_STMT (t
));
1265 /* If necessary, rewrite the base of the reference tree *TP from
1266 a MEM_REF to a plain or converted symbol. */
1269 maybe_rewrite_mem_ref_base (tree
*tp
, bitmap suitable_for_renaming
)
1273 while (handled_component_p (*tp
))
1274 tp
= &TREE_OPERAND (*tp
, 0);
1275 if (TREE_CODE (*tp
) == MEM_REF
1276 && TREE_CODE (TREE_OPERAND (*tp
, 0)) == ADDR_EXPR
1277 && (sym
= TREE_OPERAND (TREE_OPERAND (*tp
, 0), 0))
1279 && !TREE_ADDRESSABLE (sym
)
1280 && bitmap_bit_p (suitable_for_renaming
, DECL_UID (sym
)))
1282 if (TREE_CODE (TREE_TYPE (sym
)) == VECTOR_TYPE
1283 && useless_type_conversion_p (TREE_TYPE (*tp
),
1284 TREE_TYPE (TREE_TYPE (sym
)))
1285 && multiple_of_p (sizetype
, TREE_OPERAND (*tp
, 1),
1286 TYPE_SIZE_UNIT (TREE_TYPE (*tp
))))
1288 *tp
= build3 (BIT_FIELD_REF
, TREE_TYPE (*tp
), sym
,
1289 TYPE_SIZE (TREE_TYPE (*tp
)),
1290 int_const_binop (MULT_EXPR
,
1291 bitsize_int (BITS_PER_UNIT
),
1292 TREE_OPERAND (*tp
, 1)));
1294 else if (TREE_CODE (TREE_TYPE (sym
)) == COMPLEX_TYPE
1295 && useless_type_conversion_p (TREE_TYPE (*tp
),
1296 TREE_TYPE (TREE_TYPE (sym
))))
1298 *tp
= build1 (integer_zerop (TREE_OPERAND (*tp
, 1))
1299 ? REALPART_EXPR
: IMAGPART_EXPR
,
1300 TREE_TYPE (*tp
), sym
);
1302 else if (integer_zerop (TREE_OPERAND (*tp
, 1)))
1304 if (!useless_type_conversion_p (TREE_TYPE (*tp
),
1306 *tp
= build1 (VIEW_CONVERT_EXPR
,
1307 TREE_TYPE (*tp
), sym
);
1314 /* For a tree REF return its base if it is the base of a MEM_REF
1315 that cannot be rewritten into SSA form. Otherwise return NULL_TREE. */
1318 non_rewritable_mem_ref_base (tree ref
)
1322 /* A plain decl does not need it set. */
1326 while (handled_component_p (base
))
1327 base
= TREE_OPERAND (base
, 0);
1329 /* But watch out for MEM_REFs we cannot lower to a
1330 VIEW_CONVERT_EXPR or a BIT_FIELD_REF. */
1331 if (TREE_CODE (base
) == MEM_REF
1332 && TREE_CODE (TREE_OPERAND (base
, 0)) == ADDR_EXPR
)
1334 tree decl
= TREE_OPERAND (TREE_OPERAND (base
, 0), 0);
1335 if ((TREE_CODE (TREE_TYPE (decl
)) == VECTOR_TYPE
1336 || TREE_CODE (TREE_TYPE (decl
)) == COMPLEX_TYPE
)
1337 && useless_type_conversion_p (TREE_TYPE (base
),
1338 TREE_TYPE (TREE_TYPE (decl
)))
1339 && mem_ref_offset (base
).fits_uhwi ()
1340 && tree_to_double_int (TYPE_SIZE_UNIT (TREE_TYPE (decl
)))
1341 .ugt (mem_ref_offset (base
))
1342 && multiple_of_p (sizetype
, TREE_OPERAND (base
, 1),
1343 TYPE_SIZE_UNIT (TREE_TYPE (base
))))
1346 && (!integer_zerop (TREE_OPERAND (base
, 1))
1347 || (DECL_SIZE (decl
)
1348 != TYPE_SIZE (TREE_TYPE (base
)))
1349 || TREE_THIS_VOLATILE (decl
) != TREE_THIS_VOLATILE (base
)))
1356 /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1357 Otherwise return true. */
1360 non_rewritable_lvalue_p (tree lhs
)
1362 /* A plain decl is always rewritable. */
1366 /* A decl that is wrapped inside a MEM-REF that covers
1367 it full is also rewritable.
1368 ??? The following could be relaxed allowing component
1369 references that do not change the access size. */
1370 if (TREE_CODE (lhs
) == MEM_REF
1371 && TREE_CODE (TREE_OPERAND (lhs
, 0)) == ADDR_EXPR
1372 && integer_zerop (TREE_OPERAND (lhs
, 1)))
1374 tree decl
= TREE_OPERAND (TREE_OPERAND (lhs
, 0), 0);
1376 && DECL_SIZE (decl
) == TYPE_SIZE (TREE_TYPE (lhs
))
1377 && (TREE_THIS_VOLATILE (decl
) == TREE_THIS_VOLATILE (lhs
)))
1384 /* When possible, clear TREE_ADDRESSABLE bit or set DECL_GIMPLE_REG_P bit and
1385 mark the variable VAR for conversion into SSA. Return true when updating
1386 stmts is required. */
1389 maybe_optimize_var (tree var
, bitmap addresses_taken
, bitmap not_reg_needs
,
1390 bitmap suitable_for_renaming
)
1392 /* Global Variables, result decls cannot be changed. */
1393 if (is_global_var (var
)
1394 || TREE_CODE (var
) == RESULT_DECL
1395 || bitmap_bit_p (addresses_taken
, DECL_UID (var
)))
1398 if (TREE_ADDRESSABLE (var
)
1399 /* Do not change TREE_ADDRESSABLE if we need to preserve var as
1400 a non-register. Otherwise we are confused and forget to
1401 add virtual operands for it. */
1402 && (!is_gimple_reg_type (TREE_TYPE (var
))
1403 || TREE_CODE (TREE_TYPE (var
)) == VECTOR_TYPE
1404 || TREE_CODE (TREE_TYPE (var
)) == COMPLEX_TYPE
1405 || !bitmap_bit_p (not_reg_needs
, DECL_UID (var
))))
1407 TREE_ADDRESSABLE (var
) = 0;
1408 if (is_gimple_reg (var
))
1409 bitmap_set_bit (suitable_for_renaming
, DECL_UID (var
));
1412 fprintf (dump_file
, "No longer having address taken: ");
1413 print_generic_expr (dump_file
, var
, 0);
1414 fprintf (dump_file
, "\n");
1418 if (!DECL_GIMPLE_REG_P (var
)
1419 && !bitmap_bit_p (not_reg_needs
, DECL_UID (var
))
1420 && (TREE_CODE (TREE_TYPE (var
)) == COMPLEX_TYPE
1421 || TREE_CODE (TREE_TYPE (var
)) == VECTOR_TYPE
)
1422 && !TREE_THIS_VOLATILE (var
)
1423 && (TREE_CODE (var
) != VAR_DECL
|| !DECL_HARD_REGISTER (var
)))
1425 DECL_GIMPLE_REG_P (var
) = 1;
1426 bitmap_set_bit (suitable_for_renaming
, DECL_UID (var
));
1429 fprintf (dump_file
, "Now a gimple register: ");
1430 print_generic_expr (dump_file
, var
, 0);
1431 fprintf (dump_file
, "\n");
1436 /* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables. */
1439 execute_update_addresses_taken (void)
1441 gimple_stmt_iterator gsi
;
1443 bitmap addresses_taken
= BITMAP_ALLOC (NULL
);
1444 bitmap not_reg_needs
= BITMAP_ALLOC (NULL
);
1445 bitmap suitable_for_renaming
= BITMAP_ALLOC (NULL
);
1449 timevar_push (TV_ADDRESS_TAKEN
);
1451 /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1452 the function body. */
1455 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
1457 gimple stmt
= gsi_stmt (gsi
);
1458 enum gimple_code code
= gimple_code (stmt
);
1461 /* Note all addresses taken by the stmt. */
1462 gimple_ior_addresses_taken (addresses_taken
, stmt
);
1464 /* If we have a call or an assignment, see if the lhs contains
1465 a local decl that requires not to be a gimple register. */
1466 if (code
== GIMPLE_ASSIGN
|| code
== GIMPLE_CALL
)
1468 tree lhs
= gimple_get_lhs (stmt
);
1470 && TREE_CODE (lhs
) != SSA_NAME
1471 && non_rewritable_lvalue_p (lhs
))
1473 decl
= get_base_address (lhs
);
1475 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1479 if (gimple_assign_single_p (stmt
))
1481 tree rhs
= gimple_assign_rhs1 (stmt
);
1482 if ((decl
= non_rewritable_mem_ref_base (rhs
)))
1483 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1486 else if (code
== GIMPLE_CALL
)
1488 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
1490 tree arg
= gimple_call_arg (stmt
, i
);
1491 if ((decl
= non_rewritable_mem_ref_base (arg
)))
1492 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1496 else if (code
== GIMPLE_ASM
)
1498 for (i
= 0; i
< gimple_asm_noutputs (stmt
); ++i
)
1500 tree link
= gimple_asm_output_op (stmt
, i
);
1501 tree lhs
= TREE_VALUE (link
);
1502 if (TREE_CODE (lhs
) != SSA_NAME
)
1504 decl
= get_base_address (lhs
);
1506 && (non_rewritable_lvalue_p (lhs
)
1507 /* We cannot move required conversions from
1508 the lhs to the rhs in asm statements, so
1509 require we do not need any. */
1510 || !useless_type_conversion_p
1511 (TREE_TYPE (lhs
), TREE_TYPE (decl
))))
1512 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1515 for (i
= 0; i
< gimple_asm_ninputs (stmt
); ++i
)
1517 tree link
= gimple_asm_input_op (stmt
, i
);
1518 if ((decl
= non_rewritable_mem_ref_base (TREE_VALUE (link
))))
1519 bitmap_set_bit (not_reg_needs
, DECL_UID (decl
));
1524 for (gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
1527 gimple phi
= gsi_stmt (gsi
);
1529 for (i
= 0; i
< gimple_phi_num_args (phi
); i
++)
1531 tree op
= PHI_ARG_DEF (phi
, i
), var
;
1532 if (TREE_CODE (op
) == ADDR_EXPR
1533 && (var
= get_base_address (TREE_OPERAND (op
, 0))) != NULL
1535 bitmap_set_bit (addresses_taken
, DECL_UID (var
));
1540 /* We cannot iterate over all referenced vars because that can contain
1541 unused vars from BLOCK trees, which causes code generation differences
1543 for (var
= DECL_ARGUMENTS (cfun
->decl
); var
; var
= DECL_CHAIN (var
))
1544 maybe_optimize_var (var
, addresses_taken
, not_reg_needs
,
1545 suitable_for_renaming
);
1547 FOR_EACH_VEC_SAFE_ELT (cfun
->local_decls
, i
, var
)
1548 maybe_optimize_var (var
, addresses_taken
, not_reg_needs
,
1549 suitable_for_renaming
);
1551 /* Operand caches need to be recomputed for operands referencing the updated
1552 variables and operands need to be rewritten to expose bare symbols. */
1553 if (!bitmap_empty_p (suitable_for_renaming
))
1556 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
);)
1558 gimple stmt
= gsi_stmt (gsi
);
1560 /* Re-write TARGET_MEM_REFs of symbols we want to
1561 rewrite into SSA form. */
1562 if (gimple_assign_single_p (stmt
))
1564 tree lhs
= gimple_assign_lhs (stmt
);
1565 tree rhs
, *rhsp
= gimple_assign_rhs1_ptr (stmt
);
1568 /* We shouldn't have any fancy wrapping of
1569 component-refs on the LHS, but look through
1570 VIEW_CONVERT_EXPRs as that is easy. */
1571 while (TREE_CODE (lhs
) == VIEW_CONVERT_EXPR
)
1572 lhs
= TREE_OPERAND (lhs
, 0);
1573 if (TREE_CODE (lhs
) == MEM_REF
1574 && TREE_CODE (TREE_OPERAND (lhs
, 0)) == ADDR_EXPR
1575 && integer_zerop (TREE_OPERAND (lhs
, 1))
1576 && (sym
= TREE_OPERAND (TREE_OPERAND (lhs
, 0), 0))
1578 && !TREE_ADDRESSABLE (sym
)
1579 && bitmap_bit_p (suitable_for_renaming
, DECL_UID (sym
)))
1582 lhs
= gimple_assign_lhs (stmt
);
1584 /* Rewrite the RHS and make sure the resulting assignment
1585 is validly typed. */
1586 maybe_rewrite_mem_ref_base (rhsp
, suitable_for_renaming
);
1587 rhs
= gimple_assign_rhs1 (stmt
);
1588 if (gimple_assign_lhs (stmt
) != lhs
1589 && !useless_type_conversion_p (TREE_TYPE (lhs
),
1591 rhs
= fold_build1 (VIEW_CONVERT_EXPR
,
1592 TREE_TYPE (lhs
), rhs
);
1594 if (gimple_assign_lhs (stmt
) != lhs
)
1595 gimple_assign_set_lhs (stmt
, lhs
);
1597 /* For var ={v} {CLOBBER}; where var lost
1598 TREE_ADDRESSABLE just remove the stmt. */
1600 && TREE_CLOBBER_P (rhs
)
1601 && bitmap_bit_p (suitable_for_renaming
, DECL_UID (lhs
)))
1603 unlink_stmt_vdef (stmt
);
1604 gsi_remove (&gsi
, true);
1605 release_defs (stmt
);
1609 if (gimple_assign_rhs1 (stmt
) != rhs
)
1611 gimple_stmt_iterator gsi
= gsi_for_stmt (stmt
);
1612 gimple_assign_set_rhs_from_tree (&gsi
, rhs
);
1616 else if (gimple_code (stmt
) == GIMPLE_CALL
)
1619 for (i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
1621 tree
*argp
= gimple_call_arg_ptr (stmt
, i
);
1622 maybe_rewrite_mem_ref_base (argp
, suitable_for_renaming
);
1626 else if (gimple_code (stmt
) == GIMPLE_ASM
)
1629 for (i
= 0; i
< gimple_asm_noutputs (stmt
); ++i
)
1631 tree link
= gimple_asm_output_op (stmt
, i
);
1632 maybe_rewrite_mem_ref_base (&TREE_VALUE (link
),
1633 suitable_for_renaming
);
1635 for (i
= 0; i
< gimple_asm_ninputs (stmt
); ++i
)
1637 tree link
= gimple_asm_input_op (stmt
, i
);
1638 maybe_rewrite_mem_ref_base (&TREE_VALUE (link
),
1639 suitable_for_renaming
);
1643 else if (gimple_debug_bind_p (stmt
)
1644 && gimple_debug_bind_has_value_p (stmt
))
1646 tree
*valuep
= gimple_debug_bind_get_value_ptr (stmt
);
1648 maybe_rewrite_mem_ref_base (valuep
, suitable_for_renaming
);
1649 decl
= non_rewritable_mem_ref_base (*valuep
);
1651 && bitmap_bit_p (suitable_for_renaming
, DECL_UID (decl
)))
1652 gimple_debug_bind_reset_value (stmt
);
1655 if (gimple_references_memory_p (stmt
)
1656 || is_gimple_debug (stmt
))
1662 /* Update SSA form here, we are called as non-pass as well. */
1663 if (number_of_loops (cfun
) > 1
1664 && loops_state_satisfies_p (LOOP_CLOSED_SSA
))
1665 rewrite_into_loop_closed_ssa (NULL
, TODO_update_ssa
);
1667 update_ssa (TODO_update_ssa
);
1670 BITMAP_FREE (not_reg_needs
);
1671 BITMAP_FREE (addresses_taken
);
1672 BITMAP_FREE (suitable_for_renaming
);
1673 timevar_pop (TV_ADDRESS_TAKEN
);
1678 const pass_data pass_data_update_address_taken
=
1680 GIMPLE_PASS
, /* type */
1681 "addressables", /* name */
1682 OPTGROUP_NONE
, /* optinfo_flags */
1683 false, /* has_gate */
1684 false, /* has_execute */
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
);