]> gcc.gnu.org Git - gcc.git/blame - gcc/tree-ssa.c
re PR tree-optimization/14736 ([tree-ssa] code quality regression)
[gcc.git] / gcc / tree-ssa.c
CommitLineData
6de9cd9a
DN
1/* Miscellaneous SSA utility functions.
2 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GCC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING. If not, write to
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
24#include "tm.h"
25#include "tree.h"
26#include "flags.h"
27#include "rtl.h"
28#include "tm_p.h"
29#include "ggc.h"
30#include "langhooks.h"
31#include "hard-reg-set.h"
32#include "basic-block.h"
33#include "output.h"
34#include "errors.h"
35#include "expr.h"
36#include "function.h"
37#include "diagnostic.h"
38#include "bitmap.h"
39#include "tree-flow.h"
eadf906f 40#include "tree-gimple.h"
6de9cd9a
DN
41#include "tree-inline.h"
42#include "varray.h"
43#include "timevar.h"
44#include "tree-alias-common.h"
45#include "hashtab.h"
46#include "tree-dump.h"
47#include "tree-pass.h"
48
49
50/* Remove edge E and remove the corresponding arguments from the PHI nodes
51 in E's destination block. */
52
53void
54ssa_remove_edge (edge e)
55{
56 tree phi, next;
57
58 /* Remove the appropriate PHI arguments in E's destination block. */
59 for (phi = phi_nodes (e->dest); phi; phi = next)
60 {
61 next = TREE_CHAIN (phi);
62 remove_phi_arg (phi, e->src);
63 }
64
65 remove_edge (e);
66}
67
68/* Remove remove the corresponding arguments from the PHI nodes
69 in E's destination block and redirect it to DEST. Return redirected edge.
70 The list of removed arguments is stored in PENDING_STMT (e). */
71
72edge
73ssa_redirect_edge (edge e, basic_block dest)
74{
75 tree phi, next;
76 tree list = NULL, *last = &list;
77 tree src, dst, node;
78 int i;
79
80 /* Remove the appropriate PHI arguments in E's destination block. */
81 for (phi = phi_nodes (e->dest); phi; phi = next)
82 {
83 next = TREE_CHAIN (phi);
84
85 i = phi_arg_from_edge (phi, e);
86 if (i < 0)
87 continue;
88
89 src = PHI_ARG_DEF (phi, i);
90 dst = PHI_RESULT (phi);
91 node = build_tree_list (dst, src);
92 *last = node;
93 last = &TREE_CHAIN (node);
94
95 remove_phi_arg_num (phi, i);
96 }
97
98 e = redirect_edge_succ_nodup (e, dest);
99 PENDING_STMT (e) = list;
100
101 return e;
102}
103
104
105/* Return true if the definition of SSA_NAME at block BB is malformed.
106
107 STMT is the statement where SSA_NAME is created.
108
109 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME version
110 numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, it means that the
111 block in that array slot contains the definition of SSA_NAME. */
112
113static bool
114verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
115 tree stmt)
116{
117 bool err = false;
118
119 if (TREE_CODE (ssa_name) != SSA_NAME)
120 {
121 error ("Expected an SSA_NAME object");
122 debug_generic_stmt (ssa_name);
123 debug_generic_stmt (stmt);
124 }
125
126 if (definition_block[SSA_NAME_VERSION (ssa_name)])
127 {
128 error ("SSA_NAME created in two different blocks %i and %i",
129 definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
130 fprintf (stderr, "SSA_NAME: ");
131 debug_generic_stmt (ssa_name);
132 debug_generic_stmt (stmt);
133 err = true;
134 }
135
136 definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
137
138 if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
139 {
140 error ("SSA_NAME_DEF_STMT is wrong");
141 fprintf (stderr, "SSA_NAME: ");
142 debug_generic_stmt (ssa_name);
143 fprintf (stderr, "Expected definition statement:\n");
144 debug_generic_stmt (SSA_NAME_DEF_STMT (ssa_name));
145 fprintf (stderr, "\nActual definition statement:\n");
146 debug_generic_stmt (stmt);
147 err = true;
148 }
149
150 return err;
151}
152
153
154/* Return true if the use of SSA_NAME at statement STMT in block BB is
155 malformed.
156
157 DEF_BB is the block where SSA_NAME was found to be created.
158
159 IDOM contains immediate dominator information for the flowgraph.
160
161 CHECK_ABNORMAL is true if the caller wants to check whether this use
162 is flowing through an abnormal edge (only used when checking PHI
163 arguments). */
164
165static bool
166verify_use (basic_block bb, basic_block def_bb, tree ssa_name,
167 tree stmt, bool check_abnormal)
168{
169 bool err = false;
170
171 if (IS_EMPTY_STMT (SSA_NAME_DEF_STMT (ssa_name)))
172 ; /* Nothing to do. */
173 else if (!def_bb)
174 {
175 error ("Missing definition");
176 err = true;
177 }
178 else if (bb != def_bb
179 && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
180 {
181 error ("Definition in block %i does not dominate use in block %i",
182 def_bb->index, bb->index);
183 err = true;
184 }
185
186 if (check_abnormal
187 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
188 {
189 error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
190 err = true;
191 }
192
193 if (err)
194 {
195 fprintf (stderr, "for SSA_NAME: ");
196 debug_generic_stmt (ssa_name);
197 fprintf (stderr, "in statement:\n");
198 debug_generic_stmt (stmt);
199 }
200
201 return err;
202}
203
204
205/* Return true if any of the arguments for PHI node PHI at block BB is
206 malformed.
207
208 IDOM contains immediate dominator information for the flowgraph.
209
210 DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME version
211 numbers. If DEFINITION_BLOCK[SSA_NAME_VERSION] is set, it means that the
212 block in that array slot contains the definition of SSA_NAME. */
213
214static bool
215verify_phi_args (tree phi, basic_block bb, basic_block *definition_block)
216{
217 edge e;
218 bool err = false;
219 int i, phi_num_args = PHI_NUM_ARGS (phi);
220
221 /* Mark all the incoming edges. */
222 for (e = bb->pred; e; e = e->pred_next)
223 e->aux = (void *) 1;
224
225 for (i = 0; i < phi_num_args; i++)
226 {
227 tree op = PHI_ARG_DEF (phi, i);
228
229 e = PHI_ARG_EDGE (phi, i);
230
231 if (TREE_CODE (op) == SSA_NAME)
232 err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op,
233 phi, e->flags & EDGE_ABNORMAL);
234
235 if (e->dest != bb)
236 {
237 error ("Wrong edge %d->%d for PHI argument\n",
238 e->src->index, e->dest->index, bb->index);
239 err = true;
240 }
241
242 if (e->aux == (void *) 0)
243 {
244 error ("PHI argument flowing through dead edge %d->%d\n",
245 e->src->index, e->dest->index);
246 err = true;
247 }
248
249 if (e->aux == (void *) 2)
250 {
251 error ("PHI argument duplicated for edge %d->%d\n", e->src->index,
252 e->dest->index);
253 err = true;
254 }
255
256 if (err)
257 {
258 fprintf (stderr, "PHI argument\n");
259 debug_generic_stmt (op);
260 }
261
262 e->aux = (void *) 2;
263 }
264
265 for (e = bb->pred; e; e = e->pred_next)
266 {
267 if (e->aux != (void *) 2)
268 {
269 error ("No argument flowing through edge %d->%d\n", e->src->index,
270 e->dest->index);
271 err = true;
272 }
273 e->aux = (void *) 0;
274 }
275
276 if (err)
277 {
278 fprintf (stderr, "for PHI node\n");
279 debug_generic_stmt (phi);
280 }
281
282
283 return err;
284}
285
286
287/* Verify common invariants in the SSA web.
288 TODO: verify the variable annotations. */
289
290void
291verify_ssa (void)
292{
293 bool err = false;
294 basic_block bb;
295 basic_block *definition_block = xcalloc (highest_ssa_version,
296 sizeof (basic_block));
297
298 timevar_push (TV_TREE_SSA_VERIFY);
299
300 calculate_dominance_info (CDI_DOMINATORS);
301
302 /* Verify and register all the SSA_NAME definitions found in the
303 function. */
304 FOR_EACH_BB (bb)
305 {
306 tree phi;
307 block_stmt_iterator bsi;
308
309 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
310 err |= verify_def (bb, definition_block, PHI_RESULT (phi), phi);
311
312 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
313 {
314 tree stmt;
315 stmt_ann_t ann;
316 unsigned int j;
317 vdef_optype vdefs;
318 def_optype defs;
319
320 stmt = bsi_stmt (bsi);
321 ann = stmt_ann (stmt);
322 get_stmt_operands (stmt);
323
324 vdefs = VDEF_OPS (ann);
325 for (j = 0; j < NUM_VDEFS (vdefs); j++)
326 {
327 tree op = VDEF_RESULT (vdefs, j);
328 if (is_gimple_reg (op))
329 {
330 error ("Found a virtual definition for a GIMPLE register");
331 debug_generic_stmt (op);
332 debug_generic_stmt (stmt);
333 err = true;
334 }
335 err |= verify_def (bb, definition_block, op, stmt);
336 }
337
338 defs = DEF_OPS (ann);
339 for (j = 0; j < NUM_DEFS (defs); j++)
340 {
341 tree op = DEF_OP (defs, j);
342 if (TREE_CODE (op) == SSA_NAME && !is_gimple_reg (op))
343 {
344 error ("Found a real definition for a non-GIMPLE register");
345 debug_generic_stmt (op);
346 debug_generic_stmt (stmt);
347 err = true;
348 }
349 err |= verify_def (bb, definition_block, op, stmt);
350 }
351 }
352 }
353
354
355 /* Now verify all the uses and make sure they agree with the definitions
356 found in the previous pass. */
357 FOR_EACH_BB (bb)
358 {
359 edge e;
360 tree phi;
361 block_stmt_iterator bsi;
362
363 /* Make sure that all edges have a clear 'aux' field. */
364 for (e = bb->pred; e; e = e->pred_next)
365 {
366 if (e->aux)
367 {
368 error ("AUX pointer initialized for edge %d->%d\n", e->src->index,
369 e->dest->index);
370 err = true;
371 }
372 }
373
374 /* Verify the arguments for every PHI node in the block. */
375 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
376 err |= verify_phi_args (phi, bb, definition_block);
377
378 /* Now verify all the uses and vuses in every statement of the block.
379
380 Remember, the RHS of a VDEF is a use as well. */
381 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
382 {
383 tree stmt = bsi_stmt (bsi);
384 stmt_ann_t ann = stmt_ann (stmt);
385 unsigned int j;
386 vuse_optype vuses;
387 vdef_optype vdefs;
388 use_optype uses;
389
390 vuses = VUSE_OPS (ann);
391 for (j = 0; j < NUM_VUSES (vuses); j++)
392 {
393 tree op = VUSE_OP (vuses, j);
394
395 if (is_gimple_reg (op))
396 {
397 error ("Found a virtual use for a GIMPLE register");
398 debug_generic_stmt (op);
399 debug_generic_stmt (stmt);
400 err = true;
401 }
402 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
403 op, stmt, false);
404 }
405
406 vdefs = VDEF_OPS (ann);
407 for (j = 0; j < NUM_VDEFS (vdefs); j++)
408 {
409 tree op = VDEF_OP (vdefs, j);
410
411 if (is_gimple_reg (op))
412 {
413 error ("Found a virtual use for a GIMPLE register");
414 debug_generic_stmt (op);
415 debug_generic_stmt (stmt);
416 err = true;
417 }
418 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
419 op, stmt, false);
420 }
421
422 uses = USE_OPS (ann);
423 for (j = 0; j < NUM_USES (uses); j++)
424 {
425 tree op = USE_OP (uses, j);
426
427 if (TREE_CODE (op) == SSA_NAME && !is_gimple_reg (op))
428 {
429 error ("Found a real use of a non-GIMPLE register");
430 debug_generic_stmt (op);
431 debug_generic_stmt (stmt);
432 err = true;
433 }
434 err |= verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
435 op, stmt, false);
436 }
437 }
438 }
439
440 free (definition_block);
441
442 timevar_pop (TV_TREE_SSA_VERIFY);
443
444 if (err)
445 internal_error ("verify_ssa failed.");
446}
447
448
449/* Set the USED bit in the annotation for T. */
450
451void
452set_is_used (tree t)
453{
454 while (1)
455 {
456 if (SSA_VAR_P (t))
457 break;
458
459 switch (TREE_CODE (t))
460 {
461 case ARRAY_REF:
462 case COMPONENT_REF:
463 case REALPART_EXPR:
464 case IMAGPART_EXPR:
465 case BIT_FIELD_REF:
466 case INDIRECT_REF:
467 t = TREE_OPERAND (t, 0);
468 break;
469
470 default:
471 return;
472 }
473 }
474
475 if (TREE_CODE (t) == SSA_NAME)
476 t = SSA_NAME_VAR (t);
477
478 var_ann (t)->used = 1;
479}
480
481
482/* Initialize global DFA and SSA structures. */
483
484void
485init_tree_ssa (void)
486{
487 VARRAY_TREE_INIT (referenced_vars, 20, "referenced_vars");
488 call_clobbered_vars = BITMAP_XMALLOC ();
489 init_ssa_operands ();
490 init_ssanames ();
491 init_phinodes ();
492 global_var = NULL_TREE;
493 aliases_computed_p = false;
494}
495
496
497/* Deallocate memory associated with SSA data structures for FNDECL. */
498
499void
500delete_tree_ssa (void)
501{
502 size_t i;
503 basic_block bb;
504 block_stmt_iterator bsi;
505
506 /* Remove annotations from every tree in the function. */
507 FOR_EACH_BB (bb)
508 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
509 bsi_stmt (bsi)->common.ann = NULL;
510
511 /* Remove annotations from every referenced variable. */
512 if (referenced_vars)
513 {
514 for (i = 0; i < num_referenced_vars; i++)
515 referenced_var (i)->common.ann = NULL;
516 referenced_vars = NULL;
517 }
518
519 fini_ssanames ();
520 fini_phinodes ();
521 fini_ssa_operands ();
522
523 global_var = NULL_TREE;
6b9bee8e 524 BITMAP_XFREE (call_clobbered_vars);
6de9cd9a
DN
525 call_clobbered_vars = NULL;
526 aliases_computed_p = false;
527}
528
529
530/* Return true if EXPR is a useless type conversion, otherwise return
531 false. */
532
533bool
534tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
535{
536 /* If the inner and outer types are effectively the same, then
537 strip the type conversion and enter the equivalence into
538 the table. */
539 if (inner_type == outer_type
540 || (lang_hooks.types_compatible_p (inner_type, outer_type)))
541 return true;
542
543 /* If both types are pointers and the outer type is a (void *), then
544 the conversion is not necessary. The opposite is not true since
545 that conversion would result in a loss of information if the
546 equivalence was used. Consider an indirect function call where
547 we need to know the exact type of the function to correctly
548 implement the ABI. */
549 else if (POINTER_TYPE_P (inner_type)
550 && POINTER_TYPE_P (outer_type)
551 && TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
552 return true;
553
554 /* Pointers and references are equivalent once we get to GENERIC,
555 so strip conversions that just switch between them. */
556 else if (POINTER_TYPE_P (inner_type)
557 && POINTER_TYPE_P (outer_type)
3facc4b6
AP
558 && lang_hooks.types_compatible_p (TREE_TYPE (inner_type),
559 TREE_TYPE (outer_type)))
6de9cd9a
DN
560 return true;
561
562 /* If both the inner and outer types are integral types, then the
563 conversion is not necessary if they have the same mode and
564 signedness and precision. Note that type _Bool can have size of
565 4 (only happens on powerpc-darwin right now but can happen on any
566 target that defines BOOL_TYPE_SIZE to be INT_TYPE_SIZE) and a
567 precision of 1 while unsigned int is the same expect for a
568 precision of 4 so testing of precision is necessary. */
569 else if (INTEGRAL_TYPE_P (inner_type)
570 && INTEGRAL_TYPE_P (outer_type)
571 && TYPE_MODE (inner_type) == TYPE_MODE (outer_type)
572 && TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
573 && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
574 return true;
575
576 /* Recurse for complex types. */
577 else if (TREE_CODE (inner_type) == COMPLEX_TYPE
578 && TREE_CODE (outer_type) == COMPLEX_TYPE
579 && tree_ssa_useless_type_conversion_1 (TREE_TYPE (outer_type),
580 TREE_TYPE (inner_type)))
581 return true;
582
583 return false;
584}
585
586/* Return true if EXPR is a useless type conversion, otherwise return
587 false. */
588
589bool
590tree_ssa_useless_type_conversion (tree expr)
591{
592 /* If we have an assignment that merely uses a NOP_EXPR to change
593 the top of the RHS to the type of the LHS and the type conversion
594 is "safe", then strip away the type conversion so that we can
595 enter LHS = RHS into the const_and_copies table. */
596 if (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR)
597 return tree_ssa_useless_type_conversion_1 (TREE_TYPE (expr),
598 TREE_TYPE (TREE_OPERAND (expr,
599 0)));
600
601
602 return false;
603}
604
605
606/* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
607 described in walk_use_def_chains. VISITED is a bitmap used to mark
608 visited SSA_NAMEs to avoid infinite loops. */
609
610static bool
611walk_use_def_chains_1 (tree var, walk_use_def_chains_fn fn, void *data,
612 bitmap visited)
613{
614 tree def_stmt;
615
616 if (bitmap_bit_p (visited, SSA_NAME_VERSION (var)))
617 return false;
618
619 bitmap_set_bit (visited, SSA_NAME_VERSION (var));
620
621 def_stmt = SSA_NAME_DEF_STMT (var);
622
623 if (TREE_CODE (def_stmt) != PHI_NODE)
624 {
625 /* If we reached the end of the use-def chain, call FN. */
626 return (*fn) (var, def_stmt, data);
627 }
628 else
629 {
630 int i;
631
632 /* Otherwise, follow use-def links out of each PHI argument and call
633 FN after visiting each one. */
634 for (i = 0; i < PHI_NUM_ARGS (def_stmt); i++)
635 {
636 tree arg = PHI_ARG_DEF (def_stmt, i);
637 if (TREE_CODE (arg) == SSA_NAME
638 && walk_use_def_chains_1 (arg, fn, data, visited))
639 return true;
640
641 if ((*fn) (arg, def_stmt, data))
642 return true;
643 }
644 }
645 return false;
646}
647
648
649
650/* Walk use-def chains starting at the SSA variable VAR. Call function FN
651 at each reaching definition found. FN takes three arguments: VAR, its
652 defining statement (DEF_STMT) and a generic pointer to whatever state
653 information that FN may want to maintain (DATA). FN is able to stop the
654 walk by returning true, otherwise in order to continue the walk, FN
655 should return false.
656
657 Note, that if DEF_STMT is a PHI node, the semantics are slightly
658 different. For each argument ARG of the PHI node, this function will:
659
660 1- Walk the use-def chains for ARG.
661 2- Call (*FN) (ARG, PHI, DATA).
662
663 Note how the first argument to FN is no longer the original variable
664 VAR, but the PHI argument currently being examined. If FN wants to get
665 at VAR, it should call PHI_RESULT (PHI). */
666
667void
668walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data)
669{
670 tree def_stmt;
671
672#if defined ENABLE_CHECKING
673 if (TREE_CODE (var) != SSA_NAME)
674 abort ();
675#endif
676
677 def_stmt = SSA_NAME_DEF_STMT (var);
678
679 /* We only need to recurse if the reaching definition comes from a PHI
680 node. */
681 if (TREE_CODE (def_stmt) != PHI_NODE)
682 (*fn) (var, def_stmt, data);
683 else
684 {
685 bitmap visited = BITMAP_XMALLOC ();
686 walk_use_def_chains_1 (var, fn, data, visited);
687 BITMAP_XFREE (visited);
688 }
689}
690
691
692/* Replaces immediate uses of VAR by REPL. */
693
694static void
695replace_immediate_uses (tree var, tree repl)
696{
697 use_optype uses;
698 vuse_optype vuses;
699 vdef_optype vdefs;
700 int i, j, n;
701 dataflow_t df;
702 tree stmt;
703 stmt_ann_t ann;
704
705 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
706 n = num_immediate_uses (df);
707
708 for (i = 0; i < n; i++)
709 {
710 stmt = immediate_use (df, i);
711 ann = stmt_ann (stmt);
712
713 if (TREE_CODE (stmt) == PHI_NODE)
714 {
715 for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
716 if (PHI_ARG_DEF (stmt, j) == var)
717 {
718 PHI_ARG_DEF (stmt, j) = repl;
719 if (TREE_CODE (repl) == SSA_NAME
720 && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL)
721 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1;
722 }
723
724 continue;
725 }
726
727 get_stmt_operands (stmt);
728 if (is_gimple_reg (SSA_NAME_VAR (var)))
729 {
730 uses = USE_OPS (ann);
731 for (j = 0; j < (int) NUM_USES (uses); j++)
732 if (USE_OP (uses, j) == var)
733 propagate_value (USE_OP_PTR (uses, j), repl);
734 }
735 else
736 {
737 vuses = VUSE_OPS (ann);
738 for (j = 0; j < (int) NUM_VUSES (vuses); j++)
739 if (VUSE_OP (vuses, j) == var)
740 propagate_value (VUSE_OP_PTR (vuses, j), repl);
741
742 vdefs = VDEF_OPS (ann);
743 for (j = 0; j < (int) NUM_VDEFS (vdefs); j++)
744 if (VDEF_OP (vdefs, j) == var)
745 propagate_value (VDEF_OP_PTR (vdefs, j), repl);
746 }
747
748 modify_stmt (stmt);
749
750 /* If REPL is a pointer, it may have different memory tags associated
751 with it. For instance, VAR may have had a name tag while REPL
752 only had a type tag. In these cases, the virtual operands (if
753 any) in the statement will refer to different symbols which need
754 to be renamed. */
755 if (POINTER_TYPE_P (TREE_TYPE (repl)))
756 mark_new_vars_to_rename (stmt, vars_to_rename);
757 }
758}
759
760/* Raises value of phi node PHI by joining it with VAL. Processes immediate
761 uses of PHI recursively. */
762
763static void
764raise_value (tree phi, tree val, tree *eq_to)
765{
766 int i, n;
767 tree var = PHI_RESULT (phi), stmt;
768 int ver = SSA_NAME_VERSION (var);
769 dataflow_t df;
770
771 if (eq_to[ver] == var)
772 return;
773
774 switch (TREE_CODE (val))
775 {
776 case SSA_NAME:
777 case REAL_CST:
778 case COMPLEX_CST:
779 break;
780 case INTEGER_CST:
781 if (TREE_CODE (TREE_TYPE (var)) != POINTER_TYPE)
782 break;
783
784 default:
785 /* Do not propagate pointer constants. This might require folding
786 things like *&foo and rewriting the ssa, which is not worth the
787 trouble. */
788 val = var;
789 }
790
791 if (eq_to[ver])
792 {
793 if (operand_equal_p (eq_to[ver], val, 0))
794 return;
795
796 eq_to[ver] = var;
797 }
798 else
799 eq_to[ver] = val;
800
801 df = get_immediate_uses (SSA_NAME_DEF_STMT (var));
802 n = num_immediate_uses (df);
803
804 for (i = 0; i < n; i++)
805 {
806 stmt = immediate_use (df, i);
807
808 if (TREE_CODE (stmt) != PHI_NODE)
809 continue;
810
811 raise_value (stmt, eq_to[ver], eq_to);
812 }
813}
814
815/* Removes redundant phi nodes.
816
817 A redundant PHI node is a PHI node where all of its PHI arguments
818 are the same value, excluding any PHI arguments which are the same
819 as the PHI result.
820
821 A redundant PHI node is effectively a copy, so we forward copy propagate
822 which removes all uses of the destination of the PHI node then
823 finally we delete the redundant PHI node.
824
825 Note that if we can not copy propagate the PHI node, then the PHI
826 will not be removed. Thus we do not have to worry about dependencies
827 between PHIs and the problems serializing PHIs into copies creates.
828
829 The most important effect of this pass is to remove degenerate PHI
830 nodes created by removing unreachable code. */
831
832static void
833kill_redundant_phi_nodes (void)
834{
835 tree *eq_to, *ssa_names;
836 unsigned i, ver, aver;
837 basic_block bb;
838 tree phi, t, stmt, var;
839
840 /* The EQ_TO array holds the current value of the ssa name in the
841 lattice:
842
843 top
844 / | \
845 const variables
846 \ | /
847 bottom
848
849 Bottom is represented by NULL and top by the variable itself.
850
851 Once the dataflow stabilizes, we know that the phi nodes we need to keep
852 are exactly those with top as their result.
853
854 The remaining phi nodes have their uses replaced with their value
855 in the lattice and the phi node itself is removed. */
856 eq_to = xcalloc (highest_ssa_version, sizeof (tree));
857
858 /* The SSA_NAMES array holds each SSA_NAME node we encounter
859 in a PHI node (indexed by ssa version number).
860
861 One could argue that the SSA_NAME manager ought to provide a
862 generic interface to get at the SSA_NAME node for a given
863 ssa version number. */
864 ssa_names = xcalloc (highest_ssa_version, sizeof (tree));
865
866 /* We have had cases where computing immediate uses takes a
867 significant amount of compile time. If we run into such
868 problems here, we may want to only compute immediate uses for
869 a subset of all the SSA_NAMEs instead of computing it for
870 all of the SSA_NAMEs. */
871 compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL);
872
873 FOR_EACH_BB (bb)
874 {
875 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
876 {
877 var = PHI_RESULT (phi);
878 ver = SSA_NAME_VERSION (var);
879 ssa_names[ver] = var;
880
881 for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++)
882 {
883 t = PHI_ARG_DEF (phi, i);
884
885 if (TREE_CODE (t) != SSA_NAME)
886 {
887 raise_value (phi, t, eq_to);
888 continue;
889 }
890
891 stmt = SSA_NAME_DEF_STMT (t);
892 aver = SSA_NAME_VERSION (t);
893 ssa_names[aver] = t;
894
895 /* If the defining statement for this argument is not a
896 phi node or the argument is associated with an abnormal
897 edge, then we need to recursively start the forward
898 dataflow starting with PHI. */
899 if (TREE_CODE (stmt) != PHI_NODE
900 || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (t))
901 {
902 eq_to[aver] = t;
903 raise_value (phi, t, eq_to);
904 }
905 }
906 }
907 }
908
909 /* Now propagate the values. */
910 for (i = 0; i < highest_ssa_version; i++)
911 if (eq_to[i]
912 && eq_to[i] != ssa_names[i])
913 replace_immediate_uses (ssa_names[i], eq_to[i]);
914
915 /* And remove the dead phis. */
916 for (i = 0; i < highest_ssa_version; i++)
917 if (eq_to[i]
918 && eq_to[i] != ssa_names[i])
919 {
920 stmt = SSA_NAME_DEF_STMT (ssa_names[i]);
921 remove_phi_node (stmt, 0, bb_for_stmt (stmt));
922 }
923
924 free_df ();
925 free (eq_to);
926 free (ssa_names);
927}
928
929struct tree_opt_pass pass_redundant_phi =
930{
931 "redphi", /* name */
932 NULL, /* gate */
933 kill_redundant_phi_nodes, /* execute */
934 NULL, /* sub */
935 NULL, /* next */
936 0, /* static_pass_number */
937 0, /* tv_id */
938 PROP_cfg | PROP_ssa, /* properties_required */
939 0, /* properties_provided */
940 0, /* properties_destroyed */
941 0, /* todo_flags_start */
942 TODO_dump_func | TODO_rename_vars
943 | TODO_ggc_collect | TODO_verify_ssa /* todo_flags_finish */
944};
945\f
946/* Emit warnings for uninitialized variables. This is done in two passes.
947
948 The first pass notices real uses of SSA names with default definitions.
949 Such uses are unconditionally uninitialized, and we can be certain that
950 such a use is a mistake. This pass is run before most optimizations,
951 so that we catch as many as we can.
952
953 The second pass follows PHI nodes to find uses that are potentially
954 uninitialized. In this case we can't necessarily prove that the use
955 is really uninitialized. This pass is run after most optimizations,
956 so that we thread as many jumps and possible, and delete as much dead
957 code as possible, in order to reduce false positives. We also look
958 again for plain uninitialized variables, since optimization may have
959 changed conditionally uninitialized to unconditionally uninitialized. */
960
961/* Emit a warning for T, an SSA_NAME, being uninitialized. The exact
962 warning text is in MSGID and LOCUS may contain a location or be null. */
963
964static void
965warn_uninit (tree t, const char *msgid, location_t *locus)
966{
967 tree var = SSA_NAME_VAR (t);
968 tree def = SSA_NAME_DEF_STMT (t);
969
970 /* Default uses (indicated by an empty definition statement),
971 are uninitialized. */
972 if (!IS_EMPTY_STMT (def))
973 return;
974
975 /* Except for PARMs of course, which are always initialized. */
976 if (TREE_CODE (var) == PARM_DECL)
977 return;
978
979 /* Hard register variables get their initial value from the ether. */
980 if (DECL_HARD_REGISTER (var))
981 return;
982
983 /* TREE_NO_WARNING either means we already warned, or the front end
984 wishes to suppress the warning. */
985 if (TREE_NO_WARNING (var))
986 return;
987
988 if (!locus)
989 locus = &DECL_SOURCE_LOCATION (var);
990 warning (msgid, locus, var);
991 TREE_NO_WARNING (var) = 1;
992}
993
994/* Called via walk_tree, look for SSA_NAMEs that have empty definitions
995 and warn about them. */
996
997static tree
998warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
999{
1000 location_t *locus = data;
1001 tree t = *tp;
1002
1003 /* We only do data flow with SSA_NAMEs, so that's all we can warn about. */
1004 if (TREE_CODE (t) == SSA_NAME)
1005 {
1006 warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
1007 *walk_subtrees = 0;
1008 }
1009 else if (DECL_P (t) || TYPE_P (t))
1010 *walk_subtrees = 0;
1011
1012 return NULL_TREE;
1013}
1014
1015/* Look for inputs to PHI that are SSA_NAMEs that have empty definitions
1016 and warn about them. */
1017
1018static void
1019warn_uninitialized_phi (tree phi)
1020{
1021 int i, n = PHI_NUM_ARGS (phi);
1022
1023 /* Don't look at memory tags. */
1024 if (!is_gimple_reg (PHI_RESULT (phi)))
1025 return;
1026
1027 for (i = 0; i < n; ++i)
1028 {
1029 tree op = PHI_ARG_DEF (phi, i);
1030 if (TREE_CODE (op) == SSA_NAME)
1031 warn_uninit (op, "%H'%D' may be used uninitialized in this function",
1032 NULL);
1033 }
1034}
1035
1036static void
1037execute_early_warn_uninitialized (void)
1038{
1039 block_stmt_iterator bsi;
1040 basic_block bb;
1041
1042 FOR_EACH_BB (bb)
1043 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1044 walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
1045 EXPR_LOCUS (bsi_stmt (bsi)), NULL);
1046}
1047
1048static void
1049execute_late_warn_uninitialized (void)
1050{
1051 basic_block bb;
1052 tree phi;
1053
1054 /* Re-do the plain uninitialized variable check, as optimization may have
1055 straightened control flow. Do this first so that we don't accidentally
1056 get a "may be" warning when we'd have seen an "is" warning later. */
1057 execute_early_warn_uninitialized ();
1058
1059 FOR_EACH_BB (bb)
1060 for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
1061 warn_uninitialized_phi (phi);
1062}
1063
1064static bool
1065gate_warn_uninitialized (void)
1066{
1067 return warn_uninitialized != 0;
1068}
1069
1070struct tree_opt_pass pass_early_warn_uninitialized =
1071{
1072 NULL, /* name */
1073 gate_warn_uninitialized, /* gate */
1074 execute_early_warn_uninitialized, /* execute */
1075 NULL, /* sub */
1076 NULL, /* next */
1077 0, /* static_pass_number */
1078 0, /* tv_id */
1079 PROP_ssa, /* properties_required */
1080 0, /* properties_provided */
1081 0, /* properties_destroyed */
1082 0, /* todo_flags_start */
1083 0 /* todo_flags_finish */
1084};
1085
1086struct tree_opt_pass pass_late_warn_uninitialized =
1087{
1088 NULL, /* name */
1089 gate_warn_uninitialized, /* gate */
1090 execute_late_warn_uninitialized, /* execute */
1091 NULL, /* sub */
1092 NULL, /* next */
1093 0, /* static_pass_number */
1094 0, /* tv_id */
1095 PROP_ssa, /* properties_required */
1096 0, /* properties_provided */
1097 0, /* properties_destroyed */
1098 0, /* todo_flags_start */
1099 0 /* todo_flags_finish */
1100};
This page took 0.178689 seconds and 5 git commands to generate.