2015-06-11 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / tree-ssa.c
blob026b23a5ae6a81266b19fec69ccd42a4226b730f
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)
9 any later version.
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/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "input.h"
25 #include "alias.h"
26 #include "symtab.h"
27 #include "tree.h"
28 #include "fold-const.h"
29 #include "stor-layout.h"
30 #include "flags.h"
31 #include "tm_p.h"
32 #include "target.h"
33 #include "langhooks.h"
34 #include "predict.h"
35 #include "hard-reg-set.h"
36 #include "input.h"
37 #include "function.h"
38 #include "dominance.h"
39 #include "cfg.h"
40 #include "basic-block.h"
41 #include "gimple-pretty-print.h"
42 #include "tree-ssa-alias.h"
43 #include "internal-fn.h"
44 #include "gimple-fold.h"
45 #include "gimple-expr.h"
46 #include "is-a.h"
47 #include "gimple.h"
48 #include "gimplify.h"
49 #include "gimple-iterator.h"
50 #include "gimple-walk.h"
51 #include "gimple-ssa.h"
52 #include "tree-phinodes.h"
53 #include "ssa-iterators.h"
54 #include "stringpool.h"
55 #include "tree-ssanames.h"
56 #include "tree-ssa-loop-manip.h"
57 #include "tree-into-ssa.h"
58 #include "tree-ssa.h"
59 #include "tree-inline.h"
60 #include "tree-pass.h"
61 #include "diagnostic-core.h"
62 #include "cfgloop.h"
63 #include "cfgexpand.h"
65 /* Pointer map of variable mappings, keyed by edge. */
66 static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
69 /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
71 void
72 redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
74 edge_var_map new_node;
76 if (edge_var_maps == NULL)
77 edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
79 auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
80 new_node.def = def;
81 new_node.result = result;
82 new_node.locus = locus;
84 slot.safe_push (new_node);
88 /* Clear the var mappings in edge E. */
90 void
91 redirect_edge_var_map_clear (edge e)
93 if (!edge_var_maps)
94 return;
96 auto_vec<edge_var_map> *head = edge_var_maps->get (e);
98 if (head)
99 head->release ();
103 /* Duplicate the redirected var mappings in OLDE in NEWE.
105 This assumes a hash_map can have multiple edges mapping to the same
106 var_map (many to one mapping), since we don't remove the previous mappings.
109 void
110 redirect_edge_var_map_dup (edge newe, edge olde)
112 if (!edge_var_maps)
113 return;
115 auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
116 auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
117 if (!old_head)
118 return;
120 new_head->safe_splice (*old_head);
124 /* Return the variable mappings for a given edge. If there is none, return
125 NULL. */
127 vec<edge_var_map> *
128 redirect_edge_var_map_vector (edge e)
130 /* Hey, what kind of idiot would... you'd be surprised. */
131 if (!edge_var_maps)
132 return NULL;
134 auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
135 if (!slot)
136 return NULL;
138 return slot;
141 /* Clear the edge variable mappings. */
143 void
144 redirect_edge_var_map_destroy (void)
146 delete edge_var_maps;
147 edge_var_maps = NULL;
151 /* Remove the corresponding arguments from the PHI nodes in E's
152 destination block and redirect it to DEST. Return redirected edge.
153 The list of removed arguments is stored in a vector accessed
154 through edge_var_maps. */
156 edge
157 ssa_redirect_edge (edge e, basic_block dest)
159 gphi_iterator gsi;
160 gphi *phi;
162 redirect_edge_var_map_clear (e);
164 /* Remove the appropriate PHI arguments in E's destination block. */
165 for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
167 tree def;
168 source_location locus ;
170 phi = gsi.phi ();
171 def = gimple_phi_arg_def (phi, e->dest_idx);
172 locus = gimple_phi_arg_location (phi, e->dest_idx);
174 if (def == NULL_TREE)
175 continue;
177 redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
180 e = redirect_edge_succ_nodup (e, dest);
182 return e;
186 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
187 E->dest. */
189 void
190 flush_pending_stmts (edge e)
192 gphi *phi;
193 edge_var_map *vm;
194 int i;
195 gphi_iterator gsi;
197 vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
198 if (!v)
199 return;
201 for (gsi = gsi_start_phis (e->dest), i = 0;
202 !gsi_end_p (gsi) && v->iterate (i, &vm);
203 gsi_next (&gsi), i++)
205 tree def;
207 phi = gsi.phi ();
208 def = redirect_edge_var_map_def (vm);
209 add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
212 redirect_edge_var_map_clear (e);
215 /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
216 GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
217 expression with a different value.
219 This will update any annotations (say debug bind stmts) referring
220 to the original LHS, so that they use the RHS instead. This is
221 done even if NLHS and LHS are the same, for it is understood that
222 the RHS will be modified afterwards, and NLHS will not be assigned
223 an equivalent value.
225 Adjusting any non-annotation uses of the LHS, if needed, is a
226 responsibility of the caller.
228 The effect of this call should be pretty much the same as that of
229 inserting a copy of STMT before STMT, and then removing the
230 original stmt, at which time gsi_remove() would have update
231 annotations, but using this function saves all the inserting,
232 copying and removing. */
234 void
235 gimple_replace_ssa_lhs (gimple stmt, tree nlhs)
237 if (MAY_HAVE_DEBUG_STMTS)
239 tree lhs = gimple_get_lhs (stmt);
241 gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
243 insert_debug_temp_for_var_def (NULL, lhs);
246 gimple_set_lhs (stmt, nlhs);
250 /* Given a tree for an expression for which we might want to emit
251 locations or values in debug information (generally a variable, but
252 we might deal with other kinds of trees in the future), return the
253 tree that should be used as the variable of a DEBUG_BIND STMT or
254 VAR_LOCATION INSN or NOTE. Return NULL if VAR is not to be tracked. */
256 tree
257 target_for_debug_bind (tree var)
259 if (!MAY_HAVE_DEBUG_STMTS)
260 return NULL_TREE;
262 if (TREE_CODE (var) == SSA_NAME)
264 var = SSA_NAME_VAR (var);
265 if (var == NULL_TREE)
266 return NULL_TREE;
269 if ((TREE_CODE (var) != VAR_DECL
270 || VAR_DECL_IS_VIRTUAL_OPERAND (var))
271 && TREE_CODE (var) != PARM_DECL)
272 return NULL_TREE;
274 if (DECL_HAS_VALUE_EXPR_P (var))
275 return target_for_debug_bind (DECL_VALUE_EXPR (var));
277 if (DECL_IGNORED_P (var))
278 return NULL_TREE;
280 /* var-tracking only tracks registers. */
281 if (!is_gimple_reg_type (TREE_TYPE (var)))
282 return NULL_TREE;
284 return var;
287 /* Called via walk_tree, look for SSA_NAMEs that have already been
288 released. */
290 static tree
291 find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
293 struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
295 if (wi && wi->is_lhs)
296 return NULL_TREE;
298 if (TREE_CODE (*tp) == SSA_NAME)
300 if (SSA_NAME_IN_FREE_LIST (*tp))
301 return *tp;
303 *walk_subtrees = 0;
305 else if (IS_TYPE_OR_DECL_P (*tp))
306 *walk_subtrees = 0;
308 return NULL_TREE;
311 /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced
312 by other DEBUG stmts, and replace uses of the DEF with the
313 newly-created debug temp. */
315 void
316 insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
318 imm_use_iterator imm_iter;
319 use_operand_p use_p;
320 gimple stmt;
321 gimple def_stmt = NULL;
322 int usecount = 0;
323 tree value = NULL;
325 if (!MAY_HAVE_DEBUG_STMTS)
326 return;
328 /* If this name has already been registered for replacement, do nothing
329 as anything that uses this name isn't in SSA form. */
330 if (name_registered_for_update_p (var))
331 return;
333 /* Check whether there are debug stmts that reference this variable and,
334 if there are, decide whether we should use a debug temp. */
335 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
337 stmt = USE_STMT (use_p);
339 if (!gimple_debug_bind_p (stmt))
340 continue;
342 if (usecount++)
343 break;
345 if (gimple_debug_bind_get_value (stmt) != var)
347 /* Count this as an additional use, so as to make sure we
348 use a temp unless VAR's definition has a SINGLE_RHS that
349 can be shared. */
350 usecount++;
351 break;
355 if (!usecount)
356 return;
358 if (gsi)
359 def_stmt = gsi_stmt (*gsi);
360 else
361 def_stmt = SSA_NAME_DEF_STMT (var);
363 /* If we didn't get an insertion point, and the stmt has already
364 been removed, we won't be able to insert the debug bind stmt, so
365 we'll have to drop debug information. */
366 if (gimple_code (def_stmt) == GIMPLE_PHI)
368 value = degenerate_phi_result (as_a <gphi *> (def_stmt));
369 if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
370 value = NULL;
371 /* error_mark_node is what fixup_noreturn_call changes PHI arguments
372 to. */
373 else if (value == error_mark_node)
374 value = NULL;
376 else if (is_gimple_assign (def_stmt))
378 bool no_value = false;
380 if (!dom_info_available_p (CDI_DOMINATORS))
382 struct walk_stmt_info wi;
384 memset (&wi, 0, sizeof (wi));
386 /* When removing blocks without following reverse dominance
387 order, we may sometimes encounter SSA_NAMEs that have
388 already been released, referenced in other SSA_DEFs that
389 we're about to release. Consider:
391 <bb X>:
392 v_1 = foo;
394 <bb Y>:
395 w_2 = v_1 + bar;
396 # DEBUG w => w_2
398 If we deleted BB X first, propagating the value of w_2
399 won't do us any good. It's too late to recover their
400 original definition of v_1: when it was deleted, it was
401 only referenced in other DEFs, it couldn't possibly know
402 it should have been retained, and propagating every
403 single DEF just in case it might have to be propagated
404 into a DEBUG STMT would probably be too wasteful.
406 When dominator information is not readily available, we
407 check for and accept some loss of debug information. But
408 if it is available, there's no excuse for us to remove
409 blocks in the wrong order, so we don't even check for
410 dead SSA NAMEs. SSA verification shall catch any
411 errors. */
412 if ((!gsi && !gimple_bb (def_stmt))
413 || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
414 no_value = true;
417 if (!no_value)
418 value = gimple_assign_rhs_to_tree (def_stmt);
421 if (value)
423 /* If there's a single use of VAR, and VAR is the entire debug
424 expression (usecount would have been incremented again
425 otherwise), and the definition involves only constants and
426 SSA names, then we can propagate VALUE into this single use,
427 avoiding the temp.
429 We can also avoid using a temp if VALUE can be shared and
430 propagated into all uses, without generating expressions that
431 wouldn't be valid gimple RHSs.
433 Other cases that would require unsharing or non-gimple RHSs
434 are deferred to a debug temp, although we could avoid temps
435 at the expense of duplication of expressions. */
437 if (CONSTANT_CLASS_P (value)
438 || gimple_code (def_stmt) == GIMPLE_PHI
439 || (usecount == 1
440 && (!gimple_assign_single_p (def_stmt)
441 || is_gimple_min_invariant (value)))
442 || is_gimple_reg (value))
444 else
446 gdebug *def_temp;
447 tree vexpr = make_node (DEBUG_EXPR_DECL);
449 def_temp = gimple_build_debug_bind (vexpr,
450 unshare_expr (value),
451 def_stmt);
453 DECL_ARTIFICIAL (vexpr) = 1;
454 TREE_TYPE (vexpr) = TREE_TYPE (value);
455 if (DECL_P (value))
456 DECL_MODE (vexpr) = DECL_MODE (value);
457 else
458 DECL_MODE (vexpr) = TYPE_MODE (TREE_TYPE (value));
460 if (gsi)
461 gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
462 else
464 gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
465 gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
468 value = vexpr;
472 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
474 if (!gimple_debug_bind_p (stmt))
475 continue;
477 if (value)
479 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
480 /* unshare_expr is not needed here. vexpr is either a
481 SINGLE_RHS, that can be safely shared, some other RHS
482 that was unshared when we found it had a single debug
483 use, or a DEBUG_EXPR_DECL, that can be safely
484 shared. */
485 SET_USE (use_p, unshare_expr (value));
486 /* If we didn't replace uses with a debug decl fold the
487 resulting expression. Otherwise we end up with invalid IL. */
488 if (TREE_CODE (value) != DEBUG_EXPR_DECL)
490 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
491 fold_stmt_inplace (&gsi);
494 else
495 gimple_debug_bind_reset_value (stmt);
497 update_stmt (stmt);
502 /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by
503 other DEBUG stmts, and replace uses of the DEF with the
504 newly-created debug temp. */
506 void
507 insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
509 gimple stmt;
510 ssa_op_iter op_iter;
511 def_operand_p def_p;
513 if (!MAY_HAVE_DEBUG_STMTS)
514 return;
516 stmt = gsi_stmt (*gsi);
518 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
520 tree var = DEF_FROM_PTR (def_p);
522 if (TREE_CODE (var) != SSA_NAME)
523 continue;
525 insert_debug_temp_for_var_def (gsi, var);
529 /* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */
531 void
532 reset_debug_uses (gimple stmt)
534 ssa_op_iter op_iter;
535 def_operand_p def_p;
536 imm_use_iterator imm_iter;
537 gimple use_stmt;
539 if (!MAY_HAVE_DEBUG_STMTS)
540 return;
542 FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
544 tree var = DEF_FROM_PTR (def_p);
546 if (TREE_CODE (var) != SSA_NAME)
547 continue;
549 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
551 if (!gimple_debug_bind_p (use_stmt))
552 continue;
554 gimple_debug_bind_reset_value (use_stmt);
555 update_stmt (use_stmt);
560 /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
561 dominated stmts before their dominators, so that release_ssa_defs
562 stands a chance of propagating DEFs into debug bind stmts. */
564 void
565 release_defs_bitset (bitmap toremove)
567 unsigned j;
568 bitmap_iterator bi;
570 /* Performing a topological sort is probably overkill, this will
571 most likely run in slightly superlinear time, rather than the
572 pathological quadratic worst case. */
573 while (!bitmap_empty_p (toremove))
574 EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
576 bool remove_now = true;
577 tree var = ssa_name (j);
578 gimple stmt;
579 imm_use_iterator uit;
581 FOR_EACH_IMM_USE_STMT (stmt, uit, var)
583 ssa_op_iter dit;
584 def_operand_p def_p;
586 /* We can't propagate PHI nodes into debug stmts. */
587 if (gimple_code (stmt) == GIMPLE_PHI
588 || is_gimple_debug (stmt))
589 continue;
591 /* If we find another definition to remove that uses
592 the one we're looking at, defer the removal of this
593 one, so that it can be propagated into debug stmts
594 after the other is. */
595 FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
597 tree odef = DEF_FROM_PTR (def_p);
599 if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
601 remove_now = false;
602 break;
606 if (!remove_now)
607 BREAK_FROM_IMM_USE_STMT (uit);
610 if (remove_now)
612 gimple def = SSA_NAME_DEF_STMT (var);
613 gimple_stmt_iterator gsi = gsi_for_stmt (def);
615 if (gimple_code (def) == GIMPLE_PHI)
616 remove_phi_node (&gsi, true);
617 else
619 gsi_remove (&gsi, true);
620 release_defs (def);
623 bitmap_clear_bit (toremove, j);
628 /* Return true if SSA_NAME is malformed and mark it visited.
630 IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
631 operand. */
633 static bool
634 verify_ssa_name (tree ssa_name, bool is_virtual)
636 if (TREE_CODE (ssa_name) != SSA_NAME)
638 error ("expected an SSA_NAME object");
639 return true;
642 if (SSA_NAME_IN_FREE_LIST (ssa_name))
644 error ("found an SSA_NAME that had been released into the free pool");
645 return true;
648 if (SSA_NAME_VAR (ssa_name) != NULL_TREE
649 && TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
651 error ("type mismatch between an SSA_NAME and its symbol");
652 return true;
655 if (is_virtual && !virtual_operand_p (ssa_name))
657 error ("found a virtual definition for a GIMPLE register");
658 return true;
661 if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun))
663 error ("virtual SSA name for non-VOP decl");
664 return true;
667 if (!is_virtual && virtual_operand_p (ssa_name))
669 error ("found a real definition for a non-register");
670 return true;
673 if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
674 && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)))
676 error ("found a default name with a non-empty defining statement");
677 return true;
680 return false;
684 /* Return true if the definition of SSA_NAME at block BB is malformed.
686 STMT is the statement where SSA_NAME is created.
688 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
689 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
690 it means that the block in that array slot contains the
691 definition of SSA_NAME.
693 IS_VIRTUAL is true if SSA_NAME is created by a VDEF. */
695 static bool
696 verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
697 gimple stmt, bool is_virtual)
699 if (verify_ssa_name (ssa_name, is_virtual))
700 goto err;
702 if (SSA_NAME_VAR (ssa_name)
703 && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
704 && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
706 error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
707 goto err;
710 if (definition_block[SSA_NAME_VERSION (ssa_name)])
712 error ("SSA_NAME created in two different blocks %i and %i",
713 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
714 goto err;
717 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
719 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
721 error ("SSA_NAME_DEF_STMT is wrong");
722 fprintf (stderr, "Expected definition statement:\n");
723 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS);
724 fprintf (stderr, "\nActual definition statement:\n");
725 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
726 goto err;
729 return false;
731 err:
732 fprintf (stderr, "while verifying SSA_NAME ");
733 print_generic_expr (stderr, ssa_name, 0);
734 fprintf (stderr, " in statement\n");
735 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
737 return true;
741 /* Return true if the use of SSA_NAME at statement STMT in block BB is
742 malformed.
744 DEF_BB is the block where SSA_NAME was found to be created.
746 IDOM contains immediate dominator information for the flowgraph.
748 CHECK_ABNORMAL is true if the caller wants to check whether this use
749 is flowing through an abnormal edge (only used when checking PHI
750 arguments).
752 If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
753 that are defined before STMT in basic block BB. */
755 static bool
756 verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
757 gimple stmt, bool check_abnormal, bitmap names_defined_in_bb)
759 bool err = false;
760 tree ssa_name = USE_FROM_PTR (use_p);
762 if (!TREE_VISITED (ssa_name))
763 if (verify_imm_links (stderr, ssa_name))
764 err = true;
766 TREE_VISITED (ssa_name) = 1;
768 if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
769 && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
770 ; /* Default definitions have empty statements. Nothing to do. */
771 else if (!def_bb)
773 error ("missing definition");
774 err = true;
776 else if (bb != def_bb
777 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
779 error ("definition in block %i does not dominate use in block %i",
780 def_bb->index, bb->index);
781 err = true;
783 else if (bb == def_bb
784 && names_defined_in_bb != NULL
785 && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
787 error ("definition in block %i follows the use", def_bb->index);
788 err = true;
791 if (check_abnormal
792 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
794 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
795 err = true;
798 /* Make sure the use is in an appropriate list by checking the previous
799 element to make sure it's the same. */
800 if (use_p->prev == NULL)
802 error ("no immediate_use list");
803 err = true;
805 else
807 tree listvar;
808 if (use_p->prev->use == NULL)
809 listvar = use_p->prev->loc.ssa_name;
810 else
811 listvar = USE_FROM_PTR (use_p->prev);
812 if (listvar != ssa_name)
814 error ("wrong immediate use list");
815 err = true;
819 if (err)
821 fprintf (stderr, "for SSA_NAME: ");
822 print_generic_expr (stderr, ssa_name, TDF_VOPS);
823 fprintf (stderr, " in statement:\n");
824 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
827 return err;
831 /* Return true if any of the arguments for PHI node PHI at block BB is
832 malformed.
834 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
835 version numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
836 it means that the block in that array slot contains the
837 definition of SSA_NAME. */
839 static bool
840 verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
842 edge e;
843 bool err = false;
844 size_t i, phi_num_args = gimple_phi_num_args (phi);
846 if (EDGE_COUNT (bb->preds) != phi_num_args)
848 error ("incoming edge count does not match number of PHI arguments");
849 err = true;
850 goto error;
853 for (i = 0; i < phi_num_args; i++)
855 use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
856 tree op = USE_FROM_PTR (op_p);
858 e = EDGE_PRED (bb, i);
860 if (op == NULL_TREE)
862 error ("PHI argument is missing for edge %d->%d",
863 e->src->index,
864 e->dest->index);
865 err = true;
866 goto error;
869 if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
871 error ("PHI argument is not SSA_NAME, or invariant");
872 err = true;
875 if (TREE_CODE (op) == SSA_NAME)
877 err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
878 err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
879 op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
882 if (TREE_CODE (op) == ADDR_EXPR)
884 tree base = TREE_OPERAND (op, 0);
885 while (handled_component_p (base))
886 base = TREE_OPERAND (base, 0);
887 if ((TREE_CODE (base) == VAR_DECL
888 || TREE_CODE (base) == PARM_DECL
889 || TREE_CODE (base) == RESULT_DECL)
890 && !TREE_ADDRESSABLE (base))
892 error ("address taken, but ADDRESSABLE bit not set");
893 err = true;
897 if (e->dest != bb)
899 error ("wrong edge %d->%d for PHI argument",
900 e->src->index, e->dest->index);
901 err = true;
904 if (err)
906 fprintf (stderr, "PHI argument\n");
907 print_generic_stmt (stderr, op, TDF_VOPS);
908 goto error;
912 error:
913 if (err)
915 fprintf (stderr, "for PHI node\n");
916 print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
920 return err;
924 /* Verify common invariants in the SSA web.
925 TODO: verify the variable annotations. */
927 DEBUG_FUNCTION void
928 verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
930 size_t i;
931 basic_block bb;
932 basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
933 ssa_op_iter iter;
934 tree op;
935 enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
936 bitmap names_defined_in_bb = BITMAP_ALLOC (NULL);
938 gcc_assert (!need_ssa_update_p (cfun));
940 timevar_push (TV_TREE_SSA_VERIFY);
942 /* Keep track of SSA names present in the IL. */
943 for (i = 1; i < num_ssa_names; i++)
945 tree name = ssa_name (i);
946 if (name)
948 gimple stmt;
949 TREE_VISITED (name) = 0;
951 verify_ssa_name (name, virtual_operand_p (name));
953 stmt = SSA_NAME_DEF_STMT (name);
954 if (!gimple_nop_p (stmt))
956 basic_block bb = gimple_bb (stmt);
957 if (verify_def (bb, definition_block,
958 name, stmt, virtual_operand_p (name)))
959 goto err;
964 calculate_dominance_info (CDI_DOMINATORS);
966 /* Now verify all the uses and make sure they agree with the definitions
967 found in the previous pass. */
968 FOR_EACH_BB_FN (bb, cfun)
970 edge e;
971 edge_iterator ei;
973 /* Make sure that all edges have a clear 'aux' field. */
974 FOR_EACH_EDGE (e, ei, bb->preds)
976 if (e->aux)
978 error ("AUX pointer initialized for edge %d->%d", e->src->index,
979 e->dest->index);
980 goto err;
984 /* Verify the arguments for every PHI node in the block. */
985 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
987 gphi *phi = gsi.phi ();
988 if (verify_phi_args (phi, bb, definition_block))
989 goto err;
991 bitmap_set_bit (names_defined_in_bb,
992 SSA_NAME_VERSION (gimple_phi_result (phi)));
995 /* Now verify all the uses and vuses in every statement of the block. */
996 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
997 gsi_next (&gsi))
999 gimple stmt = gsi_stmt (gsi);
1000 use_operand_p use_p;
1002 if (check_modified_stmt && gimple_modified_p (stmt))
1004 error ("stmt (%p) marked modified after optimization pass: ",
1005 (void *)stmt);
1006 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
1007 goto err;
1010 if (check_ssa_operands && verify_ssa_operands (cfun, stmt))
1012 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
1013 goto err;
1016 if (gimple_debug_bind_p (stmt)
1017 && !gimple_debug_bind_has_value_p (stmt))
1018 continue;
1020 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
1022 op = USE_FROM_PTR (use_p);
1023 if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
1024 use_p, stmt, false, names_defined_in_bb))
1025 goto err;
1028 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
1030 if (SSA_NAME_DEF_STMT (op) != stmt)
1032 error ("SSA_NAME_DEF_STMT is wrong");
1033 fprintf (stderr, "Expected definition statement:\n");
1034 print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
1035 fprintf (stderr, "\nActual definition statement:\n");
1036 print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (op),
1037 4, TDF_VOPS);
1038 goto err;
1040 bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
1044 bitmap_clear (names_defined_in_bb);
1047 free (definition_block);
1049 /* Restore the dominance information to its prior known state, so
1050 that we do not perturb the compiler's subsequent behavior. */
1051 if (orig_dom_state == DOM_NONE)
1052 free_dominance_info (CDI_DOMINATORS);
1053 else
1054 set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
1056 BITMAP_FREE (names_defined_in_bb);
1057 timevar_pop (TV_TREE_SSA_VERIFY);
1058 return;
1060 err:
1061 internal_error ("verify_ssa failed");
1065 /* Initialize global DFA and SSA structures. */
1067 void
1068 init_tree_ssa (struct function *fn)
1070 fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
1071 fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
1072 pt_solution_reset (&fn->gimple_df->escaped);
1073 init_ssanames (fn, 0);
1076 /* Do the actions required to initialize internal data structures used
1077 in tree-ssa optimization passes. */
1079 static unsigned int
1080 execute_init_datastructures (void)
1082 /* Allocate hash tables, arrays and other structures. */
1083 gcc_assert (!cfun->gimple_df);
1084 init_tree_ssa (cfun);
1085 return 0;
1088 namespace {
1090 const pass_data pass_data_init_datastructures =
1092 GIMPLE_PASS, /* type */
1093 "*init_datastructures", /* name */
1094 OPTGROUP_NONE, /* optinfo_flags */
1095 TV_NONE, /* tv_id */
1096 PROP_cfg, /* properties_required */
1097 0, /* properties_provided */
1098 0, /* properties_destroyed */
1099 0, /* todo_flags_start */
1100 0, /* todo_flags_finish */
1103 class pass_init_datastructures : public gimple_opt_pass
1105 public:
1106 pass_init_datastructures (gcc::context *ctxt)
1107 : gimple_opt_pass (pass_data_init_datastructures, ctxt)
1110 /* opt_pass methods: */
1111 virtual bool gate (function *fun)
1113 /* Do nothing for funcions that was produced already in SSA form. */
1114 return !(fun->curr_properties & PROP_ssa);
1117 virtual unsigned int execute (function *)
1119 return execute_init_datastructures ();
1122 }; // class pass_init_datastructures
1124 } // anon namespace
1126 gimple_opt_pass *
1127 make_pass_init_datastructures (gcc::context *ctxt)
1129 return new pass_init_datastructures (ctxt);
1132 /* Deallocate memory associated with SSA data structures for FNDECL. */
1134 void
1135 delete_tree_ssa (void)
1137 fini_ssanames ();
1139 /* We no longer maintain the SSA operand cache at this point. */
1140 if (ssa_operands_active (cfun))
1141 fini_ssa_operands (cfun);
1143 cfun->gimple_df->default_defs->empty ();
1144 cfun->gimple_df->default_defs = NULL;
1145 pt_solution_reset (&cfun->gimple_df->escaped);
1146 if (cfun->gimple_df->decls_to_pointers != NULL)
1147 delete cfun->gimple_df->decls_to_pointers;
1148 cfun->gimple_df->decls_to_pointers = NULL;
1149 cfun->gimple_df->modified_noreturn_calls = NULL;
1150 cfun->gimple_df = NULL;
1152 /* We no longer need the edge variable maps. */
1153 redirect_edge_var_map_destroy ();
1156 /* Return true if EXPR is a useless type conversion, otherwise return
1157 false. */
1159 bool
1160 tree_ssa_useless_type_conversion (tree expr)
1162 /* If we have an assignment that merely uses a NOP_EXPR to change
1163 the top of the RHS to the type of the LHS and the type conversion
1164 is "safe", then strip away the type conversion so that we can
1165 enter LHS = RHS into the const_and_copies table. */
1166 if (CONVERT_EXPR_P (expr)
1167 || TREE_CODE (expr) == VIEW_CONVERT_EXPR
1168 || TREE_CODE (expr) == NON_LVALUE_EXPR)
1169 return useless_type_conversion_p
1170 (TREE_TYPE (expr),
1171 TREE_TYPE (TREE_OPERAND (expr, 0)));
1173 return false;
1176 /* Strip conversions from EXP according to
1177 tree_ssa_useless_type_conversion and return the resulting
1178 expression. */
1180 tree
1181 tree_ssa_strip_useless_type_conversions (tree exp)
1183 while (tree_ssa_useless_type_conversion (exp))
1184 exp = TREE_OPERAND (exp, 0);
1185 return exp;
1189 /* Return true if T, an SSA_NAME, has an undefined value. PARTIAL is what
1190 should be returned if the value is only partially undefined. */
1192 bool
1193 ssa_undefined_value_p (tree t, bool partial)
1195 gimple def_stmt;
1196 tree var = SSA_NAME_VAR (t);
1198 if (!var)
1200 /* Parameters get their initial value from the function entry. */
1201 else if (TREE_CODE (var) == PARM_DECL)
1202 return false;
1203 /* When returning by reference the return address is actually a hidden
1204 parameter. */
1205 else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var))
1206 return false;
1207 /* Hard register variables get their initial value from the ether. */
1208 else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1209 return false;
1211 /* The value is undefined iff its definition statement is empty. */
1212 def_stmt = SSA_NAME_DEF_STMT (t);
1213 if (gimple_nop_p (def_stmt))
1214 return true;
1216 /* Check if the complex was not only partially defined. */
1217 if (partial && is_gimple_assign (def_stmt)
1218 && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
1220 tree rhs1, rhs2;
1222 rhs1 = gimple_assign_rhs1 (def_stmt);
1223 rhs2 = gimple_assign_rhs2 (def_stmt);
1224 return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
1225 || (TREE_CODE (rhs2) == SSA_NAME && ssa_undefined_value_p (rhs2));
1227 return false;
1231 /* If necessary, rewrite the base of the reference tree *TP from
1232 a MEM_REF to a plain or converted symbol. */
1234 static void
1235 maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
1237 tree sym;
1239 while (handled_component_p (*tp))
1240 tp = &TREE_OPERAND (*tp, 0);
1241 if (TREE_CODE (*tp) == MEM_REF
1242 && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
1243 && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
1244 && DECL_P (sym)
1245 && !TREE_ADDRESSABLE (sym)
1246 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
1248 if (TREE_CODE (TREE_TYPE (sym)) == VECTOR_TYPE
1249 && useless_type_conversion_p (TREE_TYPE (*tp),
1250 TREE_TYPE (TREE_TYPE (sym)))
1251 && multiple_of_p (sizetype, TREE_OPERAND (*tp, 1),
1252 TYPE_SIZE_UNIT (TREE_TYPE (*tp))))
1254 *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
1255 TYPE_SIZE (TREE_TYPE (*tp)),
1256 int_const_binop (MULT_EXPR,
1257 bitsize_int (BITS_PER_UNIT),
1258 TREE_OPERAND (*tp, 1)));
1260 else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
1261 && useless_type_conversion_p (TREE_TYPE (*tp),
1262 TREE_TYPE (TREE_TYPE (sym))))
1264 *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
1265 ? REALPART_EXPR : IMAGPART_EXPR,
1266 TREE_TYPE (*tp), sym);
1268 else if (integer_zerop (TREE_OPERAND (*tp, 1)))
1270 if (!useless_type_conversion_p (TREE_TYPE (*tp),
1271 TREE_TYPE (sym)))
1272 *tp = build1 (VIEW_CONVERT_EXPR,
1273 TREE_TYPE (*tp), sym);
1274 else
1275 *tp = sym;
1280 /* For a tree REF return its base if it is the base of a MEM_REF
1281 that cannot be rewritten into SSA form. Otherwise return NULL_TREE. */
1283 static tree
1284 non_rewritable_mem_ref_base (tree ref)
1286 tree base = ref;
1288 /* A plain decl does not need it set. */
1289 if (DECL_P (ref))
1290 return NULL_TREE;
1292 while (handled_component_p (base))
1293 base = TREE_OPERAND (base, 0);
1295 /* But watch out for MEM_REFs we cannot lower to a
1296 VIEW_CONVERT_EXPR or a BIT_FIELD_REF. */
1297 if (TREE_CODE (base) == MEM_REF
1298 && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
1300 tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
1301 if ((TREE_CODE (TREE_TYPE (decl)) == VECTOR_TYPE
1302 || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
1303 && useless_type_conversion_p (TREE_TYPE (base),
1304 TREE_TYPE (TREE_TYPE (decl)))
1305 && wi::fits_uhwi_p (mem_ref_offset (base))
1306 && wi::gtu_p (wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
1307 mem_ref_offset (base))
1308 && multiple_of_p (sizetype, TREE_OPERAND (base, 1),
1309 TYPE_SIZE_UNIT (TREE_TYPE (base))))
1310 return NULL_TREE;
1311 if (DECL_P (decl)
1312 && (!integer_zerop (TREE_OPERAND (base, 1))
1313 || (DECL_SIZE (decl)
1314 != TYPE_SIZE (TREE_TYPE (base)))
1315 || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base)))
1316 return decl;
1319 return NULL_TREE;
1322 /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1323 Otherwise return true. */
1325 static bool
1326 non_rewritable_lvalue_p (tree lhs)
1328 /* A plain decl is always rewritable. */
1329 if (DECL_P (lhs))
1330 return false;
1332 /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
1333 a reasonably efficient manner... */
1334 if ((TREE_CODE (lhs) == REALPART_EXPR
1335 || TREE_CODE (lhs) == IMAGPART_EXPR)
1336 && DECL_P (TREE_OPERAND (lhs, 0)))
1337 return false;
1339 /* A decl that is wrapped inside a MEM-REF that covers
1340 it full is also rewritable.
1341 ??? The following could be relaxed allowing component
1342 references that do not change the access size. */
1343 if (TREE_CODE (lhs) == MEM_REF
1344 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
1345 && integer_zerop (TREE_OPERAND (lhs, 1)))
1347 tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
1348 if (DECL_P (decl)
1349 && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
1350 && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
1351 return false;
1354 return true;
1357 /* When possible, clear TREE_ADDRESSABLE bit or set DECL_GIMPLE_REG_P bit and
1358 mark the variable VAR for conversion into SSA. Return true when updating
1359 stmts is required. */
1361 static void
1362 maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
1363 bitmap suitable_for_renaming)
1365 /* Global Variables, result decls cannot be changed. */
1366 if (is_global_var (var)
1367 || TREE_CODE (var) == RESULT_DECL
1368 || bitmap_bit_p (addresses_taken, DECL_UID (var)))
1369 return;
1371 if (TREE_ADDRESSABLE (var)
1372 /* Do not change TREE_ADDRESSABLE if we need to preserve var as
1373 a non-register. Otherwise we are confused and forget to
1374 add virtual operands for it. */
1375 && (!is_gimple_reg_type (TREE_TYPE (var))
1376 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE
1377 || TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
1378 || !bitmap_bit_p (not_reg_needs, DECL_UID (var))))
1380 TREE_ADDRESSABLE (var) = 0;
1381 if (is_gimple_reg (var))
1382 bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
1383 if (dump_file)
1385 fprintf (dump_file, "No longer having address taken: ");
1386 print_generic_expr (dump_file, var, 0);
1387 fprintf (dump_file, "\n");
1391 if (!DECL_GIMPLE_REG_P (var)
1392 && !bitmap_bit_p (not_reg_needs, DECL_UID (var))
1393 && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
1394 || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE)
1395 && !TREE_THIS_VOLATILE (var)
1396 && (TREE_CODE (var) != VAR_DECL || !DECL_HARD_REGISTER (var)))
1398 DECL_GIMPLE_REG_P (var) = 1;
1399 bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
1400 if (dump_file)
1402 fprintf (dump_file, "Now a gimple register: ");
1403 print_generic_expr (dump_file, var, 0);
1404 fprintf (dump_file, "\n");
1409 /* Compute TREE_ADDRESSABLE and DECL_GIMPLE_REG_P for local variables. */
1411 void
1412 execute_update_addresses_taken (void)
1414 basic_block bb;
1415 bitmap addresses_taken = BITMAP_ALLOC (NULL);
1416 bitmap not_reg_needs = BITMAP_ALLOC (NULL);
1417 bitmap suitable_for_renaming = BITMAP_ALLOC (NULL);
1418 tree var;
1419 unsigned i;
1421 timevar_push (TV_ADDRESS_TAKEN);
1423 /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1424 the function body. */
1425 FOR_EACH_BB_FN (bb, cfun)
1427 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
1428 gsi_next (&gsi))
1430 gimple stmt = gsi_stmt (gsi);
1431 enum gimple_code code = gimple_code (stmt);
1432 tree decl;
1434 /* Note all addresses taken by the stmt. */
1435 gimple_ior_addresses_taken (addresses_taken, stmt);
1437 /* If we have a call or an assignment, see if the lhs contains
1438 a local decl that requires not to be a gimple register. */
1439 if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
1441 tree lhs = gimple_get_lhs (stmt);
1442 if (lhs
1443 && TREE_CODE (lhs) != SSA_NAME
1444 && non_rewritable_lvalue_p (lhs))
1446 decl = get_base_address (lhs);
1447 if (DECL_P (decl))
1448 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1452 if (gimple_assign_single_p (stmt))
1454 tree rhs = gimple_assign_rhs1 (stmt);
1455 if ((decl = non_rewritable_mem_ref_base (rhs)))
1456 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1459 else if (code == GIMPLE_CALL)
1461 for (i = 0; i < gimple_call_num_args (stmt); ++i)
1463 tree arg = gimple_call_arg (stmt, i);
1464 if ((decl = non_rewritable_mem_ref_base (arg)))
1465 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1469 else if (code == GIMPLE_ASM)
1471 gasm *asm_stmt = as_a <gasm *> (stmt);
1472 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
1474 tree link = gimple_asm_output_op (asm_stmt, i);
1475 tree lhs = TREE_VALUE (link);
1476 if (TREE_CODE (lhs) != SSA_NAME)
1478 decl = get_base_address (lhs);
1479 if (DECL_P (decl)
1480 && (non_rewritable_lvalue_p (lhs)
1481 /* We cannot move required conversions from
1482 the lhs to the rhs in asm statements, so
1483 require we do not need any. */
1484 || !useless_type_conversion_p
1485 (TREE_TYPE (lhs), TREE_TYPE (decl))))
1486 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1489 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
1491 tree link = gimple_asm_input_op (asm_stmt, i);
1492 if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
1493 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
1498 for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
1499 gsi_next (&gsi))
1501 size_t i;
1502 gphi *phi = gsi.phi ();
1504 for (i = 0; i < gimple_phi_num_args (phi); i++)
1506 tree op = PHI_ARG_DEF (phi, i), var;
1507 if (TREE_CODE (op) == ADDR_EXPR
1508 && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
1509 && DECL_P (var))
1510 bitmap_set_bit (addresses_taken, DECL_UID (var));
1515 /* We cannot iterate over all referenced vars because that can contain
1516 unused vars from BLOCK trees, which causes code generation differences
1517 for -g vs. -g0. */
1518 for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
1519 maybe_optimize_var (var, addresses_taken, not_reg_needs,
1520 suitable_for_renaming);
1522 FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
1523 maybe_optimize_var (var, addresses_taken, not_reg_needs,
1524 suitable_for_renaming);
1526 /* Operand caches need to be recomputed for operands referencing the updated
1527 variables and operands need to be rewritten to expose bare symbols. */
1528 if (!bitmap_empty_p (suitable_for_renaming))
1530 FOR_EACH_BB_FN (bb, cfun)
1531 for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
1533 gimple stmt = gsi_stmt (gsi);
1535 /* Re-write TARGET_MEM_REFs of symbols we want to
1536 rewrite into SSA form. */
1537 if (gimple_assign_single_p (stmt))
1539 tree lhs = gimple_assign_lhs (stmt);
1540 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
1541 tree sym;
1543 /* Rewrite LHS IMAG/REALPART_EXPR similar to
1544 gimplify_modify_expr_complex_part. */
1545 if ((TREE_CODE (lhs) == IMAGPART_EXPR
1546 || TREE_CODE (lhs) == REALPART_EXPR)
1547 && DECL_P (TREE_OPERAND (lhs, 0))
1548 && bitmap_bit_p (suitable_for_renaming,
1549 DECL_UID (TREE_OPERAND (lhs, 0))))
1551 tree other = make_ssa_name (TREE_TYPE (lhs));
1552 tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
1553 ? REALPART_EXPR : IMAGPART_EXPR,
1554 TREE_TYPE (other),
1555 TREE_OPERAND (lhs, 0));
1556 gimple load = gimple_build_assign (other, lrhs);
1557 location_t loc = gimple_location (stmt);
1558 gimple_set_location (load, loc);
1559 gimple_set_vuse (load, gimple_vuse (stmt));
1560 gsi_insert_before (&gsi, load, GSI_SAME_STMT);
1561 gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
1562 gimple_assign_set_rhs_with_ops
1563 (&gsi, COMPLEX_EXPR,
1564 TREE_CODE (lhs) == IMAGPART_EXPR
1565 ? other : gimple_assign_rhs1 (stmt),
1566 TREE_CODE (lhs) == IMAGPART_EXPR
1567 ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
1568 stmt = gsi_stmt (gsi);
1569 unlink_stmt_vdef (stmt);
1570 update_stmt (stmt);
1571 continue;
1574 /* We shouldn't have any fancy wrapping of
1575 component-refs on the LHS, but look through
1576 VIEW_CONVERT_EXPRs as that is easy. */
1577 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
1578 lhs = TREE_OPERAND (lhs, 0);
1579 if (TREE_CODE (lhs) == MEM_REF
1580 && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
1581 && integer_zerop (TREE_OPERAND (lhs, 1))
1582 && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
1583 && DECL_P (sym)
1584 && !TREE_ADDRESSABLE (sym)
1585 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
1586 lhs = sym;
1587 else
1588 lhs = gimple_assign_lhs (stmt);
1590 /* Rewrite the RHS and make sure the resulting assignment
1591 is validly typed. */
1592 maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
1593 rhs = gimple_assign_rhs1 (stmt);
1594 if (gimple_assign_lhs (stmt) != lhs
1595 && !useless_type_conversion_p (TREE_TYPE (lhs),
1596 TREE_TYPE (rhs)))
1597 rhs = fold_build1 (VIEW_CONVERT_EXPR,
1598 TREE_TYPE (lhs), rhs);
1600 if (gimple_assign_lhs (stmt) != lhs)
1601 gimple_assign_set_lhs (stmt, lhs);
1603 if (gimple_assign_rhs1 (stmt) != rhs)
1605 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
1606 gimple_assign_set_rhs_from_tree (&gsi, rhs);
1610 else if (gimple_code (stmt) == GIMPLE_CALL)
1612 unsigned i;
1613 for (i = 0; i < gimple_call_num_args (stmt); ++i)
1615 tree *argp = gimple_call_arg_ptr (stmt, i);
1616 maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
1620 else if (gimple_code (stmt) == GIMPLE_ASM)
1622 gasm *asm_stmt = as_a <gasm *> (stmt);
1623 unsigned i;
1624 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
1626 tree link = gimple_asm_output_op (asm_stmt, i);
1627 maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
1628 suitable_for_renaming);
1630 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
1632 tree link = gimple_asm_input_op (asm_stmt, i);
1633 maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
1634 suitable_for_renaming);
1638 else if (gimple_debug_bind_p (stmt)
1639 && gimple_debug_bind_has_value_p (stmt))
1641 tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
1642 tree decl;
1643 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
1644 decl = non_rewritable_mem_ref_base (*valuep);
1645 if (decl
1646 && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
1647 gimple_debug_bind_reset_value (stmt);
1650 if (gimple_references_memory_p (stmt)
1651 || is_gimple_debug (stmt))
1652 update_stmt (stmt);
1654 gsi_next (&gsi);
1657 /* Update SSA form here, we are called as non-pass as well. */
1658 if (number_of_loops (cfun) > 1
1659 && loops_state_satisfies_p (LOOP_CLOSED_SSA))
1660 rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
1661 else
1662 update_ssa (TODO_update_ssa);
1665 BITMAP_FREE (not_reg_needs);
1666 BITMAP_FREE (addresses_taken);
1667 BITMAP_FREE (suitable_for_renaming);
1668 timevar_pop (TV_ADDRESS_TAKEN);
1671 namespace {
1673 const pass_data pass_data_update_address_taken =
1675 GIMPLE_PASS, /* type */
1676 "addressables", /* name */
1677 OPTGROUP_NONE, /* optinfo_flags */
1678 TV_ADDRESS_TAKEN, /* tv_id */
1679 PROP_ssa, /* properties_required */
1680 0, /* properties_provided */
1681 0, /* properties_destroyed */
1682 0, /* todo_flags_start */
1683 TODO_update_address_taken, /* todo_flags_finish */
1686 class pass_update_address_taken : public gimple_opt_pass
1688 public:
1689 pass_update_address_taken (gcc::context *ctxt)
1690 : gimple_opt_pass (pass_data_update_address_taken, ctxt)
1693 /* opt_pass methods: */
1695 }; // class pass_update_address_taken
1697 } // anon namespace
1699 gimple_opt_pass *
1700 make_pass_update_address_taken (gcc::context *ctxt)
1702 return new pass_update_address_taken (ctxt);