]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-cfg.c
re PR fortran/39688 (IMPORT of derived type fails)
[thirdparty/gcc.git] / gcc / tree-cfg.c
CommitLineData
6de9cd9a 1/* Control flow functions for trees.
66647d44 2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
56e84019 3 Free Software Foundation, Inc.
6de9cd9a
DN
4 Contributed by Diego Novillo <dnovillo@redhat.com>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
9dcd6f09 10the Free Software Foundation; either version 3, or (at your option)
6de9cd9a
DN
11any later version.
12
13GCC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9dcd6f09
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
21
22#include "config.h"
23#include "system.h"
24#include "coretypes.h"
25#include "tm.h"
26#include "tree.h"
27#include "rtl.h"
28#include "tm_p.h"
29#include "hard-reg-set.h"
30#include "basic-block.h"
31#include "output.h"
6de9cd9a
DN
32#include "flags.h"
33#include "function.h"
34#include "expr.h"
35#include "ggc.h"
36#include "langhooks.h"
37#include "diagnostic.h"
38#include "tree-flow.h"
39#include "timevar.h"
40#include "tree-dump.h"
41#include "tree-pass.h"
42#include "toplev.h"
43#include "except.h"
44#include "cfgloop.h"
42759f1e 45#include "cfglayout.h"
9af0df6b 46#include "tree-ssa-propagate.h"
6946b3f7 47#include "value-prof.h"
4437b50d 48#include "pointer-set.h"
917948d3 49#include "tree-inline.h"
6de9cd9a
DN
50
51/* This file contains functions for building the Control Flow Graph (CFG)
52 for a function tree. */
53
54/* Local declarations. */
55
56/* Initial capacity for the basic block array. */
57static const int initial_cfg_capacity = 20;
58
d6be0d7f
JL
59/* This hash table allows us to efficiently lookup all CASE_LABEL_EXPRs
60 which use a particular edge. The CASE_LABEL_EXPRs are chained together
61 via their TREE_CHAIN field, which we clear after we're done with the
726a989a 62 hash table to prevent problems with duplication of GIMPLE_SWITCHes.
92b6dff3 63
d6be0d7f
JL
64 Access to this list of CASE_LABEL_EXPRs allows us to efficiently
65 update the case vector in response to edge redirections.
92b6dff3 66
d6be0d7f
JL
67 Right now this table is set up and torn down at key points in the
68 compilation process. It would be nice if we could make the table
69 more persistent. The key is getting notification of changes to
70 the CFG (particularly edge removal, creation and redirection). */
71
15814ba0 72static struct pointer_map_t *edge_to_cases;
92b6dff3 73
6de9cd9a
DN
74/* CFG statistics. */
75struct cfg_stats_d
76{
77 long num_merged_labels;
78};
79
80static struct cfg_stats_d cfg_stats;
81
82/* Nonzero if we found a computed goto while building basic blocks. */
83static bool found_computed_goto;
84
85/* Basic blocks and flowgraphs. */
726a989a 86static void make_blocks (gimple_seq);
6de9cd9a 87static void factor_computed_gotos (void);
6de9cd9a
DN
88
89/* Edges. */
90static void make_edges (void);
6de9cd9a 91static void make_cond_expr_edges (basic_block);
726a989a 92static void make_gimple_switch_edges (basic_block);
6de9cd9a 93static void make_goto_expr_edges (basic_block);
726a989a
RB
94static edge gimple_redirect_edge_and_branch (edge, basic_block);
95static edge gimple_try_redirect_by_replacing_jump (edge, basic_block);
c2924966 96static unsigned int split_critical_edges (void);
6de9cd9a
DN
97
98/* Various helpers. */
726a989a
RB
99static inline bool stmt_starts_bb_p (gimple, gimple);
100static int gimple_verify_flow_info (void);
101static void gimple_make_forwarder_block (edge);
102static void gimple_cfg2vcg (FILE *);
6de9cd9a
DN
103
104/* Flowgraph optimization and cleanup. */
726a989a
RB
105static void gimple_merge_blocks (basic_block, basic_block);
106static bool gimple_can_merge_blocks_p (basic_block, basic_block);
6de9cd9a 107static void remove_bb (basic_block);
be477406 108static edge find_taken_edge_computed_goto (basic_block, tree);
6de9cd9a
DN
109static edge find_taken_edge_cond_expr (basic_block, tree);
110static edge find_taken_edge_switch_expr (basic_block, tree);
726a989a 111static tree find_case_label_for_value (gimple, tree);
6de9cd9a 112
a930a4ef 113void
9defb1fe 114init_empty_tree_cfg_for_function (struct function *fn)
a930a4ef
JH
115{
116 /* Initialize the basic block array. */
9defb1fe
DN
117 init_flow (fn);
118 profile_status_for_function (fn) = PROFILE_ABSENT;
119 n_basic_blocks_for_function (fn) = NUM_FIXED_BLOCKS;
120 last_basic_block_for_function (fn) = NUM_FIXED_BLOCKS;
121 basic_block_info_for_function (fn)
122 = VEC_alloc (basic_block, gc, initial_cfg_capacity);
123 VEC_safe_grow_cleared (basic_block, gc,
124 basic_block_info_for_function (fn),
a590ac65 125 initial_cfg_capacity);
a930a4ef
JH
126
127 /* Build a mapping of labels to their associated blocks. */
9defb1fe
DN
128 label_to_block_map_for_function (fn)
129 = VEC_alloc (basic_block, gc, initial_cfg_capacity);
130 VEC_safe_grow_cleared (basic_block, gc,
131 label_to_block_map_for_function (fn),
a590ac65 132 initial_cfg_capacity);
a930a4ef 133
9defb1fe
DN
134 SET_BASIC_BLOCK_FOR_FUNCTION (fn, ENTRY_BLOCK,
135 ENTRY_BLOCK_PTR_FOR_FUNCTION (fn));
136 SET_BASIC_BLOCK_FOR_FUNCTION (fn, EXIT_BLOCK,
137 EXIT_BLOCK_PTR_FOR_FUNCTION (fn));
138
139 ENTRY_BLOCK_PTR_FOR_FUNCTION (fn)->next_bb
140 = EXIT_BLOCK_PTR_FOR_FUNCTION (fn);
141 EXIT_BLOCK_PTR_FOR_FUNCTION (fn)->prev_bb
142 = ENTRY_BLOCK_PTR_FOR_FUNCTION (fn);
143}
144
145void
146init_empty_tree_cfg (void)
147{
148 init_empty_tree_cfg_for_function (cfun);
a930a4ef 149}
6de9cd9a
DN
150
151/*---------------------------------------------------------------------------
152 Create basic blocks
153---------------------------------------------------------------------------*/
154
726a989a 155/* Entry point to the CFG builder for trees. SEQ is the sequence of
6de9cd9a
DN
156 statements to be added to the flowgraph. */
157
158static void
726a989a 159build_gimple_cfg (gimple_seq seq)
6de9cd9a 160{
726a989a
RB
161 /* Register specific gimple functions. */
162 gimple_register_cfg_hooks ();
6de9cd9a 163
6de9cd9a
DN
164 memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
165
a930a4ef 166 init_empty_tree_cfg ();
6de9cd9a
DN
167
168 found_computed_goto = 0;
726a989a 169 make_blocks (seq);
6de9cd9a
DN
170
171 /* Computed gotos are hell to deal with, especially if there are
172 lots of them with a large number of destinations. So we factor
173 them to a common computed goto location before we build the
174 edge list. After we convert back to normal form, we will un-factor
175 the computed gotos since factoring introduces an unwanted jump. */
176 if (found_computed_goto)
177 factor_computed_gotos ();
178
f0b698c1 179 /* Make sure there is always at least one block, even if it's empty. */
24bd1a0b 180 if (n_basic_blocks == NUM_FIXED_BLOCKS)
6de9cd9a
DN
181 create_empty_bb (ENTRY_BLOCK_PTR);
182
6de9cd9a 183 /* Adjust the size of the array. */
68f9b844 184 if (VEC_length (basic_block, basic_block_info) < (size_t) n_basic_blocks)
a590ac65 185 VEC_safe_grow_cleared (basic_block, gc, basic_block_info, n_basic_blocks);
6de9cd9a 186
f667741c
SB
187 /* To speed up statement iterator walks, we first purge dead labels. */
188 cleanup_dead_labels ();
189
190 /* Group case nodes to reduce the number of edges.
191 We do this after cleaning up dead labels because otherwise we miss
192 a lot of obvious case merging opportunities. */
193 group_case_labels ();
194
6de9cd9a
DN
195 /* Create the edges of the flowgraph. */
196 make_edges ();
8b11009b 197 cleanup_dead_labels ();
6de9cd9a
DN
198
199 /* Debugging dumps. */
200
201 /* Write the flowgraph to a VCG file. */
202 {
203 int local_dump_flags;
10d22567
ZD
204 FILE *vcg_file = dump_begin (TDI_vcg, &local_dump_flags);
205 if (vcg_file)
6de9cd9a 206 {
726a989a 207 gimple_cfg2vcg (vcg_file);
10d22567 208 dump_end (TDI_vcg, vcg_file);
6de9cd9a
DN
209 }
210 }
211
81cfbbc2
JH
212#ifdef ENABLE_CHECKING
213 verify_stmts ();
214#endif
6de9cd9a
DN
215}
216
c2924966 217static unsigned int
6de9cd9a
DN
218execute_build_cfg (void)
219{
39ecc018
JH
220 gimple_seq body = gimple_body (current_function_decl);
221
222 build_gimple_cfg (body);
223 gimple_set_body (current_function_decl, NULL);
cff7525f
JH
224 if (dump_file && (dump_flags & TDF_DETAILS))
225 {
226 fprintf (dump_file, "Scope blocks:\n");
227 dump_scope_blocks (dump_file, dump_flags);
228 }
c2924966 229 return 0;
6de9cd9a
DN
230}
231
8ddbbcae 232struct gimple_opt_pass pass_build_cfg =
6de9cd9a 233{
8ddbbcae
JH
234 {
235 GIMPLE_PASS,
6de9cd9a
DN
236 "cfg", /* name */
237 NULL, /* gate */
238 execute_build_cfg, /* execute */
239 NULL, /* sub */
240 NULL, /* next */
241 0, /* static_pass_number */
242 TV_TREE_CFG, /* tv_id */
726a989a 243 PROP_gimple_leh, /* properties_required */
6de9cd9a
DN
244 PROP_cfg, /* properties_provided */
245 0, /* properties_destroyed */
246 0, /* todo_flags_start */
11b08ee9
RG
247 TODO_verify_stmts | TODO_cleanup_cfg
248 | TODO_dump_func /* todo_flags_finish */
8ddbbcae 249 }
6de9cd9a
DN
250};
251
726a989a
RB
252
253/* Return true if T is a computed goto. */
254
255static bool
256computed_goto_p (gimple t)
257{
258 return (gimple_code (t) == GIMPLE_GOTO
259 && TREE_CODE (gimple_goto_dest (t)) != LABEL_DECL);
260}
261
262
6531d1be 263/* Search the CFG for any computed gotos. If found, factor them to a
6de9cd9a 264 common computed goto site. Also record the location of that site so
6531d1be 265 that we can un-factor the gotos after we have converted back to
6de9cd9a
DN
266 normal form. */
267
268static void
269factor_computed_gotos (void)
270{
271 basic_block bb;
272 tree factored_label_decl = NULL;
273 tree var = NULL;
726a989a
RB
274 gimple factored_computed_goto_label = NULL;
275 gimple factored_computed_goto = NULL;
6de9cd9a
DN
276
277 /* We know there are one or more computed gotos in this function.
278 Examine the last statement in each basic block to see if the block
279 ends with a computed goto. */
6531d1be 280
6de9cd9a
DN
281 FOR_EACH_BB (bb)
282 {
726a989a
RB
283 gimple_stmt_iterator gsi = gsi_last_bb (bb);
284 gimple last;
6de9cd9a 285
726a989a 286 if (gsi_end_p (gsi))
6de9cd9a 287 continue;
726a989a
RB
288
289 last = gsi_stmt (gsi);
6de9cd9a
DN
290
291 /* Ignore the computed goto we create when we factor the original
292 computed gotos. */
293 if (last == factored_computed_goto)
294 continue;
295
296 /* If the last statement is a computed goto, factor it. */
297 if (computed_goto_p (last))
298 {
726a989a 299 gimple assignment;
6de9cd9a
DN
300
301 /* The first time we find a computed goto we need to create
302 the factored goto block and the variable each original
303 computed goto will use for their goto destination. */
726a989a 304 if (!factored_computed_goto)
6de9cd9a
DN
305 {
306 basic_block new_bb = create_empty_bb (bb);
726a989a 307 gimple_stmt_iterator new_gsi = gsi_start_bb (new_bb);
6de9cd9a
DN
308
309 /* Create the destination of the factored goto. Each original
310 computed goto will put its desired destination into this
311 variable and jump to the label we create immediately
312 below. */
313 var = create_tmp_var (ptr_type_node, "gotovar");
314
315 /* Build a label for the new block which will contain the
316 factored computed goto. */
317 factored_label_decl = create_artificial_label ();
318 factored_computed_goto_label
726a989a
RB
319 = gimple_build_label (factored_label_decl);
320 gsi_insert_after (&new_gsi, factored_computed_goto_label,
321 GSI_NEW_STMT);
6de9cd9a
DN
322
323 /* Build our new computed goto. */
726a989a
RB
324 factored_computed_goto = gimple_build_goto (var);
325 gsi_insert_after (&new_gsi, factored_computed_goto, GSI_NEW_STMT);
6de9cd9a
DN
326 }
327
328 /* Copy the original computed goto's destination into VAR. */
726a989a
RB
329 assignment = gimple_build_assign (var, gimple_goto_dest (last));
330 gsi_insert_before (&gsi, assignment, GSI_SAME_STMT);
6de9cd9a
DN
331
332 /* And re-vector the computed goto to the new destination. */
726a989a 333 gimple_goto_set_dest (last, factored_label_decl);
6de9cd9a
DN
334 }
335 }
336}
337
338
726a989a 339/* Build a flowgraph for the sequence of stmts SEQ. */
6de9cd9a
DN
340
341static void
726a989a 342make_blocks (gimple_seq seq)
6de9cd9a 343{
726a989a
RB
344 gimple_stmt_iterator i = gsi_start (seq);
345 gimple stmt = NULL;
6de9cd9a 346 bool start_new_block = true;
726a989a 347 bool first_stmt_of_seq = true;
6de9cd9a
DN
348 basic_block bb = ENTRY_BLOCK_PTR;
349
726a989a 350 while (!gsi_end_p (i))
6de9cd9a 351 {
726a989a 352 gimple prev_stmt;
6de9cd9a
DN
353
354 prev_stmt = stmt;
726a989a 355 stmt = gsi_stmt (i);
6de9cd9a
DN
356
357 /* If the statement starts a new basic block or if we have determined
358 in a previous pass that we need to create a new block for STMT, do
359 so now. */
360 if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
361 {
726a989a
RB
362 if (!first_stmt_of_seq)
363 seq = gsi_split_seq_before (&i);
364 bb = create_basic_block (seq, NULL, bb);
6de9cd9a
DN
365 start_new_block = false;
366 }
367
368 /* Now add STMT to BB and create the subgraphs for special statement
369 codes. */
726a989a 370 gimple_set_bb (stmt, bb);
6de9cd9a
DN
371
372 if (computed_goto_p (stmt))
373 found_computed_goto = true;
374
375 /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
376 next iteration. */
377 if (stmt_ends_bb_p (stmt))
54634841
RG
378 {
379 /* If the stmt can make abnormal goto use a new temporary
380 for the assignment to the LHS. This makes sure the old value
381 of the LHS is available on the abnormal edge. Otherwise
382 we will end up with overlapping life-ranges for abnormal
383 SSA names. */
384 if (gimple_has_lhs (stmt)
385 && stmt_can_make_abnormal_goto (stmt)
386 && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt))))
387 {
388 tree lhs = gimple_get_lhs (stmt);
389 tree tmp = create_tmp_var (TREE_TYPE (lhs), NULL);
390 gimple s = gimple_build_assign (lhs, tmp);
391 gimple_set_location (s, gimple_location (stmt));
392 gimple_set_block (s, gimple_block (stmt));
393 gimple_set_lhs (stmt, tmp);
394 if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
395 || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
396 DECL_GIMPLE_REG_P (tmp) = 1;
397 gsi_insert_after (&i, s, GSI_SAME_STMT);
398 }
399 start_new_block = true;
400 }
6de9cd9a 401
726a989a
RB
402 gsi_next (&i);
403 first_stmt_of_seq = false;
6de9cd9a
DN
404 }
405}
406
407
408/* Create and return a new empty basic block after bb AFTER. */
409
410static basic_block
411create_bb (void *h, void *e, basic_block after)
412{
413 basic_block bb;
414
1e128c5f 415 gcc_assert (!e);
6de9cd9a 416
27fd69fa
KH
417 /* Create and initialize a new basic block. Since alloc_block uses
418 ggc_alloc_cleared to allocate a basic block, we do not have to
419 clear the newly allocated basic block here. */
6de9cd9a 420 bb = alloc_block ();
6de9cd9a
DN
421
422 bb->index = last_basic_block;
423 bb->flags = BB_NEW;
726a989a
RB
424 bb->il.gimple = GGC_CNEW (struct gimple_bb_info);
425 set_bb_seq (bb, h ? (gimple_seq) h : gimple_seq_alloc ());
6de9cd9a
DN
426
427 /* Add the new block to the linked list of blocks. */
428 link_block (bb, after);
429
430 /* Grow the basic block array if needed. */
68f9b844 431 if ((size_t) last_basic_block == VEC_length (basic_block, basic_block_info))
6de9cd9a
DN
432 {
433 size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
a590ac65 434 VEC_safe_grow_cleared (basic_block, gc, basic_block_info, new_size);
6de9cd9a
DN
435 }
436
437 /* Add the newly created block to the array. */
68f9b844 438 SET_BASIC_BLOCK (last_basic_block, bb);
6de9cd9a 439
6de9cd9a
DN
440 n_basic_blocks++;
441 last_basic_block++;
442
6de9cd9a
DN
443 return bb;
444}
445
446
447/*---------------------------------------------------------------------------
448 Edge creation
449---------------------------------------------------------------------------*/
450
fca01525
KH
451/* Fold COND_EXPR_COND of each COND_EXPR. */
452
e21aff8a 453void
fca01525
KH
454fold_cond_expr_cond (void)
455{
456 basic_block bb;
457
458 FOR_EACH_BB (bb)
459 {
726a989a 460 gimple stmt = last_stmt (bb);
fca01525 461
726a989a 462 if (stmt && gimple_code (stmt) == GIMPLE_COND)
fca01525 463 {
6ac01510
ILT
464 tree cond;
465 bool zerop, onep;
466
467 fold_defer_overflow_warnings ();
726a989a
RB
468 cond = fold_binary (gimple_cond_code (stmt), boolean_type_node,
469 gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
470 if (cond)
471 {
472 zerop = integer_zerop (cond);
473 onep = integer_onep (cond);
474 }
475 else
476 zerop = onep = false;
477
e233ac97 478 fold_undefer_overflow_warnings (zerop || onep,
4df28528 479 stmt,
6ac01510
ILT
480 WARN_STRICT_OVERFLOW_CONDITIONAL);
481 if (zerop)
726a989a 482 gimple_cond_make_false (stmt);
6ac01510 483 else if (onep)
726a989a 484 gimple_cond_make_true (stmt);
fca01525
KH
485 }
486 }
487}
488
6de9cd9a
DN
489/* Join all the blocks in the flowgraph. */
490
491static void
492make_edges (void)
493{
494 basic_block bb;
bed575d5 495 struct omp_region *cur_region = NULL;
6de9cd9a
DN
496
497 /* Create an edge from entry to the first block with executable
498 statements in it. */
24bd1a0b 499 make_edge (ENTRY_BLOCK_PTR, BASIC_BLOCK (NUM_FIXED_BLOCKS), EDGE_FALLTHRU);
6de9cd9a 500
adb35797 501 /* Traverse the basic block array placing edges. */
6de9cd9a
DN
502 FOR_EACH_BB (bb)
503 {
726a989a 504 gimple last = last_stmt (bb);
56e84019 505 bool fallthru;
6de9cd9a 506
56e84019 507 if (last)
6de9cd9a 508 {
726a989a 509 enum gimple_code code = gimple_code (last);
bed575d5 510 switch (code)
56e84019 511 {
726a989a 512 case GIMPLE_GOTO:
56e84019
RH
513 make_goto_expr_edges (bb);
514 fallthru = false;
515 break;
726a989a 516 case GIMPLE_RETURN:
56e84019
RH
517 make_edge (bb, EXIT_BLOCK_PTR, 0);
518 fallthru = false;
519 break;
726a989a 520 case GIMPLE_COND:
56e84019
RH
521 make_cond_expr_edges (bb);
522 fallthru = false;
523 break;
726a989a
RB
524 case GIMPLE_SWITCH:
525 make_gimple_switch_edges (bb);
56e84019
RH
526 fallthru = false;
527 break;
726a989a 528 case GIMPLE_RESX:
56e84019
RH
529 make_eh_edges (last);
530 fallthru = false;
531 break;
532
726a989a 533 case GIMPLE_CALL:
56e84019
RH
534 /* If this function receives a nonlocal goto, then we need to
535 make edges from this call site to all the nonlocal goto
536 handlers. */
726a989a 537 if (stmt_can_make_abnormal_goto (last))
4f6c2131 538 make_abnormal_goto_edges (bb, true);
6de9cd9a 539
56e84019
RH
540 /* If this statement has reachable exception handlers, then
541 create abnormal edges to them. */
542 make_eh_edges (last);
543
544 /* Some calls are known not to return. */
726a989a 545 fallthru = !(gimple_call_flags (last) & ECF_NORETURN);
56e84019
RH
546 break;
547
726a989a
RB
548 case GIMPLE_ASSIGN:
549 /* A GIMPLE_ASSIGN may throw internally and thus be considered
550 control-altering. */
56e84019
RH
551 if (is_ctrl_altering_stmt (last))
552 {
56e84019
RH
553 make_eh_edges (last);
554 }
555 fallthru = true;
556 break;
557
726a989a
RB
558 case GIMPLE_OMP_PARALLEL:
559 case GIMPLE_OMP_TASK:
560 case GIMPLE_OMP_FOR:
561 case GIMPLE_OMP_SINGLE:
562 case GIMPLE_OMP_MASTER:
563 case GIMPLE_OMP_ORDERED:
564 case GIMPLE_OMP_CRITICAL:
565 case GIMPLE_OMP_SECTION:
bed575d5 566 cur_region = new_omp_region (bb, code, cur_region);
56e84019
RH
567 fallthru = true;
568 break;
569
726a989a 570 case GIMPLE_OMP_SECTIONS:
bed575d5 571 cur_region = new_omp_region (bb, code, cur_region);
e5c95afe
ZD
572 fallthru = true;
573 break;
574
726a989a 575 case GIMPLE_OMP_SECTIONS_SWITCH:
7e2df4a1 576 fallthru = false;
777f7f9a
RH
577 break;
578
a509ebb5 579
726a989a
RB
580 case GIMPLE_OMP_ATOMIC_LOAD:
581 case GIMPLE_OMP_ATOMIC_STORE:
a509ebb5
RL
582 fallthru = true;
583 break;
584
585
726a989a
RB
586 case GIMPLE_OMP_RETURN:
587 /* In the case of a GIMPLE_OMP_SECTION, the edge will go
588 somewhere other than the next block. This will be
589 created later. */
bed575d5 590 cur_region->exit = bb;
726a989a 591 fallthru = cur_region->type != GIMPLE_OMP_SECTION;
bed575d5
RS
592 cur_region = cur_region->outer;
593 break;
594
726a989a 595 case GIMPLE_OMP_CONTINUE:
bed575d5
RS
596 cur_region->cont = bb;
597 switch (cur_region->type)
598 {
726a989a
RB
599 case GIMPLE_OMP_FOR:
600 /* Mark all GIMPLE_OMP_FOR and GIMPLE_OMP_CONTINUE
601 succs edges as abnormal to prevent splitting
602 them. */
135a171d 603 single_succ_edge (cur_region->entry)->flags |= EDGE_ABNORMAL;
e5c95afe 604 /* Make the loopback edge. */
135a171d
JJ
605 make_edge (bb, single_succ (cur_region->entry),
606 EDGE_ABNORMAL);
607
726a989a
RB
608 /* Create an edge from GIMPLE_OMP_FOR to exit, which
609 corresponds to the case that the body of the loop
610 is not executed at all. */
135a171d
JJ
611 make_edge (cur_region->entry, bb->next_bb, EDGE_ABNORMAL);
612 make_edge (bb, bb->next_bb, EDGE_FALLTHRU | EDGE_ABNORMAL);
613 fallthru = false;
bed575d5
RS
614 break;
615
726a989a 616 case GIMPLE_OMP_SECTIONS:
bed575d5 617 /* Wire up the edges into and out of the nested sections. */
bed575d5 618 {
e5c95afe
ZD
619 basic_block switch_bb = single_succ (cur_region->entry);
620
bed575d5
RS
621 struct omp_region *i;
622 for (i = cur_region->inner; i ; i = i->next)
623 {
726a989a 624 gcc_assert (i->type == GIMPLE_OMP_SECTION);
e5c95afe 625 make_edge (switch_bb, i->entry, 0);
bed575d5
RS
626 make_edge (i->exit, bb, EDGE_FALLTHRU);
627 }
e5c95afe
ZD
628
629 /* Make the loopback edge to the block with
726a989a 630 GIMPLE_OMP_SECTIONS_SWITCH. */
e5c95afe
ZD
631 make_edge (bb, switch_bb, 0);
632
633 /* Make the edge from the switch to exit. */
634 make_edge (switch_bb, bb->next_bb, 0);
635 fallthru = false;
bed575d5
RS
636 }
637 break;
6531d1be 638
bed575d5
RS
639 default:
640 gcc_unreachable ();
641 }
bed575d5
RS
642 break;
643
56e84019
RH
644 default:
645 gcc_assert (!stmt_ends_bb_p (last));
646 fallthru = true;
647 }
6de9cd9a 648 }
56e84019
RH
649 else
650 fallthru = true;
6de9cd9a 651
56e84019 652 if (fallthru)
6de9cd9a
DN
653 make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
654 }
655
bed575d5
RS
656 if (root_omp_region)
657 free_omp_regions ();
658
fca01525
KH
659 /* Fold COND_EXPR_COND of each COND_EXPR. */
660 fold_cond_expr_cond ();
6de9cd9a
DN
661}
662
663
726a989a 664/* Create the edges for a GIMPLE_COND starting at block BB. */
6de9cd9a
DN
665
666static void
667make_cond_expr_edges (basic_block bb)
668{
726a989a
RB
669 gimple entry = last_stmt (bb);
670 gimple then_stmt, else_stmt;
6de9cd9a
DN
671 basic_block then_bb, else_bb;
672 tree then_label, else_label;
d783b2a2 673 edge e;
6de9cd9a 674
1e128c5f 675 gcc_assert (entry);
726a989a 676 gcc_assert (gimple_code (entry) == GIMPLE_COND);
6de9cd9a
DN
677
678 /* Entry basic blocks for each component. */
726a989a
RB
679 then_label = gimple_cond_true_label (entry);
680 else_label = gimple_cond_false_label (entry);
6de9cd9a
DN
681 then_bb = label_to_block (then_label);
682 else_bb = label_to_block (else_label);
726a989a
RB
683 then_stmt = first_stmt (then_bb);
684 else_stmt = first_stmt (else_bb);
6de9cd9a 685
d783b2a2 686 e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
726a989a 687 e->goto_locus = gimple_location (then_stmt);
cc2a64dd
JJ
688 if (e->goto_locus)
689 e->goto_block = gimple_block (then_stmt);
d783b2a2
JH
690 e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
691 if (e)
7241571e
JJ
692 {
693 e->goto_locus = gimple_location (else_stmt);
cc2a64dd
JJ
694 if (e->goto_locus)
695 e->goto_block = gimple_block (else_stmt);
7241571e 696 }
a9b77cd1 697
726a989a
RB
698 /* We do not need the labels anymore. */
699 gimple_cond_set_true_label (entry, NULL_TREE);
700 gimple_cond_set_false_label (entry, NULL_TREE);
6de9cd9a
DN
701}
702
92b6dff3 703
d6be0d7f
JL
704/* Called for each element in the hash table (P) as we delete the
705 edge to cases hash table.
706
6531d1be 707 Clear all the TREE_CHAINs to prevent problems with copying of
d6be0d7f
JL
708 SWITCH_EXPRs and structure sharing rules, then free the hash table
709 element. */
710
15814ba0 711static bool
ac7d7749 712edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value,
15814ba0 713 void *data ATTRIBUTE_UNUSED)
d6be0d7f 714{
d6be0d7f
JL
715 tree t, next;
716
15814ba0 717 for (t = (tree) *value; t; t = next)
d6be0d7f
JL
718 {
719 next = TREE_CHAIN (t);
720 TREE_CHAIN (t) = NULL;
721 }
15814ba0
PB
722
723 *value = NULL;
724 return false;
d6be0d7f
JL
725}
726
727/* Start recording information mapping edges to case labels. */
728
c9784e6d 729void
d6be0d7f
JL
730start_recording_case_labels (void)
731{
732 gcc_assert (edge_to_cases == NULL);
15814ba0 733 edge_to_cases = pointer_map_create ();
d6be0d7f
JL
734}
735
736/* Return nonzero if we are recording information for case labels. */
737
738static bool
739recording_case_labels_p (void)
740{
741 return (edge_to_cases != NULL);
742}
743
744/* Stop recording information mapping edges to case labels and
745 remove any information we have recorded. */
c9784e6d 746void
d6be0d7f
JL
747end_recording_case_labels (void)
748{
15814ba0
PB
749 pointer_map_traverse (edge_to_cases, edge_to_cases_cleanup, NULL);
750 pointer_map_destroy (edge_to_cases);
d6be0d7f
JL
751 edge_to_cases = NULL;
752}
753
d6be0d7f
JL
754/* If we are inside a {start,end}_recording_cases block, then return
755 a chain of CASE_LABEL_EXPRs from T which reference E.
756
757 Otherwise return NULL. */
92b6dff3
JL
758
759static tree
726a989a 760get_cases_for_edge (edge e, gimple t)
92b6dff3 761{
92b6dff3 762 void **slot;
d6be0d7f 763 size_t i, n;
92b6dff3 764
d6be0d7f
JL
765 /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
766 chains available. Return NULL so the caller can detect this case. */
767 if (!recording_case_labels_p ())
768 return NULL;
6531d1be 769
15814ba0 770 slot = pointer_map_contains (edge_to_cases, e);
92b6dff3 771 if (slot)
15814ba0 772 return (tree) *slot;
92b6dff3 773
d6be0d7f
JL
774 /* If we did not find E in the hash table, then this must be the first
775 time we have been queried for information about E & T. Add all the
776 elements from T to the hash table then perform the query again. */
92b6dff3 777
726a989a 778 n = gimple_switch_num_labels (t);
92b6dff3
JL
779 for (i = 0; i < n; i++)
780 {
726a989a 781 tree elt = gimple_switch_label (t, i);
15814ba0 782 tree lab = CASE_LABEL (elt);
d6be0d7f 783 basic_block label_bb = label_to_block (lab);
15814ba0
PB
784 edge this_edge = find_edge (e->src, label_bb);
785
786 /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
787 a new chain. */
788 slot = pointer_map_insert (edge_to_cases, this_edge);
789 TREE_CHAIN (elt) = (tree) *slot;
790 *slot = elt;
92b6dff3 791 }
15814ba0
PB
792
793 return (tree) *pointer_map_contains (edge_to_cases, e);
92b6dff3 794}
6de9cd9a 795
726a989a 796/* Create the edges for a GIMPLE_SWITCH starting at block BB. */
6de9cd9a
DN
797
798static void
726a989a 799make_gimple_switch_edges (basic_block bb)
6de9cd9a 800{
726a989a 801 gimple entry = last_stmt (bb);
6de9cd9a 802 size_t i, n;
6de9cd9a 803
726a989a 804 n = gimple_switch_num_labels (entry);
6de9cd9a
DN
805
806 for (i = 0; i < n; ++i)
807 {
726a989a 808 tree lab = CASE_LABEL (gimple_switch_label (entry, i));
6de9cd9a 809 basic_block label_bb = label_to_block (lab);
d6be0d7f 810 make_edge (bb, label_bb, 0);
6de9cd9a
DN
811 }
812}
813
814
815/* Return the basic block holding label DEST. */
816
817basic_block
997de8ed 818label_to_block_fn (struct function *ifun, tree dest)
6de9cd9a 819{
242229bb
JH
820 int uid = LABEL_DECL_UID (dest);
821
f0b698c1
KH
822 /* We would die hard when faced by an undefined label. Emit a label to
823 the very first basic block. This will hopefully make even the dataflow
242229bb
JH
824 and undefined variable warnings quite right. */
825 if ((errorcount || sorrycount) && uid < 0)
826 {
726a989a
RB
827 gimple_stmt_iterator gsi = gsi_start_bb (BASIC_BLOCK (NUM_FIXED_BLOCKS));
828 gimple stmt;
242229bb 829
726a989a
RB
830 stmt = gimple_build_label (dest);
831 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
242229bb
JH
832 uid = LABEL_DECL_UID (dest);
833 }
e597f337
KH
834 if (VEC_length (basic_block, ifun->cfg->x_label_to_block_map)
835 <= (unsigned int) uid)
98f464e0 836 return NULL;
e597f337 837 return VEC_index (basic_block, ifun->cfg->x_label_to_block_map, uid);
6de9cd9a
DN
838}
839
4f6c2131
EB
840/* Create edges for an abnormal goto statement at block BB. If FOR_CALL
841 is true, the source statement is a CALL_EXPR instead of a GOTO_EXPR. */
842
843void
844make_abnormal_goto_edges (basic_block bb, bool for_call)
845{
846 basic_block target_bb;
726a989a 847 gimple_stmt_iterator gsi;
4f6c2131
EB
848
849 FOR_EACH_BB (target_bb)
726a989a 850 for (gsi = gsi_start_bb (target_bb); !gsi_end_p (gsi); gsi_next (&gsi))
4f6c2131 851 {
726a989a
RB
852 gimple label_stmt = gsi_stmt (gsi);
853 tree target;
4f6c2131 854
726a989a 855 if (gimple_code (label_stmt) != GIMPLE_LABEL)
4f6c2131
EB
856 break;
857
726a989a 858 target = gimple_label_label (label_stmt);
4f6c2131
EB
859
860 /* Make an edge to every label block that has been marked as a
861 potential target for a computed goto or a non-local goto. */
862 if ((FORCED_LABEL (target) && !for_call)
863 || (DECL_NONLOCAL (target) && for_call))
864 {
865 make_edge (bb, target_bb, EDGE_ABNORMAL);
866 break;
867 }
868 }
869}
870
6de9cd9a
DN
871/* Create edges for a goto statement at block BB. */
872
873static void
874make_goto_expr_edges (basic_block bb)
875{
726a989a
RB
876 gimple_stmt_iterator last = gsi_last_bb (bb);
877 gimple goto_t = gsi_stmt (last);
6de9cd9a 878
4f6c2131
EB
879 /* A simple GOTO creates normal edges. */
880 if (simple_goto_p (goto_t))
6de9cd9a 881 {
726a989a 882 tree dest = gimple_goto_dest (goto_t);
4f6c2131 883 edge e = make_edge (bb, label_to_block (dest), EDGE_FALLTHRU);
726a989a 884 e->goto_locus = gimple_location (goto_t);
cc2a64dd
JJ
885 if (e->goto_locus)
886 e->goto_block = gimple_block (goto_t);
726a989a 887 gsi_remove (&last, true);
4f6c2131 888 return;
6de9cd9a
DN
889 }
890
4f6c2131
EB
891 /* A computed GOTO creates abnormal edges. */
892 make_abnormal_goto_edges (bb, false);
6de9cd9a
DN
893}
894
895
896/*---------------------------------------------------------------------------
897 Flowgraph analysis
898---------------------------------------------------------------------------*/
899
f698d217
SB
900/* Cleanup useless labels in basic blocks. This is something we wish
901 to do early because it allows us to group case labels before creating
902 the edges for the CFG, and it speeds up block statement iterators in
903 all passes later on.
8b11009b
ZD
904 We rerun this pass after CFG is created, to get rid of the labels that
905 are no longer referenced. After then we do not run it any more, since
906 (almost) no new labels should be created. */
f698d217
SB
907
908/* A map from basic block index to the leading label of that block. */
8b11009b
ZD
909static struct label_record
910{
911 /* The label. */
912 tree label;
913
914 /* True if the label is referenced from somewhere. */
915 bool used;
916} *label_for_bb;
f698d217
SB
917
918/* Callback for for_each_eh_region. Helper for cleanup_dead_labels. */
919static void
920update_eh_label (struct eh_region *region)
921{
922 tree old_label = get_eh_region_tree_label (region);
923 if (old_label)
924 {
165b54c3
SB
925 tree new_label;
926 basic_block bb = label_to_block (old_label);
927
928 /* ??? After optimizing, there may be EH regions with labels
929 that have already been removed from the function body, so
930 there is no basic block for them. */
931 if (! bb)
932 return;
933
8b11009b
ZD
934 new_label = label_for_bb[bb->index].label;
935 label_for_bb[bb->index].used = true;
f698d217
SB
936 set_eh_region_tree_label (region, new_label);
937 }
938}
939
726a989a 940
242229bb 941/* Given LABEL return the first label in the same basic block. */
726a989a 942
242229bb
JH
943static tree
944main_block_label (tree label)
945{
946 basic_block bb = label_to_block (label);
8b11009b 947 tree main_label = label_for_bb[bb->index].label;
242229bb
JH
948
949 /* label_to_block possibly inserted undefined label into the chain. */
8b11009b
ZD
950 if (!main_label)
951 {
952 label_for_bb[bb->index].label = label;
953 main_label = label;
954 }
955
956 label_for_bb[bb->index].used = true;
957 return main_label;
242229bb
JH
958}
959
b986ebf3 960/* Cleanup redundant labels. This is a three-step process:
f698d217
SB
961 1) Find the leading label for each block.
962 2) Redirect all references to labels to the leading labels.
963 3) Cleanup all useless labels. */
6de9cd9a 964
165b54c3 965void
6de9cd9a
DN
966cleanup_dead_labels (void)
967{
968 basic_block bb;
8b11009b 969 label_for_bb = XCNEWVEC (struct label_record, last_basic_block);
6de9cd9a
DN
970
971 /* Find a suitable label for each block. We use the first user-defined
f0b698c1 972 label if there is one, or otherwise just the first label we see. */
6de9cd9a
DN
973 FOR_EACH_BB (bb)
974 {
726a989a 975 gimple_stmt_iterator i;
6de9cd9a 976
726a989a 977 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
6de9cd9a 978 {
726a989a
RB
979 tree label;
980 gimple stmt = gsi_stmt (i);
6de9cd9a 981
726a989a 982 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a
DN
983 break;
984
726a989a 985 label = gimple_label_label (stmt);
6de9cd9a
DN
986
987 /* If we have not yet seen a label for the current block,
988 remember this one and see if there are more labels. */
8b11009b 989 if (!label_for_bb[bb->index].label)
6de9cd9a 990 {
8b11009b 991 label_for_bb[bb->index].label = label;
6de9cd9a
DN
992 continue;
993 }
994
995 /* If we did see a label for the current block already, but it
996 is an artificially created label, replace it if the current
997 label is a user defined label. */
8b11009b
ZD
998 if (!DECL_ARTIFICIAL (label)
999 && DECL_ARTIFICIAL (label_for_bb[bb->index].label))
6de9cd9a 1000 {
8b11009b 1001 label_for_bb[bb->index].label = label;
6de9cd9a
DN
1002 break;
1003 }
1004 }
1005 }
1006
f698d217
SB
1007 /* Now redirect all jumps/branches to the selected label.
1008 First do so for each block ending in a control statement. */
6de9cd9a
DN
1009 FOR_EACH_BB (bb)
1010 {
726a989a 1011 gimple stmt = last_stmt (bb);
6de9cd9a
DN
1012 if (!stmt)
1013 continue;
1014
726a989a 1015 switch (gimple_code (stmt))
6de9cd9a 1016 {
726a989a 1017 case GIMPLE_COND:
6de9cd9a 1018 {
726a989a
RB
1019 tree true_label = gimple_cond_true_label (stmt);
1020 tree false_label = gimple_cond_false_label (stmt);
6de9cd9a 1021
726a989a
RB
1022 if (true_label)
1023 gimple_cond_set_true_label (stmt, main_block_label (true_label));
1024 if (false_label)
1025 gimple_cond_set_false_label (stmt, main_block_label (false_label));
6de9cd9a
DN
1026 break;
1027 }
6531d1be 1028
726a989a 1029 case GIMPLE_SWITCH:
6de9cd9a 1030 {
726a989a 1031 size_t i, n = gimple_switch_num_labels (stmt);
6531d1be 1032
6de9cd9a
DN
1033 /* Replace all destination labels. */
1034 for (i = 0; i < n; ++i)
92b6dff3 1035 {
726a989a
RB
1036 tree case_label = gimple_switch_label (stmt, i);
1037 tree label = main_block_label (CASE_LABEL (case_label));
1038 CASE_LABEL (case_label) = label;
92b6dff3 1039 }
6de9cd9a
DN
1040 break;
1041 }
1042
726a989a 1043 /* We have to handle gotos until they're removed, and we don't
f667741c 1044 remove them until after we've created the CFG edges. */
726a989a
RB
1045 case GIMPLE_GOTO:
1046 if (!computed_goto_p (stmt))
242229bb 1047 {
726a989a
RB
1048 tree new_dest = main_block_label (gimple_goto_dest (stmt));
1049 gimple_goto_set_dest (stmt, new_dest);
242229bb
JH
1050 break;
1051 }
f667741c 1052
6de9cd9a
DN
1053 default:
1054 break;
1055 }
1056 }
1057
f698d217
SB
1058 for_each_eh_region (update_eh_label);
1059
6de9cd9a 1060 /* Finally, purge dead labels. All user-defined labels and labels that
cea0f4f1
AP
1061 can be the target of non-local gotos and labels which have their
1062 address taken are preserved. */
6de9cd9a
DN
1063 FOR_EACH_BB (bb)
1064 {
726a989a 1065 gimple_stmt_iterator i;
8b11009b 1066 tree label_for_this_bb = label_for_bb[bb->index].label;
6de9cd9a 1067
8b11009b 1068 if (!label_for_this_bb)
6de9cd9a
DN
1069 continue;
1070
8b11009b
ZD
1071 /* If the main label of the block is unused, we may still remove it. */
1072 if (!label_for_bb[bb->index].used)
1073 label_for_this_bb = NULL;
1074
726a989a 1075 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
6de9cd9a 1076 {
726a989a
RB
1077 tree label;
1078 gimple stmt = gsi_stmt (i);
6de9cd9a 1079
726a989a 1080 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a
DN
1081 break;
1082
726a989a 1083 label = gimple_label_label (stmt);
6de9cd9a
DN
1084
1085 if (label == label_for_this_bb
726a989a 1086 || !DECL_ARTIFICIAL (label)
cea0f4f1
AP
1087 || DECL_NONLOCAL (label)
1088 || FORCED_LABEL (label))
726a989a 1089 gsi_next (&i);
6de9cd9a 1090 else
726a989a 1091 gsi_remove (&i, true);
6de9cd9a
DN
1092 }
1093 }
1094
1095 free (label_for_bb);
1096}
1097
f667741c
SB
1098/* Look for blocks ending in a multiway branch (a SWITCH_EXPR in GIMPLE),
1099 and scan the sorted vector of cases. Combine the ones jumping to the
1100 same label.
1101 Eg. three separate entries 1: 2: 3: become one entry 1..3: */
1102
165b54c3 1103void
f667741c
SB
1104group_case_labels (void)
1105{
1106 basic_block bb;
1107
1108 FOR_EACH_BB (bb)
1109 {
726a989a
RB
1110 gimple stmt = last_stmt (bb);
1111 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
f667741c 1112 {
726a989a 1113 int old_size = gimple_switch_num_labels (stmt);
f667741c 1114 int i, j, new_size = old_size;
b7814a18
RG
1115 tree default_case = NULL_TREE;
1116 tree default_label = NULL_TREE;
726a989a 1117 bool has_default;
29c4d22b 1118
726a989a 1119 /* The default label is always the first case in a switch
b7814a18 1120 statement after gimplification if it was not optimized
726a989a
RB
1121 away */
1122 if (!CASE_LOW (gimple_switch_default_label (stmt))
1123 && !CASE_HIGH (gimple_switch_default_label (stmt)))
b7814a18 1124 {
726a989a 1125 default_case = gimple_switch_default_label (stmt);
b7814a18 1126 default_label = CASE_LABEL (default_case);
726a989a 1127 has_default = true;
b7814a18 1128 }
726a989a
RB
1129 else
1130 has_default = false;
f667741c 1131
b7814a18 1132 /* Look for possible opportunities to merge cases. */
726a989a
RB
1133 if (has_default)
1134 i = 1;
1135 else
1136 i = 0;
b7814a18 1137 while (i < old_size)
f667741c 1138 {
ed9cef22 1139 tree base_case, base_label, base_high;
726a989a 1140 base_case = gimple_switch_label (stmt, i);
f667741c 1141
1e128c5f 1142 gcc_assert (base_case);
f667741c 1143 base_label = CASE_LABEL (base_case);
31e9eea2
SB
1144
1145 /* Discard cases that have the same destination as the
1146 default case. */
1147 if (base_label == default_label)
1148 {
726a989a 1149 gimple_switch_set_label (stmt, i, NULL_TREE);
31e9eea2 1150 i++;
29c4d22b 1151 new_size--;
31e9eea2
SB
1152 continue;
1153 }
1154
726a989a
RB
1155 base_high = CASE_HIGH (base_case)
1156 ? CASE_HIGH (base_case)
1157 : CASE_LOW (base_case);
d717e500 1158 i++;
726a989a 1159
f667741c
SB
1160 /* Try to merge case labels. Break out when we reach the end
1161 of the label vector or when we cannot merge the next case
1162 label with the current one. */
b7814a18 1163 while (i < old_size)
f667741c 1164 {
726a989a 1165 tree merge_case = gimple_switch_label (stmt, i);
f667741c
SB
1166 tree merge_label = CASE_LABEL (merge_case);
1167 tree t = int_const_binop (PLUS_EXPR, base_high,
1168 integer_one_node, 1);
1169
1170 /* Merge the cases if they jump to the same place,
1171 and their ranges are consecutive. */
1172 if (merge_label == base_label
1173 && tree_int_cst_equal (CASE_LOW (merge_case), t))
1174 {
1175 base_high = CASE_HIGH (merge_case) ?
1176 CASE_HIGH (merge_case) : CASE_LOW (merge_case);
1177 CASE_HIGH (base_case) = base_high;
726a989a 1178 gimple_switch_set_label (stmt, i, NULL_TREE);
f667741c 1179 new_size--;
d717e500 1180 i++;
f667741c
SB
1181 }
1182 else
1183 break;
1184 }
1185 }
1186
1187 /* Compress the case labels in the label vector, and adjust the
1188 length of the vector. */
1189 for (i = 0, j = 0; i < new_size; i++)
1190 {
726a989a 1191 while (! gimple_switch_label (stmt, j))
f667741c 1192 j++;
726a989a
RB
1193 gimple_switch_set_label (stmt, i,
1194 gimple_switch_label (stmt, j++));
f667741c 1195 }
726a989a
RB
1196
1197 gcc_assert (new_size <= old_size);
1198 gimple_switch_set_num_labels (stmt, new_size);
f667741c
SB
1199 }
1200 }
1201}
6de9cd9a
DN
1202
1203/* Checks whether we can merge block B into block A. */
1204
1205static bool
726a989a 1206gimple_can_merge_blocks_p (basic_block a, basic_block b)
6de9cd9a 1207{
726a989a
RB
1208 gimple stmt;
1209 gimple_stmt_iterator gsi;
1210 gimple_seq phis;
6de9cd9a 1211
c5cbcccf 1212 if (!single_succ_p (a))
6de9cd9a
DN
1213 return false;
1214
c5cbcccf 1215 if (single_succ_edge (a)->flags & EDGE_ABNORMAL)
6de9cd9a
DN
1216 return false;
1217
c5cbcccf 1218 if (single_succ (a) != b)
6de9cd9a
DN
1219 return false;
1220
c5cbcccf 1221 if (!single_pred_p (b))
6de9cd9a
DN
1222 return false;
1223
26e75214
KH
1224 if (b == EXIT_BLOCK_PTR)
1225 return false;
6531d1be 1226
6de9cd9a
DN
1227 /* If A ends by a statement causing exceptions or something similar, we
1228 cannot merge the blocks. */
726a989a 1229 stmt = last_stmt (a);
6de9cd9a
DN
1230 if (stmt && stmt_ends_bb_p (stmt))
1231 return false;
1232
1233 /* Do not allow a block with only a non-local label to be merged. */
726a989a
RB
1234 if (stmt
1235 && gimple_code (stmt) == GIMPLE_LABEL
1236 && DECL_NONLOCAL (gimple_label_label (stmt)))
6de9cd9a
DN
1237 return false;
1238
38965eb2 1239 /* It must be possible to eliminate all phi nodes in B. If ssa form
8f8bb1d2
ZD
1240 is not up-to-date, we cannot eliminate any phis; however, if only
1241 some symbols as whole are marked for renaming, this is not a problem,
1242 as phi nodes for those symbols are irrelevant in updating anyway. */
726a989a
RB
1243 phis = phi_nodes (b);
1244 if (!gimple_seq_empty_p (phis))
38965eb2 1245 {
726a989a
RB
1246 gimple_stmt_iterator i;
1247
8f8bb1d2 1248 if (name_mappings_registered_p ())
38965eb2
ZD
1249 return false;
1250
726a989a
RB
1251 for (i = gsi_start (phis); !gsi_end_p (i); gsi_next (&i))
1252 {
1253 gimple phi = gsi_stmt (i);
1254
1255 if (!is_gimple_reg (gimple_phi_result (phi))
1256 && !may_propagate_copy (gimple_phi_result (phi),
1257 gimple_phi_arg_def (phi, 0)))
1258 return false;
1259 }
38965eb2 1260 }
6de9cd9a
DN
1261
1262 /* Do not remove user labels. */
726a989a 1263 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 1264 {
726a989a
RB
1265 stmt = gsi_stmt (gsi);
1266 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a 1267 break;
726a989a 1268 if (!DECL_ARTIFICIAL (gimple_label_label (stmt)))
6de9cd9a
DN
1269 return false;
1270 }
1271
2b271002
ZD
1272 /* Protect the loop latches. */
1273 if (current_loops
1274 && b->loop_father->latch == b)
1275 return false;
1276
6de9cd9a
DN
1277 return true;
1278}
1279
38965eb2
ZD
1280/* Replaces all uses of NAME by VAL. */
1281
684aaf29 1282void
38965eb2
ZD
1283replace_uses_by (tree name, tree val)
1284{
1285 imm_use_iterator imm_iter;
1286 use_operand_p use;
726a989a 1287 gimple stmt;
38965eb2 1288 edge e;
38965eb2 1289
6c00f606 1290 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
38965eb2 1291 {
726a989a 1292 if (gimple_code (stmt) != GIMPLE_PHI)
cfaab3a9
DN
1293 push_stmt_changes (&stmt);
1294
6c00f606
AM
1295 FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
1296 {
1297 replace_exp (use, val);
38965eb2 1298
726a989a 1299 if (gimple_code (stmt) == GIMPLE_PHI)
38965eb2 1300 {
726a989a 1301 e = gimple_phi_arg_edge (stmt, PHI_ARG_INDEX_FROM_USE (use));
6c00f606
AM
1302 if (e->flags & EDGE_ABNORMAL)
1303 {
1304 /* This can only occur for virtual operands, since
1305 for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
1306 would prevent replacement. */
1307 gcc_assert (!is_gimple_reg (name));
1308 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
1309 }
38965eb2
ZD
1310 }
1311 }
cfaab3a9 1312
726a989a 1313 if (gimple_code (stmt) != GIMPLE_PHI)
6c00f606 1314 {
726a989a 1315 size_t i;
9af0df6b 1316
6c00f606 1317 fold_stmt_inplace (stmt);
672987e8 1318 if (cfgcleanup_altered_bbs)
726a989a 1319 bitmap_set_bit (cfgcleanup_altered_bbs, gimple_bb (stmt)->index);
cfaab3a9
DN
1320
1321 /* FIXME. This should go in pop_stmt_changes. */
726a989a
RB
1322 for (i = 0; i < gimple_num_ops (stmt); i++)
1323 {
1324 tree op = gimple_op (stmt, i);
1325 /* Operands may be empty here. For example, the labels
1326 of a GIMPLE_COND are nulled out following the creation
1327 of the corresponding CFG edges. */
1328 if (op && TREE_CODE (op) == ADDR_EXPR)
1329 recompute_tree_invariant_for_addr_expr (op);
1330 }
9af0df6b 1331
6c00f606 1332 maybe_clean_or_replace_eh_stmt (stmt, stmt);
cfaab3a9
DN
1333
1334 pop_stmt_changes (&stmt);
6c00f606 1335 }
38965eb2 1336 }
6531d1be 1337
40b448ef 1338 gcc_assert (has_zero_uses (name));
d5ab5675
ZD
1339
1340 /* Also update the trees stored in loop structures. */
1341 if (current_loops)
1342 {
1343 struct loop *loop;
42fd6772 1344 loop_iterator li;
d5ab5675 1345
42fd6772 1346 FOR_EACH_LOOP (li, loop, 0)
d5ab5675 1347 {
42fd6772 1348 substitute_in_loop_info (loop, name, val);
d5ab5675
ZD
1349 }
1350 }
38965eb2 1351}
6de9cd9a
DN
1352
1353/* Merge block B into block A. */
1354
1355static void
726a989a 1356gimple_merge_blocks (basic_block a, basic_block b)
6de9cd9a 1357{
726a989a
RB
1358 gimple_stmt_iterator last, gsi, psi;
1359 gimple_seq phis = phi_nodes (b);
6de9cd9a
DN
1360
1361 if (dump_file)
1362 fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1363
c4f548b8
DN
1364 /* Remove all single-valued PHI nodes from block B of the form
1365 V_i = PHI <V_j> by propagating V_j to all the uses of V_i. */
726a989a
RB
1366 gsi = gsi_last_bb (a);
1367 for (psi = gsi_start (phis); !gsi_end_p (psi); )
38965eb2 1368 {
726a989a
RB
1369 gimple phi = gsi_stmt (psi);
1370 tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0);
1371 gimple copy;
1372 bool may_replace_uses = !is_gimple_reg (def)
1373 || may_propagate_copy (def, use);
d7f0e25c 1374
7c8eb293
ZD
1375 /* In case we maintain loop closed ssa form, do not propagate arguments
1376 of loop exit phi nodes. */
d7f0e25c 1377 if (current_loops
f87000d0 1378 && loops_state_satisfies_p (LOOP_CLOSED_SSA)
d7f0e25c
ZD
1379 && is_gimple_reg (def)
1380 && TREE_CODE (use) == SSA_NAME
1381 && a->loop_father != b->loop_father)
1382 may_replace_uses = false;
1383
1384 if (!may_replace_uses)
38965eb2
ZD
1385 {
1386 gcc_assert (is_gimple_reg (def));
1387
128a79fb 1388 /* Note that just emitting the copies is fine -- there is no problem
38965eb2
ZD
1389 with ordering of phi nodes. This is because A is the single
1390 predecessor of B, therefore results of the phi nodes cannot
1391 appear as arguments of the phi nodes. */
726a989a
RB
1392 copy = gimple_build_assign (def, use);
1393 gsi_insert_after (&gsi, copy, GSI_NEW_STMT);
1394 remove_phi_node (&psi, false);
38965eb2
ZD
1395 }
1396 else
611021e1 1397 {
d0f76c4b
RG
1398 /* If we deal with a PHI for virtual operands, we can simply
1399 propagate these without fussing with folding or updating
1400 the stmt. */
1401 if (!is_gimple_reg (def))
1402 {
1403 imm_use_iterator iter;
1404 use_operand_p use_p;
726a989a 1405 gimple stmt;
d0f76c4b
RG
1406
1407 FOR_EACH_IMM_USE_STMT (stmt, iter, def)
1408 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
1409 SET_USE (use_p, use);
1410 }
1411 else
1412 replace_uses_by (def, use);
726a989a
RB
1413
1414 remove_phi_node (&psi, true);
611021e1 1415 }
38965eb2
ZD
1416 }
1417
6de9cd9a
DN
1418 /* Ensure that B follows A. */
1419 move_block_after (b, a);
1420
c5cbcccf 1421 gcc_assert (single_succ_edge (a)->flags & EDGE_FALLTHRU);
1e128c5f 1422 gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
6de9cd9a 1423
726a989a
RB
1424 /* Remove labels from B and set gimple_bb to A for other statements. */
1425 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi);)
6de9cd9a 1426 {
726a989a 1427 if (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
be477406 1428 {
726a989a
RB
1429 gimple label = gsi_stmt (gsi);
1430
1431 gsi_remove (&gsi, false);
be477406 1432
be477406
JL
1433 /* Now that we can thread computed gotos, we might have
1434 a situation where we have a forced label in block B
1435 However, the label at the start of block B might still be
1436 used in other ways (think about the runtime checking for
1437 Fortran assigned gotos). So we can not just delete the
1438 label. Instead we move the label to the start of block A. */
726a989a 1439 if (FORCED_LABEL (gimple_label_label (label)))
be477406 1440 {
726a989a
RB
1441 gimple_stmt_iterator dest_gsi = gsi_start_bb (a);
1442 gsi_insert_before (&dest_gsi, label, GSI_NEW_STMT);
be477406
JL
1443 }
1444 }
6de9cd9a
DN
1445 else
1446 {
726a989a
RB
1447 gimple_set_bb (gsi_stmt (gsi), a);
1448 gsi_next (&gsi);
6de9cd9a
DN
1449 }
1450 }
1451
726a989a
RB
1452 /* Merge the sequences. */
1453 last = gsi_last_bb (a);
1454 gsi_insert_seq_after (&last, bb_seq (b), GSI_NEW_STMT);
1455 set_bb_seq (b, NULL);
672987e8
ZD
1456
1457 if (cfgcleanup_altered_bbs)
1458 bitmap_set_bit (cfgcleanup_altered_bbs, a->index);
6de9cd9a
DN
1459}
1460
1461
bc23502b
PB
1462/* Return the one of two successors of BB that is not reachable by a
1463 reached by a complex edge, if there is one. Else, return BB. We use
1464 this in optimizations that use post-dominators for their heuristics,
1465 to catch the cases in C++ where function calls are involved. */
6531d1be 1466
bc23502b 1467basic_block
6531d1be 1468single_noncomplex_succ (basic_block bb)
bc23502b
PB
1469{
1470 edge e0, e1;
1471 if (EDGE_COUNT (bb->succs) != 2)
1472 return bb;
6531d1be 1473
bc23502b
PB
1474 e0 = EDGE_SUCC (bb, 0);
1475 e1 = EDGE_SUCC (bb, 1);
1476 if (e0->flags & EDGE_COMPLEX)
1477 return e1->dest;
1478 if (e1->flags & EDGE_COMPLEX)
1479 return e0->dest;
6531d1be 1480
bc23502b 1481 return bb;
6531d1be 1482}
bc23502b
PB
1483
1484
6de9cd9a
DN
1485/* Walk the function tree removing unnecessary statements.
1486
1487 * Empty statement nodes are removed
1488
1489 * Unnecessary TRY_FINALLY and TRY_CATCH blocks are removed
1490
1491 * Unnecessary COND_EXPRs are removed
1492
1493 * Some unnecessary BIND_EXPRs are removed
1494
726a989a
RB
1495 * GOTO_EXPRs immediately preceding destination are removed.
1496
6de9cd9a
DN
1497 Clearly more work could be done. The trick is doing the analysis
1498 and removal fast enough to be a net improvement in compile times.
1499
1500 Note that when we remove a control structure such as a COND_EXPR
1501 BIND_EXPR, or TRY block, we will need to repeat this optimization pass
1502 to ensure we eliminate all the useless code. */
1503
1504struct rus_data
1505{
6de9cd9a
DN
1506 bool repeat;
1507 bool may_throw;
1508 bool may_branch;
1509 bool has_label;
726a989a
RB
1510 bool last_was_goto;
1511 gimple_stmt_iterator last_goto_gsi;
6de9cd9a
DN
1512};
1513
726a989a
RB
1514
1515static void remove_useless_stmts_1 (gimple_stmt_iterator *gsi, struct rus_data *);
1516
1517/* Given a statement sequence, find the first executable statement with
1518 location information, and warn that it is unreachable. When searching,
1519 descend into containers in execution order. */
6de9cd9a
DN
1520
1521static bool
726a989a 1522remove_useless_stmts_warn_notreached (gimple_seq stmts)
6de9cd9a 1523{
726a989a 1524 gimple_stmt_iterator gsi;
6de9cd9a 1525
726a989a 1526 for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 1527 {
726a989a 1528 gimple stmt = gsi_stmt (gsi);
6de9cd9a 1529
726a989a
RB
1530 if (gimple_has_location (stmt))
1531 {
1532 location_t loc = gimple_location (stmt);
1533 if (LOCATION_LINE (loc) > 0)
1534 {
1535 warning (OPT_Wunreachable_code, "%Hwill never be executed", &loc);
1536 return true;
1537 }
1538 }
6de9cd9a 1539
726a989a
RB
1540 switch (gimple_code (stmt))
1541 {
1542 /* Unfortunately, we need the CFG now to detect unreachable
1543 branches in a conditional, so conditionals are not handled here. */
6de9cd9a 1544
726a989a
RB
1545 case GIMPLE_TRY:
1546 if (remove_useless_stmts_warn_notreached (gimple_try_eval (stmt)))
1547 return true;
1548 if (remove_useless_stmts_warn_notreached (gimple_try_cleanup (stmt)))
1549 return true;
1550 break;
6de9cd9a 1551
726a989a
RB
1552 case GIMPLE_CATCH:
1553 return remove_useless_stmts_warn_notreached (gimple_catch_handler (stmt));
1554
1555 case GIMPLE_EH_FILTER:
1556 return remove_useless_stmts_warn_notreached (gimple_eh_filter_failure (stmt));
1557
1558 case GIMPLE_BIND:
1559 return remove_useless_stmts_warn_notreached (gimple_bind_body (stmt));
1560
1561 default:
1562 break;
1563 }
6de9cd9a
DN
1564 }
1565
1566 return false;
1567}
1568
726a989a
RB
1569/* Helper for remove_useless_stmts_1. Handle GIMPLE_COND statements. */
1570
6de9cd9a 1571static void
726a989a 1572remove_useless_stmts_cond (gimple_stmt_iterator *gsi, struct rus_data *data)
6de9cd9a 1573{
726a989a 1574 gimple stmt = gsi_stmt (*gsi);
6de9cd9a 1575
726a989a 1576 /* The folded result must still be a conditional statement. */
2586ba4b
RG
1577 fold_stmt (gsi);
1578 gcc_assert (gsi_stmt (*gsi) == stmt);
6de9cd9a 1579
726a989a 1580 data->may_branch = true;
6de9cd9a 1581
726a989a
RB
1582 /* Replace trivial conditionals with gotos. */
1583 if (gimple_cond_true_p (stmt))
6de9cd9a 1584 {
726a989a
RB
1585 /* Goto THEN label. */
1586 tree then_label = gimple_cond_true_label (stmt);
6de9cd9a 1587
726a989a
RB
1588 gsi_replace (gsi, gimple_build_goto (then_label), false);
1589 data->last_goto_gsi = *gsi;
1590 data->last_was_goto = true;
6de9cd9a
DN
1591 data->repeat = true;
1592 }
726a989a 1593 else if (gimple_cond_false_p (stmt))
6de9cd9a 1594 {
726a989a
RB
1595 /* Goto ELSE label. */
1596 tree else_label = gimple_cond_false_label (stmt);
1597
1598 gsi_replace (gsi, gimple_build_goto (else_label), false);
1599 data->last_goto_gsi = *gsi;
1600 data->last_was_goto = true;
6de9cd9a
DN
1601 data->repeat = true;
1602 }
6de9cd9a
DN
1603 else
1604 {
726a989a
RB
1605 tree then_label = gimple_cond_true_label (stmt);
1606 tree else_label = gimple_cond_false_label (stmt);
6de9cd9a 1607
726a989a
RB
1608 if (then_label == else_label)
1609 {
1610 /* Goto common destination. */
1611 gsi_replace (gsi, gimple_build_goto (then_label), false);
1612 data->last_goto_gsi = *gsi;
1613 data->last_was_goto = true;
6de9cd9a
DN
1614 data->repeat = true;
1615 }
6de9cd9a
DN
1616 }
1617
726a989a
RB
1618 gsi_next (gsi);
1619
1620 data->last_was_goto = false;
6de9cd9a
DN
1621}
1622
726a989a
RB
1623/* Helper for remove_useless_stmts_1.
1624 Handle the try-finally case for GIMPLE_TRY statements. */
6de9cd9a
DN
1625
1626static void
726a989a 1627remove_useless_stmts_tf (gimple_stmt_iterator *gsi, struct rus_data *data)
6de9cd9a
DN
1628{
1629 bool save_may_branch, save_may_throw;
1630 bool this_may_branch, this_may_throw;
1631
726a989a
RB
1632 gimple_seq eval_seq, cleanup_seq;
1633 gimple_stmt_iterator eval_gsi, cleanup_gsi;
1634
1635 gimple stmt = gsi_stmt (*gsi);
1636
6de9cd9a
DN
1637 /* Collect may_branch and may_throw information for the body only. */
1638 save_may_branch = data->may_branch;
1639 save_may_throw = data->may_throw;
1640 data->may_branch = false;
1641 data->may_throw = false;
726a989a 1642 data->last_was_goto = false;
6de9cd9a 1643
726a989a
RB
1644 eval_seq = gimple_try_eval (stmt);
1645 eval_gsi = gsi_start (eval_seq);
1646 remove_useless_stmts_1 (&eval_gsi, data);
6de9cd9a
DN
1647
1648 this_may_branch = data->may_branch;
1649 this_may_throw = data->may_throw;
1650 data->may_branch |= save_may_branch;
1651 data->may_throw |= save_may_throw;
726a989a 1652 data->last_was_goto = false;
6de9cd9a 1653
726a989a
RB
1654 cleanup_seq = gimple_try_cleanup (stmt);
1655 cleanup_gsi = gsi_start (cleanup_seq);
1656 remove_useless_stmts_1 (&cleanup_gsi, data);
6de9cd9a
DN
1657
1658 /* If the body is empty, then we can emit the FINALLY block without
1659 the enclosing TRY_FINALLY_EXPR. */
726a989a 1660 if (gimple_seq_empty_p (eval_seq))
6de9cd9a 1661 {
726a989a
RB
1662 gsi_insert_seq_before (gsi, cleanup_seq, GSI_SAME_STMT);
1663 gsi_remove (gsi, false);
6de9cd9a
DN
1664 data->repeat = true;
1665 }
1666
1667 /* If the handler is empty, then we can emit the TRY block without
1668 the enclosing TRY_FINALLY_EXPR. */
726a989a 1669 else if (gimple_seq_empty_p (cleanup_seq))
6de9cd9a 1670 {
726a989a
RB
1671 gsi_insert_seq_before (gsi, eval_seq, GSI_SAME_STMT);
1672 gsi_remove (gsi, false);
6de9cd9a
DN
1673 data->repeat = true;
1674 }
1675
1676 /* If the body neither throws, nor branches, then we can safely
1677 string the TRY and FINALLY blocks together. */
1678 else if (!this_may_branch && !this_may_throw)
1679 {
726a989a
RB
1680 gsi_insert_seq_before (gsi, eval_seq, GSI_SAME_STMT);
1681 gsi_insert_seq_before (gsi, cleanup_seq, GSI_SAME_STMT);
1682 gsi_remove (gsi, false);
6de9cd9a
DN
1683 data->repeat = true;
1684 }
726a989a
RB
1685 else
1686 gsi_next (gsi);
6de9cd9a
DN
1687}
1688
726a989a
RB
1689/* Helper for remove_useless_stmts_1.
1690 Handle the try-catch case for GIMPLE_TRY statements. */
6de9cd9a
DN
1691
1692static void
726a989a 1693remove_useless_stmts_tc (gimple_stmt_iterator *gsi, struct rus_data *data)
6de9cd9a
DN
1694{
1695 bool save_may_throw, this_may_throw;
726a989a
RB
1696
1697 gimple_seq eval_seq, cleanup_seq, handler_seq, failure_seq;
1698 gimple_stmt_iterator eval_gsi, cleanup_gsi, handler_gsi, failure_gsi;
1699
1700 gimple stmt = gsi_stmt (*gsi);
6de9cd9a
DN
1701
1702 /* Collect may_throw information for the body only. */
1703 save_may_throw = data->may_throw;
1704 data->may_throw = false;
726a989a 1705 data->last_was_goto = false;
6de9cd9a 1706
726a989a
RB
1707 eval_seq = gimple_try_eval (stmt);
1708 eval_gsi = gsi_start (eval_seq);
1709 remove_useless_stmts_1 (&eval_gsi, data);
6de9cd9a
DN
1710
1711 this_may_throw = data->may_throw;
1712 data->may_throw = save_may_throw;
1713
726a989a
RB
1714 cleanup_seq = gimple_try_cleanup (stmt);
1715
6de9cd9a
DN
1716 /* If the body cannot throw, then we can drop the entire TRY_CATCH_EXPR. */
1717 if (!this_may_throw)
1718 {
1719 if (warn_notreached)
726a989a
RB
1720 {
1721 remove_useless_stmts_warn_notreached (cleanup_seq);
1722 }
1723 gsi_insert_seq_before (gsi, eval_seq, GSI_SAME_STMT);
1724 gsi_remove (gsi, false);
6de9cd9a
DN
1725 data->repeat = true;
1726 return;
1727 }
1728
1729 /* Process the catch clause specially. We may be able to tell that
1730 no exceptions propagate past this point. */
1731
1732 this_may_throw = true;
726a989a
RB
1733 cleanup_gsi = gsi_start (cleanup_seq);
1734 stmt = gsi_stmt (cleanup_gsi);
1735 data->last_was_goto = false;
6de9cd9a 1736
726a989a 1737 switch (gimple_code (stmt))
6de9cd9a 1738 {
726a989a
RB
1739 case GIMPLE_CATCH:
1740 /* If the first element is a catch, they all must be. */
1741 while (!gsi_end_p (cleanup_gsi))
1742 {
1743 stmt = gsi_stmt (cleanup_gsi);
6de9cd9a
DN
1744 /* If we catch all exceptions, then the body does not
1745 propagate exceptions past this point. */
726a989a 1746 if (gimple_catch_types (stmt) == NULL)
6de9cd9a 1747 this_may_throw = false;
726a989a
RB
1748 data->last_was_goto = false;
1749 handler_seq = gimple_catch_handler (stmt);
1750 handler_gsi = gsi_start (handler_seq);
1751 remove_useless_stmts_1 (&handler_gsi, data);
1752 gsi_next (&cleanup_gsi);
6de9cd9a 1753 }
726a989a 1754 gsi_next (gsi);
6de9cd9a
DN
1755 break;
1756
726a989a
RB
1757 case GIMPLE_EH_FILTER:
1758 /* If the first element is an eh_filter, it should stand alone. */
1759 if (gimple_eh_filter_must_not_throw (stmt))
6de9cd9a 1760 this_may_throw = false;
726a989a 1761 else if (gimple_eh_filter_types (stmt) == NULL)
6de9cd9a 1762 this_may_throw = false;
726a989a
RB
1763 failure_seq = gimple_eh_filter_failure (stmt);
1764 failure_gsi = gsi_start (failure_seq);
1765 remove_useless_stmts_1 (&failure_gsi, data);
1766 gsi_next (gsi);
6de9cd9a
DN
1767 break;
1768
1769 default:
726a989a
RB
1770 /* Otherwise this is a list of cleanup statements. */
1771 remove_useless_stmts_1 (&cleanup_gsi, data);
6de9cd9a
DN
1772
1773 /* If the cleanup is empty, then we can emit the TRY block without
1774 the enclosing TRY_CATCH_EXPR. */
726a989a 1775 if (gimple_seq_empty_p (cleanup_seq))
6de9cd9a 1776 {
726a989a
RB
1777 gsi_insert_seq_before (gsi, eval_seq, GSI_SAME_STMT);
1778 gsi_remove(gsi, false);
6de9cd9a
DN
1779 data->repeat = true;
1780 }
726a989a
RB
1781 else
1782 gsi_next (gsi);
6de9cd9a
DN
1783 break;
1784 }
726a989a 1785
6de9cd9a
DN
1786 data->may_throw |= this_may_throw;
1787}
1788
726a989a 1789/* Helper for remove_useless_stmts_1. Handle GIMPLE_BIND statements. */
6de9cd9a
DN
1790
1791static void
726a989a 1792remove_useless_stmts_bind (gimple_stmt_iterator *gsi, struct rus_data *data ATTRIBUTE_UNUSED)
6de9cd9a
DN
1793{
1794 tree block;
726a989a
RB
1795 gimple_seq body_seq, fn_body_seq;
1796 gimple_stmt_iterator body_gsi;
1797
1798 gimple stmt = gsi_stmt (*gsi);
6de9cd9a
DN
1799
1800 /* First remove anything underneath the BIND_EXPR. */
726a989a
RB
1801
1802 body_seq = gimple_bind_body (stmt);
1803 body_gsi = gsi_start (body_seq);
1804 remove_useless_stmts_1 (&body_gsi, data);
6de9cd9a 1805
726a989a
RB
1806 /* If the GIMPLE_BIND has no variables, then we can pull everything
1807 up one level and remove the GIMPLE_BIND, unless this is the toplevel
1808 GIMPLE_BIND for the current function or an inlined function.
6de9cd9a
DN
1809
1810 When this situation occurs we will want to apply this
1811 optimization again. */
726a989a
RB
1812 block = gimple_bind_block (stmt);
1813 fn_body_seq = gimple_body (current_function_decl);
1814 if (gimple_bind_vars (stmt) == NULL_TREE
1815 && (gimple_seq_empty_p (fn_body_seq)
1816 || stmt != gimple_seq_first_stmt (fn_body_seq))
6de9cd9a
DN
1817 && (! block
1818 || ! BLOCK_ABSTRACT_ORIGIN (block)
1819 || (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (block))
1820 != FUNCTION_DECL)))
1821 {
ee0ee7e2
JJ
1822 tree var = NULL_TREE;
1823 /* Even if there are no gimple_bind_vars, there might be other
1824 decls in BLOCK_VARS rendering the GIMPLE_BIND not useless. */
9f0e7885 1825 if (block && !BLOCK_NUM_NONLOCALIZED_VARS (block))
ee0ee7e2
JJ
1826 for (var = BLOCK_VARS (block); var; var = TREE_CHAIN (var))
1827 if (TREE_CODE (var) == IMPORTED_DECL)
1828 break;
9f0e7885 1829 if (var || (block && BLOCK_NUM_NONLOCALIZED_VARS (block)))
ee0ee7e2
JJ
1830 gsi_next (gsi);
1831 else
1832 {
1833 gsi_insert_seq_before (gsi, body_seq, GSI_SAME_STMT);
1834 gsi_remove (gsi, false);
1835 data->repeat = true;
1836 }
6de9cd9a 1837 }
726a989a
RB
1838 else
1839 gsi_next (gsi);
6de9cd9a
DN
1840}
1841
726a989a 1842/* Helper for remove_useless_stmts_1. Handle GIMPLE_GOTO statements. */
6de9cd9a
DN
1843
1844static void
726a989a 1845remove_useless_stmts_goto (gimple_stmt_iterator *gsi, struct rus_data *data)
6de9cd9a 1846{
726a989a
RB
1847 gimple stmt = gsi_stmt (*gsi);
1848
1849 tree dest = gimple_goto_dest (stmt);
6de9cd9a
DN
1850
1851 data->may_branch = true;
726a989a 1852 data->last_was_goto = false;
6de9cd9a 1853
726a989a 1854 /* Record iterator for last goto expr, so that we can delete it if unnecessary. */
6de9cd9a 1855 if (TREE_CODE (dest) == LABEL_DECL)
726a989a
RB
1856 {
1857 data->last_goto_gsi = *gsi;
1858 data->last_was_goto = true;
1859 }
1860
1861 gsi_next(gsi);
6de9cd9a
DN
1862}
1863
726a989a 1864/* Helper for remove_useless_stmts_1. Handle GIMPLE_LABEL statements. */
6de9cd9a
DN
1865
1866static void
726a989a 1867remove_useless_stmts_label (gimple_stmt_iterator *gsi, struct rus_data *data)
6de9cd9a 1868{
726a989a
RB
1869 gimple stmt = gsi_stmt (*gsi);
1870
1871 tree label = gimple_label_label (stmt);
6de9cd9a
DN
1872
1873 data->has_label = true;
1874
1875 /* We do want to jump across non-local label receiver code. */
1876 if (DECL_NONLOCAL (label))
726a989a 1877 data->last_was_goto = false;
6de9cd9a 1878
726a989a
RB
1879 else if (data->last_was_goto
1880 && gimple_goto_dest (gsi_stmt (data->last_goto_gsi)) == label)
6de9cd9a 1881 {
726a989a
RB
1882 /* Replace the preceding GIMPLE_GOTO statement with
1883 a GIMPLE_NOP, which will be subsequently removed.
1884 In this way, we avoid invalidating other iterators
1885 active on the statement sequence. */
1886 gsi_replace(&data->last_goto_gsi, gimple_build_nop(), false);
1887 data->last_was_goto = false;
6de9cd9a
DN
1888 data->repeat = true;
1889 }
1890
1891 /* ??? Add something here to delete unused labels. */
6de9cd9a 1892
726a989a 1893 gsi_next (gsi);
6de9cd9a
DN
1894}
1895
1896
1897/* T is CALL_EXPR. Set current_function_calls_* flags. */
1898
1899void
726a989a 1900notice_special_calls (gimple call)
6de9cd9a 1901{
726a989a 1902 int flags = gimple_call_flags (call);
6de9cd9a
DN
1903
1904 if (flags & ECF_MAY_BE_ALLOCA)
e3b5732b 1905 cfun->calls_alloca = true;
6de9cd9a 1906 if (flags & ECF_RETURNS_TWICE)
e3b5732b 1907 cfun->calls_setjmp = true;
6de9cd9a
DN
1908}
1909
1910
1911/* Clear flags set by notice_special_calls. Used by dead code removal
1912 to update the flags. */
1913
1914void
1915clear_special_calls (void)
1916{
e3b5732b
JH
1917 cfun->calls_alloca = false;
1918 cfun->calls_setjmp = false;
6de9cd9a
DN
1919}
1920
726a989a
RB
1921/* Remove useless statements from a statement sequence, and perform
1922 some preliminary simplifications. */
6de9cd9a
DN
1923
1924static void
726a989a 1925remove_useless_stmts_1 (gimple_stmt_iterator *gsi, struct rus_data *data)
6de9cd9a 1926{
726a989a 1927 while (!gsi_end_p (*gsi))
6de9cd9a 1928 {
726a989a 1929 gimple stmt = gsi_stmt (*gsi);
6de9cd9a 1930
726a989a
RB
1931 switch (gimple_code (stmt))
1932 {
1933 case GIMPLE_COND:
1934 remove_useless_stmts_cond (gsi, data);
1935 break;
1936
1937 case GIMPLE_GOTO:
1938 remove_useless_stmts_goto (gsi, data);
1939 break;
1940
1941 case GIMPLE_LABEL:
1942 remove_useless_stmts_label (gsi, data);
1943 break;
1944
1945 case GIMPLE_ASSIGN:
1946 fold_stmt (gsi);
1947 stmt = gsi_stmt (*gsi);
1948 data->last_was_goto = false;
1949 if (stmt_could_throw_p (stmt))
1950 data->may_throw = true;
1951 gsi_next (gsi);
1952 break;
1953
1954 case GIMPLE_ASM:
1955 fold_stmt (gsi);
1956 data->last_was_goto = false;
1957 gsi_next (gsi);
1958 break;
1959
1960 case GIMPLE_CALL:
1961 fold_stmt (gsi);
1962 stmt = gsi_stmt (*gsi);
1963 data->last_was_goto = false;
1964 if (is_gimple_call (stmt))
1965 notice_special_calls (stmt);
1966
1967 /* We used to call update_gimple_call_flags here,
1968 which copied side-effects and nothrows status
1969 from the function decl to the call. In the new
1970 tuplified GIMPLE, the accessors for this information
1971 always consult the function decl, so this copying
1972 is no longer necessary. */
1973 if (stmt_could_throw_p (stmt))
1974 data->may_throw = true;
1975 gsi_next (gsi);
1976 break;
1977
1978 case GIMPLE_RETURN:
1979 fold_stmt (gsi);
1980 data->last_was_goto = false;
1981 data->may_branch = true;
1982 gsi_next (gsi);
1983 break;
1984
1985 case GIMPLE_BIND:
1986 remove_useless_stmts_bind (gsi, data);
1987 break;
1988
1989 case GIMPLE_TRY:
1990 if (gimple_try_kind (stmt) == GIMPLE_TRY_CATCH)
1991 remove_useless_stmts_tc (gsi, data);
1992 else if (gimple_try_kind (stmt) == GIMPLE_TRY_FINALLY)
1993 remove_useless_stmts_tf (gsi, data);
1994 else
1995 gcc_unreachable ();
1996 break;
1997
1998 case GIMPLE_CATCH:
1999 gcc_unreachable ();
2000 break;
2001
2002 case GIMPLE_NOP:
2003 gsi_remove (gsi, false);
2004 break;
2005
2006 case GIMPLE_OMP_FOR:
2007 {
2008 gimple_seq pre_body_seq = gimple_omp_for_pre_body (stmt);
2009 gimple_stmt_iterator pre_body_gsi = gsi_start (pre_body_seq);
2010
2011 remove_useless_stmts_1 (&pre_body_gsi, data);
2012 data->last_was_goto = false;
2013 }
2014 /* FALLTHROUGH */
2015 case GIMPLE_OMP_CRITICAL:
2016 case GIMPLE_OMP_CONTINUE:
2017 case GIMPLE_OMP_MASTER:
2018 case GIMPLE_OMP_ORDERED:
2019 case GIMPLE_OMP_SECTION:
2020 case GIMPLE_OMP_SECTIONS:
2021 case GIMPLE_OMP_SINGLE:
2022 {
2023 gimple_seq body_seq = gimple_omp_body (stmt);
2024 gimple_stmt_iterator body_gsi = gsi_start (body_seq);
2025
2026 remove_useless_stmts_1 (&body_gsi, data);
2027 data->last_was_goto = false;
2028 gsi_next (gsi);
2029 }
2030 break;
2031
2032 case GIMPLE_OMP_PARALLEL:
2033 case GIMPLE_OMP_TASK:
2034 {
2035 /* Make sure the outermost GIMPLE_BIND isn't removed
2036 as useless. */
2037 gimple_seq body_seq = gimple_omp_body (stmt);
2038 gimple bind = gimple_seq_first_stmt (body_seq);
2039 gimple_seq bind_seq = gimple_bind_body (bind);
2040 gimple_stmt_iterator bind_gsi = gsi_start (bind_seq);
2041
2042 remove_useless_stmts_1 (&bind_gsi, data);
2043 data->last_was_goto = false;
2044 gsi_next (gsi);
2045 }
2046 break;
2047
3d9fbb9a
RG
2048 case GIMPLE_CHANGE_DYNAMIC_TYPE:
2049 /* If we do not optimize remove GIMPLE_CHANGE_DYNAMIC_TYPE as
2050 expansion is confused about them and we only remove them
2051 during alias computation otherwise. */
2052 if (!optimize)
2053 {
2054 data->last_was_goto = false;
2055 gsi_remove (gsi, false);
2056 break;
2057 }
2058 /* Fallthru. */
2059
726a989a
RB
2060 default:
2061 data->last_was_goto = false;
2062 gsi_next (gsi);
2063 break;
2064 }
6de9cd9a
DN
2065 }
2066}
2067
726a989a
RB
2068/* Walk the function tree, removing useless statements and performing
2069 some preliminary simplifications. */
2070
c2924966 2071static unsigned int
6de9cd9a
DN
2072remove_useless_stmts (void)
2073{
2074 struct rus_data data;
2075
2076 clear_special_calls ();
2077
2078 do
2079 {
726a989a
RB
2080 gimple_stmt_iterator gsi;
2081
2082 gsi = gsi_start (gimple_body (current_function_decl));
6de9cd9a 2083 memset (&data, 0, sizeof (data));
726a989a 2084 remove_useless_stmts_1 (&gsi, &data);
6de9cd9a
DN
2085 }
2086 while (data.repeat);
c2924966 2087 return 0;
6de9cd9a
DN
2088}
2089
2090
8ddbbcae 2091struct gimple_opt_pass pass_remove_useless_stmts =
6de9cd9a 2092{
8ddbbcae
JH
2093 {
2094 GIMPLE_PASS,
6de9cd9a
DN
2095 "useless", /* name */
2096 NULL, /* gate */
2097 remove_useless_stmts, /* execute */
2098 NULL, /* sub */
2099 NULL, /* next */
2100 0, /* static_pass_number */
7072a650 2101 TV_NONE, /* tv_id */
9e5a3e6c
RH
2102 PROP_gimple_any, /* properties_required */
2103 0, /* properties_provided */
6de9cd9a
DN
2104 0, /* properties_destroyed */
2105 0, /* todo_flags_start */
8ddbbcae
JH
2106 TODO_dump_func /* todo_flags_finish */
2107 }
6de9cd9a
DN
2108};
2109
6de9cd9a
DN
2110/* Remove PHI nodes associated with basic block BB and all edges out of BB. */
2111
2112static void
2113remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
2114{
6de9cd9a
DN
2115 /* Since this block is no longer reachable, we can just delete all
2116 of its PHI nodes. */
81b822d5 2117 remove_phi_nodes (bb);
6de9cd9a
DN
2118
2119 /* Remove edges to BB's successors. */
628f6a4e 2120 while (EDGE_COUNT (bb->succs) > 0)
d0d2cc21 2121 remove_edge (EDGE_SUCC (bb, 0));
6de9cd9a
DN
2122}
2123
2124
2125/* Remove statements of basic block BB. */
2126
2127static void
2128remove_bb (basic_block bb)
2129{
726a989a 2130 gimple_stmt_iterator i;
dbce1570 2131 source_location loc = UNKNOWN_LOCATION;
6de9cd9a
DN
2132
2133 if (dump_file)
2134 {
2135 fprintf (dump_file, "Removing basic block %d\n", bb->index);
2136 if (dump_flags & TDF_DETAILS)
2137 {
2138 dump_bb (bb, dump_file, 0);
2139 fprintf (dump_file, "\n");
2140 }
2141 }
2142
2b271002
ZD
2143 if (current_loops)
2144 {
2145 struct loop *loop = bb->loop_father;
2146
598ec7bd
ZD
2147 /* If a loop gets removed, clean up the information associated
2148 with it. */
2b271002
ZD
2149 if (loop->latch == bb
2150 || loop->header == bb)
598ec7bd 2151 free_numbers_of_iterations_estimates_loop (loop);
2b271002
ZD
2152 }
2153
6de9cd9a 2154 /* Remove all the instructions in the block. */
726a989a 2155 if (bb_seq (bb) != NULL)
6de9cd9a 2156 {
726a989a 2157 for (i = gsi_start_bb (bb); !gsi_end_p (i);)
77568960 2158 {
726a989a
RB
2159 gimple stmt = gsi_stmt (i);
2160 if (gimple_code (stmt) == GIMPLE_LABEL
2161 && (FORCED_LABEL (gimple_label_label (stmt))
2162 || DECL_NONLOCAL (gimple_label_label (stmt))))
7506e1cb
ZD
2163 {
2164 basic_block new_bb;
726a989a 2165 gimple_stmt_iterator new_gsi;
7506e1cb
ZD
2166
2167 /* A non-reachable non-local label may still be referenced.
2168 But it no longer needs to carry the extra semantics of
2169 non-locality. */
726a989a 2170 if (DECL_NONLOCAL (gimple_label_label (stmt)))
7506e1cb 2171 {
726a989a
RB
2172 DECL_NONLOCAL (gimple_label_label (stmt)) = 0;
2173 FORCED_LABEL (gimple_label_label (stmt)) = 1;
7506e1cb 2174 }
bb1ecfe8 2175
7506e1cb 2176 new_bb = bb->prev_bb;
726a989a
RB
2177 new_gsi = gsi_start_bb (new_bb);
2178 gsi_remove (&i, false);
2179 gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
7506e1cb
ZD
2180 }
2181 else
bb1ecfe8 2182 {
7506e1cb
ZD
2183 /* Release SSA definitions if we are in SSA. Note that we
2184 may be called when not in SSA. For example,
2185 final_cleanup calls this function via
2186 cleanup_tree_cfg. */
2187 if (gimple_in_ssa_p (cfun))
2188 release_defs (stmt);
2189
726a989a 2190 gsi_remove (&i, true);
bb1ecfe8 2191 }
6531d1be 2192
7506e1cb
ZD
2193 /* Don't warn for removed gotos. Gotos are often removed due to
2194 jump threading, thus resulting in bogus warnings. Not great,
2195 since this way we lose warnings for gotos in the original
2196 program that are indeed unreachable. */
726a989a
RB
2197 if (gimple_code (stmt) != GIMPLE_GOTO
2198 && gimple_has_location (stmt)
2199 && !loc)
2200 loc = gimple_location (stmt);
43e05e45 2201 }
6de9cd9a
DN
2202 }
2203
2204 /* If requested, give a warning that the first statement in the
2205 block is unreachable. We walk statements backwards in the
2206 loop above, so the last statement we process is the first statement
2207 in the block. */
5ffeb913 2208 if (loc > BUILTINS_LOCATION && LOCATION_LINE (loc) > 0)
44c21c7f 2209 warning (OPT_Wunreachable_code, "%Hwill never be executed", &loc);
6de9cd9a
DN
2210
2211 remove_phi_nodes_and_edges_for_unreachable_block (bb);
726a989a 2212 bb->il.gimple = NULL;
6de9cd9a
DN
2213}
2214
6de9cd9a 2215
35920270
KH
2216/* Given a basic block BB ending with COND_EXPR or SWITCH_EXPR, and a
2217 predicate VAL, return the edge that will be taken out of the block.
2218 If VAL does not match a unique edge, NULL is returned. */
6de9cd9a
DN
2219
2220edge
2221find_taken_edge (basic_block bb, tree val)
2222{
726a989a 2223 gimple stmt;
6de9cd9a
DN
2224
2225 stmt = last_stmt (bb);
2226
1e128c5f
GB
2227 gcc_assert (stmt);
2228 gcc_assert (is_ctrl_stmt (stmt));
6de9cd9a 2229
726a989a
RB
2230 if (val == NULL)
2231 return NULL;
2232
2233 if (!is_gimple_min_invariant (val))
6de9cd9a
DN
2234 return NULL;
2235
726a989a 2236 if (gimple_code (stmt) == GIMPLE_COND)
6de9cd9a
DN
2237 return find_taken_edge_cond_expr (bb, val);
2238
726a989a 2239 if (gimple_code (stmt) == GIMPLE_SWITCH)
6de9cd9a
DN
2240 return find_taken_edge_switch_expr (bb, val);
2241
be477406 2242 if (computed_goto_p (stmt))
1799efef
JL
2243 {
2244 /* Only optimize if the argument is a label, if the argument is
2245 not a label then we can not construct a proper CFG.
2246
2247 It may be the case that we only need to allow the LABEL_REF to
2248 appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
2249 appear inside a LABEL_EXPR just to be safe. */
2250 if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
2251 && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
2252 return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
2253 return NULL;
2254 }
be477406 2255
35920270 2256 gcc_unreachable ();
6de9cd9a
DN
2257}
2258
be477406
JL
2259/* Given a constant value VAL and the entry block BB to a GOTO_EXPR
2260 statement, determine which of the outgoing edges will be taken out of the
2261 block. Return NULL if either edge may be taken. */
2262
2263static edge
2264find_taken_edge_computed_goto (basic_block bb, tree val)
2265{
2266 basic_block dest;
2267 edge e = NULL;
2268
2269 dest = label_to_block (val);
2270 if (dest)
2271 {
2272 e = find_edge (bb, dest);
2273 gcc_assert (e != NULL);
2274 }
2275
2276 return e;
2277}
6de9cd9a
DN
2278
2279/* Given a constant value VAL and the entry block BB to a COND_EXPR
2280 statement, determine which of the two edges will be taken out of the
2281 block. Return NULL if either edge may be taken. */
2282
2283static edge
2284find_taken_edge_cond_expr (basic_block bb, tree val)
2285{
2286 edge true_edge, false_edge;
2287
2288 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
6531d1be 2289
f1b19062 2290 gcc_assert (TREE_CODE (val) == INTEGER_CST);
6e682d7e 2291 return (integer_zerop (val) ? false_edge : true_edge);
6de9cd9a
DN
2292}
2293
fca01525 2294/* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
6de9cd9a
DN
2295 statement, determine which edge will be taken out of the block. Return
2296 NULL if any edge may be taken. */
2297
2298static edge
2299find_taken_edge_switch_expr (basic_block bb, tree val)
2300{
6de9cd9a
DN
2301 basic_block dest_bb;
2302 edge e;
726a989a
RB
2303 gimple switch_stmt;
2304 tree taken_case;
6de9cd9a 2305
726a989a
RB
2306 switch_stmt = last_stmt (bb);
2307 taken_case = find_case_label_for_value (switch_stmt, val);
6de9cd9a
DN
2308 dest_bb = label_to_block (CASE_LABEL (taken_case));
2309
2310 e = find_edge (bb, dest_bb);
1e128c5f 2311 gcc_assert (e);
6de9cd9a
DN
2312 return e;
2313}
2314
2315
726a989a 2316/* Return the CASE_LABEL_EXPR that SWITCH_STMT will take for VAL.
f667741c
SB
2317 We can make optimal use here of the fact that the case labels are
2318 sorted: We can do a binary search for a case matching VAL. */
6de9cd9a
DN
2319
2320static tree
726a989a 2321find_case_label_for_value (gimple switch_stmt, tree val)
6de9cd9a 2322{
726a989a
RB
2323 size_t low, high, n = gimple_switch_num_labels (switch_stmt);
2324 tree default_case = gimple_switch_default_label (switch_stmt);
6de9cd9a 2325
726a989a 2326 for (low = 0, high = n; high - low > 1; )
6de9cd9a 2327 {
f667741c 2328 size_t i = (high + low) / 2;
726a989a 2329 tree t = gimple_switch_label (switch_stmt, i);
f667741c
SB
2330 int cmp;
2331
2332 /* Cache the result of comparing CASE_LOW and val. */
2333 cmp = tree_int_cst_compare (CASE_LOW (t), val);
6de9cd9a 2334
f667741c
SB
2335 if (cmp > 0)
2336 high = i;
2337 else
2338 low = i;
2339
2340 if (CASE_HIGH (t) == NULL)
6de9cd9a 2341 {
f667741c
SB
2342 /* A singe-valued case label. */
2343 if (cmp == 0)
6de9cd9a
DN
2344 return t;
2345 }
2346 else
2347 {
2348 /* A case range. We can only handle integer ranges. */
f667741c 2349 if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
6de9cd9a
DN
2350 return t;
2351 }
2352 }
2353
6de9cd9a
DN
2354 return default_case;
2355}
2356
2357
6de9cd9a
DN
2358/* Dump a basic block on stderr. */
2359
2360void
726a989a 2361gimple_debug_bb (basic_block bb)
6de9cd9a 2362{
726a989a 2363 gimple_dump_bb (bb, stderr, 0, TDF_VOPS|TDF_MEMSYMS);
6de9cd9a
DN
2364}
2365
2366
2367/* Dump basic block with index N on stderr. */
2368
2369basic_block
726a989a 2370gimple_debug_bb_n (int n)
6de9cd9a 2371{
726a989a 2372 gimple_debug_bb (BASIC_BLOCK (n));
6de9cd9a 2373 return BASIC_BLOCK (n);
6531d1be 2374}
6de9cd9a
DN
2375
2376
2377/* Dump the CFG on stderr.
2378
2379 FLAGS are the same used by the tree dumping functions
6531d1be 2380 (see TDF_* in tree-pass.h). */
6de9cd9a
DN
2381
2382void
726a989a 2383gimple_debug_cfg (int flags)
6de9cd9a 2384{
726a989a 2385 gimple_dump_cfg (stderr, flags);
6de9cd9a
DN
2386}
2387
2388
2389/* Dump the program showing basic block boundaries on the given FILE.
2390
2391 FLAGS are the same used by the tree dumping functions (see TDF_* in
2392 tree.h). */
2393
2394void
726a989a 2395gimple_dump_cfg (FILE *file, int flags)
6de9cd9a
DN
2396{
2397 if (flags & TDF_DETAILS)
2398 {
2399 const char *funcname
673fda6b 2400 = lang_hooks.decl_printable_name (current_function_decl, 2);
6de9cd9a
DN
2401
2402 fputc ('\n', file);
2403 fprintf (file, ";; Function %s\n\n", funcname);
2404 fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
2405 n_basic_blocks, n_edges, last_basic_block);
2406
2407 brief_dump_cfg (file);
2408 fprintf (file, "\n");
2409 }
2410
2411 if (flags & TDF_STATS)
2412 dump_cfg_stats (file);
2413
2414 dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2415}
2416
2417
2418/* Dump CFG statistics on FILE. */
2419
2420void
2421dump_cfg_stats (FILE *file)
2422{
2423 static long max_num_merged_labels = 0;
2424 unsigned long size, total = 0;
7b0cab99 2425 long num_edges;
6de9cd9a
DN
2426 basic_block bb;
2427 const char * const fmt_str = "%-30s%-13s%12s\n";
f7fda749 2428 const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
cac50d94 2429 const char * const fmt_str_2 = "%-30s%13ld%11lu%c\n";
6de9cd9a
DN
2430 const char * const fmt_str_3 = "%-43s%11lu%c\n";
2431 const char *funcname
673fda6b 2432 = lang_hooks.decl_printable_name (current_function_decl, 2);
6de9cd9a
DN
2433
2434
2435 fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2436
2437 fprintf (file, "---------------------------------------------------------\n");
2438 fprintf (file, fmt_str, "", " Number of ", "Memory");
2439 fprintf (file, fmt_str, "", " instances ", "used ");
2440 fprintf (file, "---------------------------------------------------------\n");
2441
2442 size = n_basic_blocks * sizeof (struct basic_block_def);
2443 total += size;
f7fda749
RH
2444 fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks,
2445 SCALE (size), LABEL (size));
6de9cd9a 2446
7b0cab99 2447 num_edges = 0;
6de9cd9a 2448 FOR_EACH_BB (bb)
7b0cab99
JH
2449 num_edges += EDGE_COUNT (bb->succs);
2450 size = num_edges * sizeof (struct edge_def);
6de9cd9a 2451 total += size;
cac50d94 2452 fprintf (file, fmt_str_2, "Edges", num_edges, SCALE (size), LABEL (size));
6de9cd9a 2453
6de9cd9a
DN
2454 fprintf (file, "---------------------------------------------------------\n");
2455 fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2456 LABEL (total));
2457 fprintf (file, "---------------------------------------------------------\n");
2458 fprintf (file, "\n");
2459
2460 if (cfg_stats.num_merged_labels > max_num_merged_labels)
2461 max_num_merged_labels = cfg_stats.num_merged_labels;
2462
2463 fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2464 cfg_stats.num_merged_labels, max_num_merged_labels);
2465
2466 fprintf (file, "\n");
2467}
2468
2469
2470/* Dump CFG statistics on stderr. Keep extern so that it's always
2471 linked in the final executable. */
2472
2473void
2474debug_cfg_stats (void)
2475{
2476 dump_cfg_stats (stderr);
2477}
2478
2479
2480/* Dump the flowgraph to a .vcg FILE. */
2481
2482static void
726a989a 2483gimple_cfg2vcg (FILE *file)
6de9cd9a
DN
2484{
2485 edge e;
628f6a4e 2486 edge_iterator ei;
6de9cd9a
DN
2487 basic_block bb;
2488 const char *funcname
673fda6b 2489 = lang_hooks.decl_printable_name (current_function_decl, 2);
6de9cd9a
DN
2490
2491 /* Write the file header. */
2492 fprintf (file, "graph: { title: \"%s\"\n", funcname);
2493 fprintf (file, "node: { title: \"ENTRY\" label: \"ENTRY\" }\n");
2494 fprintf (file, "node: { title: \"EXIT\" label: \"EXIT\" }\n");
2495
2496 /* Write blocks and edges. */
628f6a4e 2497 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
6de9cd9a
DN
2498 {
2499 fprintf (file, "edge: { sourcename: \"ENTRY\" targetname: \"%d\"",
2500 e->dest->index);
2501
2502 if (e->flags & EDGE_FAKE)
2503 fprintf (file, " linestyle: dotted priority: 10");
2504 else
2505 fprintf (file, " linestyle: solid priority: 100");
2506
2507 fprintf (file, " }\n");
2508 }
2509 fputc ('\n', file);
2510
2511 FOR_EACH_BB (bb)
2512 {
726a989a 2513 enum gimple_code head_code, end_code;
6de9cd9a
DN
2514 const char *head_name, *end_name;
2515 int head_line = 0;
2516 int end_line = 0;
726a989a
RB
2517 gimple first = first_stmt (bb);
2518 gimple last = last_stmt (bb);
6de9cd9a
DN
2519
2520 if (first)
2521 {
726a989a
RB
2522 head_code = gimple_code (first);
2523 head_name = gimple_code_name[head_code];
6de9cd9a
DN
2524 head_line = get_lineno (first);
2525 }
2526 else
2527 head_name = "no-statement";
2528
2529 if (last)
2530 {
726a989a
RB
2531 end_code = gimple_code (last);
2532 end_name = gimple_code_name[end_code];
6de9cd9a
DN
2533 end_line = get_lineno (last);
2534 }
2535 else
2536 end_name = "no-statement";
2537
2538 fprintf (file, "node: { title: \"%d\" label: \"#%d\\n%s (%d)\\n%s (%d)\"}\n",
2539 bb->index, bb->index, head_name, head_line, end_name,
2540 end_line);
2541
628f6a4e 2542 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
2543 {
2544 if (e->dest == EXIT_BLOCK_PTR)
2545 fprintf (file, "edge: { sourcename: \"%d\" targetname: \"EXIT\"", bb->index);
2546 else
2547 fprintf (file, "edge: { sourcename: \"%d\" targetname: \"%d\"", bb->index, e->dest->index);
2548
2549 if (e->flags & EDGE_FAKE)
2550 fprintf (file, " priority: 10 linestyle: dotted");
2551 else
2552 fprintf (file, " priority: 100 linestyle: solid");
2553
2554 fprintf (file, " }\n");
2555 }
2556
2557 if (bb->next_bb != EXIT_BLOCK_PTR)
2558 fputc ('\n', file);
2559 }
2560
2561 fputs ("}\n\n", file);
2562}
2563
2564
2565
2566/*---------------------------------------------------------------------------
2567 Miscellaneous helpers
2568---------------------------------------------------------------------------*/
2569
2570/* Return true if T represents a stmt that always transfers control. */
2571
2572bool
726a989a 2573is_ctrl_stmt (gimple t)
6de9cd9a 2574{
726a989a
RB
2575 return gimple_code (t) == GIMPLE_COND
2576 || gimple_code (t) == GIMPLE_SWITCH
2577 || gimple_code (t) == GIMPLE_GOTO
2578 || gimple_code (t) == GIMPLE_RETURN
2579 || gimple_code (t) == GIMPLE_RESX;
6de9cd9a
DN
2580}
2581
2582
2583/* Return true if T is a statement that may alter the flow of control
2584 (e.g., a call to a non-returning function). */
2585
2586bool
726a989a 2587is_ctrl_altering_stmt (gimple t)
6de9cd9a 2588{
1e128c5f 2589 gcc_assert (t);
726a989a
RB
2590
2591 if (is_gimple_call (t))
6de9cd9a 2592 {
726a989a
RB
2593 int flags = gimple_call_flags (t);
2594
2595 /* A non-pure/const call alters flow control if the current
6de9cd9a 2596 function has nonlocal labels. */
726a989a
RB
2597 if (!(flags & (ECF_CONST | ECF_PURE))
2598 && cfun->has_nonlocal_label)
6de9cd9a
DN
2599 return true;
2600
726a989a
RB
2601 /* A call also alters control flow if it does not return. */
2602 if (gimple_call_flags (t) & ECF_NORETURN)
6de9cd9a 2603 return true;
6de9cd9a
DN
2604 }
2605
50674e96 2606 /* OpenMP directives alter control flow. */
726a989a 2607 if (is_gimple_omp (t))
50674e96
DN
2608 return true;
2609
6de9cd9a 2610 /* If a statement can throw, it alters control flow. */
726a989a 2611 return stmt_can_throw_internal (t);
6de9cd9a
DN
2612}
2613
2614
4f6c2131 2615/* Return true if T is a simple local goto. */
6de9cd9a
DN
2616
2617bool
726a989a 2618simple_goto_p (gimple t)
6de9cd9a 2619{
726a989a
RB
2620 return (gimple_code (t) == GIMPLE_GOTO
2621 && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL);
4f6c2131
EB
2622}
2623
2624
2625/* Return true if T can make an abnormal transfer of control flow.
2626 Transfers of control flow associated with EH are excluded. */
2627
2628bool
726a989a 2629stmt_can_make_abnormal_goto (gimple t)
4f6c2131
EB
2630{
2631 if (computed_goto_p (t))
2632 return true;
726a989a
RB
2633 if (is_gimple_call (t))
2634 return gimple_has_side_effects (t) && cfun->has_nonlocal_label;
4f6c2131 2635 return false;
6de9cd9a
DN
2636}
2637
2638
726a989a
RB
2639/* Return true if STMT should start a new basic block. PREV_STMT is
2640 the statement preceding STMT. It is used when STMT is a label or a
2641 case label. Labels should only start a new basic block if their
2642 previous statement wasn't a label. Otherwise, sequence of labels
2643 would generate unnecessary basic blocks that only contain a single
2644 label. */
6de9cd9a
DN
2645
2646static inline bool
726a989a 2647stmt_starts_bb_p (gimple stmt, gimple prev_stmt)
6de9cd9a 2648{
726a989a 2649 if (stmt == NULL)
6de9cd9a
DN
2650 return false;
2651
726a989a
RB
2652 /* Labels start a new basic block only if the preceding statement
2653 wasn't a label of the same type. This prevents the creation of
2654 consecutive blocks that have nothing but a single label. */
2655 if (gimple_code (stmt) == GIMPLE_LABEL)
6de9cd9a
DN
2656 {
2657 /* Nonlocal and computed GOTO targets always start a new block. */
726a989a
RB
2658 if (DECL_NONLOCAL (gimple_label_label (stmt))
2659 || FORCED_LABEL (gimple_label_label (stmt)))
6de9cd9a
DN
2660 return true;
2661
726a989a 2662 if (prev_stmt && gimple_code (prev_stmt) == GIMPLE_LABEL)
6de9cd9a 2663 {
726a989a 2664 if (DECL_NONLOCAL (gimple_label_label (prev_stmt)))
6de9cd9a
DN
2665 return true;
2666
2667 cfg_stats.num_merged_labels++;
2668 return false;
2669 }
2670 else
2671 return true;
2672 }
2673
2674 return false;
2675}
2676
2677
2678/* Return true if T should end a basic block. */
2679
2680bool
726a989a 2681stmt_ends_bb_p (gimple t)
6de9cd9a
DN
2682{
2683 return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2684}
2685
726a989a 2686/* Remove block annotations and other data structures. */
6de9cd9a
DN
2687
2688void
242229bb 2689delete_tree_cfg_annotations (void)
6de9cd9a 2690{
6de9cd9a 2691 label_to_block_map = NULL;
6de9cd9a
DN
2692}
2693
2694
2695/* Return the first statement in basic block BB. */
2696
726a989a 2697gimple
6de9cd9a
DN
2698first_stmt (basic_block bb)
2699{
726a989a
RB
2700 gimple_stmt_iterator i = gsi_start_bb (bb);
2701 return !gsi_end_p (i) ? gsi_stmt (i) : NULL;
6de9cd9a
DN
2702}
2703
6de9cd9a
DN
2704/* Return the last statement in basic block BB. */
2705
726a989a 2706gimple
6de9cd9a
DN
2707last_stmt (basic_block bb)
2708{
726a989a
RB
2709 gimple_stmt_iterator b = gsi_last_bb (bb);
2710 return !gsi_end_p (b) ? gsi_stmt (b) : NULL;
6de9cd9a
DN
2711}
2712
6de9cd9a
DN
2713/* Return the last statement of an otherwise empty block. Return NULL
2714 if the block is totally empty, or if it contains more than one
2715 statement. */
2716
726a989a 2717gimple
6de9cd9a
DN
2718last_and_only_stmt (basic_block bb)
2719{
726a989a
RB
2720 gimple_stmt_iterator i = gsi_last_bb (bb);
2721 gimple last, prev;
6de9cd9a 2722
726a989a
RB
2723 if (gsi_end_p (i))
2724 return NULL;
6de9cd9a 2725
726a989a
RB
2726 last = gsi_stmt (i);
2727 gsi_prev (&i);
2728 if (gsi_end_p (i))
6de9cd9a
DN
2729 return last;
2730
2731 /* Empty statements should no longer appear in the instruction stream.
2732 Everything that might have appeared before should be deleted by
726a989a 2733 remove_useless_stmts, and the optimizers should just gsi_remove
6de9cd9a
DN
2734 instead of smashing with build_empty_stmt.
2735
2736 Thus the only thing that should appear here in a block containing
2737 one executable statement is a label. */
726a989a
RB
2738 prev = gsi_stmt (i);
2739 if (gimple_code (prev) == GIMPLE_LABEL)
6de9cd9a
DN
2740 return last;
2741 else
726a989a 2742 return NULL;
82b85a85 2743}
6de9cd9a 2744
4f7db7f7
KH
2745/* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE. */
2746
2747static void
2748reinstall_phi_args (edge new_edge, edge old_edge)
2749{
ea7e6d5a
AH
2750 edge_var_map_vector v;
2751 edge_var_map *vm;
2752 int i;
726a989a
RB
2753 gimple_stmt_iterator phis;
2754
ea7e6d5a
AH
2755 v = redirect_edge_var_map_vector (old_edge);
2756 if (!v)
4f7db7f7 2757 return;
726a989a
RB
2758
2759 for (i = 0, phis = gsi_start_phis (new_edge->dest);
2760 VEC_iterate (edge_var_map, v, i, vm) && !gsi_end_p (phis);
2761 i++, gsi_next (&phis))
4f7db7f7 2762 {
726a989a 2763 gimple phi = gsi_stmt (phis);
ea7e6d5a
AH
2764 tree result = redirect_edge_var_map_result (vm);
2765 tree arg = redirect_edge_var_map_def (vm);
726a989a
RB
2766
2767 gcc_assert (result == gimple_phi_result (phi));
2768
d2e398df 2769 add_phi_arg (phi, arg, new_edge);
4f7db7f7 2770 }
726a989a 2771
ea7e6d5a 2772 redirect_edge_var_map_clear (old_edge);
4f7db7f7
KH
2773}
2774
2a8a8292 2775/* Returns the basic block after which the new basic block created
b9a66240
ZD
2776 by splitting edge EDGE_IN should be placed. Tries to keep the new block
2777 near its "logical" location. This is of most help to humans looking
2778 at debugging dumps. */
2779
2780static basic_block
2781split_edge_bb_loc (edge edge_in)
2782{
2783 basic_block dest = edge_in->dest;
2784
2785 if (dest->prev_bb && find_edge (dest->prev_bb, dest))
2786 return edge_in->src;
2787 else
2788 return dest->prev_bb;
2789}
2790
6de9cd9a
DN
2791/* Split a (typically critical) edge EDGE_IN. Return the new block.
2792 Abort on abnormal edges. */
2793
2794static basic_block
726a989a 2795gimple_split_edge (edge edge_in)
6de9cd9a 2796{
4741d956 2797 basic_block new_bb, after_bb, dest;
6de9cd9a 2798 edge new_edge, e;
6de9cd9a
DN
2799
2800 /* Abnormal edges cannot be split. */
1e128c5f 2801 gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
6de9cd9a 2802
6de9cd9a
DN
2803 dest = edge_in->dest;
2804
b9a66240 2805 after_bb = split_edge_bb_loc (edge_in);
6de9cd9a
DN
2806
2807 new_bb = create_empty_bb (after_bb);
b829f3fa
JH
2808 new_bb->frequency = EDGE_FREQUENCY (edge_in);
2809 new_bb->count = edge_in->count;
6de9cd9a 2810 new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
b829f3fa
JH
2811 new_edge->probability = REG_BR_PROB_BASE;
2812 new_edge->count = edge_in->count;
6de9cd9a 2813
1e128c5f 2814 e = redirect_edge_and_branch (edge_in, new_bb);
c7b852c8 2815 gcc_assert (e == edge_in);
4f7db7f7 2816 reinstall_phi_args (new_edge, e);
6de9cd9a
DN
2817
2818 return new_bb;
2819}
2820
6de9cd9a 2821/* Callback for walk_tree, check that all elements with address taken are
7a442a1d
SB
2822 properly noticed as such. The DATA is an int* that is 1 if TP was seen
2823 inside a PHI node. */
6de9cd9a
DN
2824
2825static tree
2fbe90f2 2826verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
6de9cd9a
DN
2827{
2828 tree t = *tp, x;
2829
2830 if (TYPE_P (t))
2831 *walk_subtrees = 0;
6531d1be 2832
e8ca4159 2833 /* Check operand N for being valid GIMPLE and give error MSG if not. */
2fbe90f2 2834#define CHECK_OP(N, MSG) \
e8ca4159 2835 do { if (!is_gimple_val (TREE_OPERAND (t, N))) \
2fbe90f2 2836 { error (MSG); return TREE_OPERAND (t, N); }} while (0)
6de9cd9a
DN
2837
2838 switch (TREE_CODE (t))
2839 {
2840 case SSA_NAME:
2841 if (SSA_NAME_IN_FREE_LIST (t))
2842 {
2843 error ("SSA name in freelist but still referenced");
2844 return *tp;
2845 }
2846 break;
2847
26de0bcb
AP
2848 case INDIRECT_REF:
2849 x = TREE_OPERAND (t, 0);
2850 if (!is_gimple_reg (x) && !is_gimple_min_invariant (x))
2851 {
2852 error ("Indirect reference's operand is not a register or a constant.");
2853 return x;
2854 }
2855 break;
2856
0bca51f0
DN
2857 case ASSERT_EXPR:
2858 x = fold (ASSERT_EXPR_COND (t));
2859 if (x == boolean_false_node)
2860 {
2861 error ("ASSERT_EXPR with an always-false condition");
2862 return *tp;
2863 }
2864 break;
2865
6de9cd9a 2866 case MODIFY_EXPR:
26de0bcb 2867 error ("MODIFY_EXPR not expected while having tuples.");
e57fcb68 2868 return *tp;
6de9cd9a
DN
2869
2870 case ADDR_EXPR:
81fc3052 2871 {
81fc3052
DB
2872 bool old_constant;
2873 bool old_side_effects;
81fc3052
DB
2874 bool new_constant;
2875 bool new_side_effects;
2876
51eed280
PB
2877 gcc_assert (is_gimple_address (t));
2878
81fc3052
DB
2879 old_constant = TREE_CONSTANT (t);
2880 old_side_effects = TREE_SIDE_EFFECTS (t);
2881
127203ac 2882 recompute_tree_invariant_for_addr_expr (t);
81fc3052
DB
2883 new_side_effects = TREE_SIDE_EFFECTS (t);
2884 new_constant = TREE_CONSTANT (t);
2885
81fc3052
DB
2886 if (old_constant != new_constant)
2887 {
2888 error ("constant not recomputed when ADDR_EXPR changed");
2889 return t;
2890 }
2891 if (old_side_effects != new_side_effects)
2892 {
2893 error ("side effects not recomputed when ADDR_EXPR changed");
2894 return t;
2895 }
2896
2897 /* Skip any references (they will be checked when we recurse down the
2898 tree) and ensure that any variable used as a prefix is marked
2899 addressable. */
2900 for (x = TREE_OPERAND (t, 0);
2901 handled_component_p (x);
2902 x = TREE_OPERAND (x, 0))
2903 ;
2904
5006671f
RG
2905 if (!(TREE_CODE (x) == VAR_DECL
2906 || TREE_CODE (x) == PARM_DECL
2907 || TREE_CODE (x) == RESULT_DECL))
81fc3052
DB
2908 return NULL;
2909 if (!TREE_ADDRESSABLE (x))
2910 {
2911 error ("address taken, but ADDRESSABLE bit not set");
2912 return x;
2913 }
ba4d8f9d
RG
2914 if (DECL_GIMPLE_REG_P (x))
2915 {
2916 error ("DECL_GIMPLE_REG_P set on a variable with address taken");
2917 return x;
2918 }
bdb69bee 2919
81fc3052
DB
2920 break;
2921 }
6de9cd9a
DN
2922
2923 case COND_EXPR:
a6234684 2924 x = COND_EXPR_COND (t);
d40055ab 2925 if (!INTEGRAL_TYPE_P (TREE_TYPE (x)))
6de9cd9a 2926 {
d40055ab 2927 error ("non-integral used in condition");
6de9cd9a
DN
2928 return x;
2929 }
9c691961
AP
2930 if (!is_gimple_condexpr (x))
2931 {
ab532386 2932 error ("invalid conditional operand");
9c691961
AP
2933 return x;
2934 }
6de9cd9a
DN
2935 break;
2936
a134e5f3
TB
2937 case NON_LVALUE_EXPR:
2938 gcc_unreachable ();
2939
1043771b 2940 CASE_CONVERT:
6de9cd9a 2941 case FIX_TRUNC_EXPR:
6de9cd9a
DN
2942 case FLOAT_EXPR:
2943 case NEGATE_EXPR:
2944 case ABS_EXPR:
2945 case BIT_NOT_EXPR:
6de9cd9a 2946 case TRUTH_NOT_EXPR:
ab532386 2947 CHECK_OP (0, "invalid operand to unary operator");
6de9cd9a
DN
2948 break;
2949
2950 case REALPART_EXPR:
2951 case IMAGPART_EXPR:
2fbe90f2
RK
2952 case COMPONENT_REF:
2953 case ARRAY_REF:
2954 case ARRAY_RANGE_REF:
2955 case BIT_FIELD_REF:
2956 case VIEW_CONVERT_EXPR:
2957 /* We have a nest of references. Verify that each of the operands
2958 that determine where to reference is either a constant or a variable,
2959 verify that the base is valid, and then show we've already checked
2960 the subtrees. */
afe84921 2961 while (handled_component_p (t))
2fbe90f2
RK
2962 {
2963 if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
ab532386 2964 CHECK_OP (2, "invalid COMPONENT_REF offset operator");
2fbe90f2
RK
2965 else if (TREE_CODE (t) == ARRAY_REF
2966 || TREE_CODE (t) == ARRAY_RANGE_REF)
2967 {
ab532386 2968 CHECK_OP (1, "invalid array index");
2fbe90f2 2969 if (TREE_OPERAND (t, 2))
ab532386 2970 CHECK_OP (2, "invalid array lower bound");
2fbe90f2 2971 if (TREE_OPERAND (t, 3))
ab532386 2972 CHECK_OP (3, "invalid array stride");
2fbe90f2
RK
2973 }
2974 else if (TREE_CODE (t) == BIT_FIELD_REF)
2975 {
e55f42fb
RG
2976 if (!host_integerp (TREE_OPERAND (t, 1), 1)
2977 || !host_integerp (TREE_OPERAND (t, 2), 1))
2978 {
2979 error ("invalid position or size operand to BIT_FIELD_REF");
2980 return t;
2981 }
fc0f49f3
RG
2982 else if (INTEGRAL_TYPE_P (TREE_TYPE (t))
2983 && (TYPE_PRECISION (TREE_TYPE (t))
2984 != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2985 {
2986 error ("integral result type precision does not match "
2987 "field size of BIT_FIELD_REF");
2988 return t;
2989 }
2990 if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
2991 && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (t)))
2992 != TREE_INT_CST_LOW (TREE_OPERAND (t, 1))))
2993 {
2994 error ("mode precision of non-integral result does not "
2995 "match field size of BIT_FIELD_REF");
2996 return t;
2997 }
2fbe90f2
RK
2998 }
2999
3000 t = TREE_OPERAND (t, 0);
3001 }
3002
bb0c55f6 3003 if (!is_gimple_min_invariant (t) && !is_gimple_lvalue (t))
2fbe90f2 3004 {
ab532386 3005 error ("invalid reference prefix");
2fbe90f2
RK
3006 return t;
3007 }
3008 *walk_subtrees = 0;
6de9cd9a 3009 break;
5be014d5
AP
3010 case PLUS_EXPR:
3011 case MINUS_EXPR:
3012 /* PLUS_EXPR and MINUS_EXPR don't work on pointers, they should be done using
3013 POINTER_PLUS_EXPR. */
3014 if (POINTER_TYPE_P (TREE_TYPE (t)))
3015 {
3016 error ("invalid operand to plus/minus, type is a pointer");
3017 return t;
3018 }
3019 CHECK_OP (0, "invalid operand to binary operator");
3020 CHECK_OP (1, "invalid operand to binary operator");
3021 break;
6de9cd9a 3022
5be014d5
AP
3023 case POINTER_PLUS_EXPR:
3024 /* Check to make sure the first operand is a pointer or reference type. */
3025 if (!POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
3026 {
3027 error ("invalid operand to pointer plus, first operand is not a pointer");
3028 return t;
3029 }
3030 /* Check to make sure the second operand is an integer with type of
3031 sizetype. */
36618b93
RG
3032 if (!useless_type_conversion_p (sizetype,
3033 TREE_TYPE (TREE_OPERAND (t, 1))))
5be014d5
AP
3034 {
3035 error ("invalid operand to pointer plus, second operand is not an "
3036 "integer with type of sizetype.");
3037 return t;
3038 }
3039 /* FALLTHROUGH */
6de9cd9a
DN
3040 case LT_EXPR:
3041 case LE_EXPR:
3042 case GT_EXPR:
3043 case GE_EXPR:
3044 case EQ_EXPR:
3045 case NE_EXPR:
3046 case UNORDERED_EXPR:
3047 case ORDERED_EXPR:
3048 case UNLT_EXPR:
3049 case UNLE_EXPR:
3050 case UNGT_EXPR:
3051 case UNGE_EXPR:
3052 case UNEQ_EXPR:
d1a7edaf 3053 case LTGT_EXPR:
6de9cd9a
DN
3054 case MULT_EXPR:
3055 case TRUNC_DIV_EXPR:
3056 case CEIL_DIV_EXPR:
3057 case FLOOR_DIV_EXPR:
3058 case ROUND_DIV_EXPR:
3059 case TRUNC_MOD_EXPR:
3060 case CEIL_MOD_EXPR:
3061 case FLOOR_MOD_EXPR:
3062 case ROUND_MOD_EXPR:
3063 case RDIV_EXPR:
3064 case EXACT_DIV_EXPR:
3065 case MIN_EXPR:
3066 case MAX_EXPR:
3067 case LSHIFT_EXPR:
3068 case RSHIFT_EXPR:
3069 case LROTATE_EXPR:
3070 case RROTATE_EXPR:
3071 case BIT_IOR_EXPR:
3072 case BIT_XOR_EXPR:
3073 case BIT_AND_EXPR:
ab532386
JM
3074 CHECK_OP (0, "invalid operand to binary operator");
3075 CHECK_OP (1, "invalid operand to binary operator");
6de9cd9a
DN
3076 break;
3077
84816907
JM
3078 case CONSTRUCTOR:
3079 if (TREE_CONSTANT (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
3080 *walk_subtrees = 0;
3081 break;
3082
6de9cd9a
DN
3083 default:
3084 break;
3085 }
3086 return NULL;
2fbe90f2
RK
3087
3088#undef CHECK_OP
6de9cd9a
DN
3089}
3090
7e98624c
RG
3091
3092/* Verify if EXPR is either a GIMPLE ID or a GIMPLE indirect reference.
3093 Returns true if there is an error, otherwise false. */
3094
3095static bool
726a989a 3096verify_types_in_gimple_min_lval (tree expr)
7e98624c
RG
3097{
3098 tree op;
3099
3100 if (is_gimple_id (expr))
3101 return false;
3102
9f509004
RG
3103 if (!INDIRECT_REF_P (expr)
3104 && TREE_CODE (expr) != TARGET_MEM_REF)
7e98624c
RG
3105 {
3106 error ("invalid expression for min lvalue");
3107 return true;
3108 }
3109
9f509004
RG
3110 /* TARGET_MEM_REFs are strange beasts. */
3111 if (TREE_CODE (expr) == TARGET_MEM_REF)
3112 return false;
3113
7e98624c
RG
3114 op = TREE_OPERAND (expr, 0);
3115 if (!is_gimple_val (op))
3116 {
3117 error ("invalid operand in indirect reference");
3118 debug_generic_stmt (op);
3119 return true;
3120 }
3121 if (!useless_type_conversion_p (TREE_TYPE (expr),
3122 TREE_TYPE (TREE_TYPE (op))))
3123 {
3124 error ("type mismatch in indirect reference");
3125 debug_generic_stmt (TREE_TYPE (expr));
3126 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3127 return true;
3128 }
3129
3130 return false;
3131}
3132
3133/* Verify if EXPR is a valid GIMPLE reference expression. Returns true
3134 if there is an error, otherwise false. */
3135
3136static bool
726a989a 3137verify_types_in_gimple_reference (tree expr)
7e98624c
RG
3138{
3139 while (handled_component_p (expr))
3140 {
3141 tree op = TREE_OPERAND (expr, 0);
3142
3143 if (TREE_CODE (expr) == ARRAY_REF
3144 || TREE_CODE (expr) == ARRAY_RANGE_REF)
3145 {
3146 if (!is_gimple_val (TREE_OPERAND (expr, 1))
3147 || (TREE_OPERAND (expr, 2)
3148 && !is_gimple_val (TREE_OPERAND (expr, 2)))
3149 || (TREE_OPERAND (expr, 3)
3150 && !is_gimple_val (TREE_OPERAND (expr, 3))))
3151 {
3152 error ("invalid operands to array reference");
3153 debug_generic_stmt (expr);
3154 return true;
3155 }
3156 }
3157
3158 /* Verify if the reference array element types are compatible. */
3159 if (TREE_CODE (expr) == ARRAY_REF
3160 && !useless_type_conversion_p (TREE_TYPE (expr),
3161 TREE_TYPE (TREE_TYPE (op))))
3162 {
3163 error ("type mismatch in array reference");
3164 debug_generic_stmt (TREE_TYPE (expr));
3165 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3166 return true;
3167 }
3168 if (TREE_CODE (expr) == ARRAY_RANGE_REF
3169 && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
3170 TREE_TYPE (TREE_TYPE (op))))
3171 {
3172 error ("type mismatch in array range reference");
3173 debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
3174 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3175 return true;
3176 }
3177
3178 if ((TREE_CODE (expr) == REALPART_EXPR
3179 || TREE_CODE (expr) == IMAGPART_EXPR)
3180 && !useless_type_conversion_p (TREE_TYPE (expr),
3181 TREE_TYPE (TREE_TYPE (op))))
3182 {
3183 error ("type mismatch in real/imagpart reference");
3184 debug_generic_stmt (TREE_TYPE (expr));
3185 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
3186 return true;
3187 }
3188
3189 if (TREE_CODE (expr) == COMPONENT_REF
3190 && !useless_type_conversion_p (TREE_TYPE (expr),
3191 TREE_TYPE (TREE_OPERAND (expr, 1))))
3192 {
3193 error ("type mismatch in component reference");
3194 debug_generic_stmt (TREE_TYPE (expr));
3195 debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
3196 return true;
3197 }
3198
3199 /* For VIEW_CONVERT_EXPRs which are allowed here, too, there
3200 is nothing to verify. Gross mismatches at most invoke
3201 undefined behavior. */
9f509004
RG
3202 if (TREE_CODE (expr) == VIEW_CONVERT_EXPR
3203 && !handled_component_p (op))
3204 return false;
7e98624c
RG
3205
3206 expr = op;
3207 }
3208
726a989a 3209 return verify_types_in_gimple_min_lval (expr);
7e98624c
RG
3210}
3211
20dcff2a
RG
3212/* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
3213 list of pointer-to types that is trivially convertible to DEST. */
3214
3215static bool
3216one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
3217{
3218 tree src;
3219
3220 if (!TYPE_POINTER_TO (src_obj))
3221 return true;
3222
3223 for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
3224 if (useless_type_conversion_p (dest, src))
3225 return true;
3226
3227 return false;
3228}
3229
726a989a
RB
3230/* Return true if TYPE1 is a fixed-point type and if conversions to and
3231 from TYPE2 can be handled by FIXED_CONVERT_EXPR. */
3232
3233static bool
3234valid_fixed_convert_types_p (tree type1, tree type2)
3235{
3236 return (FIXED_POINT_TYPE_P (type1)
3237 && (INTEGRAL_TYPE_P (type2)
3238 || SCALAR_FLOAT_TYPE_P (type2)
3239 || FIXED_POINT_TYPE_P (type2)));
3240}
3241
726a989a
RB
3242/* Verify the contents of a GIMPLE_CALL STMT. Returns true when there
3243 is a problem, otherwise false. */
3244
3245static bool
b59d3976 3246verify_gimple_call (gimple stmt)
726a989a 3247{
b59d3976
RG
3248 tree fn = gimple_call_fn (stmt);
3249 tree fntype;
726a989a 3250
b59d3976
RG
3251 if (!POINTER_TYPE_P (TREE_TYPE (fn))
3252 || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
3253 && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE))
3254 {
3255 error ("non-function in gimple call");
3256 return true;
3257 }
726a989a 3258
b59d3976
RG
3259 if (gimple_call_lhs (stmt)
3260 && !is_gimple_lvalue (gimple_call_lhs (stmt)))
3261 {
3262 error ("invalid LHS in gimple call");
3263 return true;
3264 }
726a989a 3265
b59d3976
RG
3266 fntype = TREE_TYPE (TREE_TYPE (fn));
3267 if (gimple_call_lhs (stmt)
3268 && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)),
3269 TREE_TYPE (fntype))
3270 /* ??? At least C++ misses conversions at assignments from
3271 void * call results.
3272 ??? Java is completely off. Especially with functions
3273 returning java.lang.Object.
3274 For now simply allow arbitrary pointer type conversions. */
3275 && !(POINTER_TYPE_P (TREE_TYPE (gimple_call_lhs (stmt)))
3276 && POINTER_TYPE_P (TREE_TYPE (fntype))))
3277 {
3278 error ("invalid conversion in gimple call");
3279 debug_generic_stmt (TREE_TYPE (gimple_call_lhs (stmt)));
3280 debug_generic_stmt (TREE_TYPE (fntype));
3281 return true;
3282 }
726a989a 3283
b59d3976
RG
3284 /* ??? The C frontend passes unpromoted arguments in case it
3285 didn't see a function declaration before the call. So for now
3286 leave the call arguments unverified. Once we gimplify
3287 unit-at-a-time we have a chance to fix this. */
726a989a 3288
b59d3976 3289 return false;
726a989a
RB
3290}
3291
b59d3976
RG
3292/* Verifies the gimple comparison with the result type TYPE and
3293 the operands OP0 and OP1. */
17d23165
RS
3294
3295static bool
b59d3976 3296verify_gimple_comparison (tree type, tree op0, tree op1)
17d23165 3297{
b59d3976
RG
3298 tree op0_type = TREE_TYPE (op0);
3299 tree op1_type = TREE_TYPE (op1);
726a989a 3300
b59d3976
RG
3301 if (!is_gimple_val (op0) || !is_gimple_val (op1))
3302 {
3303 error ("invalid operands in gimple comparison");
3304 return true;
3305 }
17d23165 3306
b59d3976
RG
3307 /* For comparisons we do not have the operations type as the
3308 effective type the comparison is carried out in. Instead
3309 we require that either the first operand is trivially
3310 convertible into the second, or the other way around.
3311 The resulting type of a comparison may be any integral type.
3312 Because we special-case pointers to void we allow
3313 comparisons of pointers with the same mode as well. */
3314 if ((!useless_type_conversion_p (op0_type, op1_type)
3315 && !useless_type_conversion_p (op1_type, op0_type)
3316 && (!POINTER_TYPE_P (op0_type)
3317 || !POINTER_TYPE_P (op1_type)
3318 || TYPE_MODE (op0_type) != TYPE_MODE (op1_type)))
3319 || !INTEGRAL_TYPE_P (type))
3320 {
3321 error ("type mismatch in comparison expression");
3322 debug_generic_expr (type);
3323 debug_generic_expr (op0_type);
3324 debug_generic_expr (op1_type);
3325 return true;
3326 }
3327
3328 return false;
3329}
726a989a 3330
9f509004
RG
3331/* Verify a gimple assignment statement STMT with an unary rhs.
3332 Returns true if anything is wrong. */
7e98624c
RG
3333
3334static bool
9f509004 3335verify_gimple_assign_unary (gimple stmt)
7e98624c 3336{
726a989a
RB
3337 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3338 tree lhs = gimple_assign_lhs (stmt);
726a989a 3339 tree lhs_type = TREE_TYPE (lhs);
9f509004 3340 tree rhs1 = gimple_assign_rhs1 (stmt);
726a989a 3341 tree rhs1_type = TREE_TYPE (rhs1);
7e98624c 3342
9f509004
RG
3343 if (!is_gimple_reg (lhs)
3344 && !(optimize == 0
3345 && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3346 {
3347 error ("non-register as LHS of unary operation");
3348 return true;
3349 }
3350
3351 if (!is_gimple_val (rhs1))
3352 {
3353 error ("invalid operand in unary operation");
3354 return true;
3355 }
3356
3357 /* First handle conversions. */
726a989a 3358 switch (rhs_code)
7e98624c 3359 {
1043771b 3360 CASE_CONVERT:
7e98624c 3361 {
7e98624c 3362 /* Allow conversions between integral types and pointers only if
9f509004
RG
3363 there is no sign or zero extension involved.
3364 For targets were the precision of sizetype doesn't match that
3365 of pointers we need to allow arbitrary conversions from and
3366 to sizetype. */
3367 if ((POINTER_TYPE_P (lhs_type)
3368 && INTEGRAL_TYPE_P (rhs1_type)
3369 && (TYPE_PRECISION (lhs_type) >= TYPE_PRECISION (rhs1_type)
3370 || rhs1_type == sizetype))
3371 || (POINTER_TYPE_P (rhs1_type)
3372 && INTEGRAL_TYPE_P (lhs_type)
3373 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
3374 || lhs_type == sizetype)))
7e98624c
RG
3375 return false;
3376
3377 /* Allow conversion from integer to offset type and vice versa. */
726a989a
RB
3378 if ((TREE_CODE (lhs_type) == OFFSET_TYPE
3379 && TREE_CODE (rhs1_type) == INTEGER_TYPE)
3380 || (TREE_CODE (lhs_type) == INTEGER_TYPE
3381 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
7e98624c
RG
3382 return false;
3383
3384 /* Otherwise assert we are converting between types of the
3385 same kind. */
726a989a 3386 if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
7e98624c
RG
3387 {
3388 error ("invalid types in nop conversion");
726a989a
RB
3389 debug_generic_expr (lhs_type);
3390 debug_generic_expr (rhs1_type);
7e98624c
RG
3391 return true;
3392 }
3393
3394 return false;
3395 }
3396
17d23165
RS
3397 case FIXED_CONVERT_EXPR:
3398 {
726a989a
RB
3399 if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3400 && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
17d23165
RS
3401 {
3402 error ("invalid types in fixed-point conversion");
726a989a
RB
3403 debug_generic_expr (lhs_type);
3404 debug_generic_expr (rhs1_type);
17d23165
RS
3405 return true;
3406 }
3407
3408 return false;
3409 }
3410
7e98624c
RG
3411 case FLOAT_EXPR:
3412 {
726a989a 3413 if (!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
7e98624c
RG
3414 {
3415 error ("invalid types in conversion to floating point");
726a989a
RB
3416 debug_generic_expr (lhs_type);
3417 debug_generic_expr (rhs1_type);
7e98624c
RG
3418 return true;
3419 }
726a989a 3420
7e98624c
RG
3421 return false;
3422 }
3423
3424 case FIX_TRUNC_EXPR:
3425 {
726a989a 3426 if (!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
7e98624c
RG
3427 {
3428 error ("invalid types in conversion to integer");
726a989a
RB
3429 debug_generic_expr (lhs_type);
3430 debug_generic_expr (rhs1_type);
7e98624c
RG
3431 return true;
3432 }
726a989a 3433
7e98624c
RG
3434 return false;
3435 }
3436
587aa063
RG
3437 case VEC_UNPACK_HI_EXPR:
3438 case VEC_UNPACK_LO_EXPR:
3439 case REDUC_MAX_EXPR:
3440 case REDUC_MIN_EXPR:
3441 case REDUC_PLUS_EXPR:
3442 case VEC_UNPACK_FLOAT_HI_EXPR:
3443 case VEC_UNPACK_FLOAT_LO_EXPR:
3444 /* FIXME. */
3445 return false;
9f509004 3446
587aa063 3447 case TRUTH_NOT_EXPR:
9f509004
RG
3448 case NEGATE_EXPR:
3449 case ABS_EXPR:
3450 case BIT_NOT_EXPR:
3451 case PAREN_EXPR:
3452 case NON_LVALUE_EXPR:
3453 case CONJ_EXPR:
9f509004
RG
3454 break;
3455
3456 default:
3457 gcc_unreachable ();
3458 }
3459
3460 /* For the remaining codes assert there is no conversion involved. */
3461 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3462 {
3463 error ("non-trivial conversion in unary operation");
3464 debug_generic_expr (lhs_type);
3465 debug_generic_expr (rhs1_type);
3466 return true;
3467 }
3468
3469 return false;
3470}
3471
3472/* Verify a gimple assignment statement STMT with a binary rhs.
3473 Returns true if anything is wrong. */
3474
3475static bool
3476verify_gimple_assign_binary (gimple stmt)
3477{
3478 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3479 tree lhs = gimple_assign_lhs (stmt);
3480 tree lhs_type = TREE_TYPE (lhs);
3481 tree rhs1 = gimple_assign_rhs1 (stmt);
3482 tree rhs1_type = TREE_TYPE (rhs1);
3483 tree rhs2 = gimple_assign_rhs2 (stmt);
3484 tree rhs2_type = TREE_TYPE (rhs2);
3485
3486 if (!is_gimple_reg (lhs)
3487 && !(optimize == 0
3488 && TREE_CODE (lhs_type) == COMPLEX_TYPE))
3489 {
3490 error ("non-register as LHS of binary operation");
3491 return true;
3492 }
726a989a 3493
9f509004
RG
3494 if (!is_gimple_val (rhs1)
3495 || !is_gimple_val (rhs2))
3496 {
3497 error ("invalid operands in binary operation");
3498 return true;
3499 }
3500
3501 /* First handle operations that involve different types. */
3502 switch (rhs_code)
3503 {
3504 case COMPLEX_EXPR:
3505 {
3506 if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3507 || !(INTEGRAL_TYPE_P (rhs1_type)
726a989a 3508 || SCALAR_FLOAT_TYPE_P (rhs1_type))
9f509004 3509 || !(INTEGRAL_TYPE_P (rhs2_type)
726a989a 3510 || SCALAR_FLOAT_TYPE_P (rhs2_type)))
7e98624c
RG
3511 {
3512 error ("type mismatch in complex expression");
726a989a
RB
3513 debug_generic_expr (lhs_type);
3514 debug_generic_expr (rhs1_type);
3515 debug_generic_expr (rhs2_type);
7e98624c
RG
3516 return true;
3517 }
726a989a 3518
7e98624c
RG
3519 return false;
3520 }
3521
7e98624c
RG
3522 case LSHIFT_EXPR:
3523 case RSHIFT_EXPR:
3524 case LROTATE_EXPR:
3525 case RROTATE_EXPR:
3526 {
587aa063
RG
3527 /* Shifts and rotates are ok on integral types, fixed point
3528 types and integer vector types. */
3529 if ((!INTEGRAL_TYPE_P (rhs1_type)
3530 && !FIXED_POINT_TYPE_P (rhs1_type)
3531 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3532 && TREE_CODE (TREE_TYPE (rhs1_type)) == INTEGER_TYPE))
3533 || (!INTEGRAL_TYPE_P (rhs2_type)
3534 /* Vector shifts of vectors are also ok. */
3535 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
3536 && TREE_CODE (TREE_TYPE (rhs1_type)) == INTEGER_TYPE
3537 && TREE_CODE (rhs2_type) == VECTOR_TYPE
3538 && TREE_CODE (TREE_TYPE (rhs2_type)) == INTEGER_TYPE))
726a989a 3539 || !useless_type_conversion_p (lhs_type, rhs1_type))
7e98624c
RG
3540 {
3541 error ("type mismatch in shift expression");
726a989a
RB
3542 debug_generic_expr (lhs_type);
3543 debug_generic_expr (rhs1_type);
3544 debug_generic_expr (rhs2_type);
7e98624c
RG
3545 return true;
3546 }
726a989a 3547
7e98624c
RG
3548 return false;
3549 }
3550
9f509004
RG
3551 case VEC_LSHIFT_EXPR:
3552 case VEC_RSHIFT_EXPR:
7e98624c 3553 {
9f509004 3554 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
0009b473
RS
3555 || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3556 || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type)))
9f509004
RG
3557 || (!INTEGRAL_TYPE_P (rhs2_type)
3558 && (TREE_CODE (rhs2_type) != VECTOR_TYPE
3559 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3560 || !useless_type_conversion_p (lhs_type, rhs1_type))
7e98624c 3561 {
9f509004
RG
3562 error ("type mismatch in vector shift expression");
3563 debug_generic_expr (lhs_type);
3564 debug_generic_expr (rhs1_type);
3565 debug_generic_expr (rhs2_type);
7e98624c
RG
3566 return true;
3567 }
726a989a 3568
9f509004 3569 return false;
7e98624c
RG
3570 }
3571
646bea10
RG
3572 case PLUS_EXPR:
3573 {
3574 /* We use regular PLUS_EXPR for vectors.
3575 ??? This just makes the checker happy and may not be what is
3576 intended. */
3577 if (TREE_CODE (lhs_type) == VECTOR_TYPE
3578 && POINTER_TYPE_P (TREE_TYPE (lhs_type)))
3579 {
3580 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3581 || TREE_CODE (rhs2_type) != VECTOR_TYPE)
3582 {
3583 error ("invalid non-vector operands to vector valued plus");
3584 return true;
3585 }
3586 lhs_type = TREE_TYPE (lhs_type);
3587 rhs1_type = TREE_TYPE (rhs1_type);
3588 rhs2_type = TREE_TYPE (rhs2_type);
3589 /* PLUS_EXPR is commutative, so we might end up canonicalizing
3590 the pointer to 2nd place. */
3591 if (POINTER_TYPE_P (rhs2_type))
3592 {
3593 tree tem = rhs1_type;
3594 rhs1_type = rhs2_type;
3595 rhs2_type = tem;
3596 }
3597 goto do_pointer_plus_expr_check;
3598 }
3599 }
3600 /* Fallthru. */
3601 case MINUS_EXPR:
3602 {
3603 if (POINTER_TYPE_P (lhs_type)
3604 || POINTER_TYPE_P (rhs1_type)
3605 || POINTER_TYPE_P (rhs2_type))
3606 {
3607 error ("invalid (pointer) operands to plus/minus");
3608 return true;
3609 }
3610
3611 /* Continue with generic binary expression handling. */
3612 break;
3613 }
3614
7e98624c
RG
3615 case POINTER_PLUS_EXPR:
3616 {
646bea10 3617do_pointer_plus_expr_check:
726a989a
RB
3618 if (!POINTER_TYPE_P (rhs1_type)
3619 || !useless_type_conversion_p (lhs_type, rhs1_type)
3620 || !useless_type_conversion_p (sizetype, rhs2_type))
7e98624c
RG
3621 {
3622 error ("type mismatch in pointer plus expression");
726a989a
RB
3623 debug_generic_stmt (lhs_type);
3624 debug_generic_stmt (rhs1_type);
3625 debug_generic_stmt (rhs2_type);
7e98624c
RG
3626 return true;
3627 }
7e98624c 3628
726a989a
RB
3629 return false;
3630 }
7e98624c 3631
7e98624c
RG
3632 case TRUTH_ANDIF_EXPR:
3633 case TRUTH_ORIF_EXPR:
2893f753
RAE
3634 gcc_unreachable ();
3635
7e98624c
RG
3636 case TRUTH_AND_EXPR:
3637 case TRUTH_OR_EXPR:
3638 case TRUTH_XOR_EXPR:
3639 {
7e98624c 3640 /* We allow any kind of integral typed argument and result. */
726a989a
RB
3641 if (!INTEGRAL_TYPE_P (rhs1_type)
3642 || !INTEGRAL_TYPE_P (rhs2_type)
3643 || !INTEGRAL_TYPE_P (lhs_type))
7e98624c
RG
3644 {
3645 error ("type mismatch in binary truth expression");
726a989a
RB
3646 debug_generic_expr (lhs_type);
3647 debug_generic_expr (rhs1_type);
3648 debug_generic_expr (rhs2_type);
7e98624c
RG
3649 return true;
3650 }
3651
3652 return false;
3653 }
3654
9f509004
RG
3655 case LT_EXPR:
3656 case LE_EXPR:
3657 case GT_EXPR:
3658 case GE_EXPR:
3659 case EQ_EXPR:
3660 case NE_EXPR:
3661 case UNORDERED_EXPR:
3662 case ORDERED_EXPR:
3663 case UNLT_EXPR:
3664 case UNLE_EXPR:
3665 case UNGT_EXPR:
3666 case UNGE_EXPR:
3667 case UNEQ_EXPR:
3668 case LTGT_EXPR:
3669 /* Comparisons are also binary, but the result type is not
3670 connected to the operand types. */
3671 return verify_gimple_comparison (lhs_type, rhs1, rhs2);
7e98624c 3672
587aa063
RG
3673 case WIDEN_SUM_EXPR:
3674 case WIDEN_MULT_EXPR:
3675 case VEC_WIDEN_MULT_HI_EXPR:
3676 case VEC_WIDEN_MULT_LO_EXPR:
3677 case VEC_PACK_TRUNC_EXPR:
3678 case VEC_PACK_SAT_EXPR:
3679 case VEC_PACK_FIX_TRUNC_EXPR:
3680 case VEC_EXTRACT_EVEN_EXPR:
3681 case VEC_EXTRACT_ODD_EXPR:
3682 case VEC_INTERLEAVE_HIGH_EXPR:
3683 case VEC_INTERLEAVE_LOW_EXPR:
3684 /* FIXME. */
3685 return false;
3686
9f509004
RG
3687 case MULT_EXPR:
3688 case TRUNC_DIV_EXPR:
3689 case CEIL_DIV_EXPR:
3690 case FLOOR_DIV_EXPR:
3691 case ROUND_DIV_EXPR:
3692 case TRUNC_MOD_EXPR:
3693 case CEIL_MOD_EXPR:
3694 case FLOOR_MOD_EXPR:
3695 case ROUND_MOD_EXPR:
3696 case RDIV_EXPR:
3697 case EXACT_DIV_EXPR:
3698 case MIN_EXPR:
3699 case MAX_EXPR:
3700 case BIT_IOR_EXPR:
3701 case BIT_XOR_EXPR:
3702 case BIT_AND_EXPR:
9f509004
RG
3703 /* Continue with generic binary expression handling. */
3704 break;
7e98624c 3705
9f509004
RG
3706 default:
3707 gcc_unreachable ();
3708 }
b691d4b0 3709
9f509004
RG
3710 if (!useless_type_conversion_p (lhs_type, rhs1_type)
3711 || !useless_type_conversion_p (lhs_type, rhs2_type))
3712 {
3713 error ("type mismatch in binary expression");
3714 debug_generic_stmt (lhs_type);
3715 debug_generic_stmt (rhs1_type);
3716 debug_generic_stmt (rhs2_type);
3717 return true;
3718 }
3719
3720 return false;
3721}
3722
3723/* Verify a gimple assignment statement STMT with a single rhs.
3724 Returns true if anything is wrong. */
3725
3726static bool
3727verify_gimple_assign_single (gimple stmt)
3728{
3729 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3730 tree lhs = gimple_assign_lhs (stmt);
3731 tree lhs_type = TREE_TYPE (lhs);
3732 tree rhs1 = gimple_assign_rhs1 (stmt);
3733 tree rhs1_type = TREE_TYPE (rhs1);
3734 bool res = false;
3735
3736 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3737 {
3738 error ("non-trivial conversion at assignment");
3739 debug_generic_expr (lhs_type);
3740 debug_generic_expr (rhs1_type);
3741 return true;
7e98624c
RG
3742 }
3743
9f509004
RG
3744 if (handled_component_p (lhs))
3745 res |= verify_types_in_gimple_reference (lhs);
3746
3747 /* Special codes we cannot handle via their class. */
3748 switch (rhs_code)
7e98624c 3749 {
9f509004
RG
3750 case ADDR_EXPR:
3751 {
3752 tree op = TREE_OPERAND (rhs1, 0);
3753 if (!is_gimple_addressable (op))
3754 {
3755 error ("invalid operand in unary expression");
3756 return true;
3757 }
f5e85907 3758
22a65a54
RG
3759 if (!one_pointer_to_useless_type_conversion_p (lhs_type,
3760 TREE_TYPE (op)))
9f509004
RG
3761 {
3762 error ("type mismatch in address expression");
3763 debug_generic_stmt (lhs_type);
3764 debug_generic_stmt (TYPE_POINTER_TO (TREE_TYPE (op)));
3765 return true;
3766 }
3767
3768 return verify_types_in_gimple_reference (op);
3769 }
3770
3771 /* tcc_reference */
3772 case COMPONENT_REF:
3773 case BIT_FIELD_REF:
3774 case INDIRECT_REF:
3775 case ALIGN_INDIRECT_REF:
3776 case MISALIGNED_INDIRECT_REF:
3777 case ARRAY_REF:
3778 case ARRAY_RANGE_REF:
3779 case VIEW_CONVERT_EXPR:
3780 case REALPART_EXPR:
3781 case IMAGPART_EXPR:
3782 case TARGET_MEM_REF:
3783 if (!is_gimple_reg (lhs)
3784 && is_gimple_reg_type (TREE_TYPE (lhs)))
f5e85907 3785 {
9f509004
RG
3786 error ("invalid rhs for gimple memory store");
3787 debug_generic_stmt (lhs);
3788 debug_generic_stmt (rhs1);
726a989a
RB
3789 return true;
3790 }
9f509004 3791 return res || verify_types_in_gimple_reference (rhs1);
7e98624c 3792
9f509004
RG
3793 /* tcc_constant */
3794 case SSA_NAME:
3795 case INTEGER_CST:
3796 case REAL_CST:
3797 case FIXED_CST:
3798 case COMPLEX_CST:
3799 case VECTOR_CST:
3800 case STRING_CST:
3801 return res;
3802
3803 /* tcc_declaration */
3804 case CONST_DECL:
3805 return res;
3806 case VAR_DECL:
3807 case PARM_DECL:
3808 if (!is_gimple_reg (lhs)
3809 && !is_gimple_reg (rhs1)
3810 && is_gimple_reg_type (TREE_TYPE (lhs)))
2f9864e6 3811 {
9f509004
RG
3812 error ("invalid rhs for gimple memory store");
3813 debug_generic_stmt (lhs);
3814 debug_generic_stmt (rhs1);
2f9864e6
RG
3815 return true;
3816 }
9f509004 3817 return res;
7e98624c 3818
9f509004
RG
3819 case COND_EXPR:
3820 case CONSTRUCTOR:
3821 case OBJ_TYPE_REF:
3822 case ASSERT_EXPR:
3823 case WITH_SIZE_EXPR:
3824 case EXC_PTR_EXPR:
3825 case FILTER_EXPR:
3826 case POLYNOMIAL_CHREC:
3827 case DOT_PROD_EXPR:
3828 case VEC_COND_EXPR:
3829 case REALIGN_LOAD_EXPR:
3830 /* FIXME. */
3831 return res;
7e98624c 3832
726a989a 3833 default:;
7e98624c
RG
3834 }
3835
9f509004 3836 return res;
7e98624c
RG
3837}
3838
9f509004
RG
3839/* Verify the contents of a GIMPLE_ASSIGN STMT. Returns true when there
3840 is a problem, otherwise false. */
3841
3842static bool
3843verify_gimple_assign (gimple stmt)
3844{
3845 switch (gimple_assign_rhs_class (stmt))
3846 {
3847 case GIMPLE_SINGLE_RHS:
3848 return verify_gimple_assign_single (stmt);
3849
3850 case GIMPLE_UNARY_RHS:
3851 return verify_gimple_assign_unary (stmt);
3852
3853 case GIMPLE_BINARY_RHS:
3854 return verify_gimple_assign_binary (stmt);
3855
3856 default:
3857 gcc_unreachable ();
3858 }
3859}
726a989a
RB
3860
3861/* Verify the contents of a GIMPLE_RETURN STMT. Returns true when there
3862 is a problem, otherwise false. */
7e98624c
RG
3863
3864static bool
b59d3976 3865verify_gimple_return (gimple stmt)
7e98624c 3866{
726a989a 3867 tree op = gimple_return_retval (stmt);
b59d3976 3868 tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
726a989a 3869
b59d3976
RG
3870 /* We cannot test for present return values as we do not fix up missing
3871 return values from the original source. */
726a989a
RB
3872 if (op == NULL)
3873 return false;
b59d3976
RG
3874
3875 if (!is_gimple_val (op)
3876 && TREE_CODE (op) != RESULT_DECL)
3877 {
3878 error ("invalid operand in return statement");
3879 debug_generic_stmt (op);
3880 return true;
3881 }
3882
3883 if (!useless_type_conversion_p (restype, TREE_TYPE (op))
3884 /* ??? With C++ we can have the situation that the result
3885 decl is a reference type while the return type is an aggregate. */
3886 && !(TREE_CODE (op) == RESULT_DECL
3887 && TREE_CODE (TREE_TYPE (op)) == REFERENCE_TYPE
3888 && useless_type_conversion_p (restype, TREE_TYPE (TREE_TYPE (op)))))
3889 {
3890 error ("invalid conversion in return statement");
3891 debug_generic_stmt (restype);
3892 debug_generic_stmt (TREE_TYPE (op));
3893 return true;
3894 }
3895
3896 return false;
726a989a 3897}
7e98624c 3898
7e98624c 3899
b59d3976
RG
3900/* Verify the contents of a GIMPLE_GOTO STMT. Returns true when there
3901 is a problem, otherwise false. */
3902
3903static bool
3904verify_gimple_goto (gimple stmt)
3905{
3906 tree dest = gimple_goto_dest (stmt);
3907
3908 /* ??? We have two canonical forms of direct goto destinations, a
3909 bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL. */
3910 if (TREE_CODE (dest) != LABEL_DECL
3911 && (!is_gimple_val (dest)
3912 || !POINTER_TYPE_P (TREE_TYPE (dest))))
3913 {
3914 error ("goto destination is neither a label nor a pointer");
3915 return true;
3916 }
3917
3918 return false;
3919}
3920
726a989a
RB
3921/* Verify the contents of a GIMPLE_SWITCH STMT. Returns true when there
3922 is a problem, otherwise false. */
3923
3924static bool
b59d3976 3925verify_gimple_switch (gimple stmt)
726a989a
RB
3926{
3927 if (!is_gimple_val (gimple_switch_index (stmt)))
7e98624c 3928 {
726a989a 3929 error ("invalid operand to switch statement");
b59d3976 3930 debug_generic_stmt (gimple_switch_index (stmt));
7e98624c
RG
3931 return true;
3932 }
3933
726a989a
RB
3934 return false;
3935}
7e98624c 3936
7e98624c 3937
726a989a
RB
3938/* Verify the contents of a GIMPLE_PHI. Returns true if there is a problem,
3939 and false otherwise. */
7e98624c 3940
726a989a 3941static bool
b59d3976 3942verify_gimple_phi (gimple stmt)
726a989a 3943{
b59d3976
RG
3944 tree type = TREE_TYPE (gimple_phi_result (stmt));
3945 unsigned i;
7e98624c 3946
b59d3976
RG
3947 if (!is_gimple_variable (gimple_phi_result (stmt)))
3948 {
3949 error ("Invalid PHI result");
3950 return true;
3951 }
7e98624c 3952
726a989a 3953 for (i = 0; i < gimple_phi_num_args (stmt); i++)
b59d3976
RG
3954 {
3955 tree arg = gimple_phi_arg_def (stmt, i);
9f509004
RG
3956 if ((is_gimple_reg (gimple_phi_result (stmt))
3957 && !is_gimple_val (arg))
3958 || (!is_gimple_reg (gimple_phi_result (stmt))
3959 && !is_gimple_addressable (arg)))
b59d3976
RG
3960 {
3961 error ("Invalid PHI argument");
3962 debug_generic_stmt (arg);
3963 return true;
3964 }
3965 if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
3966 {
587aa063 3967 error ("Incompatible types in PHI argument %u", i);
b59d3976
RG
3968 debug_generic_stmt (type);
3969 debug_generic_stmt (TREE_TYPE (arg));
3970 return true;
3971 }
3972 }
726a989a 3973
7e98624c
RG
3974 return false;
3975}
3976
726a989a 3977
7e98624c
RG
3978/* Verify the GIMPLE statement STMT. Returns true if there is an
3979 error, otherwise false. */
3980
3981static bool
726a989a 3982verify_types_in_gimple_stmt (gimple stmt)
7e98624c 3983{
726a989a 3984 if (is_gimple_omp (stmt))
7e98624c
RG
3985 {
3986 /* OpenMP directives are validated by the FE and never operated
726a989a 3987 on by the optimizers. Furthermore, GIMPLE_OMP_FOR may contain
7e98624c
RG
3988 non-gimple expressions when the main index variable has had
3989 its address taken. This does not affect the loop itself
726a989a 3990 because the header of an GIMPLE_OMP_FOR is merely used to determine
7e98624c
RG
3991 how to setup the parallel iteration. */
3992 return false;
3993 }
3994
726a989a 3995 switch (gimple_code (stmt))
7e98624c 3996 {
726a989a 3997 case GIMPLE_ASSIGN:
9f509004 3998 return verify_gimple_assign (stmt);
7e98624c 3999
726a989a
RB
4000 case GIMPLE_LABEL:
4001 return TREE_CODE (gimple_label_label (stmt)) != LABEL_DECL;
7e98624c 4002
726a989a 4003 case GIMPLE_CALL:
b59d3976 4004 return verify_gimple_call (stmt);
7e98624c 4005
726a989a 4006 case GIMPLE_COND:
b59d3976
RG
4007 return verify_gimple_comparison (boolean_type_node,
4008 gimple_cond_lhs (stmt),
4009 gimple_cond_rhs (stmt));
7e98624c 4010
726a989a 4011 case GIMPLE_GOTO:
b59d3976 4012 return verify_gimple_goto (stmt);
7e98624c 4013
726a989a 4014 case GIMPLE_SWITCH:
b59d3976 4015 return verify_gimple_switch (stmt);
7e98624c 4016
726a989a 4017 case GIMPLE_RETURN:
b59d3976 4018 return verify_gimple_return (stmt);
7e98624c 4019
726a989a 4020 case GIMPLE_ASM:
7e98624c
RG
4021 return false;
4022
726a989a 4023 case GIMPLE_CHANGE_DYNAMIC_TYPE:
9f509004 4024 return (!is_gimple_val (gimple_cdt_location (stmt))
b59d3976 4025 || !POINTER_TYPE_P (TREE_TYPE (gimple_cdt_location (stmt))));
726a989a
RB
4026
4027 case GIMPLE_PHI:
b59d3976
RG
4028 return verify_gimple_phi (stmt);
4029
4030 /* Tuples that do not have tree operands. */
4031 case GIMPLE_NOP:
4032 case GIMPLE_RESX:
4033 case GIMPLE_PREDICT:
4034 return false;
726a989a 4035
7e98624c
RG
4036 default:
4037 gcc_unreachable ();
4038 }
4039}
4040
726a989a 4041/* Verify the GIMPLE statements inside the sequence STMTS. */
7e98624c 4042
7dc83ebc 4043static bool
726a989a 4044verify_types_in_gimple_seq_2 (gimple_seq stmts)
7e98624c 4045{
726a989a 4046 gimple_stmt_iterator ittr;
7dc83ebc 4047 bool err = false;
7e98624c 4048
726a989a 4049 for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
7e98624c 4050 {
726a989a 4051 gimple stmt = gsi_stmt (ittr);
7e98624c 4052
726a989a
RB
4053 switch (gimple_code (stmt))
4054 {
b59d3976
RG
4055 case GIMPLE_BIND:
4056 err |= verify_types_in_gimple_seq_2 (gimple_bind_body (stmt));
4057 break;
4058
4059 case GIMPLE_TRY:
4060 err |= verify_types_in_gimple_seq_2 (gimple_try_eval (stmt));
4061 err |= verify_types_in_gimple_seq_2 (gimple_try_cleanup (stmt));
4062 break;
4063
4064 case GIMPLE_EH_FILTER:
4065 err |= verify_types_in_gimple_seq_2 (gimple_eh_filter_failure (stmt));
4066 break;
4067
4068 case GIMPLE_CATCH:
4069 err |= verify_types_in_gimple_seq_2 (gimple_catch_handler (stmt));
4070 break;
7e98624c
RG
4071
4072 default:
7dc83ebc 4073 {
726a989a 4074 bool err2 = verify_types_in_gimple_stmt (stmt);
7dc83ebc 4075 if (err2)
726a989a 4076 debug_gimple_stmt (stmt);
7dc83ebc
RG
4077 err |= err2;
4078 }
7e98624c
RG
4079 }
4080 }
7dc83ebc
RG
4081
4082 return err;
4083}
4084
4085
4086/* Verify the GIMPLE statements inside the statement list STMTS. */
4087
4088void
726a989a 4089verify_types_in_gimple_seq (gimple_seq stmts)
7dc83ebc 4090{
726a989a 4091 if (verify_types_in_gimple_seq_2 (stmts))
7dc83ebc 4092 internal_error ("verify_gimple failed");
7e98624c
RG
4093}
4094
6de9cd9a
DN
4095
4096/* Verify STMT, return true if STMT is not in GIMPLE form.
4097 TODO: Implement type checking. */
4098
4099static bool
726a989a 4100verify_stmt (gimple_stmt_iterator *gsi)
6de9cd9a
DN
4101{
4102 tree addr;
726a989a
RB
4103 struct walk_stmt_info wi;
4104 bool last_in_block = gsi_one_before_end_p (*gsi);
4105 gimple stmt = gsi_stmt (*gsi);
6de9cd9a 4106
726a989a 4107 if (is_gimple_omp (stmt))
50674e96
DN
4108 {
4109 /* OpenMP directives are validated by the FE and never operated
726a989a 4110 on by the optimizers. Furthermore, GIMPLE_OMP_FOR may contain
50674e96
DN
4111 non-gimple expressions when the main index variable has had
4112 its address taken. This does not affect the loop itself
726a989a 4113 because the header of an GIMPLE_OMP_FOR is merely used to determine
50674e96
DN
4114 how to setup the parallel iteration. */
4115 return false;
4116 }
4117
726a989a
RB
4118 /* FIXME. The C frontend passes unpromoted arguments in case it
4119 didn't see a function declaration before the call. */
4120 if (is_gimple_call (stmt))
6de9cd9a 4121 {
7c9577be 4122 tree decl;
726a989a 4123
7c9577be
RG
4124 if (!is_gimple_call_addr (gimple_call_fn (stmt)))
4125 {
4126 error ("invalid function in call statement");
4127 return true;
4128 }
4129
4130 decl = gimple_call_fndecl (stmt);
4131 if (decl
4132 && TREE_CODE (decl) == FUNCTION_DECL
726a989a
RB
4133 && DECL_LOOPING_CONST_OR_PURE_P (decl)
4134 && (!DECL_PURE_P (decl))
4135 && (!TREE_READONLY (decl)))
4136 {
4137 error ("invalid pure const state for function");
4138 return true;
4139 }
6de9cd9a
DN
4140 }
4141
726a989a
RB
4142 memset (&wi, 0, sizeof (wi));
4143 addr = walk_gimple_op (gsi_stmt (*gsi), verify_expr, &wi);
6de9cd9a
DN
4144 if (addr)
4145 {
726a989a 4146 debug_generic_expr (addr);
1f5b3869 4147 inform (input_location, "in statement");
726a989a 4148 debug_gimple_stmt (stmt);
6de9cd9a
DN
4149 return true;
4150 }
4151
1eaba2f2
RH
4152 /* If the statement is marked as part of an EH region, then it is
4153 expected that the statement could throw. Verify that when we
4154 have optimizations that simplify statements such that we prove
4155 that they cannot throw, that we update other data structures
4156 to match. */
4157 if (lookup_stmt_eh_region (stmt) >= 0)
4158 {
2505c5ed
JH
4159 /* During IPA passes, ipa-pure-const sets nothrow flags on calls
4160 and they are updated on statements only after fixup_cfg
4161 is executed at beggining of expansion stage. */
4162 if (!stmt_could_throw_p (stmt) && cgraph_state != CGRAPH_STATE_IPA_SSA)
1eaba2f2 4163 {
ab532386 4164 error ("statement marked for throw, but doesn%'t");
1eaba2f2
RH
4165 goto fail;
4166 }
726a989a 4167 if (!last_in_block && stmt_can_throw_internal (stmt))
1eaba2f2 4168 {
ab532386 4169 error ("statement marked for throw in middle of block");
1eaba2f2
RH
4170 goto fail;
4171 }
4172 }
4173
6de9cd9a 4174 return false;
1eaba2f2
RH
4175
4176 fail:
726a989a 4177 debug_gimple_stmt (stmt);
1eaba2f2 4178 return true;
6de9cd9a
DN
4179}
4180
4181
4182/* Return true when the T can be shared. */
4183
4184static bool
4185tree_node_can_be_shared (tree t)
4186{
6615c446 4187 if (IS_TYPE_OR_DECL_P (t)
6de9cd9a 4188 || is_gimple_min_invariant (t)
5e23162d 4189 || TREE_CODE (t) == SSA_NAME
953ff289
DN
4190 || t == error_mark_node
4191 || TREE_CODE (t) == IDENTIFIER_NODE)
6de9cd9a
DN
4192 return true;
4193
92b6dff3
JL
4194 if (TREE_CODE (t) == CASE_LABEL_EXPR)
4195 return true;
4196
44de5aeb 4197 while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
953ff289
DN
4198 && is_gimple_min_invariant (TREE_OPERAND (t, 1)))
4199 || TREE_CODE (t) == COMPONENT_REF
4200 || TREE_CODE (t) == REALPART_EXPR
4201 || TREE_CODE (t) == IMAGPART_EXPR)
6de9cd9a
DN
4202 t = TREE_OPERAND (t, 0);
4203
4204 if (DECL_P (t))
4205 return true;
4206
4207 return false;
4208}
4209
4210
726a989a 4211/* Called via walk_gimple_stmt. Verify tree sharing. */
6de9cd9a
DN
4212
4213static tree
726a989a 4214verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
6de9cd9a 4215{
726a989a
RB
4216 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4217 struct pointer_set_t *visited = (struct pointer_set_t *) wi->info;
6de9cd9a
DN
4218
4219 if (tree_node_can_be_shared (*tp))
4220 {
4221 *walk_subtrees = false;
4222 return NULL;
4223 }
4224
4437b50d
JH
4225 if (pointer_set_insert (visited, *tp))
4226 return *tp;
6de9cd9a
DN
4227
4228 return NULL;
4229}
4230
4231
4437b50d
JH
4232static bool eh_error_found;
4233static int
4234verify_eh_throw_stmt_node (void **slot, void *data)
4235{
4236 struct throw_stmt_node *node = (struct throw_stmt_node *)*slot;
4237 struct pointer_set_t *visited = (struct pointer_set_t *) data;
4238
4239 if (!pointer_set_contains (visited, node->stmt))
4240 {
4241 error ("Dead STMT in EH table");
726a989a 4242 debug_gimple_stmt (node->stmt);
4437b50d
JH
4243 eh_error_found = true;
4244 }
c13edb67 4245 return 1;
4437b50d
JH
4246}
4247
726a989a
RB
4248
4249/* Verify the GIMPLE statements in every basic block. */
6de9cd9a
DN
4250
4251void
4252verify_stmts (void)
4253{
4254 basic_block bb;
726a989a 4255 gimple_stmt_iterator gsi;
6de9cd9a 4256 bool err = false;
4437b50d 4257 struct pointer_set_t *visited, *visited_stmts;
6de9cd9a 4258 tree addr;
726a989a 4259 struct walk_stmt_info wi;
6de9cd9a
DN
4260
4261 timevar_push (TV_TREE_STMT_VERIFY);
4437b50d
JH
4262 visited = pointer_set_create ();
4263 visited_stmts = pointer_set_create ();
6de9cd9a 4264
726a989a
RB
4265 memset (&wi, 0, sizeof (wi));
4266 wi.info = (void *) visited;
4267
6de9cd9a
DN
4268 FOR_EACH_BB (bb)
4269 {
726a989a
RB
4270 gimple phi;
4271 size_t i;
6de9cd9a 4272
726a989a 4273 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4274 {
726a989a 4275 phi = gsi_stmt (gsi);
4437b50d 4276 pointer_set_insert (visited_stmts, phi);
726a989a 4277 if (gimple_bb (phi) != bb)
8de1fc1b 4278 {
726a989a 4279 error ("gimple_bb (phi) is set to a wrong basic block");
8de1fc1b
KH
4280 err |= true;
4281 }
4282
726a989a 4283 for (i = 0; i < gimple_phi_num_args (phi); i++)
6de9cd9a 4284 {
726a989a 4285 tree t = gimple_phi_arg_def (phi, i);
6de9cd9a
DN
4286 tree addr;
4287
e9705dc5
AO
4288 if (!t)
4289 {
4290 error ("missing PHI def");
726a989a 4291 debug_gimple_stmt (phi);
e9705dc5
AO
4292 err |= true;
4293 continue;
4294 }
6de9cd9a
DN
4295 /* Addressable variables do have SSA_NAMEs but they
4296 are not considered gimple values. */
e9705dc5
AO
4297 else if (TREE_CODE (t) != SSA_NAME
4298 && TREE_CODE (t) != FUNCTION_DECL
220f1c29 4299 && !is_gimple_min_invariant (t))
6de9cd9a 4300 {
726a989a
RB
4301 error ("PHI argument is not a GIMPLE value");
4302 debug_gimple_stmt (phi);
4303 debug_generic_expr (t);
6de9cd9a
DN
4304 err |= true;
4305 }
4306
4437b50d 4307 addr = walk_tree (&t, verify_node_sharing, visited, NULL);
6de9cd9a
DN
4308 if (addr)
4309 {
ab532386 4310 error ("incorrect sharing of tree nodes");
726a989a
RB
4311 debug_gimple_stmt (phi);
4312 debug_generic_expr (addr);
6de9cd9a
DN
4313 err |= true;
4314 }
4315 }
4316 }
4317
726a989a 4318 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
6de9cd9a 4319 {
726a989a
RB
4320 gimple stmt = gsi_stmt (gsi);
4321
4322 if (gimple_code (stmt) == GIMPLE_WITH_CLEANUP_EXPR
4323 || gimple_code (stmt) == GIMPLE_BIND)
4324 {
4325 error ("invalid GIMPLE statement");
4326 debug_gimple_stmt (stmt);
4327 err |= true;
4328 }
8de1fc1b 4329
4437b50d 4330 pointer_set_insert (visited_stmts, stmt);
07beea0d 4331
726a989a 4332 if (gimple_bb (stmt) != bb)
8de1fc1b 4333 {
726a989a 4334 error ("gimple_bb (stmt) is set to a wrong basic block");
8de1fc1b
KH
4335 err |= true;
4336 }
4337
726a989a
RB
4338 if (gimple_code (stmt) == GIMPLE_LABEL)
4339 {
4340 tree decl = gimple_label_label (stmt);
4341 int uid = LABEL_DECL_UID (decl);
4342
4343 if (uid == -1
4344 || VEC_index (basic_block, label_to_block_map, uid) != bb)
4345 {
4346 error ("incorrect entry in label_to_block_map.\n");
4347 err |= true;
4348 }
4349 }
4350
4351 err |= verify_stmt (&gsi);
4352 addr = walk_gimple_op (gsi_stmt (gsi), verify_node_sharing, &wi);
6de9cd9a
DN
4353 if (addr)
4354 {
ab532386 4355 error ("incorrect sharing of tree nodes");
726a989a
RB
4356 debug_gimple_stmt (stmt);
4357 debug_generic_expr (addr);
6de9cd9a
DN
4358 err |= true;
4359 }
726a989a 4360 gsi_next (&gsi);
6de9cd9a
DN
4361 }
4362 }
726a989a 4363
4437b50d
JH
4364 eh_error_found = false;
4365 if (get_eh_throw_stmt_table (cfun))
4366 htab_traverse (get_eh_throw_stmt_table (cfun),
4367 verify_eh_throw_stmt_node,
4368 visited_stmts);
6de9cd9a 4369
4437b50d 4370 if (err | eh_error_found)
ab532386 4371 internal_error ("verify_stmts failed");
6de9cd9a 4372
4437b50d
JH
4373 pointer_set_destroy (visited);
4374 pointer_set_destroy (visited_stmts);
6946b3f7 4375 verify_histograms ();
6de9cd9a
DN
4376 timevar_pop (TV_TREE_STMT_VERIFY);
4377}
4378
4379
4380/* Verifies that the flow information is OK. */
4381
4382static int
726a989a 4383gimple_verify_flow_info (void)
6de9cd9a
DN
4384{
4385 int err = 0;
4386 basic_block bb;
726a989a
RB
4387 gimple_stmt_iterator gsi;
4388 gimple stmt;
6de9cd9a 4389 edge e;
628f6a4e 4390 edge_iterator ei;
6de9cd9a 4391
726a989a 4392 if (ENTRY_BLOCK_PTR->il.gimple)
6de9cd9a 4393 {
7506e1cb 4394 error ("ENTRY_BLOCK has IL associated with it");
6de9cd9a
DN
4395 err = 1;
4396 }
4397
726a989a 4398 if (EXIT_BLOCK_PTR->il.gimple)
6de9cd9a 4399 {
7506e1cb 4400 error ("EXIT_BLOCK has IL associated with it");
6de9cd9a
DN
4401 err = 1;
4402 }
4403
628f6a4e 4404 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6de9cd9a
DN
4405 if (e->flags & EDGE_FALLTHRU)
4406 {
ab532386 4407 error ("fallthru to exit from bb %d", e->src->index);
6de9cd9a
DN
4408 err = 1;
4409 }
4410
4411 FOR_EACH_BB (bb)
4412 {
4413 bool found_ctrl_stmt = false;
4414
726a989a 4415 stmt = NULL;
548414c6 4416
6de9cd9a 4417 /* Skip labels on the start of basic block. */
726a989a 4418 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4419 {
726a989a
RB
4420 tree label;
4421 gimple prev_stmt = stmt;
548414c6 4422
726a989a 4423 stmt = gsi_stmt (gsi);
548414c6 4424
726a989a 4425 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a
DN
4426 break;
4427
726a989a
RB
4428 label = gimple_label_label (stmt);
4429 if (prev_stmt && DECL_NONLOCAL (label))
548414c6 4430 {
953ff289 4431 error ("nonlocal label ");
726a989a 4432 print_generic_expr (stderr, label, 0);
953ff289
DN
4433 fprintf (stderr, " is not first in a sequence of labels in bb %d",
4434 bb->index);
548414c6
KH
4435 err = 1;
4436 }
4437
726a989a 4438 if (label_to_block (label) != bb)
6de9cd9a 4439 {
953ff289 4440 error ("label ");
726a989a 4441 print_generic_expr (stderr, label, 0);
953ff289
DN
4442 fprintf (stderr, " to block does not match in bb %d",
4443 bb->index);
6de9cd9a
DN
4444 err = 1;
4445 }
4446
726a989a 4447 if (decl_function_context (label) != current_function_decl)
6de9cd9a 4448 {
953ff289 4449 error ("label ");
726a989a 4450 print_generic_expr (stderr, label, 0);
953ff289
DN
4451 fprintf (stderr, " has incorrect context in bb %d",
4452 bb->index);
6de9cd9a
DN
4453 err = 1;
4454 }
4455 }
4456
4457 /* Verify that body of basic block BB is free of control flow. */
726a989a 4458 for (; !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4459 {
726a989a 4460 gimple stmt = gsi_stmt (gsi);
6de9cd9a
DN
4461
4462 if (found_ctrl_stmt)
4463 {
ab532386 4464 error ("control flow in the middle of basic block %d",
6de9cd9a
DN
4465 bb->index);
4466 err = 1;
4467 }
4468
4469 if (stmt_ends_bb_p (stmt))
4470 found_ctrl_stmt = true;
4471
726a989a 4472 if (gimple_code (stmt) == GIMPLE_LABEL)
6de9cd9a 4473 {
953ff289 4474 error ("label ");
726a989a 4475 print_generic_expr (stderr, gimple_label_label (stmt), 0);
953ff289 4476 fprintf (stderr, " in the middle of basic block %d", bb->index);
6de9cd9a
DN
4477 err = 1;
4478 }
4479 }
953ff289 4480
726a989a
RB
4481 gsi = gsi_last_bb (bb);
4482 if (gsi_end_p (gsi))
6de9cd9a
DN
4483 continue;
4484
726a989a 4485 stmt = gsi_stmt (gsi);
6de9cd9a 4486
cc7220fd
JH
4487 err |= verify_eh_edges (stmt);
4488
6de9cd9a
DN
4489 if (is_ctrl_stmt (stmt))
4490 {
628f6a4e 4491 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
4492 if (e->flags & EDGE_FALLTHRU)
4493 {
ab532386 4494 error ("fallthru edge after a control statement in bb %d",
6de9cd9a
DN
4495 bb->index);
4496 err = 1;
4497 }
4498 }
4499
726a989a 4500 if (gimple_code (stmt) != GIMPLE_COND)
36b24193
ZD
4501 {
4502 /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
4503 after anything else but if statement. */
4504 FOR_EACH_EDGE (e, ei, bb->succs)
4505 if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
4506 {
726a989a 4507 error ("true/false edge after a non-GIMPLE_COND in bb %d",
36b24193
ZD
4508 bb->index);
4509 err = 1;
4510 }
4511 }
4512
726a989a 4513 switch (gimple_code (stmt))
6de9cd9a 4514 {
726a989a 4515 case GIMPLE_COND:
6de9cd9a
DN
4516 {
4517 edge true_edge;
4518 edge false_edge;
a9b77cd1 4519
6de9cd9a
DN
4520 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
4521
726a989a
RB
4522 if (!true_edge
4523 || !false_edge
6de9cd9a
DN
4524 || !(true_edge->flags & EDGE_TRUE_VALUE)
4525 || !(false_edge->flags & EDGE_FALSE_VALUE)
4526 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
4527 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
628f6a4e 4528 || EDGE_COUNT (bb->succs) >= 3)
6de9cd9a 4529 {
ab532386 4530 error ("wrong outgoing edge flags at end of bb %d",
6de9cd9a
DN
4531 bb->index);
4532 err = 1;
4533 }
6de9cd9a
DN
4534 }
4535 break;
4536
726a989a 4537 case GIMPLE_GOTO:
6de9cd9a
DN
4538 if (simple_goto_p (stmt))
4539 {
ab532386 4540 error ("explicit goto at end of bb %d", bb->index);
6531d1be 4541 err = 1;
6de9cd9a
DN
4542 }
4543 else
4544 {
6531d1be 4545 /* FIXME. We should double check that the labels in the
6de9cd9a 4546 destination blocks have their address taken. */
628f6a4e 4547 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
4548 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
4549 | EDGE_FALSE_VALUE))
4550 || !(e->flags & EDGE_ABNORMAL))
4551 {
ab532386 4552 error ("wrong outgoing edge flags at end of bb %d",
6de9cd9a
DN
4553 bb->index);
4554 err = 1;
4555 }
4556 }
4557 break;
4558
726a989a 4559 case GIMPLE_RETURN:
c5cbcccf
ZD
4560 if (!single_succ_p (bb)
4561 || (single_succ_edge (bb)->flags
4562 & (EDGE_FALLTHRU | EDGE_ABNORMAL
4563 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
6de9cd9a 4564 {
ab532386 4565 error ("wrong outgoing edge flags at end of bb %d", bb->index);
6de9cd9a
DN
4566 err = 1;
4567 }
c5cbcccf 4568 if (single_succ (bb) != EXIT_BLOCK_PTR)
6de9cd9a 4569 {
ab532386 4570 error ("return edge does not point to exit in bb %d",
6de9cd9a
DN
4571 bb->index);
4572 err = 1;
4573 }
4574 break;
4575
726a989a 4576 case GIMPLE_SWITCH:
6de9cd9a 4577 {
7853504d 4578 tree prev;
6de9cd9a
DN
4579 edge e;
4580 size_t i, n;
6de9cd9a 4581
726a989a 4582 n = gimple_switch_num_labels (stmt);
6de9cd9a
DN
4583
4584 /* Mark all the destination basic blocks. */
4585 for (i = 0; i < n; ++i)
4586 {
726a989a 4587 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
6de9cd9a 4588 basic_block label_bb = label_to_block (lab);
1e128c5f 4589 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
6de9cd9a
DN
4590 label_bb->aux = (void *)1;
4591 }
4592
7853504d 4593 /* Verify that the case labels are sorted. */
726a989a 4594 prev = gimple_switch_label (stmt, 0);
b7814a18 4595 for (i = 1; i < n; ++i)
7853504d 4596 {
726a989a
RB
4597 tree c = gimple_switch_label (stmt, i);
4598 if (!CASE_LOW (c))
7853504d 4599 {
726a989a
RB
4600 error ("found default case not at the start of "
4601 "case vector");
4602 err = 1;
7853504d
SB
4603 continue;
4604 }
726a989a
RB
4605 if (CASE_LOW (prev)
4606 && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
7853504d 4607 {
953ff289 4608 error ("case labels not sorted: ");
7853504d
SB
4609 print_generic_expr (stderr, prev, 0);
4610 fprintf (stderr," is greater than ");
4611 print_generic_expr (stderr, c, 0);
4612 fprintf (stderr," but comes before it.\n");
4613 err = 1;
4614 }
4615 prev = c;
4616 }
b7814a18
RG
4617 /* VRP will remove the default case if it can prove it will
4618 never be executed. So do not verify there always exists
4619 a default case here. */
7853504d 4620
628f6a4e 4621 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
4622 {
4623 if (!e->dest->aux)
4624 {
ab532386 4625 error ("extra outgoing edge %d->%d",
6de9cd9a
DN
4626 bb->index, e->dest->index);
4627 err = 1;
4628 }
726a989a 4629
6de9cd9a
DN
4630 e->dest->aux = (void *)2;
4631 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
4632 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
4633 {
ab532386 4634 error ("wrong outgoing edge flags at end of bb %d",
6de9cd9a
DN
4635 bb->index);
4636 err = 1;
4637 }
4638 }
4639
4640 /* Check that we have all of them. */
4641 for (i = 0; i < n; ++i)
4642 {
726a989a 4643 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
6de9cd9a
DN
4644 basic_block label_bb = label_to_block (lab);
4645
4646 if (label_bb->aux != (void *)2)
4647 {
726a989a 4648 error ("missing edge %i->%i", bb->index, label_bb->index);
6de9cd9a
DN
4649 err = 1;
4650 }
4651 }
4652
628f6a4e 4653 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
4654 e->dest->aux = (void *)0;
4655 }
4656
4657 default: ;
4658 }
4659 }
4660
2b28c07a 4661 if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
6de9cd9a
DN
4662 verify_dominators (CDI_DOMINATORS);
4663
4664 return err;
4665}
4666
4667
f0b698c1 4668/* Updates phi nodes after creating a forwarder block joined
6de9cd9a
DN
4669 by edge FALLTHRU. */
4670
4671static void
726a989a 4672gimple_make_forwarder_block (edge fallthru)
6de9cd9a
DN
4673{
4674 edge e;
628f6a4e 4675 edge_iterator ei;
6de9cd9a 4676 basic_block dummy, bb;
726a989a
RB
4677 tree var;
4678 gimple_stmt_iterator gsi;
6de9cd9a
DN
4679
4680 dummy = fallthru->src;
4681 bb = fallthru->dest;
4682
c5cbcccf 4683 if (single_pred_p (bb))
6de9cd9a
DN
4684 return;
4685
cfaab3a9 4686 /* If we redirected a branch we must create new PHI nodes at the
6de9cd9a 4687 start of BB. */
726a989a 4688 for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4689 {
726a989a
RB
4690 gimple phi, new_phi;
4691
4692 phi = gsi_stmt (gsi);
4693 var = gimple_phi_result (phi);
6de9cd9a
DN
4694 new_phi = create_phi_node (var, bb);
4695 SSA_NAME_DEF_STMT (var) = new_phi;
726a989a
RB
4696 gimple_phi_set_result (phi, make_ssa_name (SSA_NAME_VAR (var), phi));
4697 add_phi_arg (new_phi, gimple_phi_result (phi), fallthru);
6de9cd9a
DN
4698 }
4699
6de9cd9a 4700 /* Add the arguments we have stored on edges. */
628f6a4e 4701 FOR_EACH_EDGE (e, ei, bb->preds)
6de9cd9a
DN
4702 {
4703 if (e == fallthru)
4704 continue;
4705
71882046 4706 flush_pending_stmts (e);
6de9cd9a
DN
4707 }
4708}
4709
4710
6de9cd9a
DN
4711/* Return a non-special label in the head of basic block BLOCK.
4712 Create one if it doesn't exist. */
4713
d7621d3c 4714tree
726a989a 4715gimple_block_label (basic_block bb)
6de9cd9a 4716{
726a989a 4717 gimple_stmt_iterator i, s = gsi_start_bb (bb);
6de9cd9a 4718 bool first = true;
726a989a
RB
4719 tree label;
4720 gimple stmt;
6de9cd9a 4721
726a989a 4722 for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
6de9cd9a 4723 {
726a989a
RB
4724 stmt = gsi_stmt (i);
4725 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a 4726 break;
726a989a 4727 label = gimple_label_label (stmt);
6de9cd9a
DN
4728 if (!DECL_NONLOCAL (label))
4729 {
4730 if (!first)
726a989a 4731 gsi_move_before (&i, &s);
6de9cd9a
DN
4732 return label;
4733 }
4734 }
4735
4736 label = create_artificial_label ();
726a989a
RB
4737 stmt = gimple_build_label (label);
4738 gsi_insert_before (&s, stmt, GSI_NEW_STMT);
6de9cd9a
DN
4739 return label;
4740}
4741
4742
4743/* Attempt to perform edge redirection by replacing a possibly complex
4744 jump instruction by a goto or by removing the jump completely.
4745 This can apply only if all edges now point to the same block. The
4746 parameters and return values are equivalent to
4747 redirect_edge_and_branch. */
4748
4749static edge
726a989a 4750gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
6de9cd9a
DN
4751{
4752 basic_block src = e->src;
726a989a
RB
4753 gimple_stmt_iterator i;
4754 gimple stmt;
6de9cd9a 4755
07b43a87
KH
4756 /* We can replace or remove a complex jump only when we have exactly
4757 two edges. */
4758 if (EDGE_COUNT (src->succs) != 2
4759 /* Verify that all targets will be TARGET. Specifically, the
4760 edge that is not E must also go to TARGET. */
4761 || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
6de9cd9a
DN
4762 return NULL;
4763
726a989a
RB
4764 i = gsi_last_bb (src);
4765 if (gsi_end_p (i))
6de9cd9a 4766 return NULL;
6de9cd9a 4767
726a989a
RB
4768 stmt = gsi_stmt (i);
4769
4770 if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
6de9cd9a 4771 {
726a989a 4772 gsi_remove (&i, true);
6de9cd9a
DN
4773 e = ssa_redirect_edge (e, target);
4774 e->flags = EDGE_FALLTHRU;
4775 return e;
4776 }
4777
4778 return NULL;
4779}
4780
4781
4782/* Redirect E to DEST. Return NULL on failure. Otherwise, return the
4783 edge representing the redirected branch. */
4784
4785static edge
726a989a 4786gimple_redirect_edge_and_branch (edge e, basic_block dest)
6de9cd9a
DN
4787{
4788 basic_block bb = e->src;
726a989a 4789 gimple_stmt_iterator gsi;
6de9cd9a 4790 edge ret;
726a989a 4791 gimple stmt;
6de9cd9a 4792
4f6c2131 4793 if (e->flags & EDGE_ABNORMAL)
6de9cd9a
DN
4794 return NULL;
4795
6531d1be 4796 if (e->src != ENTRY_BLOCK_PTR
726a989a 4797 && (ret = gimple_try_redirect_by_replacing_jump (e, dest)))
6de9cd9a
DN
4798 return ret;
4799
4800 if (e->dest == dest)
4801 return NULL;
4802
726a989a
RB
4803 gsi = gsi_last_bb (bb);
4804 stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
6de9cd9a 4805
726a989a 4806 switch (stmt ? gimple_code (stmt) : ERROR_MARK)
6de9cd9a 4807 {
726a989a 4808 case GIMPLE_COND:
a9b77cd1 4809 /* For COND_EXPR, we only need to redirect the edge. */
6de9cd9a
DN
4810 break;
4811
726a989a 4812 case GIMPLE_GOTO:
6de9cd9a
DN
4813 /* No non-abnormal edges should lead from a non-simple goto, and
4814 simple ones should be represented implicitly. */
1e128c5f 4815 gcc_unreachable ();
6de9cd9a 4816
726a989a 4817 case GIMPLE_SWITCH:
6de9cd9a 4818 {
726a989a 4819 tree label = gimple_block_label (dest);
d6be0d7f 4820 tree cases = get_cases_for_edge (e, stmt);
6de9cd9a 4821
d6be0d7f
JL
4822 /* If we have a list of cases associated with E, then use it
4823 as it's a lot faster than walking the entire case vector. */
4824 if (cases)
6de9cd9a 4825 {
4edbbd3f 4826 edge e2 = find_edge (e->src, dest);
d6be0d7f
JL
4827 tree last, first;
4828
4829 first = cases;
4830 while (cases)
4831 {
4832 last = cases;
4833 CASE_LABEL (cases) = label;
4834 cases = TREE_CHAIN (cases);
4835 }
4836
4837 /* If there was already an edge in the CFG, then we need
4838 to move all the cases associated with E to E2. */
4839 if (e2)
4840 {
4841 tree cases2 = get_cases_for_edge (e2, stmt);
4842
4843 TREE_CHAIN (last) = TREE_CHAIN (cases2);
4844 TREE_CHAIN (cases2) = first;
4845 }
6de9cd9a 4846 }
92b6dff3
JL
4847 else
4848 {
726a989a 4849 size_t i, n = gimple_switch_num_labels (stmt);
d6be0d7f
JL
4850
4851 for (i = 0; i < n; i++)
4852 {
726a989a 4853 tree elt = gimple_switch_label (stmt, i);
d6be0d7f
JL
4854 if (label_to_block (CASE_LABEL (elt)) == e->dest)
4855 CASE_LABEL (elt) = label;
4856 }
92b6dff3 4857 }
d6be0d7f 4858
92b6dff3 4859 break;
6de9cd9a 4860 }
6de9cd9a 4861
726a989a
RB
4862 case GIMPLE_RETURN:
4863 gsi_remove (&gsi, true);
6de9cd9a
DN
4864 e->flags |= EDGE_FALLTHRU;
4865 break;
4866
726a989a
RB
4867 case GIMPLE_OMP_RETURN:
4868 case GIMPLE_OMP_CONTINUE:
4869 case GIMPLE_OMP_SECTIONS_SWITCH:
4870 case GIMPLE_OMP_FOR:
e5c95afe
ZD
4871 /* The edges from OMP constructs can be simply redirected. */
4872 break;
4873
6de9cd9a
DN
4874 default:
4875 /* Otherwise it must be a fallthru edge, and we don't need to
4876 do anything besides redirecting it. */
1e128c5f 4877 gcc_assert (e->flags & EDGE_FALLTHRU);
6de9cd9a
DN
4878 break;
4879 }
4880
4881 /* Update/insert PHI nodes as necessary. */
4882
4883 /* Now update the edges in the CFG. */
4884 e = ssa_redirect_edge (e, dest);
4885
4886 return e;
4887}
4888
14fa2cc0
ZD
4889/* Returns true if it is possible to remove edge E by redirecting
4890 it to the destination of the other edge from E->src. */
4891
4892static bool
726a989a 4893gimple_can_remove_branch_p (const_edge e)
14fa2cc0
ZD
4894{
4895 if (e->flags & EDGE_ABNORMAL)
4896 return false;
4897
4898 return true;
4899}
6de9cd9a
DN
4900
4901/* Simple wrapper, as we can always redirect fallthru edges. */
4902
4903static basic_block
726a989a 4904gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
6de9cd9a 4905{
726a989a 4906 e = gimple_redirect_edge_and_branch (e, dest);
1e128c5f 4907 gcc_assert (e);
6de9cd9a
DN
4908
4909 return NULL;
4910}
4911
4912
4913/* Splits basic block BB after statement STMT (but at least after the
4914 labels). If STMT is NULL, BB is split just after the labels. */
4915
4916static basic_block
726a989a 4917gimple_split_block (basic_block bb, void *stmt)
6de9cd9a 4918{
726a989a
RB
4919 gimple_stmt_iterator gsi;
4920 gimple_stmt_iterator gsi_tgt;
4921 gimple act;
4922 gimple_seq list;
6de9cd9a
DN
4923 basic_block new_bb;
4924 edge e;
628f6a4e 4925 edge_iterator ei;
6de9cd9a
DN
4926
4927 new_bb = create_empty_bb (bb);
4928
4929 /* Redirect the outgoing edges. */
628f6a4e
BE
4930 new_bb->succs = bb->succs;
4931 bb->succs = NULL;
4932 FOR_EACH_EDGE (e, ei, new_bb->succs)
6de9cd9a
DN
4933 e->src = new_bb;
4934
726a989a 4935 if (stmt && gimple_code ((gimple) stmt) == GIMPLE_LABEL)
6de9cd9a
DN
4936 stmt = NULL;
4937
726a989a
RB
4938 /* Move everything from GSI to the new basic block. */
4939 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4940 {
726a989a
RB
4941 act = gsi_stmt (gsi);
4942 if (gimple_code (act) == GIMPLE_LABEL)
6de9cd9a
DN
4943 continue;
4944
4945 if (!stmt)
4946 break;
4947
4948 if (stmt == act)
4949 {
726a989a 4950 gsi_next (&gsi);
6de9cd9a
DN
4951 break;
4952 }
4953 }
4954
726a989a 4955 if (gsi_end_p (gsi))
597ae074
JH
4956 return new_bb;
4957
4958 /* Split the statement list - avoid re-creating new containers as this
4959 brings ugly quadratic memory consumption in the inliner.
4960 (We are still quadratic since we need to update stmt BB pointers,
4961 sadly.) */
726a989a
RB
4962 list = gsi_split_seq_before (&gsi);
4963 set_bb_seq (new_bb, list);
4964 for (gsi_tgt = gsi_start (list);
4965 !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
4966 gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
6de9cd9a
DN
4967
4968 return new_bb;
4969}
4970
4971
4972/* Moves basic block BB after block AFTER. */
4973
4974static bool
726a989a 4975gimple_move_block_after (basic_block bb, basic_block after)
6de9cd9a
DN
4976{
4977 if (bb->prev_bb == after)
4978 return true;
4979
4980 unlink_block (bb);
4981 link_block (bb, after);
4982
4983 return true;
4984}
4985
4986
4987/* Return true if basic_block can be duplicated. */
4988
4989static bool
726a989a 4990gimple_can_duplicate_bb_p (const_basic_block bb ATTRIBUTE_UNUSED)
6de9cd9a
DN
4991{
4992 return true;
4993}
4994
6de9cd9a
DN
4995/* Create a duplicate of the basic block BB. NOTE: This does not
4996 preserve SSA form. */
4997
4998static basic_block
726a989a 4999gimple_duplicate_bb (basic_block bb)
6de9cd9a
DN
5000{
5001 basic_block new_bb;
726a989a
RB
5002 gimple_stmt_iterator gsi, gsi_tgt;
5003 gimple_seq phis = phi_nodes (bb);
5004 gimple phi, stmt, copy;
6de9cd9a
DN
5005
5006 new_bb = create_empty_bb (EXIT_BLOCK_PTR->prev_bb);
b0382c67 5007
84d65814
DN
5008 /* Copy the PHI nodes. We ignore PHI node arguments here because
5009 the incoming edges have not been setup yet. */
726a989a 5010 for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
b0382c67 5011 {
726a989a
RB
5012 phi = gsi_stmt (gsi);
5013 copy = create_phi_node (gimple_phi_result (phi), new_bb);
5014 create_new_def_for (gimple_phi_result (copy), copy,
5015 gimple_phi_result_ptr (copy));
b0382c67 5016 }
84d65814 5017
726a989a
RB
5018 gsi_tgt = gsi_start_bb (new_bb);
5019 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 5020 {
84d65814
DN
5021 def_operand_p def_p;
5022 ssa_op_iter op_iter;
cc7220fd 5023 int region;
6de9cd9a 5024
726a989a
RB
5025 stmt = gsi_stmt (gsi);
5026 if (gimple_code (stmt) == GIMPLE_LABEL)
6de9cd9a
DN
5027 continue;
5028
84d65814
DN
5029 /* Create a new copy of STMT and duplicate STMT's virtual
5030 operands. */
726a989a
RB
5031 copy = gimple_copy (stmt);
5032 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
cc7220fd
JH
5033 region = lookup_stmt_eh_region (stmt);
5034 if (region >= 0)
5035 add_stmt_to_eh_region (copy, region);
6946b3f7 5036 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
84d65814
DN
5037
5038 /* Create new names for all the definitions created by COPY and
5039 add replacement mappings for each new name. */
5040 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
5041 create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
6de9cd9a
DN
5042 }
5043
5044 return new_bb;
5045}
5046
5f40b3cb
ZD
5047/* Adds phi node arguments for edge E_COPY after basic block duplication. */
5048
5049static void
5050add_phi_args_after_copy_edge (edge e_copy)
5051{
5052 basic_block bb, bb_copy = e_copy->src, dest;
5053 edge e;
5054 edge_iterator ei;
726a989a
RB
5055 gimple phi, phi_copy;
5056 tree def;
5057 gimple_stmt_iterator psi, psi_copy;
5f40b3cb 5058
726a989a 5059 if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
5f40b3cb
ZD
5060 return;
5061
5062 bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
5063
5064 if (e_copy->dest->flags & BB_DUPLICATED)
5065 dest = get_bb_original (e_copy->dest);
5066 else
5067 dest = e_copy->dest;
5068
5069 e = find_edge (bb, dest);
5070 if (!e)
5071 {
5072 /* During loop unrolling the target of the latch edge is copied.
5073 In this case we are not looking for edge to dest, but to
5074 duplicated block whose original was dest. */
5075 FOR_EACH_EDGE (e, ei, bb->succs)
5076 {
5077 if ((e->dest->flags & BB_DUPLICATED)
5078 && get_bb_original (e->dest) == dest)
5079 break;
5080 }
5081
5082 gcc_assert (e != NULL);
5083 }
5084
726a989a
RB
5085 for (psi = gsi_start_phis (e->dest),
5086 psi_copy = gsi_start_phis (e_copy->dest);
5087 !gsi_end_p (psi);
5088 gsi_next (&psi), gsi_next (&psi_copy))
5f40b3cb 5089 {
726a989a
RB
5090 phi = gsi_stmt (psi);
5091 phi_copy = gsi_stmt (psi_copy);
5f40b3cb
ZD
5092 def = PHI_ARG_DEF_FROM_EDGE (phi, e);
5093 add_phi_arg (phi_copy, def, e_copy);
5094 }
5095}
5096
84d65814 5097
42759f1e
ZD
5098/* Basic block BB_COPY was created by code duplication. Add phi node
5099 arguments for edges going out of BB_COPY. The blocks that were
6580ee77 5100 duplicated have BB_DUPLICATED set. */
42759f1e
ZD
5101
5102void
5103add_phi_args_after_copy_bb (basic_block bb_copy)
5104{
5f40b3cb 5105 edge e_copy;
726a989a 5106 edge_iterator ei;
42759f1e 5107
628f6a4e 5108 FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
42759f1e 5109 {
5f40b3cb 5110 add_phi_args_after_copy_edge (e_copy);
42759f1e
ZD
5111 }
5112}
5113
5114/* Blocks in REGION_COPY array of length N_REGION were created by
5115 duplication of basic blocks. Add phi node arguments for edges
5f40b3cb
ZD
5116 going from these blocks. If E_COPY is not NULL, also add
5117 phi node arguments for its destination.*/
42759f1e
ZD
5118
5119void
5f40b3cb
ZD
5120add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
5121 edge e_copy)
42759f1e
ZD
5122{
5123 unsigned i;
5124
5125 for (i = 0; i < n_region; i++)
6580ee77 5126 region_copy[i]->flags |= BB_DUPLICATED;
42759f1e
ZD
5127
5128 for (i = 0; i < n_region; i++)
5129 add_phi_args_after_copy_bb (region_copy[i]);
5f40b3cb
ZD
5130 if (e_copy)
5131 add_phi_args_after_copy_edge (e_copy);
42759f1e
ZD
5132
5133 for (i = 0; i < n_region; i++)
6580ee77 5134 region_copy[i]->flags &= ~BB_DUPLICATED;
42759f1e
ZD
5135}
5136
42759f1e
ZD
5137/* Duplicates a REGION (set of N_REGION basic blocks) with just a single
5138 important exit edge EXIT. By important we mean that no SSA name defined
5139 inside region is live over the other exit edges of the region. All entry
5140 edges to the region must go to ENTRY->dest. The edge ENTRY is redirected
5141 to the duplicate of the region. SSA form, dominance and loop information
5142 is updated. The new basic blocks are stored to REGION_COPY in the same
5143 order as they had in REGION, provided that REGION_COPY is not NULL.
5144 The function returns false if it is unable to copy the region,
5145 true otherwise. */
5146
5147bool
726a989a 5148gimple_duplicate_sese_region (edge entry, edge exit,
42759f1e
ZD
5149 basic_block *region, unsigned n_region,
5150 basic_block *region_copy)
5151{
66f97d31 5152 unsigned i;
42759f1e
ZD
5153 bool free_region_copy = false, copying_header = false;
5154 struct loop *loop = entry->dest->loop_father;
5155 edge exit_copy;
66f97d31 5156 VEC (basic_block, heap) *doms;
42759f1e 5157 edge redirected;
09bac500
JH
5158 int total_freq = 0, entry_freq = 0;
5159 gcov_type total_count = 0, entry_count = 0;
42759f1e
ZD
5160
5161 if (!can_copy_bbs_p (region, n_region))
5162 return false;
5163
5164 /* Some sanity checking. Note that we do not check for all possible
5165 missuses of the functions. I.e. if you ask to copy something weird,
5166 it will work, but the state of structures probably will not be
5167 correct. */
42759f1e
ZD
5168 for (i = 0; i < n_region; i++)
5169 {
5170 /* We do not handle subloops, i.e. all the blocks must belong to the
5171 same loop. */
5172 if (region[i]->loop_father != loop)
5173 return false;
5174
5175 if (region[i] != entry->dest
5176 && region[i] == loop->header)
5177 return false;
5178 }
5179
561e8a90 5180 set_loop_copy (loop, loop);
42759f1e
ZD
5181
5182 /* In case the function is used for loop header copying (which is the primary
5183 use), ensure that EXIT and its copy will be new latch and entry edges. */
5184 if (loop->header == entry->dest)
5185 {
5186 copying_header = true;
561e8a90 5187 set_loop_copy (loop, loop_outer (loop));
42759f1e
ZD
5188
5189 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
5190 return false;
5191
5192 for (i = 0; i < n_region; i++)
5193 if (region[i] != exit->src
5194 && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
5195 return false;
5196 }
5197
5198 if (!region_copy)
5199 {
858904db 5200 region_copy = XNEWVEC (basic_block, n_region);
42759f1e
ZD
5201 free_region_copy = true;
5202 }
5203
5006671f 5204 gcc_assert (!need_ssa_update_p (cfun));
42759f1e 5205
5deaef19 5206 /* Record blocks outside the region that are dominated by something
42759f1e 5207 inside. */
66f97d31 5208 doms = NULL;
6580ee77
JH
5209 initialize_original_copy_tables ();
5210
66f97d31 5211 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
42759f1e 5212
09bac500
JH
5213 if (entry->dest->count)
5214 {
5215 total_count = entry->dest->count;
5216 entry_count = entry->count;
5217 /* Fix up corner cases, to avoid division by zero or creation of negative
5218 frequencies. */
5219 if (entry_count > total_count)
5220 entry_count = total_count;
5221 }
5222 else
5223 {
5224 total_freq = entry->dest->frequency;
5225 entry_freq = EDGE_FREQUENCY (entry);
5226 /* Fix up corner cases, to avoid division by zero or creation of negative
5227 frequencies. */
5228 if (total_freq == 0)
5229 total_freq = 1;
5230 else if (entry_freq > total_freq)
5231 entry_freq = total_freq;
5232 }
5deaef19 5233
b9a66240
ZD
5234 copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
5235 split_edge_bb_loc (entry));
09bac500
JH
5236 if (total_count)
5237 {
5238 scale_bbs_frequencies_gcov_type (region, n_region,
5239 total_count - entry_count,
5240 total_count);
5241 scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
6531d1be 5242 total_count);
09bac500
JH
5243 }
5244 else
5245 {
5246 scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
5247 total_freq);
5248 scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
5249 }
42759f1e
ZD
5250
5251 if (copying_header)
5252 {
5253 loop->header = exit->dest;
5254 loop->latch = exit->src;
5255 }
5256
5257 /* Redirect the entry and add the phi node arguments. */
6580ee77 5258 redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
42759f1e 5259 gcc_assert (redirected != NULL);
71882046 5260 flush_pending_stmts (entry);
42759f1e
ZD
5261
5262 /* Concerning updating of dominators: We must recount dominators
84d65814
DN
5263 for entry block and its copy. Anything that is outside of the
5264 region, but was dominated by something inside needs recounting as
5265 well. */
42759f1e 5266 set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
66f97d31
ZD
5267 VEC_safe_push (basic_block, heap, doms, get_bb_original (entry->dest));
5268 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5f40b3cb 5269 VEC_free (basic_block, heap, doms);
42759f1e 5270
84d65814 5271 /* Add the other PHI node arguments. */
5f40b3cb
ZD
5272 add_phi_args_after_copy (region_copy, n_region, NULL);
5273
5274 /* Update the SSA web. */
5275 update_ssa (TODO_update_ssa);
5276
5277 if (free_region_copy)
5278 free (region_copy);
5279
5280 free_original_copy_tables ();
5281 return true;
5282}
5283
5284/* Duplicates REGION consisting of N_REGION blocks. The new blocks
5285 are stored to REGION_COPY in the same order in that they appear
5286 in REGION, if REGION_COPY is not NULL. ENTRY is the entry to
5287 the region, EXIT an exit from it. The condition guarding EXIT
5288 is moved to ENTRY. Returns true if duplication succeeds, false
5289 otherwise.
5290
5291 For example,
5292
5293 some_code;
5294 if (cond)
5295 A;
5296 else
5297 B;
5298
5299 is transformed to
5300
5301 if (cond)
5302 {
5303 some_code;
5304 A;
5305 }
5306 else
5307 {
5308 some_code;
5309 B;
5310 }
5311*/
5312
5313bool
726a989a
RB
5314gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNUSED,
5315 basic_block *region ATTRIBUTE_UNUSED, unsigned n_region ATTRIBUTE_UNUSED,
5316 basic_block *region_copy ATTRIBUTE_UNUSED)
5f40b3cb
ZD
5317{
5318 unsigned i;
5319 bool free_region_copy = false;
5320 struct loop *loop = exit->dest->loop_father;
5321 struct loop *orig_loop = entry->dest->loop_father;
5322 basic_block switch_bb, entry_bb, nentry_bb;
5323 VEC (basic_block, heap) *doms;
5324 int total_freq = 0, exit_freq = 0;
5325 gcov_type total_count = 0, exit_count = 0;
5326 edge exits[2], nexits[2], e;
726a989a
RB
5327 gimple_stmt_iterator gsi;
5328 gimple cond_stmt;
5f40b3cb
ZD
5329 edge sorig, snew;
5330
5331 gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
5332 exits[0] = exit;
5333 exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
5334
5335 if (!can_copy_bbs_p (region, n_region))
5336 return false;
5337
5338 /* Some sanity checking. Note that we do not check for all possible
5339 missuses of the functions. I.e. if you ask to copy something weird
5340 (e.g., in the example, if there is a jump from inside to the middle
5341 of some_code, or come_code defines some of the values used in cond)
5342 it will work, but the resulting code will not be correct. */
5343 for (i = 0; i < n_region; i++)
5344 {
5345 /* We do not handle subloops, i.e. all the blocks must belong to the
5346 same loop. */
5347 if (region[i]->loop_father != orig_loop)
5348 return false;
5349
5350 if (region[i] == orig_loop->latch)
5351 return false;
5352 }
5353
5354 initialize_original_copy_tables ();
5355 set_loop_copy (orig_loop, loop);
5356
5357 if (!region_copy)
5358 {
5359 region_copy = XNEWVEC (basic_block, n_region);
5360 free_region_copy = true;
5361 }
5362
5006671f 5363 gcc_assert (!need_ssa_update_p (cfun));
5f40b3cb
ZD
5364
5365 /* Record blocks outside the region that are dominated by something
5366 inside. */
5367 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5368
5369 if (exit->src->count)
5370 {
5371 total_count = exit->src->count;
5372 exit_count = exit->count;
5373 /* Fix up corner cases, to avoid division by zero or creation of negative
5374 frequencies. */
5375 if (exit_count > total_count)
5376 exit_count = total_count;
5377 }
5378 else
5379 {
5380 total_freq = exit->src->frequency;
5381 exit_freq = EDGE_FREQUENCY (exit);
5382 /* Fix up corner cases, to avoid division by zero or creation of negative
5383 frequencies. */
5384 if (total_freq == 0)
5385 total_freq = 1;
5386 if (exit_freq > total_freq)
5387 exit_freq = total_freq;
5388 }
5389
5390 copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
5391 split_edge_bb_loc (exit));
5392 if (total_count)
5393 {
5394 scale_bbs_frequencies_gcov_type (region, n_region,
5395 total_count - exit_count,
5396 total_count);
5397 scale_bbs_frequencies_gcov_type (region_copy, n_region, exit_count,
5398 total_count);
5399 }
5400 else
5401 {
5402 scale_bbs_frequencies_int (region, n_region, total_freq - exit_freq,
5403 total_freq);
5404 scale_bbs_frequencies_int (region_copy, n_region, exit_freq, total_freq);
5405 }
5406
5407 /* Create the switch block, and put the exit condition to it. */
5408 entry_bb = entry->dest;
5409 nentry_bb = get_bb_copy (entry_bb);
5410 if (!last_stmt (entry->src)
5411 || !stmt_ends_bb_p (last_stmt (entry->src)))
5412 switch_bb = entry->src;
5413 else
5414 switch_bb = split_edge (entry);
5415 set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
5416
726a989a
RB
5417 gsi = gsi_last_bb (switch_bb);
5418 cond_stmt = last_stmt (exit->src);
5419 gcc_assert (gimple_code (cond_stmt) == GIMPLE_COND);
5420 cond_stmt = gimple_copy (cond_stmt);
5421 gimple_cond_set_lhs (cond_stmt, unshare_expr (gimple_cond_lhs (cond_stmt)));
5422 gimple_cond_set_rhs (cond_stmt, unshare_expr (gimple_cond_rhs (cond_stmt)));
5423 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
5f40b3cb
ZD
5424
5425 sorig = single_succ_edge (switch_bb);
5426 sorig->flags = exits[1]->flags;
5427 snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
5428
5429 /* Register the new edge from SWITCH_BB in loop exit lists. */
5430 rescan_loop_exit (snew, true, false);
5431
5432 /* Add the PHI node arguments. */
5433 add_phi_args_after_copy (region_copy, n_region, snew);
5434
5435 /* Get rid of now superfluous conditions and associated edges (and phi node
5436 arguments). */
5437 e = redirect_edge_and_branch (exits[0], exits[1]->dest);
726a989a 5438 PENDING_STMT (e) = NULL;
5f40b3cb 5439 e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
726a989a 5440 PENDING_STMT (e) = NULL;
5f40b3cb
ZD
5441
5442 /* Anything that is outside of the region, but was dominated by something
5443 inside needs to update dominance info. */
5444 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5445 VEC_free (basic_block, heap, doms);
42759f1e 5446
84d65814
DN
5447 /* Update the SSA web. */
5448 update_ssa (TODO_update_ssa);
42759f1e
ZD
5449
5450 if (free_region_copy)
5451 free (region_copy);
5452
6580ee77 5453 free_original_copy_tables ();
42759f1e
ZD
5454 return true;
5455}
6de9cd9a 5456
50674e96
DN
5457/* Add all the blocks dominated by ENTRY to the array BBS_P. Stop
5458 adding blocks when the dominator traversal reaches EXIT. This
5459 function silently assumes that ENTRY strictly dominates EXIT. */
5460
9f9f72aa 5461void
50674e96
DN
5462gather_blocks_in_sese_region (basic_block entry, basic_block exit,
5463 VEC(basic_block,heap) **bbs_p)
5464{
5465 basic_block son;
5466
5467 for (son = first_dom_son (CDI_DOMINATORS, entry);
5468 son;
5469 son = next_dom_son (CDI_DOMINATORS, son))
5470 {
5471 VEC_safe_push (basic_block, heap, *bbs_p, son);
5472 if (son != exit)
5473 gather_blocks_in_sese_region (son, exit, bbs_p);
5474 }
5475}
5476
917948d3
ZD
5477/* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
5478 The duplicates are recorded in VARS_MAP. */
5479
5480static void
5481replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
5482 tree to_context)
5483{
5484 tree t = *tp, new_t;
5485 struct function *f = DECL_STRUCT_FUNCTION (to_context);
5486 void **loc;
5487
5488 if (DECL_CONTEXT (t) == to_context)
5489 return;
5490
5491 loc = pointer_map_contains (vars_map, t);
5492
5493 if (!loc)
5494 {
5495 loc = pointer_map_insert (vars_map, t);
5496
5497 if (SSA_VAR_P (t))
5498 {
5499 new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
cb91fab0 5500 f->local_decls = tree_cons (NULL_TREE, new_t, f->local_decls);
917948d3
ZD
5501 }
5502 else
5503 {
5504 gcc_assert (TREE_CODE (t) == CONST_DECL);
5505 new_t = copy_node (t);
5506 }
5507 DECL_CONTEXT (new_t) = to_context;
5508
5509 *loc = new_t;
5510 }
5511 else
3d9a9f94 5512 new_t = (tree) *loc;
917948d3
ZD
5513
5514 *tp = new_t;
5515}
5516
726a989a 5517
917948d3
ZD
5518/* Creates an ssa name in TO_CONTEXT equivalent to NAME.
5519 VARS_MAP maps old ssa names and var_decls to the new ones. */
5520
5521static tree
5522replace_ssa_name (tree name, struct pointer_map_t *vars_map,
5523 tree to_context)
5524{
5525 void **loc;
5526 tree new_name, decl = SSA_NAME_VAR (name);
5527
5528 gcc_assert (is_gimple_reg (name));
5529
5530 loc = pointer_map_contains (vars_map, name);
5531
5532 if (!loc)
5533 {
5534 replace_by_duplicate_decl (&decl, vars_map, to_context);
5535
5536 push_cfun (DECL_STRUCT_FUNCTION (to_context));
5537 if (gimple_in_ssa_p (cfun))
5538 add_referenced_var (decl);
5539
5540 new_name = make_ssa_name (decl, SSA_NAME_DEF_STMT (name));
5541 if (SSA_NAME_IS_DEFAULT_DEF (name))
5542 set_default_def (decl, new_name);
5543 pop_cfun ();
5544
5545 loc = pointer_map_insert (vars_map, name);
5546 *loc = new_name;
5547 }
5548 else
3d9a9f94 5549 new_name = (tree) *loc;
917948d3
ZD
5550
5551 return new_name;
5552}
50674e96
DN
5553
5554struct move_stmt_d
5555{
b357f682
JJ
5556 tree orig_block;
5557 tree new_block;
50674e96
DN
5558 tree from_context;
5559 tree to_context;
917948d3 5560 struct pointer_map_t *vars_map;
fad41cd7 5561 htab_t new_label_map;
50674e96
DN
5562 bool remap_decls_p;
5563};
5564
5565/* Helper for move_block_to_fn. Set TREE_BLOCK in every expression
b357f682
JJ
5566 contained in *TP if it has been ORIG_BLOCK previously and change the
5567 DECL_CONTEXT of every local variable referenced in *TP. */
50674e96
DN
5568
5569static tree
726a989a 5570move_stmt_op (tree *tp, int *walk_subtrees, void *data)
50674e96 5571{
726a989a
RB
5572 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
5573 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
fad41cd7 5574 tree t = *tp;
50674e96 5575
726a989a
RB
5576 if (EXPR_P (t))
5577 /* We should never have TREE_BLOCK set on non-statements. */
5578 gcc_assert (!TREE_BLOCK (t));
fad41cd7 5579
917948d3 5580 else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
50674e96 5581 {
917948d3
ZD
5582 if (TREE_CODE (t) == SSA_NAME)
5583 *tp = replace_ssa_name (t, p->vars_map, p->to_context);
5584 else if (TREE_CODE (t) == LABEL_DECL)
fad41cd7
RH
5585 {
5586 if (p->new_label_map)
5587 {
5588 struct tree_map in, *out;
fc8600f9 5589 in.base.from = t;
3d9a9f94
KG
5590 out = (struct tree_map *)
5591 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
fad41cd7
RH
5592 if (out)
5593 *tp = t = out->to;
5594 }
50674e96 5595
fad41cd7
RH
5596 DECL_CONTEXT (t) = p->to_context;
5597 }
5598 else if (p->remap_decls_p)
50674e96 5599 {
917948d3
ZD
5600 /* Replace T with its duplicate. T should no longer appear in the
5601 parent function, so this looks wasteful; however, it may appear
5602 in referenced_vars, and more importantly, as virtual operands of
5603 statements, and in alias lists of other variables. It would be
5604 quite difficult to expunge it from all those places. ??? It might
5605 suffice to do this for addressable variables. */
5606 if ((TREE_CODE (t) == VAR_DECL
5607 && !is_global_var (t))
5608 || TREE_CODE (t) == CONST_DECL)
5609 replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
5610
5611 if (SSA_VAR_P (t)
5612 && gimple_in_ssa_p (cfun))
fad41cd7 5613 {
917948d3
ZD
5614 push_cfun (DECL_STRUCT_FUNCTION (p->to_context));
5615 add_referenced_var (*tp);
5616 pop_cfun ();
fad41cd7 5617 }
50674e96 5618 }
917948d3 5619 *walk_subtrees = 0;
50674e96 5620 }
fad41cd7
RH
5621 else if (TYPE_P (t))
5622 *walk_subtrees = 0;
50674e96
DN
5623
5624 return NULL_TREE;
5625}
5626
726a989a
RB
5627/* Like move_stmt_op, but for gimple statements.
5628
5629 Helper for move_block_to_fn. Set GIMPLE_BLOCK in every expression
5630 contained in the current statement in *GSI_P and change the
5631 DECL_CONTEXT of every local variable referenced in the current
5632 statement. */
5633
5634static tree
5635move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
5636 struct walk_stmt_info *wi)
5637{
5638 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
5639 gimple stmt = gsi_stmt (*gsi_p);
5640 tree block = gimple_block (stmt);
5641
5642 if (p->orig_block == NULL_TREE
5643 || block == p->orig_block
5644 || block == NULL_TREE)
5645 gimple_set_block (stmt, p->new_block);
5646#ifdef ENABLE_CHECKING
5647 else if (block != p->new_block)
5648 {
5649 while (block && block != p->orig_block)
5650 block = BLOCK_SUPERCONTEXT (block);
5651 gcc_assert (block);
5652 }
5653#endif
5654
5655 if (is_gimple_omp (stmt)
5656 && gimple_code (stmt) != GIMPLE_OMP_RETURN
5657 && gimple_code (stmt) != GIMPLE_OMP_CONTINUE)
5658 {
5659 /* Do not remap variables inside OMP directives. Variables
5660 referenced in clauses and directive header belong to the
5661 parent function and should not be moved into the child
5662 function. */
5663 bool save_remap_decls_p = p->remap_decls_p;
5664 p->remap_decls_p = false;
5665 *handled_ops_p = true;
5666
5667 walk_gimple_seq (gimple_omp_body (stmt), move_stmt_r, move_stmt_op, wi);
5668
5669 p->remap_decls_p = save_remap_decls_p;
5670 }
5671
5672 return NULL_TREE;
5673}
5674
917948d3
ZD
5675/* Marks virtual operands of all statements in basic blocks BBS for
5676 renaming. */
5677
dea61d92
SP
5678void
5679mark_virtual_ops_in_bb (basic_block bb)
917948d3 5680{
726a989a 5681 gimple_stmt_iterator gsi;
dea61d92 5682
726a989a
RB
5683 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5684 mark_virtual_ops_for_renaming (gsi_stmt (gsi));
dea61d92 5685
726a989a
RB
5686 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5687 mark_virtual_ops_for_renaming (gsi_stmt (gsi));
dea61d92
SP
5688}
5689
50674e96
DN
5690/* Move basic block BB from function CFUN to function DEST_FN. The
5691 block is moved out of the original linked list and placed after
5692 block AFTER in the new list. Also, the block is removed from the
5693 original array of blocks and placed in DEST_FN's array of blocks.
5694 If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
5695 updated to reflect the moved edges.
6531d1be 5696
917948d3
ZD
5697 The local variables are remapped to new instances, VARS_MAP is used
5698 to record the mapping. */
50674e96
DN
5699
5700static void
5701move_block_to_fn (struct function *dest_cfun, basic_block bb,
5702 basic_block after, bool update_edge_count_p,
b357f682 5703 struct move_stmt_d *d, int eh_offset)
50674e96
DN
5704{
5705 struct control_flow_graph *cfg;
5706 edge_iterator ei;
5707 edge e;
726a989a 5708 gimple_stmt_iterator si;
728b26bb 5709 unsigned old_len, new_len;
50674e96 5710
3722506a
ZD
5711 /* Remove BB from dominance structures. */
5712 delete_from_dominance_info (CDI_DOMINATORS, bb);
5f40b3cb
ZD
5713 if (current_loops)
5714 remove_bb_from_loops (bb);
3722506a 5715
50674e96
DN
5716 /* Link BB to the new linked list. */
5717 move_block_after (bb, after);
5718
5719 /* Update the edge count in the corresponding flowgraphs. */
5720 if (update_edge_count_p)
5721 FOR_EACH_EDGE (e, ei, bb->succs)
5722 {
5723 cfun->cfg->x_n_edges--;
5724 dest_cfun->cfg->x_n_edges++;
5725 }
5726
5727 /* Remove BB from the original basic block array. */
5728 VEC_replace (basic_block, cfun->cfg->x_basic_block_info, bb->index, NULL);
5729 cfun->cfg->x_n_basic_blocks--;
5730
5731 /* Grow DEST_CFUN's basic block array if needed. */
5732 cfg = dest_cfun->cfg;
5733 cfg->x_n_basic_blocks++;
3722506a
ZD
5734 if (bb->index >= cfg->x_last_basic_block)
5735 cfg->x_last_basic_block = bb->index + 1;
50674e96 5736
728b26bb
DN
5737 old_len = VEC_length (basic_block, cfg->x_basic_block_info);
5738 if ((unsigned) cfg->x_last_basic_block >= old_len)
50674e96 5739 {
728b26bb 5740 new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
a590ac65
KH
5741 VEC_safe_grow_cleared (basic_block, gc, cfg->x_basic_block_info,
5742 new_len);
50674e96
DN
5743 }
5744
5745 VEC_replace (basic_block, cfg->x_basic_block_info,
e0310afb 5746 bb->index, bb);
50674e96 5747
917948d3 5748 /* Remap the variables in phi nodes. */
726a989a 5749 for (si = gsi_start_phis (bb); !gsi_end_p (si); )
917948d3 5750 {
726a989a 5751 gimple phi = gsi_stmt (si);
917948d3
ZD
5752 use_operand_p use;
5753 tree op = PHI_RESULT (phi);
5754 ssa_op_iter oi;
5755
5756 if (!is_gimple_reg (op))
5f40b3cb
ZD
5757 {
5758 /* Remove the phi nodes for virtual operands (alias analysis will be
5759 run for the new function, anyway). */
726a989a 5760 remove_phi_node (&si, true);
5f40b3cb
ZD
5761 continue;
5762 }
917948d3 5763
b357f682
JJ
5764 SET_PHI_RESULT (phi,
5765 replace_ssa_name (op, d->vars_map, dest_cfun->decl));
917948d3
ZD
5766 FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
5767 {
5768 op = USE_FROM_PTR (use);
5769 if (TREE_CODE (op) == SSA_NAME)
b357f682 5770 SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
917948d3 5771 }
726a989a
RB
5772
5773 gsi_next (&si);
917948d3
ZD
5774 }
5775
726a989a 5776 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
50674e96 5777 {
726a989a 5778 gimple stmt = gsi_stmt (si);
fad41cd7 5779 int region;
726a989a 5780 struct walk_stmt_info wi;
50674e96 5781
726a989a
RB
5782 memset (&wi, 0, sizeof (wi));
5783 wi.info = d;
5784 walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
50674e96 5785
726a989a 5786 if (gimple_code (stmt) == GIMPLE_LABEL)
50674e96 5787 {
726a989a 5788 tree label = gimple_label_label (stmt);
50674e96
DN
5789 int uid = LABEL_DECL_UID (label);
5790
5791 gcc_assert (uid > -1);
5792
5793 old_len = VEC_length (basic_block, cfg->x_label_to_block_map);
5794 if (old_len <= (unsigned) uid)
5795 {
5006671f 5796 new_len = 3 * uid / 2 + 1;
a590ac65
KH
5797 VEC_safe_grow_cleared (basic_block, gc,
5798 cfg->x_label_to_block_map, new_len);
50674e96
DN
5799 }
5800
5801 VEC_replace (basic_block, cfg->x_label_to_block_map, uid, bb);
5802 VEC_replace (basic_block, cfun->cfg->x_label_to_block_map, uid, NULL);
5803
5804 gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
5805
cb91fab0
JH
5806 if (uid >= dest_cfun->cfg->last_label_uid)
5807 dest_cfun->cfg->last_label_uid = uid + 1;
50674e96 5808 }
726a989a
RB
5809 else if (gimple_code (stmt) == GIMPLE_RESX && eh_offset != 0)
5810 gimple_resx_set_region (stmt, gimple_resx_region (stmt) + eh_offset);
fad41cd7
RH
5811
5812 region = lookup_stmt_eh_region (stmt);
5813 if (region >= 0)
5814 {
5815 add_stmt_to_eh_region_fn (dest_cfun, stmt, region + eh_offset);
5816 remove_stmt_from_eh_region (stmt);
6946b3f7
JH
5817 gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
5818 gimple_remove_stmt_histograms (cfun, stmt);
fad41cd7 5819 }
917948d3 5820
5f40b3cb
ZD
5821 /* We cannot leave any operands allocated from the operand caches of
5822 the current function. */
5823 free_stmt_operands (stmt);
5824 push_cfun (dest_cfun);
917948d3 5825 update_stmt (stmt);
5f40b3cb 5826 pop_cfun ();
fad41cd7 5827 }
7241571e
JJ
5828
5829 FOR_EACH_EDGE (e, ei, bb->succs)
5830 if (e->goto_locus)
5831 {
5832 tree block = e->goto_block;
5833 if (d->orig_block == NULL_TREE
5834 || block == d->orig_block)
5835 e->goto_block = d->new_block;
5836#ifdef ENABLE_CHECKING
5837 else if (block != d->new_block)
5838 {
5839 while (block && block != d->orig_block)
5840 block = BLOCK_SUPERCONTEXT (block);
5841 gcc_assert (block);
5842 }
5843#endif
5844 }
fad41cd7
RH
5845}
5846
5847/* Examine the statements in BB (which is in SRC_CFUN); find and return
5848 the outermost EH region. Use REGION as the incoming base EH region. */
5849
5850static int
5851find_outermost_region_in_block (struct function *src_cfun,
5852 basic_block bb, int region)
5853{
726a989a 5854 gimple_stmt_iterator si;
6531d1be 5855
726a989a 5856 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
fad41cd7 5857 {
726a989a 5858 gimple stmt = gsi_stmt (si);
fad41cd7 5859 int stmt_region;
1799e5d5 5860
726a989a
RB
5861 if (gimple_code (stmt) == GIMPLE_RESX)
5862 stmt_region = gimple_resx_region (stmt);
07ed51c9
JJ
5863 else
5864 stmt_region = lookup_stmt_eh_region_fn (src_cfun, stmt);
7e2df4a1
JJ
5865 if (stmt_region > 0)
5866 {
5867 if (region < 0)
5868 region = stmt_region;
5869 else if (stmt_region != region)
5870 {
5871 region = eh_region_outermost (src_cfun, stmt_region, region);
5872 gcc_assert (region != -1);
5873 }
5874 }
50674e96 5875 }
fad41cd7
RH
5876
5877 return region;
50674e96
DN
5878}
5879
fad41cd7
RH
5880static tree
5881new_label_mapper (tree decl, void *data)
5882{
5883 htab_t hash = (htab_t) data;
5884 struct tree_map *m;
5885 void **slot;
5886
5887 gcc_assert (TREE_CODE (decl) == LABEL_DECL);
5888
3d9a9f94 5889 m = XNEW (struct tree_map);
fad41cd7 5890 m->hash = DECL_UID (decl);
fc8600f9 5891 m->base.from = decl;
fad41cd7
RH
5892 m->to = create_artificial_label ();
5893 LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
cb91fab0
JH
5894 if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
5895 cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
fad41cd7
RH
5896
5897 slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
5898 gcc_assert (*slot == NULL);
5899
5900 *slot = m;
5901
5902 return m->to;
5903}
50674e96 5904
b357f682
JJ
5905/* Change DECL_CONTEXT of all BLOCK_VARS in block, including
5906 subblocks. */
5907
5908static void
5909replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
5910 tree to_context)
5911{
5912 tree *tp, t;
5913
5914 for (tp = &BLOCK_VARS (block); *tp; tp = &TREE_CHAIN (*tp))
5915 {
5916 t = *tp;
e1e2bac4
JJ
5917 if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != CONST_DECL)
5918 continue;
b357f682
JJ
5919 replace_by_duplicate_decl (&t, vars_map, to_context);
5920 if (t != *tp)
5921 {
5922 if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*tp))
5923 {
5924 SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (*tp));
5925 DECL_HAS_VALUE_EXPR_P (t) = 1;
5926 }
5927 TREE_CHAIN (t) = TREE_CHAIN (*tp);
5928 *tp = t;
5929 }
5930 }
5931
5932 for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
5933 replace_block_vars_by_duplicates (block, vars_map, to_context);
5934}
5935
50674e96
DN
5936/* Move a single-entry, single-exit region delimited by ENTRY_BB and
5937 EXIT_BB to function DEST_CFUN. The whole region is replaced by a
5938 single basic block in the original CFG and the new basic block is
5939 returned. DEST_CFUN must not have a CFG yet.
5940
5941 Note that the region need not be a pure SESE region. Blocks inside
5942 the region may contain calls to abort/exit. The only restriction
5943 is that ENTRY_BB should be the only entry point and it must
5944 dominate EXIT_BB.
5945
b357f682
JJ
5946 Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
5947 functions outermost BLOCK, move all subblocks of ORIG_BLOCK
5948 to the new function.
5949
50674e96
DN
5950 All local variables referenced in the region are assumed to be in
5951 the corresponding BLOCK_VARS and unexpanded variable lists
5952 associated with DEST_CFUN. */
5953
5954basic_block
5955move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
b357f682 5956 basic_block exit_bb, tree orig_block)
50674e96 5957{
917948d3
ZD
5958 VEC(basic_block,heap) *bbs, *dom_bbs;
5959 basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
5960 basic_block after, bb, *entry_pred, *exit_succ, abb;
5961 struct function *saved_cfun = cfun;
fad41cd7 5962 int *entry_flag, *exit_flag, eh_offset;
917948d3 5963 unsigned *entry_prob, *exit_prob;
50674e96
DN
5964 unsigned i, num_entry_edges, num_exit_edges;
5965 edge e;
5966 edge_iterator ei;
fad41cd7 5967 htab_t new_label_map;
917948d3 5968 struct pointer_map_t *vars_map;
5f40b3cb 5969 struct loop *loop = entry_bb->loop_father;
b357f682 5970 struct move_stmt_d d;
50674e96
DN
5971
5972 /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
5973 region. */
5974 gcc_assert (entry_bb != exit_bb
2aee3e57
JJ
5975 && (!exit_bb
5976 || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
50674e96 5977
917948d3
ZD
5978 /* Collect all the blocks in the region. Manually add ENTRY_BB
5979 because it won't be added by dfs_enumerate_from. */
50674e96
DN
5980 bbs = NULL;
5981 VEC_safe_push (basic_block, heap, bbs, entry_bb);
5982 gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
5983
917948d3
ZD
5984 /* The blocks that used to be dominated by something in BBS will now be
5985 dominated by the new block. */
5986 dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
5987 VEC_address (basic_block, bbs),
5988 VEC_length (basic_block, bbs));
5989
50674e96
DN
5990 /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG. We need to remember
5991 the predecessor edges to ENTRY_BB and the successor edges to
5992 EXIT_BB so that we can re-attach them to the new basic block that
5993 will replace the region. */
5994 num_entry_edges = EDGE_COUNT (entry_bb->preds);
5995 entry_pred = (basic_block *) xcalloc (num_entry_edges, sizeof (basic_block));
5996 entry_flag = (int *) xcalloc (num_entry_edges, sizeof (int));
917948d3 5997 entry_prob = XNEWVEC (unsigned, num_entry_edges);
50674e96
DN
5998 i = 0;
5999 for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
6000 {
917948d3 6001 entry_prob[i] = e->probability;
50674e96
DN
6002 entry_flag[i] = e->flags;
6003 entry_pred[i++] = e->src;
6004 remove_edge (e);
6005 }
6006
2aee3e57 6007 if (exit_bb)
50674e96 6008 {
2aee3e57
JJ
6009 num_exit_edges = EDGE_COUNT (exit_bb->succs);
6010 exit_succ = (basic_block *) xcalloc (num_exit_edges,
6011 sizeof (basic_block));
6012 exit_flag = (int *) xcalloc (num_exit_edges, sizeof (int));
917948d3 6013 exit_prob = XNEWVEC (unsigned, num_exit_edges);
2aee3e57
JJ
6014 i = 0;
6015 for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
6016 {
917948d3 6017 exit_prob[i] = e->probability;
2aee3e57
JJ
6018 exit_flag[i] = e->flags;
6019 exit_succ[i++] = e->dest;
6020 remove_edge (e);
6021 }
6022 }
6023 else
6024 {
6025 num_exit_edges = 0;
6026 exit_succ = NULL;
6027 exit_flag = NULL;
917948d3 6028 exit_prob = NULL;
50674e96
DN
6029 }
6030
6031 /* Switch context to the child function to initialize DEST_FN's CFG. */
6032 gcc_assert (dest_cfun->cfg == NULL);
917948d3 6033 push_cfun (dest_cfun);
fad41cd7 6034
50674e96 6035 init_empty_tree_cfg ();
fad41cd7
RH
6036
6037 /* Initialize EH information for the new function. */
6038 eh_offset = 0;
6039 new_label_map = NULL;
6040 if (saved_cfun->eh)
6041 {
6042 int region = -1;
6043
6044 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
6045 region = find_outermost_region_in_block (saved_cfun, bb, region);
6046
6047 init_eh_for_function ();
6048 if (region != -1)
6049 {
6050 new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
6051 eh_offset = duplicate_eh_regions (saved_cfun, new_label_mapper,
6052 new_label_map, region, 0);
6053 }
6054 }
6055
917948d3
ZD
6056 pop_cfun ();
6057
50674e96
DN
6058 /* Move blocks from BBS into DEST_CFUN. */
6059 gcc_assert (VEC_length (basic_block, bbs) >= 2);
6060 after = dest_cfun->cfg->x_entry_block_ptr;
917948d3 6061 vars_map = pointer_map_create ();
b357f682
JJ
6062
6063 memset (&d, 0, sizeof (d));
6064 d.vars_map = vars_map;
6065 d.from_context = cfun->decl;
6066 d.to_context = dest_cfun->decl;
6067 d.new_label_map = new_label_map;
6068 d.remap_decls_p = true;
6069 d.orig_block = orig_block;
6070 d.new_block = DECL_INITIAL (dest_cfun->decl);
6071
50674e96
DN
6072 for (i = 0; VEC_iterate (basic_block, bbs, i, bb); i++)
6073 {
6074 /* No need to update edge counts on the last block. It has
6075 already been updated earlier when we detached the region from
6076 the original CFG. */
b357f682 6077 move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d, eh_offset);
50674e96
DN
6078 after = bb;
6079 }
6080
b357f682
JJ
6081 /* Rewire BLOCK_SUBBLOCKS of orig_block. */
6082 if (orig_block)
6083 {
6084 tree block;
6085 gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6086 == NULL_TREE);
6087 BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6088 = BLOCK_SUBBLOCKS (orig_block);
6089 for (block = BLOCK_SUBBLOCKS (orig_block);
6090 block; block = BLOCK_CHAIN (block))
6091 BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
6092 BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
6093 }
6094
6095 replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
6096 vars_map, dest_cfun->decl);
6097
fad41cd7
RH
6098 if (new_label_map)
6099 htab_delete (new_label_map);
917948d3 6100 pointer_map_destroy (vars_map);
50674e96
DN
6101
6102 /* Rewire the entry and exit blocks. The successor to the entry
6103 block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
6104 the child function. Similarly, the predecessor of DEST_FN's
6105 EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR. We
6106 need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
6107 various CFG manipulation function get to the right CFG.
6108
6109 FIXME, this is silly. The CFG ought to become a parameter to
6110 these helpers. */
917948d3 6111 push_cfun (dest_cfun);
50674e96 6112 make_edge (ENTRY_BLOCK_PTR, entry_bb, EDGE_FALLTHRU);
2aee3e57
JJ
6113 if (exit_bb)
6114 make_edge (exit_bb, EXIT_BLOCK_PTR, 0);
917948d3 6115 pop_cfun ();
50674e96
DN
6116
6117 /* Back in the original function, the SESE region has disappeared,
6118 create a new basic block in its place. */
6119 bb = create_empty_bb (entry_pred[0]);
5f40b3cb
ZD
6120 if (current_loops)
6121 add_bb_to_loop (bb, loop);
50674e96 6122 for (i = 0; i < num_entry_edges; i++)
917948d3
ZD
6123 {
6124 e = make_edge (entry_pred[i], bb, entry_flag[i]);
6125 e->probability = entry_prob[i];
6126 }
50674e96
DN
6127
6128 for (i = 0; i < num_exit_edges; i++)
917948d3
ZD
6129 {
6130 e = make_edge (bb, exit_succ[i], exit_flag[i]);
6131 e->probability = exit_prob[i];
6132 }
6133
6134 set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
6135 for (i = 0; VEC_iterate (basic_block, dom_bbs, i, abb); i++)
6136 set_immediate_dominator (CDI_DOMINATORS, abb, bb);
6137 VEC_free (basic_block, heap, dom_bbs);
50674e96 6138
2aee3e57
JJ
6139 if (exit_bb)
6140 {
917948d3 6141 free (exit_prob);
2aee3e57
JJ
6142 free (exit_flag);
6143 free (exit_succ);
6144 }
917948d3 6145 free (entry_prob);
50674e96
DN
6146 free (entry_flag);
6147 free (entry_pred);
50674e96
DN
6148 VEC_free (basic_block, heap, bbs);
6149
6150 return bb;
6151}
6152
84d65814 6153
726a989a
RB
6154/* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in tree-pass.h)
6155 */
6de9cd9a
DN
6156
6157void
6158dump_function_to_file (tree fn, FILE *file, int flags)
6159{
6160 tree arg, vars, var;
459ffad3 6161 struct function *dsf;
6de9cd9a
DN
6162 bool ignore_topmost_bind = false, any_var = false;
6163 basic_block bb;
6164 tree chain;
6531d1be 6165
673fda6b 6166 fprintf (file, "%s (", lang_hooks.decl_printable_name (fn, 2));
6de9cd9a
DN
6167
6168 arg = DECL_ARGUMENTS (fn);
6169 while (arg)
6170 {
2f9ea521
RG
6171 print_generic_expr (file, TREE_TYPE (arg), dump_flags);
6172 fprintf (file, " ");
6de9cd9a 6173 print_generic_expr (file, arg, dump_flags);
3e894af1
KZ
6174 if (flags & TDF_VERBOSE)
6175 print_node (file, "", arg, 4);
6de9cd9a
DN
6176 if (TREE_CHAIN (arg))
6177 fprintf (file, ", ");
6178 arg = TREE_CHAIN (arg);
6179 }
6180 fprintf (file, ")\n");
6181
3e894af1
KZ
6182 if (flags & TDF_VERBOSE)
6183 print_node (file, "", fn, 2);
6184
459ffad3
EB
6185 dsf = DECL_STRUCT_FUNCTION (fn);
6186 if (dsf && (flags & TDF_DETAILS))
6187 dump_eh_tree (file, dsf);
6188
39ecc018 6189 if (flags & TDF_RAW && !gimple_has_body_p (fn))
6de9cd9a
DN
6190 {
6191 dump_node (fn, TDF_SLIM | flags, file);
6192 return;
6193 }
6194
953ff289 6195 /* Switch CFUN to point to FN. */
db2960f4 6196 push_cfun (DECL_STRUCT_FUNCTION (fn));
953ff289 6197
6de9cd9a
DN
6198 /* When GIMPLE is lowered, the variables are no longer available in
6199 BIND_EXPRs, so display them separately. */
cb91fab0 6200 if (cfun && cfun->decl == fn && cfun->local_decls)
6de9cd9a
DN
6201 {
6202 ignore_topmost_bind = true;
6203
6204 fprintf (file, "{\n");
cb91fab0 6205 for (vars = cfun->local_decls; vars; vars = TREE_CHAIN (vars))
6de9cd9a
DN
6206 {
6207 var = TREE_VALUE (vars);
6208
6209 print_generic_decl (file, var, flags);
3e894af1
KZ
6210 if (flags & TDF_VERBOSE)
6211 print_node (file, "", var, 4);
6de9cd9a
DN
6212 fprintf (file, "\n");
6213
6214 any_var = true;
6215 }
6216 }
6217
32a87d45 6218 if (cfun && cfun->decl == fn && cfun->cfg && basic_block_info)
6de9cd9a 6219 {
726a989a 6220 /* If the CFG has been built, emit a CFG-based dump. */
878f99d2 6221 check_bb_profile (ENTRY_BLOCK_PTR, file);
6de9cd9a
DN
6222 if (!ignore_topmost_bind)
6223 fprintf (file, "{\n");
6224
6225 if (any_var && n_basic_blocks)
6226 fprintf (file, "\n");
6227
6228 FOR_EACH_BB (bb)
726a989a 6229 gimple_dump_bb (bb, file, 2, flags);
6531d1be 6230
6de9cd9a 6231 fprintf (file, "}\n");
878f99d2 6232 check_bb_profile (EXIT_BLOCK_PTR, file);
6de9cd9a 6233 }
726a989a
RB
6234 else if (DECL_SAVED_TREE (fn) == NULL)
6235 {
6236 /* The function is now in GIMPLE form but the CFG has not been
6237 built yet. Emit the single sequence of GIMPLE statements
6238 that make up its body. */
6239 gimple_seq body = gimple_body (fn);
6240
6241 if (gimple_seq_first_stmt (body)
6242 && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
6243 && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
6244 print_gimple_seq (file, body, 0, flags);
6245 else
6246 {
6247 if (!ignore_topmost_bind)
6248 fprintf (file, "{\n");
6249
6250 if (any_var)
6251 fprintf (file, "\n");
6252
6253 print_gimple_seq (file, body, 2, flags);
6254 fprintf (file, "}\n");
6255 }
6256 }
6de9cd9a
DN
6257 else
6258 {
6259 int indent;
6260
6261 /* Make a tree based dump. */
6262 chain = DECL_SAVED_TREE (fn);
6263
953ff289 6264 if (chain && TREE_CODE (chain) == BIND_EXPR)
6de9cd9a
DN
6265 {
6266 if (ignore_topmost_bind)
6267 {
6268 chain = BIND_EXPR_BODY (chain);
6269 indent = 2;
6270 }
6271 else
6272 indent = 0;
6273 }
6274 else
6275 {
6276 if (!ignore_topmost_bind)
6277 fprintf (file, "{\n");
6278 indent = 2;
6279 }
6280
6281 if (any_var)
6282 fprintf (file, "\n");
6283
6284 print_generic_stmt_indented (file, chain, flags, indent);
6285 if (ignore_topmost_bind)
6286 fprintf (file, "}\n");
6287 }
6288
6289 fprintf (file, "\n\n");
953ff289
DN
6290
6291 /* Restore CFUN. */
db2960f4 6292 pop_cfun ();
953ff289
DN
6293}
6294
6295
6296/* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h) */
6297
6298void
6299debug_function (tree fn, int flags)
6300{
6301 dump_function_to_file (fn, stderr, flags);
6de9cd9a
DN
6302}
6303
6304
d7770457 6305/* Print on FILE the indexes for the predecessors of basic_block BB. */
6de9cd9a
DN
6306
6307static void
628f6a4e 6308print_pred_bbs (FILE *file, basic_block bb)
6de9cd9a 6309{
628f6a4e
BE
6310 edge e;
6311 edge_iterator ei;
6312
6313 FOR_EACH_EDGE (e, ei, bb->preds)
d7770457 6314 fprintf (file, "bb_%d ", e->src->index);
6de9cd9a
DN
6315}
6316
6317
d7770457 6318/* Print on FILE the indexes for the successors of basic_block BB. */
6de9cd9a
DN
6319
6320static void
628f6a4e 6321print_succ_bbs (FILE *file, basic_block bb)
6de9cd9a 6322{
628f6a4e
BE
6323 edge e;
6324 edge_iterator ei;
6325
6326 FOR_EACH_EDGE (e, ei, bb->succs)
d7770457 6327 fprintf (file, "bb_%d ", e->dest->index);
6de9cd9a
DN
6328}
6329
0c8efed8
SP
6330/* Print to FILE the basic block BB following the VERBOSITY level. */
6331
6332void
6333print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
6334{
6335 char *s_indent = (char *) alloca ((size_t) indent + 1);
6336 memset ((void *) s_indent, ' ', (size_t) indent);
6337 s_indent[indent] = '\0';
6338
6339 /* Print basic_block's header. */
6340 if (verbosity >= 2)
6341 {
6342 fprintf (file, "%s bb_%d (preds = {", s_indent, bb->index);
6343 print_pred_bbs (file, bb);
6344 fprintf (file, "}, succs = {");
6345 print_succ_bbs (file, bb);
6346 fprintf (file, "})\n");
6347 }
6348
6349 /* Print basic_block's body. */
6350 if (verbosity >= 3)
6351 {
6352 fprintf (file, "%s {\n", s_indent);
726a989a 6353 gimple_dump_bb (bb, file, indent + 4, TDF_VOPS|TDF_MEMSYMS);
0c8efed8
SP
6354 fprintf (file, "%s }\n", s_indent);
6355 }
6356}
6357
6358static void print_loop_and_siblings (FILE *, struct loop *, int, int);
6de9cd9a 6359
0c8efed8
SP
6360/* Pretty print LOOP on FILE, indented INDENT spaces. Following
6361 VERBOSITY level this outputs the contents of the loop, or just its
6362 structure. */
6de9cd9a
DN
6363
6364static void
0c8efed8 6365print_loop (FILE *file, struct loop *loop, int indent, int verbosity)
6de9cd9a
DN
6366{
6367 char *s_indent;
6368 basic_block bb;
6531d1be 6369
6de9cd9a
DN
6370 if (loop == NULL)
6371 return;
6372
6373 s_indent = (char *) alloca ((size_t) indent + 1);
6374 memset ((void *) s_indent, ' ', (size_t) indent);
6375 s_indent[indent] = '\0';
6376
0c8efed8
SP
6377 /* Print loop's header. */
6378 fprintf (file, "%sloop_%d (header = %d, latch = %d", s_indent,
6379 loop->num, loop->header->index, loop->latch->index);
6380 fprintf (file, ", niter = ");
6381 print_generic_expr (file, loop->nb_iterations, 0);
6531d1be 6382
0c8efed8
SP
6383 if (loop->any_upper_bound)
6384 {
6385 fprintf (file, ", upper_bound = ");
6386 dump_double_int (file, loop->nb_iterations_upper_bound, true);
6387 }
6531d1be 6388
0c8efed8
SP
6389 if (loop->any_estimate)
6390 {
6391 fprintf (file, ", estimate = ");
6392 dump_double_int (file, loop->nb_iterations_estimate, true);
6393 }
6394 fprintf (file, ")\n");
6395
6396 /* Print loop's body. */
6397 if (verbosity >= 1)
6398 {
6399 fprintf (file, "%s{\n", s_indent);
6400 FOR_EACH_BB (bb)
6401 if (bb->loop_father == loop)
6402 print_loops_bb (file, bb, indent, verbosity);
6403
6404 print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
6405 fprintf (file, "%s}\n", s_indent);
6406 }
6de9cd9a
DN
6407}
6408
0c8efed8
SP
6409/* Print the LOOP and its sibling loops on FILE, indented INDENT
6410 spaces. Following VERBOSITY level this outputs the contents of the
6411 loop, or just its structure. */
6412
6413static void
6414print_loop_and_siblings (FILE *file, struct loop *loop, int indent, int verbosity)
6415{
6416 if (loop == NULL)
6417 return;
6418
6419 print_loop (file, loop, indent, verbosity);
6420 print_loop_and_siblings (file, loop->next, indent, verbosity);
6421}
6de9cd9a
DN
6422
6423/* Follow a CFG edge from the entry point of the program, and on entry
6424 of a loop, pretty print the loop structure on FILE. */
6425
6531d1be 6426void
0c8efed8 6427print_loops (FILE *file, int verbosity)
6de9cd9a
DN
6428{
6429 basic_block bb;
6531d1be 6430
f8bf9252 6431 bb = ENTRY_BLOCK_PTR;
6de9cd9a 6432 if (bb && bb->loop_father)
0c8efed8 6433 print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
6de9cd9a
DN
6434}
6435
6436
0c8efed8
SP
6437/* Debugging loops structure at tree level, at some VERBOSITY level. */
6438
6439void
6440debug_loops (int verbosity)
6441{
6442 print_loops (stderr, verbosity);
6443}
6444
6445/* Print on stderr the code of LOOP, at some VERBOSITY level. */
6de9cd9a 6446
6531d1be 6447void
0c8efed8 6448debug_loop (struct loop *loop, int verbosity)
6de9cd9a 6449{
0c8efed8 6450 print_loop (stderr, loop, 0, verbosity);
6de9cd9a
DN
6451}
6452
0c8efed8
SP
6453/* Print on stderr the code of loop number NUM, at some VERBOSITY
6454 level. */
6455
6456void
6457debug_loop_num (unsigned num, int verbosity)
6458{
6459 debug_loop (get_loop (num), verbosity);
6460}
6de9cd9a
DN
6461
6462/* Return true if BB ends with a call, possibly followed by some
6463 instructions that must stay with the call. Return false,
6464 otherwise. */
6465
6466static bool
726a989a 6467gimple_block_ends_with_call_p (basic_block bb)
6de9cd9a 6468{
726a989a
RB
6469 gimple_stmt_iterator gsi = gsi_last_bb (bb);
6470 return is_gimple_call (gsi_stmt (gsi));
6de9cd9a
DN
6471}
6472
6473
6474/* Return true if BB ends with a conditional branch. Return false,
6475 otherwise. */
6476
6477static bool
726a989a 6478gimple_block_ends_with_condjump_p (const_basic_block bb)
6de9cd9a 6479{
726a989a
RB
6480 gimple stmt = last_stmt (CONST_CAST_BB (bb));
6481 return (stmt && gimple_code (stmt) == GIMPLE_COND);
6de9cd9a
DN
6482}
6483
6484
6485/* Return true if we need to add fake edge to exit at statement T.
726a989a 6486 Helper function for gimple_flow_call_edges_add. */
6de9cd9a
DN
6487
6488static bool
726a989a 6489need_fake_edge_p (gimple t)
6de9cd9a 6490{
726a989a
RB
6491 tree fndecl = NULL_TREE;
6492 int call_flags = 0;
6de9cd9a
DN
6493
6494 /* NORETURN and LONGJMP calls already have an edge to exit.
321cf1f2 6495 CONST and PURE calls do not need one.
6de9cd9a
DN
6496 We don't currently check for CONST and PURE here, although
6497 it would be a good idea, because those attributes are
6498 figured out from the RTL in mark_constant_function, and
6499 the counter incrementation code from -fprofile-arcs
6500 leads to different results from -fbranch-probabilities. */
726a989a 6501 if (is_gimple_call (t))
23ef6d21 6502 {
726a989a
RB
6503 fndecl = gimple_call_fndecl (t);
6504 call_flags = gimple_call_flags (t);
23ef6d21
BE
6505 }
6506
726a989a
RB
6507 if (is_gimple_call (t)
6508 && fndecl
6509 && DECL_BUILT_IN (fndecl)
23ef6d21 6510 && (call_flags & ECF_NOTHROW)
3cfa762b
RG
6511 && !(call_flags & ECF_RETURNS_TWICE)
6512 /* fork() doesn't really return twice, but the effect of
6513 wrapping it in __gcov_fork() which calls __gcov_flush()
6514 and clears the counters before forking has the same
6515 effect as returning twice. Force a fake edge. */
6516 && !(DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
6517 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FORK))
6518 return false;
23ef6d21 6519
726a989a
RB
6520 if (is_gimple_call (t)
6521 && !(call_flags & ECF_NORETURN))
6de9cd9a
DN
6522 return true;
6523
e0c68ce9 6524 if (gimple_code (t) == GIMPLE_ASM
726a989a 6525 && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
6de9cd9a
DN
6526 return true;
6527
6528 return false;
6529}
6530
6531
6532/* Add fake edges to the function exit for any non constant and non
6533 noreturn calls, volatile inline assembly in the bitmap of blocks
6534 specified by BLOCKS or to the whole CFG if BLOCKS is zero. Return
6535 the number of blocks that were split.
6536
6537 The goal is to expose cases in which entering a basic block does
6538 not imply that all subsequent instructions must be executed. */
6539
6540static int
726a989a 6541gimple_flow_call_edges_add (sbitmap blocks)
6de9cd9a
DN
6542{
6543 int i;
6544 int blocks_split = 0;
6545 int last_bb = last_basic_block;
6546 bool check_last_block = false;
6547
24bd1a0b 6548 if (n_basic_blocks == NUM_FIXED_BLOCKS)
6de9cd9a
DN
6549 return 0;
6550
6551 if (! blocks)
6552 check_last_block = true;
6553 else
6554 check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
6555
6556 /* In the last basic block, before epilogue generation, there will be
6557 a fallthru edge to EXIT. Special care is required if the last insn
6558 of the last basic block is a call because make_edge folds duplicate
6559 edges, which would result in the fallthru edge also being marked
6560 fake, which would result in the fallthru edge being removed by
6561 remove_fake_edges, which would result in an invalid CFG.
6562
6563 Moreover, we can't elide the outgoing fake edge, since the block
6564 profiler needs to take this into account in order to solve the minimal
6565 spanning tree in the case that the call doesn't return.
6566
6567 Handle this by adding a dummy instruction in a new last basic block. */
6568 if (check_last_block)
6569 {
6570 basic_block bb = EXIT_BLOCK_PTR->prev_bb;
726a989a
RB
6571 gimple_stmt_iterator gsi = gsi_last_bb (bb);
6572 gimple t = NULL;
6573
6574 if (!gsi_end_p (gsi))
6575 t = gsi_stmt (gsi);
6de9cd9a 6576
6a60530d 6577 if (t && need_fake_edge_p (t))
6de9cd9a
DN
6578 {
6579 edge e;
6580
9ff3d2de
JL
6581 e = find_edge (bb, EXIT_BLOCK_PTR);
6582 if (e)
6583 {
726a989a
RB
6584 gsi_insert_on_edge (e, gimple_build_nop ());
6585 gsi_commit_edge_inserts ();
9ff3d2de 6586 }
6de9cd9a
DN
6587 }
6588 }
6589
6590 /* Now add fake edges to the function exit for any non constant
6591 calls since there is no way that we can determine if they will
6592 return or not... */
6593 for (i = 0; i < last_bb; i++)
6594 {
6595 basic_block bb = BASIC_BLOCK (i);
726a989a
RB
6596 gimple_stmt_iterator gsi;
6597 gimple stmt, last_stmt;
6de9cd9a
DN
6598
6599 if (!bb)
6600 continue;
6601
6602 if (blocks && !TEST_BIT (blocks, i))
6603 continue;
6604
726a989a
RB
6605 gsi = gsi_last_bb (bb);
6606 if (!gsi_end_p (gsi))
6de9cd9a 6607 {
726a989a 6608 last_stmt = gsi_stmt (gsi);
6de9cd9a
DN
6609 do
6610 {
726a989a 6611 stmt = gsi_stmt (gsi);
6de9cd9a
DN
6612 if (need_fake_edge_p (stmt))
6613 {
6614 edge e;
726a989a 6615
6de9cd9a
DN
6616 /* The handling above of the final block before the
6617 epilogue should be enough to verify that there is
6618 no edge to the exit block in CFG already.
6619 Calling make_edge in such case would cause us to
6620 mark that edge as fake and remove it later. */
6621#ifdef ENABLE_CHECKING
6622 if (stmt == last_stmt)
628f6a4e 6623 {
9ff3d2de
JL
6624 e = find_edge (bb, EXIT_BLOCK_PTR);
6625 gcc_assert (e == NULL);
628f6a4e 6626 }
6de9cd9a
DN
6627#endif
6628
6629 /* Note that the following may create a new basic block
6630 and renumber the existing basic blocks. */
6631 if (stmt != last_stmt)
6632 {
6633 e = split_block (bb, stmt);
6634 if (e)
6635 blocks_split++;
6636 }
6637 make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
6638 }
726a989a 6639 gsi_prev (&gsi);
6de9cd9a 6640 }
726a989a 6641 while (!gsi_end_p (gsi));
6de9cd9a
DN
6642 }
6643 }
6644
6645 if (blocks_split)
6646 verify_flow_info ();
6647
6648 return blocks_split;
6649}
6650
4f6c2131
EB
6651/* Purge dead abnormal call edges from basic block BB. */
6652
6653bool
726a989a 6654gimple_purge_dead_abnormal_call_edges (basic_block bb)
4f6c2131 6655{
726a989a 6656 bool changed = gimple_purge_dead_eh_edges (bb);
4f6c2131 6657
e3b5732b 6658 if (cfun->has_nonlocal_label)
4f6c2131 6659 {
726a989a 6660 gimple stmt = last_stmt (bb);
4f6c2131
EB
6661 edge_iterator ei;
6662 edge e;
6663
726a989a 6664 if (!(stmt && stmt_can_make_abnormal_goto (stmt)))
4f6c2131
EB
6665 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6666 {
6667 if (e->flags & EDGE_ABNORMAL)
6668 {
6669 remove_edge (e);
6670 changed = true;
6671 }
6672 else
6673 ei_next (&ei);
6674 }
6675
726a989a 6676 /* See gimple_purge_dead_eh_edges below. */
4f6c2131
EB
6677 if (changed)
6678 free_dominance_info (CDI_DOMINATORS);
6679 }
6680
6681 return changed;
6682}
6683
672987e8
ZD
6684/* Removes edge E and all the blocks dominated by it, and updates dominance
6685 information. The IL in E->src needs to be updated separately.
6686 If dominance info is not available, only the edge E is removed.*/
6687
6688void
6689remove_edge_and_dominated_blocks (edge e)
6690{
6691 VEC (basic_block, heap) *bbs_to_remove = NULL;
6692 VEC (basic_block, heap) *bbs_to_fix_dom = NULL;
6693 bitmap df, df_idom;
6694 edge f;
6695 edge_iterator ei;
6696 bool none_removed = false;
6697 unsigned i;
6698 basic_block bb, dbb;
6699 bitmap_iterator bi;
6700
2b28c07a 6701 if (!dom_info_available_p (CDI_DOMINATORS))
672987e8
ZD
6702 {
6703 remove_edge (e);
6704 return;
6705 }
6706
6707 /* No updating is needed for edges to exit. */
6708 if (e->dest == EXIT_BLOCK_PTR)
6709 {
6710 if (cfgcleanup_altered_bbs)
6711 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6712 remove_edge (e);
6713 return;
6714 }
6715
6716 /* First, we find the basic blocks to remove. If E->dest has a predecessor
6717 that is not dominated by E->dest, then this set is empty. Otherwise,
6718 all the basic blocks dominated by E->dest are removed.
6719
6720 Also, to DF_IDOM we store the immediate dominators of the blocks in
6721 the dominance frontier of E (i.e., of the successors of the
6722 removed blocks, if there are any, and of E->dest otherwise). */
6723 FOR_EACH_EDGE (f, ei, e->dest->preds)
6724 {
6725 if (f == e)
6726 continue;
6727
6728 if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
6729 {
6730 none_removed = true;
6731 break;
6732 }
6733 }
6734
6735 df = BITMAP_ALLOC (NULL);
6736 df_idom = BITMAP_ALLOC (NULL);
6737
6738 if (none_removed)
6739 bitmap_set_bit (df_idom,
6740 get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
6741 else
6742 {
438c239d 6743 bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
672987e8
ZD
6744 for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6745 {
6746 FOR_EACH_EDGE (f, ei, bb->succs)
6747 {
6748 if (f->dest != EXIT_BLOCK_PTR)
6749 bitmap_set_bit (df, f->dest->index);
6750 }
6751 }
6752 for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6753 bitmap_clear_bit (df, bb->index);
6754
6755 EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
6756 {
6757 bb = BASIC_BLOCK (i);
6758 bitmap_set_bit (df_idom,
6759 get_immediate_dominator (CDI_DOMINATORS, bb)->index);
6760 }
6761 }
6762
6763 if (cfgcleanup_altered_bbs)
6764 {
6765 /* Record the set of the altered basic blocks. */
6766 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
6767 bitmap_ior_into (cfgcleanup_altered_bbs, df);
6768 }
6769
6770 /* Remove E and the cancelled blocks. */
6771 if (none_removed)
6772 remove_edge (e);
6773 else
6774 {
6775 for (i = 0; VEC_iterate (basic_block, bbs_to_remove, i, bb); i++)
6776 delete_basic_block (bb);
6777 }
6778
6779 /* Update the dominance information. The immediate dominator may change only
6780 for blocks whose immediate dominator belongs to DF_IDOM:
6781
6782 Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
6783 removal. Let Z the arbitrary block such that idom(Z) = Y and
6784 Z dominates X after the removal. Before removal, there exists a path P
6785 from Y to X that avoids Z. Let F be the last edge on P that is
6786 removed, and let W = F->dest. Before removal, idom(W) = Y (since Y
6787 dominates W, and because of P, Z does not dominate W), and W belongs to
6788 the dominance frontier of E. Therefore, Y belongs to DF_IDOM. */
6789 EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
6790 {
6791 bb = BASIC_BLOCK (i);
6792 for (dbb = first_dom_son (CDI_DOMINATORS, bb);
6793 dbb;
6794 dbb = next_dom_son (CDI_DOMINATORS, dbb))
6795 VEC_safe_push (basic_block, heap, bbs_to_fix_dom, dbb);
6796 }
6797
66f97d31 6798 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
672987e8
ZD
6799
6800 BITMAP_FREE (df);
6801 BITMAP_FREE (df_idom);
6802 VEC_free (basic_block, heap, bbs_to_remove);
6803 VEC_free (basic_block, heap, bbs_to_fix_dom);
6804}
6805
4f6c2131
EB
6806/* Purge dead EH edges from basic block BB. */
6807
1eaba2f2 6808bool
726a989a 6809gimple_purge_dead_eh_edges (basic_block bb)
1eaba2f2
RH
6810{
6811 bool changed = false;
628f6a4e
BE
6812 edge e;
6813 edge_iterator ei;
726a989a 6814 gimple stmt = last_stmt (bb);
1eaba2f2 6815
726a989a 6816 if (stmt && stmt_can_throw_internal (stmt))
1eaba2f2
RH
6817 return false;
6818
628f6a4e 6819 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
1eaba2f2 6820 {
1eaba2f2
RH
6821 if (e->flags & EDGE_EH)
6822 {
672987e8 6823 remove_edge_and_dominated_blocks (e);
1eaba2f2
RH
6824 changed = true;
6825 }
628f6a4e
BE
6826 else
6827 ei_next (&ei);
1eaba2f2
RH
6828 }
6829
6830 return changed;
6831}
6832
6833bool
726a989a 6834gimple_purge_all_dead_eh_edges (const_bitmap blocks)
1eaba2f2
RH
6835{
6836 bool changed = false;
3cd8c58a 6837 unsigned i;
87c476a2 6838 bitmap_iterator bi;
1eaba2f2 6839
87c476a2
ZD
6840 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
6841 {
833ee764
JJ
6842 basic_block bb = BASIC_BLOCK (i);
6843
6844 /* Earlier gimple_purge_dead_eh_edges could have removed
6845 this basic block already. */
6846 gcc_assert (bb || changed);
6847 if (bb != NULL)
6848 changed |= gimple_purge_dead_eh_edges (bb);
87c476a2 6849 }
1eaba2f2
RH
6850
6851 return changed;
6852}
6de9cd9a 6853
a100ac1e
KH
6854/* This function is called whenever a new edge is created or
6855 redirected. */
6856
6857static void
726a989a 6858gimple_execute_on_growing_pred (edge e)
a100ac1e
KH
6859{
6860 basic_block bb = e->dest;
6861
6862 if (phi_nodes (bb))
6863 reserve_phi_args_for_new_edge (bb);
6864}
6865
e51546f8
KH
6866/* This function is called immediately before edge E is removed from
6867 the edge vector E->dest->preds. */
6868
6869static void
726a989a 6870gimple_execute_on_shrinking_pred (edge e)
e51546f8
KH
6871{
6872 if (phi_nodes (e->dest))
6873 remove_phi_args (e);
6874}
6875
1cb7dfc3
MH
6876/*---------------------------------------------------------------------------
6877 Helper functions for Loop versioning
6878 ---------------------------------------------------------------------------*/
6879
6880/* Adjust phi nodes for 'first' basic block. 'second' basic block is a copy
6881 of 'first'. Both of them are dominated by 'new_head' basic block. When
6882 'new_head' was created by 'second's incoming edge it received phi arguments
6883 on the edge by split_edge(). Later, additional edge 'e' was created to
6531d1be
BF
6884 connect 'new_head' and 'first'. Now this routine adds phi args on this
6885 additional edge 'e' that new_head to second edge received as part of edge
726a989a 6886 splitting. */
1cb7dfc3
MH
6887
6888static void
726a989a
RB
6889gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
6890 basic_block new_head, edge e)
1cb7dfc3 6891{
726a989a
RB
6892 gimple phi1, phi2;
6893 gimple_stmt_iterator psi1, psi2;
6894 tree def;
d0e12fc6
KH
6895 edge e2 = find_edge (new_head, second);
6896
6897 /* Because NEW_HEAD has been created by splitting SECOND's incoming
6898 edge, we should always have an edge from NEW_HEAD to SECOND. */
6899 gcc_assert (e2 != NULL);
1cb7dfc3
MH
6900
6901 /* Browse all 'second' basic block phi nodes and add phi args to
6902 edge 'e' for 'first' head. PHI args are always in correct order. */
6903
726a989a
RB
6904 for (psi2 = gsi_start_phis (second),
6905 psi1 = gsi_start_phis (first);
6906 !gsi_end_p (psi2) && !gsi_end_p (psi1);
6907 gsi_next (&psi2), gsi_next (&psi1))
1cb7dfc3 6908 {
726a989a
RB
6909 phi1 = gsi_stmt (psi1);
6910 phi2 = gsi_stmt (psi2);
6911 def = PHI_ARG_DEF (phi2, e2->dest_idx);
d0e12fc6 6912 add_phi_arg (phi1, def, e);
1cb7dfc3
MH
6913 }
6914}
6915
726a989a 6916
6531d1be
BF
6917/* Adds a if else statement to COND_BB with condition COND_EXPR.
6918 SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
1cb7dfc3 6919 the destination of the ELSE part. */
726a989a 6920
1cb7dfc3 6921static void
726a989a
RB
6922gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
6923 basic_block second_head ATTRIBUTE_UNUSED,
6924 basic_block cond_bb, void *cond_e)
1cb7dfc3 6925{
726a989a
RB
6926 gimple_stmt_iterator gsi;
6927 gimple new_cond_expr;
1cb7dfc3
MH
6928 tree cond_expr = (tree) cond_e;
6929 edge e0;
6930
6931 /* Build new conditional expr */
726a989a
RB
6932 new_cond_expr = gimple_build_cond_from_tree (cond_expr,
6933 NULL_TREE, NULL_TREE);
1cb7dfc3 6934
6531d1be 6935 /* Add new cond in cond_bb. */
726a989a
RB
6936 gsi = gsi_last_bb (cond_bb);
6937 gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
6938
1cb7dfc3
MH
6939 /* Adjust edges appropriately to connect new head with first head
6940 as well as second head. */
6941 e0 = single_succ_edge (cond_bb);
6942 e0->flags &= ~EDGE_FALLTHRU;
6943 e0->flags |= EDGE_FALSE_VALUE;
6944}
6945
726a989a
RB
6946struct cfg_hooks gimple_cfg_hooks = {
6947 "gimple",
6948 gimple_verify_flow_info,
6949 gimple_dump_bb, /* dump_bb */
6de9cd9a 6950 create_bb, /* create_basic_block */
726a989a
RB
6951 gimple_redirect_edge_and_branch, /* redirect_edge_and_branch */
6952 gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force */
6953 gimple_can_remove_branch_p, /* can_remove_branch_p */
6de9cd9a 6954 remove_bb, /* delete_basic_block */
726a989a
RB
6955 gimple_split_block, /* split_block */
6956 gimple_move_block_after, /* move_block_after */
6957 gimple_can_merge_blocks_p, /* can_merge_blocks_p */
6958 gimple_merge_blocks, /* merge_blocks */
6959 gimple_predict_edge, /* predict_edge */
6960 gimple_predicted_by_p, /* predicted_by_p */
6961 gimple_can_duplicate_bb_p, /* can_duplicate_block_p */
6962 gimple_duplicate_bb, /* duplicate_block */
6963 gimple_split_edge, /* split_edge */
6964 gimple_make_forwarder_block, /* make_forward_block */
6de9cd9a 6965 NULL, /* tidy_fallthru_edge */
726a989a
RB
6966 gimple_block_ends_with_call_p,/* block_ends_with_call_p */
6967 gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
6968 gimple_flow_call_edges_add, /* flow_call_edges_add */
6969 gimple_execute_on_growing_pred, /* execute_on_growing_pred */
6970 gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
6971 gimple_duplicate_loop_to_header_edge, /* duplicate loop for trees */
6972 gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
6973 gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
1cb7dfc3 6974 extract_true_false_edges_from_block, /* extract_cond_bb_edges */
6531d1be 6975 flush_pending_stmts /* flush_pending_stmts */
6de9cd9a
DN
6976};
6977
6978
6979/* Split all critical edges. */
6980
c2924966 6981static unsigned int
6de9cd9a
DN
6982split_critical_edges (void)
6983{
6984 basic_block bb;
6985 edge e;
628f6a4e 6986 edge_iterator ei;
6de9cd9a 6987
d6be0d7f
JL
6988 /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
6989 expensive. So we want to enable recording of edge to CASE_LABEL_EXPR
6990 mappings around the calls to split_edge. */
6991 start_recording_case_labels ();
6de9cd9a
DN
6992 FOR_ALL_BB (bb)
6993 {
628f6a4e 6994 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
6995 if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
6996 {
6997 split_edge (e);
6998 }
6999 }
d6be0d7f 7000 end_recording_case_labels ();
c2924966 7001 return 0;
6de9cd9a
DN
7002}
7003
8ddbbcae 7004struct gimple_opt_pass pass_split_crit_edges =
6de9cd9a 7005{
8ddbbcae
JH
7006 {
7007 GIMPLE_PASS,
5d44aeed 7008 "crited", /* name */
6de9cd9a
DN
7009 NULL, /* gate */
7010 split_critical_edges, /* execute */
7011 NULL, /* sub */
7012 NULL, /* next */
7013 0, /* static_pass_number */
7014 TV_TREE_SPLIT_EDGES, /* tv_id */
7015 PROP_cfg, /* properties required */
7016 PROP_no_crit_edges, /* properties_provided */
7017 0, /* properties_destroyed */
7018 0, /* todo_flags_start */
8ddbbcae
JH
7019 TODO_dump_func /* todo_flags_finish */
7020 }
6de9cd9a 7021};
26277d41 7022
26277d41 7023
726a989a 7024/* Build a ternary operation and gimplify it. Emit code before GSI.
26277d41
PB
7025 Return the gimple_val holding the result. */
7026
7027tree
726a989a 7028gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
26277d41
PB
7029 tree type, tree a, tree b, tree c)
7030{
7031 tree ret;
7032
987b67bc 7033 ret = fold_build3 (code, type, a, b, c);
26277d41
PB
7034 STRIP_NOPS (ret);
7035
726a989a
RB
7036 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7037 GSI_SAME_STMT);
26277d41
PB
7038}
7039
726a989a 7040/* Build a binary operation and gimplify it. Emit code before GSI.
26277d41
PB
7041 Return the gimple_val holding the result. */
7042
7043tree
726a989a 7044gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
26277d41
PB
7045 tree type, tree a, tree b)
7046{
7047 tree ret;
7048
987b67bc 7049 ret = fold_build2 (code, type, a, b);
26277d41
PB
7050 STRIP_NOPS (ret);
7051
726a989a
RB
7052 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7053 GSI_SAME_STMT);
26277d41
PB
7054}
7055
726a989a 7056/* Build a unary operation and gimplify it. Emit code before GSI.
26277d41
PB
7057 Return the gimple_val holding the result. */
7058
7059tree
726a989a 7060gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
26277d41
PB
7061 tree a)
7062{
7063 tree ret;
7064
987b67bc 7065 ret = fold_build1 (code, type, a);
26277d41
PB
7066 STRIP_NOPS (ret);
7067
726a989a
RB
7068 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
7069 GSI_SAME_STMT);
26277d41
PB
7070}
7071
7072
6de9cd9a
DN
7073\f
7074/* Emit return warnings. */
7075
c2924966 7076static unsigned int
6de9cd9a
DN
7077execute_warn_function_return (void)
7078{
9506ac2b 7079 source_location location;
726a989a 7080 gimple last;
6de9cd9a 7081 edge e;
628f6a4e 7082 edge_iterator ei;
6de9cd9a 7083
6de9cd9a
DN
7084 /* If we have a path to EXIT, then we do return. */
7085 if (TREE_THIS_VOLATILE (cfun->decl)
628f6a4e 7086 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0)
6de9cd9a 7087 {
9506ac2b 7088 location = UNKNOWN_LOCATION;
628f6a4e 7089 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6de9cd9a
DN
7090 {
7091 last = last_stmt (e->src);
726a989a
RB
7092 if (gimple_code (last) == GIMPLE_RETURN
7093 && (location = gimple_location (last)) != UNKNOWN_LOCATION)
6de9cd9a
DN
7094 break;
7095 }
9506ac2b
PB
7096 if (location == UNKNOWN_LOCATION)
7097 location = cfun->function_end_locus;
d4ee4d25 7098 warning (0, "%H%<noreturn%> function does return", &location);
6de9cd9a
DN
7099 }
7100
7101 /* If we see "return;" in some basic block, then we do reach the end
7102 without returning a value. */
7103 else if (warn_return_type
089efaa4 7104 && !TREE_NO_WARNING (cfun->decl)
628f6a4e 7105 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) > 0
6de9cd9a
DN
7106 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
7107 {
628f6a4e 7108 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6de9cd9a 7109 {
726a989a
RB
7110 gimple last = last_stmt (e->src);
7111 if (gimple_code (last) == GIMPLE_RETURN
7112 && gimple_return_retval (last) == NULL
7113 && !gimple_no_warning_p (last))
6de9cd9a 7114 {
726a989a 7115 location = gimple_location (last);
9506ac2b
PB
7116 if (location == UNKNOWN_LOCATION)
7117 location = cfun->function_end_locus;
aa14403d 7118 warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
089efaa4 7119 TREE_NO_WARNING (cfun->decl) = 1;
6de9cd9a
DN
7120 break;
7121 }
7122 }
7123 }
c2924966 7124 return 0;
6de9cd9a
DN
7125}
7126
7127
7128/* Given a basic block B which ends with a conditional and has
7129 precisely two successors, determine which of the edges is taken if
7130 the conditional is true and which is taken if the conditional is
7131 false. Set TRUE_EDGE and FALSE_EDGE appropriately. */
7132
7133void
7134extract_true_false_edges_from_block (basic_block b,
7135 edge *true_edge,
7136 edge *false_edge)
7137{
628f6a4e 7138 edge e = EDGE_SUCC (b, 0);
6de9cd9a
DN
7139
7140 if (e->flags & EDGE_TRUE_VALUE)
7141 {
7142 *true_edge = e;
628f6a4e 7143 *false_edge = EDGE_SUCC (b, 1);
6de9cd9a
DN
7144 }
7145 else
7146 {
7147 *false_edge = e;
628f6a4e 7148 *true_edge = EDGE_SUCC (b, 1);
6de9cd9a
DN
7149 }
7150}
7151
8ddbbcae 7152struct gimple_opt_pass pass_warn_function_return =
6de9cd9a 7153{
8ddbbcae
JH
7154 {
7155 GIMPLE_PASS,
6de9cd9a
DN
7156 NULL, /* name */
7157 NULL, /* gate */
7158 execute_warn_function_return, /* execute */
7159 NULL, /* sub */
7160 NULL, /* next */
7161 0, /* static_pass_number */
7072a650 7162 TV_NONE, /* tv_id */
00bfee6f 7163 PROP_cfg, /* properties_required */
6de9cd9a
DN
7164 0, /* properties_provided */
7165 0, /* properties_destroyed */
7166 0, /* todo_flags_start */
8ddbbcae
JH
7167 0 /* todo_flags_finish */
7168 }
6de9cd9a 7169};
aa313ed4
JH
7170
7171/* Emit noreturn warnings. */
7172
c2924966 7173static unsigned int
aa313ed4
JH
7174execute_warn_function_noreturn (void)
7175{
7176 if (warn_missing_noreturn
7177 && !TREE_THIS_VOLATILE (cfun->decl)
7178 && EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 0
e8924938 7179 && !lang_hooks.missing_noreturn_ok_p (cfun->decl))
3176a0c2
DD
7180 warning (OPT_Wmissing_noreturn, "%Jfunction might be possible candidate "
7181 "for attribute %<noreturn%>",
aa313ed4 7182 cfun->decl);
c2924966 7183 return 0;
aa313ed4
JH
7184}
7185
8ddbbcae 7186struct gimple_opt_pass pass_warn_function_noreturn =
aa313ed4 7187{
8ddbbcae
JH
7188 {
7189 GIMPLE_PASS,
aa313ed4
JH
7190 NULL, /* name */
7191 NULL, /* gate */
7192 execute_warn_function_noreturn, /* execute */
7193 NULL, /* sub */
7194 NULL, /* next */
7195 0, /* static_pass_number */
7072a650 7196 TV_NONE, /* tv_id */
aa313ed4
JH
7197 PROP_cfg, /* properties_required */
7198 0, /* properties_provided */
7199 0, /* properties_destroyed */
7200 0, /* todo_flags_start */
8ddbbcae
JH
7201 0 /* todo_flags_finish */
7202 }
aa313ed4 7203};