Reverting merge from trunk
[official-gcc.git] / gcc / tree-ssa.c
blobd2552361a66ed401e0bc4c39152c131f33334a75
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)
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 "tree.h"
25 #include "flags.h"
26 #include "tm_p.h"
27 #include "target.h"
28 #include "ggc.h"
29 #include "langhooks.h"
30 #include "basic-block.h"
31 #include "function.h"
32 #include "gimple-pretty-print.h"
33 #include "pointer-set.h"
34 #include "gimple.h"
35 #include "gimplify.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"
44 #include "tree-ssa.h"
45 #include "tree-inline.h"
46 #include "hashtab.h"
47 #include "tree-pass.h"
48 #include "diagnostic-core.h"
49 #include "cfgloop.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. */
58 void
59 redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
61 void **slot;
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;
70 if (!head)
71 vec_safe_reserve (head, 5);
72 new_node.def = def;
73 new_node.result = result;
74 new_node.locus = locus;
76 vec_safe_push (head, new_node);
77 *slot = head;
81 /* Clear the var mappings in edge E. */
83 void
84 redirect_edge_var_map_clear (edge e)
86 void **slot;
87 edge_var_map_vector *head;
89 if (!edge_var_maps)
90 return;
92 slot = pointer_map_contains (edge_var_maps, e);
94 if (slot)
96 head = (edge_var_map_vector *) *slot;
97 vec_free (head);
98 *slot = NULL;
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. */
109 void
110 redirect_edge_var_map_dup (edge newe, edge olde)
112 void **new_slot, **old_slot;
113 edge_var_map_vector *head;
115 if (!edge_var_maps)
116 return;
118 new_slot = pointer_map_insert (edge_var_maps, newe);
119 old_slot = pointer_map_contains (edge_var_maps, olde);
120 if (!old_slot)
121 return;
122 head = (edge_var_map_vector *) *old_slot;
124 edge_var_map_vector *new_head = NULL;
125 if (head)
126 new_head = vec_safe_copy (head);
127 else
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
134 NULL. */
136 edge_var_map_vector *
137 redirect_edge_var_map_vector (edge e)
139 void **slot;
141 /* Hey, what kind of idiot would... you'd be surprised. */
142 if (!edge_var_maps)
143 return NULL;
145 slot = pointer_map_contains (edge_var_maps, e);
146 if (!slot)
147 return NULL;
149 return (edge_var_map_vector *) *slot;
152 /* Used by redirect_edge_var_map_destroy to free all memory. */
154 static bool
155 free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
156 void **value,
157 void *data ATTRIBUTE_UNUSED)
159 edge_var_map_vector *head = (edge_var_map_vector *) *value;
160 vec_free (head);
161 return true;
164 /* Clear the edge variable mappings. */
166 void
167 redirect_edge_var_map_destroy (void)
169 if (edge_var_maps)
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. */
183 edge
184 ssa_redirect_edge (edge e, basic_block dest)
186 gimple_stmt_iterator gsi;
187 gimple phi;
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))
194 tree def;
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)
202 continue;
204 redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
207 e = redirect_edge_succ_nodup (e, dest);
209 return e;
213 /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
214 E->dest. */
216 void
217 flush_pending_stmts (edge e)
219 gimple phi;
220 edge_var_map_vector *v;
221 edge_var_map *vm;
222 int i;
223 gimple_stmt_iterator gsi;
225 v = redirect_edge_var_map_vector (e);
226 if (!v)
227 return;
229 for (gsi = gsi_start_phis (e->dest), i = 0;
230 !gsi_end_p (gsi) && v->iterate (i, &vm);
231 gsi_next (&gsi), i++)
233 tree def;
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
251 an equivalent value.
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. */
262 void
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. */
284 tree
285 target_for_debug_bind (tree var)
287 if (!MAY_HAVE_DEBUG_STMTS)
288 return NULL_TREE;
290 if (TREE_CODE (var) == SSA_NAME)
292 var = SSA_NAME_VAR (var);
293 if (var == NULL_TREE)
294 return NULL_TREE;
297 if ((TREE_CODE (var) != VAR_DECL
298 || VAR_DECL_IS_VIRTUAL_OPERAND (var))
299 && TREE_CODE (var) != PARM_DECL)
300 return NULL_TREE;
302 if (DECL_HAS_VALUE_EXPR_P (var))
303 return target_for_debug_bind (DECL_VALUE_EXPR (var));
305 if (DECL_IGNORED_P (var))
306 return NULL_TREE;
308 /* var-tracking only tracks registers. */
309 if (!is_gimple_reg_type (TREE_TYPE (var)))
310 return NULL_TREE;
312 return var;
315 /* Called via walk_tree, look for SSA_NAMEs that have already been
316 released. */
318 static tree
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)
324 return NULL_TREE;
326 if (TREE_CODE (*tp) == SSA_NAME)
328 if (SSA_NAME_IN_FREE_LIST (*tp))
329 return *tp;
331 *walk_subtrees = 0;
333 else if (IS_TYPE_OR_DECL_P (*tp))
334 *walk_subtrees = 0;
336 return NULL_TREE;
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. */
343 void
344 insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
346 imm_use_iterator imm_iter;
347 use_operand_p use_p;
348 gimple stmt;
349 gimple def_stmt = NULL;
350 int usecount = 0;
351 tree value = NULL;
353 if (!MAY_HAVE_DEBUG_STMTS)
354 return;
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))
359 return;
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))
368 continue;
370 if (usecount++)
371 break;
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
377 can be shared. */
378 usecount++;
379 break;
383 if (!usecount)
384 return;
386 if (gsi)
387 def_stmt = gsi_stmt (*gsi);
388 else
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))
398 value = NULL;
399 /* error_mark_node is what fixup_noreturn_call changes PHI arguments
400 to. */
401 else if (value == error_mark_node)
402 value = NULL;
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:
419 <bb X>:
420 v_1 = foo;
422 <bb Y>:
423 w_2 = v_1 + bar;
424 # DEBUG w => w_2
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
439 errors. */
440 if ((!gsi && !gimple_bb (def_stmt))
441 || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
442 no_value = true;
445 if (!no_value)
446 value = gimple_assign_rhs_to_tree (def_stmt);
449 if (value)
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,
455 avoiding the temp.
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
467 || (usecount == 1
468 && (!gimple_assign_single_p (def_stmt)
469 || is_gimple_min_invariant (value)))
470 || is_gimple_reg (value))
472 else
474 gimple def_temp;
475 tree vexpr = make_node (DEBUG_EXPR_DECL);
477 def_temp = gimple_build_debug_bind (vexpr,
478 unshare_expr (value),
479 def_stmt);
481 DECL_ARTIFICIAL (vexpr) = 1;
482 TREE_TYPE (vexpr) = TREE_TYPE (value);
483 if (DECL_P (value))
484 DECL_MODE (vexpr) = DECL_MODE (value);
485 else
486 DECL_MODE (vexpr) = TYPE_MODE (TREE_TYPE (value));
488 if (gsi)
489 gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
490 else
492 gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
493 gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
496 value = vexpr;
500 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
502 if (!gimple_debug_bind_p (stmt))
503 continue;
505 if (value)
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
512 shared. */
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);
522 else
523 gimple_debug_bind_reset_value (stmt);
525 update_stmt (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. */
534 void
535 insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
537 gimple stmt;
538 ssa_op_iter op_iter;
539 def_operand_p def_p;
541 if (!MAY_HAVE_DEBUG_STMTS)
542 return;
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)
551 continue;
553 insert_debug_temp_for_var_def (gsi, var);
557 /* Reset all debug stmts that use SSA_NAME(s) defined in STMT. */
559 void
560 reset_debug_uses (gimple stmt)
562 ssa_op_iter op_iter;
563 def_operand_p def_p;
564 imm_use_iterator imm_iter;
565 gimple use_stmt;
567 if (!MAY_HAVE_DEBUG_STMTS)
568 return;
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)
575 continue;
577 FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
579 if (!gimple_debug_bind_p (use_stmt))
580 continue;
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. */
592 void
593 release_defs_bitset (bitmap toremove)
595 unsigned j;
596 bitmap_iterator bi;
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);
606 gimple stmt;
607 imm_use_iterator uit;
609 FOR_EACH_IMM_USE_STMT (stmt, uit, var)
611 ssa_op_iter dit;
612 def_operand_p def_p;
614 /* We can't propagate PHI nodes into debug stmts. */
615 if (gimple_code (stmt) == GIMPLE_PHI
616 || is_gimple_debug (stmt))
617 continue;
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)))
629 remove_now = false;
630 break;
634 if (!remove_now)
635 BREAK_FROM_IMM_USE_STMT (uit);
638 if (remove_now)
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);
645 else
647 gsi_remove (&gsi, true);
648 release_defs (def);
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
659 operand. */
661 static bool
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");
667 return true;
670 if (SSA_NAME_IN_FREE_LIST (ssa_name))
672 error ("found an SSA_NAME that had been released into the free pool");
673 return true;
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");
680 return true;
683 if (is_virtual && !virtual_operand_p (ssa_name))
685 error ("found a virtual definition for a GIMPLE register");
686 return true;
689 if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun))
691 error ("virtual SSA name for non-VOP decl");
692 return true;
695 if (!is_virtual && virtual_operand_p (ssa_name))
697 error ("found a real definition for a non-register");
698 return true;
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");
705 return true;
708 return false;
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. */
723 static bool
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))
728 goto err;
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");
735 goto err;
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);
742 goto err;
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);
754 goto err;
757 return false;
759 err:
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);
765 return true;
769 /* Return true if the use of SSA_NAME at statement STMT in block BB is
770 malformed.
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
778 arguments).
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. */
783 static bool
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)
787 bool err = false;
788 tree ssa_name = USE_FROM_PTR (use_p);
790 if (!TREE_VISITED (ssa_name))
791 if (verify_imm_links (stderr, ssa_name))
792 err = true;
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. */
799 else if (!def_bb)
801 error ("missing definition");
802 err = true;
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);
809 err = true;
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);
816 err = true;
819 if (check_abnormal
820 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
822 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
823 err = true;
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");
831 err = true;
833 else
835 tree listvar;
836 if (use_p->prev->use == NULL)
837 listvar = use_p->prev->loc.ssa_name;
838 else
839 listvar = USE_FROM_PTR (use_p->prev);
840 if (listvar != ssa_name)
842 error ("wrong immediate use list");
843 err = true;
847 if (err)
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);
855 return err;
859 /* Return true if any of the arguments for PHI node PHI at block BB is
860 malformed.
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. */
867 static bool
868 verify_phi_args (gimple phi, basic_block bb, basic_block *definition_block)
870 edge e;
871 bool err = false;
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");
877 err = true;
878 goto error;
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);
888 if (op == NULL_TREE)
890 error ("PHI argument is missing for edge %d->%d",
891 e->src->index,
892 e->dest->index);
893 err = true;
894 goto error;
897 if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
899 error ("PHI argument is not SSA_NAME, or invariant");
900 err = true;
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");
921 err = true;
925 if (e->dest != bb)
927 error ("wrong edge %d->%d for PHI argument",
928 e->src->index, e->dest->index);
929 err = true;
932 if (err)
934 fprintf (stderr, "PHI argument\n");
935 print_generic_stmt (stderr, op, TDF_VOPS);
936 goto error;
940 error:
941 if (err)
943 fprintf (stderr, "for PHI node\n");
944 print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
948 return err;
952 /* Verify common invariants in the SSA web.
953 TODO: verify the variable annotations. */
955 DEBUG_FUNCTION void
956 verify_ssa (bool check_modified_stmt)
958 size_t i;
959 basic_block bb;
960 basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
961 ssa_op_iter iter;
962 tree op;
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);
974 if (name)
976 gimple stmt;
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. */
996 FOR_EACH_BB (bb)
998 edge e;
999 gimple phi;
1000 edge_iterator ei;
1001 gimple_stmt_iterator gsi;
1003 /* Make sure that all edges have a clear 'aux' field. */
1004 FOR_EACH_EDGE (e, ei, bb->preds)
1006 if (e->aux)
1008 error ("AUX pointer initialized for edge %d->%d", e->src->index,
1009 e->dest->index);
1010 goto err;
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))
1019 goto err;
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: ",
1034 (void *)stmt);
1035 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
1036 goto err;
1039 if (verify_ssa_operands (stmt))
1041 print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
1042 goto err;
1045 if (gimple_debug_bind_p (stmt)
1046 && !gimple_debug_bind_has_value_p (stmt))
1047 continue;
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))
1054 goto err;
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),
1066 4, TDF_VOPS);
1067 goto err;
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);
1082 else
1083 set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
1085 BITMAP_FREE (names_defined_in_bb);
1086 timevar_pop (TV_TREE_SSA_VERIFY);
1087 return;
1089 err:
1090 internal_error ("verify_ssa failed");
1093 /* Return true if the DECL_UID in both trees are equal. */
1095 static int
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. */
1105 static unsigned int
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. */
1114 void
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. */
1127 static unsigned int
1128 execute_init_datastructures (void)
1130 /* Allocate hash tables, arrays and other structures. */
1131 gcc_assert (!cfun->gimple_df);
1132 init_tree_ssa (cfun);
1133 return 0;
1136 /* Gate for IPCP optimization. */
1138 static bool
1139 gate_init_datastructures (void)
1141 /* Do nothing for funcions that was produced already in SSA form. */
1142 return !(cfun->curr_properties & PROP_ssa);
1145 namespace {
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
1164 public:
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
1175 } // anon namespace
1177 gimple_opt_pass *
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. */
1185 void
1186 delete_tree_ssa (void)
1188 fini_ssanames ();
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
1208 false. */
1210 bool
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
1221 (TREE_TYPE (expr),
1222 TREE_TYPE (TREE_OPERAND (expr, 0)));
1224 return false;
1227 /* Strip conversions from EXP according to
1228 tree_ssa_useless_type_conversion and return the resulting
1229 expression. */
1231 tree
1232 tree_ssa_strip_useless_type_conversions (tree exp)
1234 while (tree_ssa_useless_type_conversion (exp))
1235 exp = TREE_OPERAND (exp, 0);
1236 return exp;
1240 /* Return true if T, an SSA_NAME, has an undefined value. */
1242 bool
1243 ssa_undefined_value_p (tree t)
1245 tree var = SSA_NAME_VAR (t);
1247 if (!var)
1249 /* Parameters get their initial value from the function entry. */
1250 else if (TREE_CODE (var) == PARM_DECL)
1251 return false;
1252 /* When returning by reference the return address is actually a hidden
1253 parameter. */
1254 else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var))
1255 return false;
1256 /* Hard register variables get their initial value from the ether. */
1257 else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1258 return false;
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. */
1268 static void
1269 maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
1271 tree sym;
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))
1278 && DECL_P (sym)
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),
1305 TREE_TYPE (sym)))
1306 *tp = build1 (VIEW_CONVERT_EXPR,
1307 TREE_TYPE (*tp), sym);
1308 else
1309 *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. */
1317 static tree
1318 non_rewritable_mem_ref_base (tree ref)
1320 tree base = ref;
1322 /* A plain decl does not need it set. */
1323 if (DECL_P (ref))
1324 return NULL_TREE;
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))))
1344 return NULL_TREE;
1345 if (DECL_P (decl)
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)))
1350 return decl;
1353 return NULL_TREE;
1356 /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
1357 Otherwise return true. */
1359 static bool
1360 non_rewritable_lvalue_p (tree lhs)
1362 /* A plain decl is always rewritable. */
1363 if (DECL_P (lhs))
1364 return false;
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);
1375 if (DECL_P (decl)
1376 && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
1377 && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
1378 return false;
1381 return true;
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. */
1388 static void
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)))
1396 return;
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));
1410 if (dump_file)
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));
1427 if (dump_file)
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. */
1438 void
1439 execute_update_addresses_taken (void)
1441 gimple_stmt_iterator gsi;
1442 basic_block bb;
1443 bitmap addresses_taken = BITMAP_ALLOC (NULL);
1444 bitmap not_reg_needs = BITMAP_ALLOC (NULL);
1445 bitmap suitable_for_renaming = BITMAP_ALLOC (NULL);
1446 tree var;
1447 unsigned i;
1449 timevar_push (TV_ADDRESS_TAKEN);
1451 /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
1452 the function body. */
1453 FOR_EACH_BB (bb)
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);
1459 tree decl;
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);
1469 if (lhs
1470 && TREE_CODE (lhs) != SSA_NAME
1471 && non_rewritable_lvalue_p (lhs))
1473 decl = get_base_address (lhs);
1474 if (DECL_P (decl))
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);
1505 if (DECL_P (decl)
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))
1526 size_t i;
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
1534 && DECL_P (var))
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
1542 for -g vs. -g0. */
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))
1555 FOR_EACH_BB (bb)
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);
1566 tree sym;
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))
1577 && DECL_P (sym)
1578 && !TREE_ADDRESSABLE (sym)
1579 && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
1580 lhs = sym;
1581 else
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),
1590 TREE_TYPE (rhs)))
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. */
1599 if (DECL_P (lhs)
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);
1606 continue;
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)
1618 unsigned i;
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)
1628 unsigned i;
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);
1647 tree decl;
1648 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
1649 decl = non_rewritable_mem_ref_base (*valuep);
1650 if (decl
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))
1657 update_stmt (stmt);
1659 gsi_next (&gsi);
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);
1666 else
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);
1676 namespace {
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
1695 public:
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
1704 } // anon namespace
1706 gimple_opt_pass *
1707 make_pass_update_address_taken (gcc::context *ctxt)
1709 return new pass_update_address_taken (ctxt);