]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-cfg.c
re PR middle-end/59208 (ice in initialize_flags_in_bb)
[thirdparty/gcc.git] / gcc / tree-cfg.c
CommitLineData
6de9cd9a 1/* Control flow functions for trees.
d1e082c2 2 Copyright (C) 2001-2013 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Diego Novillo <dnovillo@redhat.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9dcd6f09 9the Free Software Foundation; either version 3, or (at your option)
6de9cd9a
DN
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
20
21#include "config.h"
22#include "system.h"
23#include "coretypes.h"
4a8fb1a1 24#include "hash-table.h"
6de9cd9a
DN
25#include "tm.h"
26#include "tree.h"
d8a2d370
DN
27#include "trans-mem.h"
28#include "stor-layout.h"
29#include "print-tree.h"
6de9cd9a 30#include "tm_p.h"
6de9cd9a 31#include "basic-block.h"
6de9cd9a
DN
32#include "flags.h"
33#include "function.h"
cf835838 34#include "gimple-pretty-print.h"
2fb9a547
AM
35#include "pointer-set.h"
36#include "tree-ssa-alias.h"
37#include "internal-fn.h"
38#include "gimple-fold.h"
39#include "tree-eh.h"
40#include "gimple-expr.h"
41#include "is-a.h"
18f429e2 42#include "gimple.h"
5be5c238 43#include "gimple-iterator.h"
18f429e2 44#include "gimplify-me.h"
5be5c238 45#include "gimple-walk.h"
442b4905
AM
46#include "gimple-ssa.h"
47#include "cgraph.h"
48#include "tree-cfg.h"
49#include "tree-phinodes.h"
50#include "ssa-iterators.h"
d8a2d370 51#include "stringpool.h"
442b4905 52#include "tree-ssanames.h"
e28030cf
AM
53#include "tree-ssa-loop-manip.h"
54#include "tree-ssa-loop-niter.h"
442b4905 55#include "tree-into-ssa.h"
d8a2d370 56#include "expr.h"
442b4905 57#include "tree-dfa.h"
7a300452 58#include "tree-ssa.h"
6de9cd9a
DN
59#include "tree-dump.h"
60#include "tree-pass.h"
718f9c0f 61#include "diagnostic-core.h"
6de9cd9a
DN
62#include "except.h"
63#include "cfgloop.h"
9af0df6b 64#include "tree-ssa-propagate.h"
6946b3f7 65#include "value-prof.h"
917948d3 66#include "tree-inline.h"
d45eae79 67#include "target.h"
c1bf2a39 68#include "tree-ssa-live.h"
0645c1a2 69#include "omp-low.h"
4484a35a 70#include "tree-cfgcleanup.h"
6de9cd9a
DN
71
72/* This file contains functions for building the Control Flow Graph (CFG)
73 for a function tree. */
74
75/* Local declarations. */
76
77/* Initial capacity for the basic block array. */
78static const int initial_cfg_capacity = 20;
79
d6be0d7f
JL
80/* This hash table allows us to efficiently lookup all CASE_LABEL_EXPRs
81 which use a particular edge. The CASE_LABEL_EXPRs are chained together
308e3ba6 82 via their CASE_CHAIN field, which we clear after we're done with the
726a989a 83 hash table to prevent problems with duplication of GIMPLE_SWITCHes.
92b6dff3 84
d6be0d7f
JL
85 Access to this list of CASE_LABEL_EXPRs allows us to efficiently
86 update the case vector in response to edge redirections.
92b6dff3 87
d6be0d7f
JL
88 Right now this table is set up and torn down at key points in the
89 compilation process. It would be nice if we could make the table
90 more persistent. The key is getting notification of changes to
91 the CFG (particularly edge removal, creation and redirection). */
92
15814ba0 93static struct pointer_map_t *edge_to_cases;
92b6dff3 94
fc249fe5
MM
95/* If we record edge_to_cases, this bitmap will hold indexes
96 of basic blocks that end in a GIMPLE_SWITCH which we touched
97 due to edge manipulations. */
98
99static bitmap touched_switch_bbs;
100
6de9cd9a
DN
101/* CFG statistics. */
102struct cfg_stats_d
103{
104 long num_merged_labels;
105};
106
107static struct cfg_stats_d cfg_stats;
108
109/* Nonzero if we found a computed goto while building basic blocks. */
110static bool found_computed_goto;
111
6c52e687
CC
112/* Hash table to store last discriminator assigned for each locus. */
113struct locus_discrim_map
114{
115 location_t locus;
116 int discriminator;
117};
4a8fb1a1
LC
118
119/* Hashtable helpers. */
120
3ad695b9 121struct locus_discrim_hasher : typed_free_remove <locus_discrim_map>
4a8fb1a1
LC
122{
123 typedef locus_discrim_map value_type;
124 typedef locus_discrim_map compare_type;
125 static inline hashval_t hash (const value_type *);
126 static inline bool equal (const value_type *, const compare_type *);
127};
128
129/* Trivial hash function for a location_t. ITEM is a pointer to
130 a hash table entry that maps a location_t to a discriminator. */
131
132inline hashval_t
3ad695b9 133locus_discrim_hasher::hash (const value_type *item)
4a8fb1a1 134{
25e25c73 135 return LOCATION_LINE (item->locus);
4a8fb1a1
LC
136}
137
138/* Equality function for the locus-to-discriminator map. A and B
139 point to the two hash table entries to compare. */
140
141inline bool
3ad695b9 142locus_discrim_hasher::equal (const value_type *a, const compare_type *b)
4a8fb1a1 143{
25e25c73 144 return LOCATION_LINE (a->locus) == LOCATION_LINE (b->locus);
4a8fb1a1
LC
145}
146
3ad695b9 147static hash_table <locus_discrim_hasher> discriminator_per_locus;
6c52e687 148
6de9cd9a 149/* Basic blocks and flowgraphs. */
726a989a 150static void make_blocks (gimple_seq);
6de9cd9a 151static void factor_computed_gotos (void);
6de9cd9a
DN
152
153/* Edges. */
154static void make_edges (void);
25e25c73 155static void assign_discriminators (void);
6de9cd9a 156static void make_cond_expr_edges (basic_block);
726a989a 157static void make_gimple_switch_edges (basic_block);
6de9cd9a 158static void make_goto_expr_edges (basic_block);
1c384bf1 159static void make_gimple_asm_edges (basic_block);
726a989a
RB
160static edge gimple_redirect_edge_and_branch (edge, basic_block);
161static edge gimple_try_redirect_by_replacing_jump (edge, basic_block);
c2924966 162static unsigned int split_critical_edges (void);
6de9cd9a
DN
163
164/* Various helpers. */
726a989a
RB
165static inline bool stmt_starts_bb_p (gimple, gimple);
166static int gimple_verify_flow_info (void);
167static void gimple_make_forwarder_block (edge);
6c52e687 168static gimple first_non_label_stmt (basic_block);
0a35513e 169static bool verify_gimple_transaction (gimple);
6de9cd9a
DN
170
171/* Flowgraph optimization and cleanup. */
726a989a
RB
172static void gimple_merge_blocks (basic_block, basic_block);
173static bool gimple_can_merge_blocks_p (basic_block, basic_block);
6de9cd9a 174static void remove_bb (basic_block);
be477406 175static edge find_taken_edge_computed_goto (basic_block, tree);
6de9cd9a
DN
176static edge find_taken_edge_cond_expr (basic_block, tree);
177static edge find_taken_edge_switch_expr (basic_block, tree);
726a989a 178static tree find_case_label_for_value (gimple, tree);
6de9cd9a 179
a930a4ef 180void
9defb1fe 181init_empty_tree_cfg_for_function (struct function *fn)
a930a4ef
JH
182{
183 /* Initialize the basic block array. */
9defb1fe
DN
184 init_flow (fn);
185 profile_status_for_function (fn) = PROFILE_ABSENT;
0cae8d31 186 n_basic_blocks_for_fn (fn) = NUM_FIXED_BLOCKS;
9defb1fe 187 last_basic_block_for_function (fn) = NUM_FIXED_BLOCKS;
9771b263
DN
188 vec_alloc (basic_block_info_for_function (fn), initial_cfg_capacity);
189 vec_safe_grow_cleared (basic_block_info_for_function (fn),
a590ac65 190 initial_cfg_capacity);
a930a4ef
JH
191
192 /* Build a mapping of labels to their associated blocks. */
9771b263
DN
193 vec_alloc (label_to_block_map_for_function (fn), initial_cfg_capacity);
194 vec_safe_grow_cleared (label_to_block_map_for_function (fn),
a590ac65 195 initial_cfg_capacity);
a930a4ef 196
b8698a0f 197 SET_BASIC_BLOCK_FOR_FUNCTION (fn, ENTRY_BLOCK,
fefa31b5 198 ENTRY_BLOCK_PTR_FOR_FN (fn));
b8698a0f 199 SET_BASIC_BLOCK_FOR_FUNCTION (fn, EXIT_BLOCK,
fefa31b5 200 EXIT_BLOCK_PTR_FOR_FN (fn));
9defb1fe 201
fefa31b5
DM
202 ENTRY_BLOCK_PTR_FOR_FN (fn)->next_bb
203 = EXIT_BLOCK_PTR_FOR_FN (fn);
204 EXIT_BLOCK_PTR_FOR_FN (fn)->prev_bb
205 = ENTRY_BLOCK_PTR_FOR_FN (fn);
9defb1fe
DN
206}
207
208void
209init_empty_tree_cfg (void)
210{
211 init_empty_tree_cfg_for_function (cfun);
a930a4ef 212}
6de9cd9a
DN
213
214/*---------------------------------------------------------------------------
215 Create basic blocks
216---------------------------------------------------------------------------*/
217
726a989a 218/* Entry point to the CFG builder for trees. SEQ is the sequence of
6de9cd9a
DN
219 statements to be added to the flowgraph. */
220
221static void
726a989a 222build_gimple_cfg (gimple_seq seq)
6de9cd9a 223{
726a989a
RB
224 /* Register specific gimple functions. */
225 gimple_register_cfg_hooks ();
6de9cd9a 226
6de9cd9a
DN
227 memset ((void *) &cfg_stats, 0, sizeof (cfg_stats));
228
a930a4ef 229 init_empty_tree_cfg ();
6de9cd9a
DN
230
231 found_computed_goto = 0;
726a989a 232 make_blocks (seq);
6de9cd9a
DN
233
234 /* Computed gotos are hell to deal with, especially if there are
235 lots of them with a large number of destinations. So we factor
236 them to a common computed goto location before we build the
237 edge list. After we convert back to normal form, we will un-factor
238 the computed gotos since factoring introduces an unwanted jump. */
239 if (found_computed_goto)
240 factor_computed_gotos ();
241
f0b698c1 242 /* Make sure there is always at least one block, even if it's empty. */
0cae8d31 243 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
fefa31b5 244 create_empty_bb (ENTRY_BLOCK_PTR_FOR_FN (cfun));
6de9cd9a 245
6de9cd9a 246 /* Adjust the size of the array. */
0cae8d31
DM
247 if (basic_block_info->length () < (size_t) n_basic_blocks_for_fn (cfun))
248 vec_safe_grow_cleared (basic_block_info, n_basic_blocks_for_fn (cfun));
6de9cd9a 249
f667741c
SB
250 /* To speed up statement iterator walks, we first purge dead labels. */
251 cleanup_dead_labels ();
252
253 /* Group case nodes to reduce the number of edges.
254 We do this after cleaning up dead labels because otherwise we miss
255 a lot of obvious case merging opportunities. */
256 group_case_labels ();
257
6de9cd9a 258 /* Create the edges of the flowgraph. */
4a8fb1a1 259 discriminator_per_locus.create (13);
6de9cd9a 260 make_edges ();
25e25c73 261 assign_discriminators ();
8b11009b 262 cleanup_dead_labels ();
4a8fb1a1 263 discriminator_per_locus.dispose ();
6de9cd9a
DN
264}
265
8170608b
TB
266
267/* Search for ANNOTATE call with annot_expr_ivdep_kind; if found, remove
268 it and set loop->safelen to INT_MAX. We assume that the annotation
269 comes immediately before the condition. */
270
271static void
272replace_loop_annotate ()
273{
274 struct loop *loop;
8170608b
TB
275 basic_block bb;
276 gimple_stmt_iterator gsi;
277 gimple stmt;
278
f0bd40b1 279 FOR_EACH_LOOP (loop, 0)
8170608b
TB
280 {
281 gsi = gsi_last_bb (loop->header);
282 stmt = gsi_stmt (gsi);
283 if (stmt && gimple_code (stmt) == GIMPLE_COND)
284 {
285 gsi_prev_nondebug (&gsi);
286 if (gsi_end_p (gsi))
287 continue;
288 stmt = gsi_stmt (gsi);
289 if (gimple_code (stmt) != GIMPLE_CALL)
290 continue;
291 if (!gimple_call_internal_p (stmt)
292 || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
293 continue;
9439e9a1 294 if ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1))
8170608b
TB
295 != annot_expr_ivdep_kind)
296 continue;
297 stmt = gimple_build_assign (gimple_call_lhs (stmt),
298 gimple_call_arg (stmt, 0));
299 gsi_replace (&gsi, stmt, true);
300 loop->safelen = INT_MAX;
301 }
302 }
303
304 /* Remove IFN_ANNOTATE. Safeguard for the case loop->latch == NULL. */
305 FOR_EACH_BB (bb)
306 {
307 gsi = gsi_last_bb (bb);
308 stmt = gsi_stmt (gsi);
309 if (stmt && gimple_code (stmt) == GIMPLE_COND)
310 gsi_prev_nondebug (&gsi);
311 if (gsi_end_p (gsi))
312 continue;
313 stmt = gsi_stmt (gsi);
314 if (gimple_code (stmt) != GIMPLE_CALL)
315 continue;
316 if (!gimple_call_internal_p (stmt)
317 || gimple_call_internal_fn (stmt) != IFN_ANNOTATE)
318 continue;
9439e9a1 319 if ((annot_expr_kind) tree_to_shwi (gimple_call_arg (stmt, 1))
8170608b
TB
320 != annot_expr_ivdep_kind)
321 continue;
c5028d80
TB
322 warning_at (gimple_location (stmt), 0, "ignoring %<GCC ivdep%> "
323 "annotation");
8170608b
TB
324 stmt = gimple_build_assign (gimple_call_lhs (stmt),
325 gimple_call_arg (stmt, 0));
326 gsi_replace (&gsi, stmt, true);
327 }
328}
329
330
c2924966 331static unsigned int
6de9cd9a
DN
332execute_build_cfg (void)
333{
39ecc018
JH
334 gimple_seq body = gimple_body (current_function_decl);
335
336 build_gimple_cfg (body);
337 gimple_set_body (current_function_decl, NULL);
cff7525f
JH
338 if (dump_file && (dump_flags & TDF_DETAILS))
339 {
340 fprintf (dump_file, "Scope blocks:\n");
341 dump_scope_blocks (dump_file, dump_flags);
342 }
a9e0d843
RB
343 cleanup_tree_cfg ();
344 loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
8170608b 345 replace_loop_annotate ();
c2924966 346 return 0;
6de9cd9a
DN
347}
348
27a4cd48
DM
349namespace {
350
351const pass_data pass_data_build_cfg =
352{
353 GIMPLE_PASS, /* type */
354 "cfg", /* name */
355 OPTGROUP_NONE, /* optinfo_flags */
356 false, /* has_gate */
357 true, /* has_execute */
358 TV_TREE_CFG, /* tv_id */
359 PROP_gimple_leh, /* properties_required */
360 ( PROP_cfg | PROP_loops ), /* properties_provided */
361 0, /* properties_destroyed */
362 0, /* todo_flags_start */
363 TODO_verify_stmts, /* todo_flags_finish */
6de9cd9a
DN
364};
365
27a4cd48
DM
366class pass_build_cfg : public gimple_opt_pass
367{
368public:
c3284718
RS
369 pass_build_cfg (gcc::context *ctxt)
370 : gimple_opt_pass (pass_data_build_cfg, ctxt)
27a4cd48
DM
371 {}
372
373 /* opt_pass methods: */
374 unsigned int execute () { return execute_build_cfg (); }
375
376}; // class pass_build_cfg
377
378} // anon namespace
379
380gimple_opt_pass *
381make_pass_build_cfg (gcc::context *ctxt)
382{
383 return new pass_build_cfg (ctxt);
384}
385
726a989a
RB
386
387/* Return true if T is a computed goto. */
388
389static bool
390computed_goto_p (gimple t)
391{
392 return (gimple_code (t) == GIMPLE_GOTO
393 && TREE_CODE (gimple_goto_dest (t)) != LABEL_DECL);
394}
395
d8202b84
JJ
396/* Returns true for edge E where e->src ends with a GIMPLE_COND and
397 the other edge points to a bb with just __builtin_unreachable ().
398 I.e. return true for C->M edge in:
399 <bb C>:
400 ...
401 if (something)
402 goto <bb N>;
403 else
404 goto <bb M>;
405 <bb N>:
406 __builtin_unreachable ();
407 <bb M>: */
408
409bool
410assert_unreachable_fallthru_edge_p (edge e)
411{
412 basic_block pred_bb = e->src;
413 gimple last = last_stmt (pred_bb);
414 if (last && gimple_code (last) == GIMPLE_COND)
415 {
416 basic_block other_bb = EDGE_SUCC (pred_bb, 0)->dest;
417 if (other_bb == e->dest)
418 other_bb = EDGE_SUCC (pred_bb, 1)->dest;
419 if (EDGE_COUNT (other_bb->succs) == 0)
420 {
421 gimple_stmt_iterator gsi = gsi_after_labels (other_bb);
422 gimple stmt;
423
424 if (gsi_end_p (gsi))
425 return false;
426 stmt = gsi_stmt (gsi);
427 if (is_gimple_debug (stmt))
428 {
429 gsi_next_nondebug (&gsi);
430 if (gsi_end_p (gsi))
431 return false;
432 stmt = gsi_stmt (gsi);
433 }
434 return gimple_call_builtin_p (stmt, BUILT_IN_UNREACHABLE);
435 }
436 }
437 return false;
438}
439
726a989a 440
6531d1be 441/* Search the CFG for any computed gotos. If found, factor them to a
6de9cd9a 442 common computed goto site. Also record the location of that site so
6531d1be 443 that we can un-factor the gotos after we have converted back to
6de9cd9a
DN
444 normal form. */
445
446static void
447factor_computed_gotos (void)
448{
449 basic_block bb;
450 tree factored_label_decl = NULL;
451 tree var = NULL;
726a989a
RB
452 gimple factored_computed_goto_label = NULL;
453 gimple factored_computed_goto = NULL;
6de9cd9a
DN
454
455 /* We know there are one or more computed gotos in this function.
456 Examine the last statement in each basic block to see if the block
457 ends with a computed goto. */
6531d1be 458
6de9cd9a
DN
459 FOR_EACH_BB (bb)
460 {
726a989a
RB
461 gimple_stmt_iterator gsi = gsi_last_bb (bb);
462 gimple last;
6de9cd9a 463
726a989a 464 if (gsi_end_p (gsi))
6de9cd9a 465 continue;
726a989a
RB
466
467 last = gsi_stmt (gsi);
6de9cd9a
DN
468
469 /* Ignore the computed goto we create when we factor the original
470 computed gotos. */
471 if (last == factored_computed_goto)
472 continue;
473
474 /* If the last statement is a computed goto, factor it. */
475 if (computed_goto_p (last))
476 {
726a989a 477 gimple assignment;
6de9cd9a
DN
478
479 /* The first time we find a computed goto we need to create
480 the factored goto block and the variable each original
481 computed goto will use for their goto destination. */
726a989a 482 if (!factored_computed_goto)
6de9cd9a
DN
483 {
484 basic_block new_bb = create_empty_bb (bb);
726a989a 485 gimple_stmt_iterator new_gsi = gsi_start_bb (new_bb);
6de9cd9a
DN
486
487 /* Create the destination of the factored goto. Each original
488 computed goto will put its desired destination into this
489 variable and jump to the label we create immediately
490 below. */
491 var = create_tmp_var (ptr_type_node, "gotovar");
492
493 /* Build a label for the new block which will contain the
494 factored computed goto. */
c2255bc4 495 factored_label_decl = create_artificial_label (UNKNOWN_LOCATION);
6de9cd9a 496 factored_computed_goto_label
726a989a
RB
497 = gimple_build_label (factored_label_decl);
498 gsi_insert_after (&new_gsi, factored_computed_goto_label,
499 GSI_NEW_STMT);
6de9cd9a
DN
500
501 /* Build our new computed goto. */
726a989a
RB
502 factored_computed_goto = gimple_build_goto (var);
503 gsi_insert_after (&new_gsi, factored_computed_goto, GSI_NEW_STMT);
6de9cd9a
DN
504 }
505
506 /* Copy the original computed goto's destination into VAR. */
726a989a
RB
507 assignment = gimple_build_assign (var, gimple_goto_dest (last));
508 gsi_insert_before (&gsi, assignment, GSI_SAME_STMT);
6de9cd9a
DN
509
510 /* And re-vector the computed goto to the new destination. */
726a989a 511 gimple_goto_set_dest (last, factored_label_decl);
6de9cd9a
DN
512 }
513 }
514}
515
516
726a989a 517/* Build a flowgraph for the sequence of stmts SEQ. */
6de9cd9a
DN
518
519static void
726a989a 520make_blocks (gimple_seq seq)
6de9cd9a 521{
726a989a
RB
522 gimple_stmt_iterator i = gsi_start (seq);
523 gimple stmt = NULL;
6de9cd9a 524 bool start_new_block = true;
726a989a 525 bool first_stmt_of_seq = true;
fefa31b5 526 basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
6de9cd9a 527
726a989a 528 while (!gsi_end_p (i))
6de9cd9a 529 {
726a989a 530 gimple prev_stmt;
6de9cd9a
DN
531
532 prev_stmt = stmt;
726a989a 533 stmt = gsi_stmt (i);
6de9cd9a
DN
534
535 /* If the statement starts a new basic block or if we have determined
536 in a previous pass that we need to create a new block for STMT, do
537 so now. */
538 if (start_new_block || stmt_starts_bb_p (stmt, prev_stmt))
539 {
726a989a 540 if (!first_stmt_of_seq)
355a7673 541 gsi_split_seq_before (&i, &seq);
726a989a 542 bb = create_basic_block (seq, NULL, bb);
6de9cd9a
DN
543 start_new_block = false;
544 }
545
546 /* Now add STMT to BB and create the subgraphs for special statement
547 codes. */
726a989a 548 gimple_set_bb (stmt, bb);
6de9cd9a
DN
549
550 if (computed_goto_p (stmt))
551 found_computed_goto = true;
552
553 /* If STMT is a basic block terminator, set START_NEW_BLOCK for the
554 next iteration. */
555 if (stmt_ends_bb_p (stmt))
54634841
RG
556 {
557 /* If the stmt can make abnormal goto use a new temporary
558 for the assignment to the LHS. This makes sure the old value
559 of the LHS is available on the abnormal edge. Otherwise
560 we will end up with overlapping life-ranges for abnormal
561 SSA names. */
562 if (gimple_has_lhs (stmt)
563 && stmt_can_make_abnormal_goto (stmt)
564 && is_gimple_reg_type (TREE_TYPE (gimple_get_lhs (stmt))))
565 {
566 tree lhs = gimple_get_lhs (stmt);
567 tree tmp = create_tmp_var (TREE_TYPE (lhs), NULL);
568 gimple s = gimple_build_assign (lhs, tmp);
569 gimple_set_location (s, gimple_location (stmt));
570 gimple_set_block (s, gimple_block (stmt));
571 gimple_set_lhs (stmt, tmp);
572 if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
573 || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
574 DECL_GIMPLE_REG_P (tmp) = 1;
575 gsi_insert_after (&i, s, GSI_SAME_STMT);
576 }
577 start_new_block = true;
578 }
6de9cd9a 579
726a989a
RB
580 gsi_next (&i);
581 first_stmt_of_seq = false;
6de9cd9a
DN
582 }
583}
584
585
586/* Create and return a new empty basic block after bb AFTER. */
587
588static basic_block
589create_bb (void *h, void *e, basic_block after)
590{
591 basic_block bb;
592
1e128c5f 593 gcc_assert (!e);
6de9cd9a 594
27fd69fa 595 /* Create and initialize a new basic block. Since alloc_block uses
a9429e29
LB
596 GC allocation that clears memory to allocate a basic block, we do
597 not have to clear the newly allocated basic block here. */
6de9cd9a 598 bb = alloc_block ();
6de9cd9a
DN
599
600 bb->index = last_basic_block;
601 bb->flags = BB_NEW;
355a7673 602 set_bb_seq (bb, h ? (gimple_seq) h : NULL);
6de9cd9a
DN
603
604 /* Add the new block to the linked list of blocks. */
605 link_block (bb, after);
606
607 /* Grow the basic block array if needed. */
9771b263 608 if ((size_t) last_basic_block == basic_block_info->length ())
6de9cd9a
DN
609 {
610 size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
9771b263 611 vec_safe_grow_cleared (basic_block_info, new_size);
6de9cd9a
DN
612 }
613
614 /* Add the newly created block to the array. */
68f9b844 615 SET_BASIC_BLOCK (last_basic_block, bb);
6de9cd9a 616
0cae8d31 617 n_basic_blocks_for_fn (cfun)++;
6de9cd9a
DN
618 last_basic_block++;
619
6de9cd9a
DN
620 return bb;
621}
622
623
624/*---------------------------------------------------------------------------
625 Edge creation
626---------------------------------------------------------------------------*/
627
fca01525
KH
628/* Fold COND_EXPR_COND of each COND_EXPR. */
629
e21aff8a 630void
fca01525
KH
631fold_cond_expr_cond (void)
632{
633 basic_block bb;
634
635 FOR_EACH_BB (bb)
636 {
726a989a 637 gimple stmt = last_stmt (bb);
fca01525 638
726a989a 639 if (stmt && gimple_code (stmt) == GIMPLE_COND)
fca01525 640 {
db3927fb 641 location_t loc = gimple_location (stmt);
6ac01510
ILT
642 tree cond;
643 bool zerop, onep;
644
645 fold_defer_overflow_warnings ();
db3927fb 646 cond = fold_binary_loc (loc, gimple_cond_code (stmt), boolean_type_node,
726a989a
RB
647 gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
648 if (cond)
649 {
650 zerop = integer_zerop (cond);
651 onep = integer_onep (cond);
652 }
653 else
654 zerop = onep = false;
655
e233ac97 656 fold_undefer_overflow_warnings (zerop || onep,
4df28528 657 stmt,
6ac01510
ILT
658 WARN_STRICT_OVERFLOW_CONDITIONAL);
659 if (zerop)
726a989a 660 gimple_cond_make_false (stmt);
6ac01510 661 else if (onep)
726a989a 662 gimple_cond_make_true (stmt);
fca01525
KH
663 }
664 }
665}
666
6de9cd9a
DN
667/* Join all the blocks in the flowgraph. */
668
669static void
670make_edges (void)
671{
672 basic_block bb;
bed575d5 673 struct omp_region *cur_region = NULL;
6de9cd9a
DN
674
675 /* Create an edge from entry to the first block with executable
676 statements in it. */
fefa31b5
DM
677 make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), BASIC_BLOCK (NUM_FIXED_BLOCKS),
678 EDGE_FALLTHRU);
6de9cd9a 679
adb35797 680 /* Traverse the basic block array placing edges. */
6de9cd9a
DN
681 FOR_EACH_BB (bb)
682 {
726a989a 683 gimple last = last_stmt (bb);
56e84019 684 bool fallthru;
6de9cd9a 685
56e84019 686 if (last)
6de9cd9a 687 {
726a989a 688 enum gimple_code code = gimple_code (last);
bed575d5 689 switch (code)
56e84019 690 {
726a989a 691 case GIMPLE_GOTO:
56e84019
RH
692 make_goto_expr_edges (bb);
693 fallthru = false;
694 break;
726a989a 695 case GIMPLE_RETURN:
fefa31b5 696 make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
56e84019
RH
697 fallthru = false;
698 break;
726a989a 699 case GIMPLE_COND:
56e84019
RH
700 make_cond_expr_edges (bb);
701 fallthru = false;
702 break;
726a989a
RB
703 case GIMPLE_SWITCH:
704 make_gimple_switch_edges (bb);
56e84019
RH
705 fallthru = false;
706 break;
726a989a 707 case GIMPLE_RESX:
56e84019
RH
708 make_eh_edges (last);
709 fallthru = false;
710 break;
1d65f45c
RH
711 case GIMPLE_EH_DISPATCH:
712 fallthru = make_eh_dispatch_edges (last);
713 break;
56e84019 714
726a989a 715 case GIMPLE_CALL:
56e84019
RH
716 /* If this function receives a nonlocal goto, then we need to
717 make edges from this call site to all the nonlocal goto
718 handlers. */
726a989a 719 if (stmt_can_make_abnormal_goto (last))
4f6c2131 720 make_abnormal_goto_edges (bb, true);
6de9cd9a 721
56e84019
RH
722 /* If this statement has reachable exception handlers, then
723 create abnormal edges to them. */
724 make_eh_edges (last);
725
c54c785d
JH
726 /* BUILTIN_RETURN is really a return statement. */
727 if (gimple_call_builtin_p (last, BUILT_IN_RETURN))
fefa31b5
DM
728 make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0), fallthru =
729 false;
56e84019 730 /* Some calls are known not to return. */
c54c785d
JH
731 else
732 fallthru = !(gimple_call_flags (last) & ECF_NORETURN);
56e84019
RH
733 break;
734
726a989a
RB
735 case GIMPLE_ASSIGN:
736 /* A GIMPLE_ASSIGN may throw internally and thus be considered
737 control-altering. */
56e84019 738 if (is_ctrl_altering_stmt (last))
1d65f45c 739 make_eh_edges (last);
56e84019
RH
740 fallthru = true;
741 break;
742
1c384bf1
RH
743 case GIMPLE_ASM:
744 make_gimple_asm_edges (bb);
745 fallthru = true;
746 break;
747
0645c1a2
AM
748 CASE_GIMPLE_OMP:
749 fallthru = make_gimple_omp_edges (bb, &cur_region);
bed575d5
RS
750 break;
751
0a35513e
AH
752 case GIMPLE_TRANSACTION:
753 {
754 tree abort_label = gimple_transaction_label (last);
755 if (abort_label)
398b1daa 756 make_edge (bb, label_to_block (abort_label), EDGE_TM_ABORT);
0a35513e
AH
757 fallthru = true;
758 }
759 break;
760
56e84019
RH
761 default:
762 gcc_assert (!stmt_ends_bb_p (last));
763 fallthru = true;
764 }
6de9cd9a 765 }
56e84019
RH
766 else
767 fallthru = true;
6de9cd9a 768
56e84019 769 if (fallthru)
25e25c73 770 make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
6de9cd9a
DN
771 }
772
0645c1a2 773 free_omp_regions ();
bed575d5 774
fca01525
KH
775 /* Fold COND_EXPR_COND of each COND_EXPR. */
776 fold_cond_expr_cond ();
6de9cd9a
DN
777}
778
6c52e687
CC
779/* Find the next available discriminator value for LOCUS. The
780 discriminator distinguishes among several basic blocks that
781 share a common locus, allowing for more accurate sample-based
782 profiling. */
783
784static int
785next_discriminator_for_locus (location_t locus)
786{
787 struct locus_discrim_map item;
788 struct locus_discrim_map **slot;
789
790 item.locus = locus;
791 item.discriminator = 0;
25e25c73
DC
792 slot = discriminator_per_locus.find_slot_with_hash (
793 &item, LOCATION_LINE (locus), INSERT);
6c52e687
CC
794 gcc_assert (slot);
795 if (*slot == HTAB_EMPTY_ENTRY)
796 {
797 *slot = XNEW (struct locus_discrim_map);
798 gcc_assert (*slot);
799 (*slot)->locus = locus;
800 (*slot)->discriminator = 0;
801 }
802 (*slot)->discriminator++;
803 return (*slot)->discriminator;
804}
805
806/* Return TRUE if LOCUS1 and LOCUS2 refer to the same source line. */
807
808static bool
809same_line_p (location_t locus1, location_t locus2)
810{
811 expanded_location from, to;
812
813 if (locus1 == locus2)
814 return true;
815
816 from = expand_location (locus1);
817 to = expand_location (locus2);
818
819 if (from.line != to.line)
820 return false;
821 if (from.file == to.file)
822 return true;
823 return (from.file != NULL
824 && to.file != NULL
ba78087b 825 && filename_cmp (from.file, to.file) == 0);
6c52e687
CC
826}
827
25e25c73 828/* Assign discriminators to each basic block. */
6c52e687
CC
829
830static void
25e25c73 831assign_discriminators (void)
6c52e687 832{
25e25c73 833 basic_block bb;
6c52e687 834
25e25c73
DC
835 FOR_EACH_BB (bb)
836 {
837 edge e;
838 edge_iterator ei;
839 gimple last = last_stmt (bb);
840 location_t locus = last ? gimple_location (last) : UNKNOWN_LOCATION;
6c52e687 841
25e25c73
DC
842 if (locus == UNKNOWN_LOCATION)
843 continue;
844
845 FOR_EACH_EDGE (e, ei, bb->succs)
846 {
847 gimple first = first_non_label_stmt (e->dest);
848 gimple last = last_stmt (e->dest);
849 if ((first && same_line_p (locus, gimple_location (first)))
850 || (last && same_line_p (locus, gimple_location (last))))
851 {
852 if (e->dest->discriminator != 0 && bb->discriminator == 0)
853 bb->discriminator = next_discriminator_for_locus (locus);
854 else
855 e->dest->discriminator = next_discriminator_for_locus (locus);
856 }
857 }
858 }
6c52e687 859}
6de9cd9a 860
726a989a 861/* Create the edges for a GIMPLE_COND starting at block BB. */
6de9cd9a
DN
862
863static void
864make_cond_expr_edges (basic_block bb)
865{
726a989a
RB
866 gimple entry = last_stmt (bb);
867 gimple then_stmt, else_stmt;
6de9cd9a
DN
868 basic_block then_bb, else_bb;
869 tree then_label, else_label;
d783b2a2 870 edge e;
6de9cd9a 871
1e128c5f 872 gcc_assert (entry);
726a989a 873 gcc_assert (gimple_code (entry) == GIMPLE_COND);
6de9cd9a
DN
874
875 /* Entry basic blocks for each component. */
726a989a
RB
876 then_label = gimple_cond_true_label (entry);
877 else_label = gimple_cond_false_label (entry);
6de9cd9a
DN
878 then_bb = label_to_block (then_label);
879 else_bb = label_to_block (else_label);
726a989a
RB
880 then_stmt = first_stmt (then_bb);
881 else_stmt = first_stmt (else_bb);
6de9cd9a 882
d783b2a2 883 e = make_edge (bb, then_bb, EDGE_TRUE_VALUE);
726a989a 884 e->goto_locus = gimple_location (then_stmt);
d783b2a2
JH
885 e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
886 if (e)
25e25c73 887 e->goto_locus = gimple_location (else_stmt);
a9b77cd1 888
726a989a
RB
889 /* We do not need the labels anymore. */
890 gimple_cond_set_true_label (entry, NULL_TREE);
891 gimple_cond_set_false_label (entry, NULL_TREE);
6de9cd9a
DN
892}
893
92b6dff3 894
d6be0d7f
JL
895/* Called for each element in the hash table (P) as we delete the
896 edge to cases hash table.
897
6531d1be 898 Clear all the TREE_CHAINs to prevent problems with copying of
d6be0d7f
JL
899 SWITCH_EXPRs and structure sharing rules, then free the hash table
900 element. */
901
15814ba0 902static bool
ac7d7749 903edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value,
15814ba0 904 void *data ATTRIBUTE_UNUSED)
d6be0d7f 905{
d6be0d7f
JL
906 tree t, next;
907
15814ba0 908 for (t = (tree) *value; t; t = next)
d6be0d7f 909 {
1290e54c
NF
910 next = CASE_CHAIN (t);
911 CASE_CHAIN (t) = NULL;
d6be0d7f 912 }
15814ba0
PB
913
914 *value = NULL;
eb9f9259 915 return true;
d6be0d7f
JL
916}
917
918/* Start recording information mapping edges to case labels. */
919
c9784e6d 920void
d6be0d7f
JL
921start_recording_case_labels (void)
922{
923 gcc_assert (edge_to_cases == NULL);
15814ba0 924 edge_to_cases = pointer_map_create ();
fc249fe5 925 touched_switch_bbs = BITMAP_ALLOC (NULL);
d6be0d7f
JL
926}
927
928/* Return nonzero if we are recording information for case labels. */
929
930static bool
931recording_case_labels_p (void)
932{
933 return (edge_to_cases != NULL);
934}
935
936/* Stop recording information mapping edges to case labels and
937 remove any information we have recorded. */
c9784e6d 938void
d6be0d7f
JL
939end_recording_case_labels (void)
940{
fc249fe5
MM
941 bitmap_iterator bi;
942 unsigned i;
15814ba0
PB
943 pointer_map_traverse (edge_to_cases, edge_to_cases_cleanup, NULL);
944 pointer_map_destroy (edge_to_cases);
d6be0d7f 945 edge_to_cases = NULL;
fc249fe5
MM
946 EXECUTE_IF_SET_IN_BITMAP (touched_switch_bbs, 0, i, bi)
947 {
948 basic_block bb = BASIC_BLOCK (i);
949 if (bb)
950 {
951 gimple stmt = last_stmt (bb);
952 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
953 group_case_labels_stmt (stmt);
954 }
955 }
956 BITMAP_FREE (touched_switch_bbs);
d6be0d7f
JL
957}
958
d6be0d7f
JL
959/* If we are inside a {start,end}_recording_cases block, then return
960 a chain of CASE_LABEL_EXPRs from T which reference E.
961
962 Otherwise return NULL. */
92b6dff3
JL
963
964static tree
726a989a 965get_cases_for_edge (edge e, gimple t)
92b6dff3 966{
92b6dff3 967 void **slot;
d6be0d7f 968 size_t i, n;
92b6dff3 969
d6be0d7f
JL
970 /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
971 chains available. Return NULL so the caller can detect this case. */
972 if (!recording_case_labels_p ())
973 return NULL;
6531d1be 974
15814ba0 975 slot = pointer_map_contains (edge_to_cases, e);
92b6dff3 976 if (slot)
15814ba0 977 return (tree) *slot;
92b6dff3 978
d6be0d7f
JL
979 /* If we did not find E in the hash table, then this must be the first
980 time we have been queried for information about E & T. Add all the
981 elements from T to the hash table then perform the query again. */
92b6dff3 982
726a989a 983 n = gimple_switch_num_labels (t);
92b6dff3
JL
984 for (i = 0; i < n; i++)
985 {
726a989a 986 tree elt = gimple_switch_label (t, i);
15814ba0 987 tree lab = CASE_LABEL (elt);
d6be0d7f 988 basic_block label_bb = label_to_block (lab);
15814ba0
PB
989 edge this_edge = find_edge (e->src, label_bb);
990
991 /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
992 a new chain. */
993 slot = pointer_map_insert (edge_to_cases, this_edge);
1290e54c 994 CASE_CHAIN (elt) = (tree) *slot;
15814ba0 995 *slot = elt;
92b6dff3 996 }
15814ba0
PB
997
998 return (tree) *pointer_map_contains (edge_to_cases, e);
92b6dff3 999}
6de9cd9a 1000
726a989a 1001/* Create the edges for a GIMPLE_SWITCH starting at block BB. */
6de9cd9a
DN
1002
1003static void
726a989a 1004make_gimple_switch_edges (basic_block bb)
6de9cd9a 1005{
726a989a 1006 gimple entry = last_stmt (bb);
6de9cd9a 1007 size_t i, n;
6de9cd9a 1008
726a989a 1009 n = gimple_switch_num_labels (entry);
6de9cd9a
DN
1010
1011 for (i = 0; i < n; ++i)
1012 {
726a989a 1013 tree lab = CASE_LABEL (gimple_switch_label (entry, i));
6de9cd9a 1014 basic_block label_bb = label_to_block (lab);
d6be0d7f 1015 make_edge (bb, label_bb, 0);
6de9cd9a
DN
1016 }
1017}
1018
1019
1020/* Return the basic block holding label DEST. */
1021
1022basic_block
997de8ed 1023label_to_block_fn (struct function *ifun, tree dest)
6de9cd9a 1024{
242229bb
JH
1025 int uid = LABEL_DECL_UID (dest);
1026
f0b698c1
KH
1027 /* We would die hard when faced by an undefined label. Emit a label to
1028 the very first basic block. This will hopefully make even the dataflow
242229bb 1029 and undefined variable warnings quite right. */
1da2ed5f 1030 if (seen_error () && uid < 0)
242229bb 1031 {
726a989a
RB
1032 gimple_stmt_iterator gsi = gsi_start_bb (BASIC_BLOCK (NUM_FIXED_BLOCKS));
1033 gimple stmt;
242229bb 1034
726a989a
RB
1035 stmt = gimple_build_label (dest);
1036 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
242229bb
JH
1037 uid = LABEL_DECL_UID (dest);
1038 }
9771b263 1039 if (vec_safe_length (ifun->cfg->x_label_to_block_map) <= (unsigned int) uid)
98f464e0 1040 return NULL;
9771b263 1041 return (*ifun->cfg->x_label_to_block_map)[uid];
6de9cd9a
DN
1042}
1043
4f6c2131
EB
1044/* Create edges for an abnormal goto statement at block BB. If FOR_CALL
1045 is true, the source statement is a CALL_EXPR instead of a GOTO_EXPR. */
1046
1047void
1048make_abnormal_goto_edges (basic_block bb, bool for_call)
1049{
1050 basic_block target_bb;
726a989a 1051 gimple_stmt_iterator gsi;
4f6c2131
EB
1052
1053 FOR_EACH_BB (target_bb)
f6b64c35
RB
1054 {
1055 for (gsi = gsi_start_bb (target_bb); !gsi_end_p (gsi); gsi_next (&gsi))
1056 {
1057 gimple label_stmt = gsi_stmt (gsi);
1058 tree target;
4f6c2131 1059
f6b64c35
RB
1060 if (gimple_code (label_stmt) != GIMPLE_LABEL)
1061 break;
4f6c2131 1062
f6b64c35 1063 target = gimple_label_label (label_stmt);
4f6c2131 1064
f6b64c35
RB
1065 /* Make an edge to every label block that has been marked as a
1066 potential target for a computed goto or a non-local goto. */
1067 if ((FORCED_LABEL (target) && !for_call)
1068 || (DECL_NONLOCAL (target) && for_call))
1069 {
1070 make_edge (bb, target_bb, EDGE_ABNORMAL);
1071 break;
1072 }
1073 }
791d9044
RB
1074 if (!gsi_end_p (gsi)
1075 && is_gimple_debug (gsi_stmt (gsi)))
1076 gsi_next_nondebug (&gsi);
f6b64c35
RB
1077 if (!gsi_end_p (gsi))
1078 {
1079 /* Make an edge to every setjmp-like call. */
1080 gimple call_stmt = gsi_stmt (gsi);
1081 if (is_gimple_call (call_stmt)
1082 && (gimple_call_flags (call_stmt) & ECF_RETURNS_TWICE))
4f6c2131 1083 make_edge (bb, target_bb, EDGE_ABNORMAL);
f6b64c35
RB
1084 }
1085 }
4f6c2131
EB
1086}
1087
6de9cd9a
DN
1088/* Create edges for a goto statement at block BB. */
1089
1090static void
1091make_goto_expr_edges (basic_block bb)
1092{
726a989a
RB
1093 gimple_stmt_iterator last = gsi_last_bb (bb);
1094 gimple goto_t = gsi_stmt (last);
6de9cd9a 1095
4f6c2131
EB
1096 /* A simple GOTO creates normal edges. */
1097 if (simple_goto_p (goto_t))
6de9cd9a 1098 {
726a989a 1099 tree dest = gimple_goto_dest (goto_t);
6c52e687
CC
1100 basic_block label_bb = label_to_block (dest);
1101 edge e = make_edge (bb, label_bb, EDGE_FALLTHRU);
726a989a
RB
1102 e->goto_locus = gimple_location (goto_t);
1103 gsi_remove (&last, true);
4f6c2131 1104 return;
6de9cd9a
DN
1105 }
1106
4f6c2131
EB
1107 /* A computed GOTO creates abnormal edges. */
1108 make_abnormal_goto_edges (bb, false);
6de9cd9a
DN
1109}
1110
1c384bf1
RH
1111/* Create edges for an asm statement with labels at block BB. */
1112
1113static void
1114make_gimple_asm_edges (basic_block bb)
1115{
1116 gimple stmt = last_stmt (bb);
1c384bf1
RH
1117 int i, n = gimple_asm_nlabels (stmt);
1118
1119 for (i = 0; i < n; ++i)
1120 {
1121 tree label = TREE_VALUE (gimple_asm_label_op (stmt, i));
1122 basic_block label_bb = label_to_block (label);
1123 make_edge (bb, label_bb, 0);
1c384bf1
RH
1124 }
1125}
6de9cd9a
DN
1126
1127/*---------------------------------------------------------------------------
1128 Flowgraph analysis
1129---------------------------------------------------------------------------*/
1130
f698d217
SB
1131/* Cleanup useless labels in basic blocks. This is something we wish
1132 to do early because it allows us to group case labels before creating
1133 the edges for the CFG, and it speeds up block statement iterators in
1134 all passes later on.
8b11009b
ZD
1135 We rerun this pass after CFG is created, to get rid of the labels that
1136 are no longer referenced. After then we do not run it any more, since
1137 (almost) no new labels should be created. */
f698d217
SB
1138
1139/* A map from basic block index to the leading label of that block. */
8b11009b
ZD
1140static struct label_record
1141{
1142 /* The label. */
1143 tree label;
1144
1145 /* True if the label is referenced from somewhere. */
1146 bool used;
1147} *label_for_bb;
f698d217 1148
242229bb 1149/* Given LABEL return the first label in the same basic block. */
726a989a 1150
242229bb
JH
1151static tree
1152main_block_label (tree label)
1153{
1154 basic_block bb = label_to_block (label);
8b11009b 1155 tree main_label = label_for_bb[bb->index].label;
242229bb
JH
1156
1157 /* label_to_block possibly inserted undefined label into the chain. */
8b11009b
ZD
1158 if (!main_label)
1159 {
1160 label_for_bb[bb->index].label = label;
1161 main_label = label;
1162 }
1163
1164 label_for_bb[bb->index].used = true;
1165 return main_label;
242229bb
JH
1166}
1167
1d65f45c
RH
1168/* Clean up redundant labels within the exception tree. */
1169
1170static void
1171cleanup_dead_labels_eh (void)
1172{
1173 eh_landing_pad lp;
1174 eh_region r;
1175 tree lab;
1176 int i;
1177
1178 if (cfun->eh == NULL)
1179 return;
1180
9771b263 1181 for (i = 1; vec_safe_iterate (cfun->eh->lp_array, i, &lp); ++i)
1d65f45c
RH
1182 if (lp && lp->post_landing_pad)
1183 {
1184 lab = main_block_label (lp->post_landing_pad);
1185 if (lab != lp->post_landing_pad)
1186 {
1187 EH_LANDING_PAD_NR (lp->post_landing_pad) = 0;
1188 EH_LANDING_PAD_NR (lab) = lp->index;
1189 }
1190 }
1191
1192 FOR_ALL_EH_REGION (r)
1193 switch (r->type)
1194 {
1195 case ERT_CLEANUP:
1196 case ERT_MUST_NOT_THROW:
1197 break;
1198
1199 case ERT_TRY:
1200 {
1201 eh_catch c;
1202 for (c = r->u.eh_try.first_catch; c ; c = c->next_catch)
1203 {
1204 lab = c->label;
1205 if (lab)
1206 c->label = main_block_label (lab);
1207 }
1208 }
1209 break;
1210
1211 case ERT_ALLOWED_EXCEPTIONS:
1212 lab = r->u.allowed.label;
1213 if (lab)
1214 r->u.allowed.label = main_block_label (lab);
1215 break;
1216 }
1217}
1218
1219
b986ebf3 1220/* Cleanup redundant labels. This is a three-step process:
f698d217
SB
1221 1) Find the leading label for each block.
1222 2) Redirect all references to labels to the leading labels.
1223 3) Cleanup all useless labels. */
6de9cd9a 1224
165b54c3 1225void
6de9cd9a
DN
1226cleanup_dead_labels (void)
1227{
1228 basic_block bb;
8b11009b 1229 label_for_bb = XCNEWVEC (struct label_record, last_basic_block);
6de9cd9a
DN
1230
1231 /* Find a suitable label for each block. We use the first user-defined
f0b698c1 1232 label if there is one, or otherwise just the first label we see. */
6de9cd9a
DN
1233 FOR_EACH_BB (bb)
1234 {
726a989a 1235 gimple_stmt_iterator i;
6de9cd9a 1236
726a989a 1237 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
6de9cd9a 1238 {
726a989a
RB
1239 tree label;
1240 gimple stmt = gsi_stmt (i);
6de9cd9a 1241
726a989a 1242 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a
DN
1243 break;
1244
726a989a 1245 label = gimple_label_label (stmt);
6de9cd9a
DN
1246
1247 /* If we have not yet seen a label for the current block,
1248 remember this one and see if there are more labels. */
8b11009b 1249 if (!label_for_bb[bb->index].label)
6de9cd9a 1250 {
8b11009b 1251 label_for_bb[bb->index].label = label;
6de9cd9a
DN
1252 continue;
1253 }
1254
1255 /* If we did see a label for the current block already, but it
1256 is an artificially created label, replace it if the current
1257 label is a user defined label. */
8b11009b
ZD
1258 if (!DECL_ARTIFICIAL (label)
1259 && DECL_ARTIFICIAL (label_for_bb[bb->index].label))
6de9cd9a 1260 {
8b11009b 1261 label_for_bb[bb->index].label = label;
6de9cd9a
DN
1262 break;
1263 }
1264 }
1265 }
1266
f698d217
SB
1267 /* Now redirect all jumps/branches to the selected label.
1268 First do so for each block ending in a control statement. */
6de9cd9a
DN
1269 FOR_EACH_BB (bb)
1270 {
726a989a 1271 gimple stmt = last_stmt (bb);
0a35513e
AH
1272 tree label, new_label;
1273
6de9cd9a
DN
1274 if (!stmt)
1275 continue;
1276
726a989a 1277 switch (gimple_code (stmt))
6de9cd9a 1278 {
726a989a 1279 case GIMPLE_COND:
0a35513e
AH
1280 label = gimple_cond_true_label (stmt);
1281 if (label)
1282 {
1283 new_label = main_block_label (label);
1284 if (new_label != label)
1285 gimple_cond_set_true_label (stmt, new_label);
1286 }
6de9cd9a 1287
0a35513e
AH
1288 label = gimple_cond_false_label (stmt);
1289 if (label)
1290 {
1291 new_label = main_block_label (label);
1292 if (new_label != label)
1293 gimple_cond_set_false_label (stmt, new_label);
1294 }
1295 break;
6531d1be 1296
726a989a 1297 case GIMPLE_SWITCH:
6de9cd9a 1298 {
726a989a 1299 size_t i, n = gimple_switch_num_labels (stmt);
6531d1be 1300
6de9cd9a
DN
1301 /* Replace all destination labels. */
1302 for (i = 0; i < n; ++i)
92b6dff3 1303 {
726a989a 1304 tree case_label = gimple_switch_label (stmt, i);
0a35513e
AH
1305 label = CASE_LABEL (case_label);
1306 new_label = main_block_label (label);
1307 if (new_label != label)
1308 CASE_LABEL (case_label) = new_label;
92b6dff3 1309 }
6de9cd9a
DN
1310 break;
1311 }
1312
1c384bf1
RH
1313 case GIMPLE_ASM:
1314 {
1315 int i, n = gimple_asm_nlabels (stmt);
1316
1317 for (i = 0; i < n; ++i)
1318 {
1319 tree cons = gimple_asm_label_op (stmt, i);
1320 tree label = main_block_label (TREE_VALUE (cons));
1321 TREE_VALUE (cons) = label;
1322 }
1323 break;
1324 }
1325
726a989a 1326 /* We have to handle gotos until they're removed, and we don't
f667741c 1327 remove them until after we've created the CFG edges. */
726a989a 1328 case GIMPLE_GOTO:
0a35513e 1329 if (!computed_goto_p (stmt))
242229bb 1330 {
0a35513e
AH
1331 label = gimple_goto_dest (stmt);
1332 new_label = main_block_label (label);
1333 if (new_label != label)
1334 gimple_goto_set_dest (stmt, new_label);
242229bb 1335 }
1c384bf1 1336 break;
f667741c 1337
0a35513e
AH
1338 case GIMPLE_TRANSACTION:
1339 {
1340 tree label = gimple_transaction_label (stmt);
1341 if (label)
1342 {
1343 tree new_label = main_block_label (label);
1344 if (new_label != label)
1345 gimple_transaction_set_label (stmt, new_label);
1346 }
1347 }
1348 break;
1349
6de9cd9a
DN
1350 default:
1351 break;
1352 }
1353 }
1354
1d65f45c
RH
1355 /* Do the same for the exception region tree labels. */
1356 cleanup_dead_labels_eh ();
f698d217 1357
6de9cd9a 1358 /* Finally, purge dead labels. All user-defined labels and labels that
cea0f4f1
AP
1359 can be the target of non-local gotos and labels which have their
1360 address taken are preserved. */
6de9cd9a
DN
1361 FOR_EACH_BB (bb)
1362 {
726a989a 1363 gimple_stmt_iterator i;
8b11009b 1364 tree label_for_this_bb = label_for_bb[bb->index].label;
6de9cd9a 1365
8b11009b 1366 if (!label_for_this_bb)
6de9cd9a
DN
1367 continue;
1368
8b11009b
ZD
1369 /* If the main label of the block is unused, we may still remove it. */
1370 if (!label_for_bb[bb->index].used)
1371 label_for_this_bb = NULL;
1372
726a989a 1373 for (i = gsi_start_bb (bb); !gsi_end_p (i); )
6de9cd9a 1374 {
726a989a
RB
1375 tree label;
1376 gimple stmt = gsi_stmt (i);
6de9cd9a 1377
726a989a 1378 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a
DN
1379 break;
1380
726a989a 1381 label = gimple_label_label (stmt);
6de9cd9a
DN
1382
1383 if (label == label_for_this_bb
726a989a 1384 || !DECL_ARTIFICIAL (label)
cea0f4f1
AP
1385 || DECL_NONLOCAL (label)
1386 || FORCED_LABEL (label))
726a989a 1387 gsi_next (&i);
6de9cd9a 1388 else
726a989a 1389 gsi_remove (&i, true);
6de9cd9a
DN
1390 }
1391 }
1392
1393 free (label_for_bb);
1394}
1395
fc249fe5
MM
1396/* Scan the sorted vector of cases in STMT (a GIMPLE_SWITCH) and combine
1397 the ones jumping to the same label.
f667741c
SB
1398 Eg. three separate entries 1: 2: 3: become one entry 1..3: */
1399
238065a7 1400void
fc249fe5 1401group_case_labels_stmt (gimple stmt)
f667741c 1402{
fc249fe5
MM
1403 int old_size = gimple_switch_num_labels (stmt);
1404 int i, j, new_size = old_size;
25632d2e 1405 basic_block default_bb = NULL;
fc249fe5 1406
fd8d363e 1407 default_bb = label_to_block (CASE_LABEL (gimple_switch_default_label (stmt)));
f667741c 1408
fc249fe5 1409 /* Look for possible opportunities to merge cases. */
fd8d363e 1410 i = 1;
fc249fe5 1411 while (i < old_size)
f667741c 1412 {
25632d2e
SB
1413 tree base_case, base_high;
1414 basic_block base_bb;
1415
fc249fe5
MM
1416 base_case = gimple_switch_label (stmt, i);
1417
1418 gcc_assert (base_case);
25632d2e 1419 base_bb = label_to_block (CASE_LABEL (base_case));
fc249fe5
MM
1420
1421 /* Discard cases that have the same destination as the
1422 default case. */
25632d2e 1423 if (base_bb == default_bb)
fc249fe5
MM
1424 {
1425 gimple_switch_set_label (stmt, i, NULL_TREE);
1426 i++;
1427 new_size--;
1428 continue;
1429 }
1430
1431 base_high = CASE_HIGH (base_case)
1432 ? CASE_HIGH (base_case)
1433 : CASE_LOW (base_case);
1434 i++;
1435
1436 /* Try to merge case labels. Break out when we reach the end
1437 of the label vector or when we cannot merge the next case
1438 label with the current one. */
1439 while (i < old_size)
f667741c 1440 {
fc249fe5 1441 tree merge_case = gimple_switch_label (stmt, i);
25632d2e 1442 basic_block merge_bb = label_to_block (CASE_LABEL (merge_case));
27bcd47c 1443 double_int bhp1 = tree_to_double_int (base_high) + double_int_one;
fc249fe5
MM
1444
1445 /* Merge the cases if they jump to the same place,
1446 and their ranges are consecutive. */
25632d2e 1447 if (merge_bb == base_bb
27bcd47c 1448 && tree_to_double_int (CASE_LOW (merge_case)) == bhp1)
b7814a18 1449 {
fc249fe5
MM
1450 base_high = CASE_HIGH (merge_case) ?
1451 CASE_HIGH (merge_case) : CASE_LOW (merge_case);
1452 CASE_HIGH (base_case) = base_high;
1453 gimple_switch_set_label (stmt, i, NULL_TREE);
1454 new_size--;
1455 i++;
b7814a18 1456 }
726a989a 1457 else
fc249fe5
MM
1458 break;
1459 }
1460 }
31e9eea2 1461
fc249fe5
MM
1462 /* Compress the case labels in the label vector, and adjust the
1463 length of the vector. */
1464 for (i = 0, j = 0; i < new_size; i++)
1465 {
1466 while (! gimple_switch_label (stmt, j))
1467 j++;
1468 gimple_switch_set_label (stmt, i,
1469 gimple_switch_label (stmt, j++));
1470 }
31e9eea2 1471
fc249fe5
MM
1472 gcc_assert (new_size <= old_size);
1473 gimple_switch_set_num_labels (stmt, new_size);
1474}
726a989a 1475
fc249fe5
MM
1476/* Look for blocks ending in a multiway branch (a GIMPLE_SWITCH),
1477 and scan the sorted vector of cases. Combine the ones jumping to the
1478 same label. */
f667741c 1479
fc249fe5
MM
1480void
1481group_case_labels (void)
1482{
1483 basic_block bb;
726a989a 1484
fc249fe5
MM
1485 FOR_EACH_BB (bb)
1486 {
1487 gimple stmt = last_stmt (bb);
1488 if (stmt && gimple_code (stmt) == GIMPLE_SWITCH)
1489 group_case_labels_stmt (stmt);
f667741c
SB
1490 }
1491}
6de9cd9a
DN
1492
1493/* Checks whether we can merge block B into block A. */
1494
1495static bool
726a989a 1496gimple_can_merge_blocks_p (basic_block a, basic_block b)
6de9cd9a 1497{
726a989a
RB
1498 gimple stmt;
1499 gimple_stmt_iterator gsi;
6de9cd9a 1500
c5cbcccf 1501 if (!single_succ_p (a))
6de9cd9a
DN
1502 return false;
1503
a315c44c 1504 if (single_succ_edge (a)->flags & EDGE_COMPLEX)
6de9cd9a
DN
1505 return false;
1506
c5cbcccf 1507 if (single_succ (a) != b)
6de9cd9a
DN
1508 return false;
1509
c5cbcccf 1510 if (!single_pred_p (b))
6de9cd9a
DN
1511 return false;
1512
fefa31b5 1513 if (b == EXIT_BLOCK_PTR_FOR_FN (cfun))
26e75214 1514 return false;
6531d1be 1515
6de9cd9a
DN
1516 /* If A ends by a statement causing exceptions or something similar, we
1517 cannot merge the blocks. */
726a989a 1518 stmt = last_stmt (a);
6de9cd9a
DN
1519 if (stmt && stmt_ends_bb_p (stmt))
1520 return false;
1521
1522 /* Do not allow a block with only a non-local label to be merged. */
726a989a
RB
1523 if (stmt
1524 && gimple_code (stmt) == GIMPLE_LABEL
1525 && DECL_NONLOCAL (gimple_label_label (stmt)))
6de9cd9a
DN
1526 return false;
1527
8e7c5fdd
RH
1528 /* Examine the labels at the beginning of B. */
1529 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
1530 {
1531 tree lab;
1532 stmt = gsi_stmt (gsi);
1533 if (gimple_code (stmt) != GIMPLE_LABEL)
1534 break;
1535 lab = gimple_label_label (stmt);
1536
4a7ab00c
JJ
1537 /* Do not remove user forced labels or for -O0 any user labels. */
1538 if (!DECL_ARTIFICIAL (lab) && (!optimize || FORCED_LABEL (lab)))
8e7c5fdd
RH
1539 return false;
1540 }
1541
1542 /* Protect the loop latches. */
1543 if (current_loops && b->loop_father->latch == b)
1544 return false;
1545
38965eb2 1546 /* It must be possible to eliminate all phi nodes in B. If ssa form
610b64e2
RG
1547 is not up-to-date and a name-mapping is registered, we cannot eliminate
1548 any phis. Symbols marked for renaming are never a problem though. */
891f2df6
RG
1549 for (gsi = gsi_start_phis (b); !gsi_end_p (gsi); gsi_next (&gsi))
1550 {
1551 gimple phi = gsi_stmt (gsi);
1552 /* Technically only new names matter. */
1553 if (name_registered_for_update_p (PHI_RESULT (phi)))
1554 return false;
1555 }
6de9cd9a 1556
c87d6057
JJ
1557 /* When not optimizing, don't merge if we'd lose goto_locus. */
1558 if (!optimize
1559 && single_succ_edge (a)->goto_locus != UNKNOWN_LOCATION)
1560 {
1561 location_t goto_locus = single_succ_edge (a)->goto_locus;
1562 gimple_stmt_iterator prev, next;
1563 prev = gsi_last_nondebug_bb (a);
1564 next = gsi_after_labels (b);
1565 if (!gsi_end_p (next) && is_gimple_debug (gsi_stmt (next)))
1566 gsi_next_nondebug (&next);
1567 if ((gsi_end_p (prev)
1568 || gimple_location (gsi_stmt (prev)) != goto_locus)
1569 && (gsi_end_p (next)
1570 || gimple_location (gsi_stmt (next)) != goto_locus))
1571 return false;
1572 }
1573
6de9cd9a
DN
1574 return true;
1575}
1576
38965eb2
ZD
1577/* Replaces all uses of NAME by VAL. */
1578
684aaf29 1579void
38965eb2
ZD
1580replace_uses_by (tree name, tree val)
1581{
1582 imm_use_iterator imm_iter;
1583 use_operand_p use;
726a989a 1584 gimple stmt;
38965eb2 1585 edge e;
38965eb2 1586
6c00f606 1587 FOR_EACH_IMM_USE_STMT (stmt, imm_iter, name)
38965eb2 1588 {
6c00f606
AM
1589 FOR_EACH_IMM_USE_ON_STMT (use, imm_iter)
1590 {
1591 replace_exp (use, val);
38965eb2 1592
726a989a 1593 if (gimple_code (stmt) == GIMPLE_PHI)
38965eb2 1594 {
726a989a 1595 e = gimple_phi_arg_edge (stmt, PHI_ARG_INDEX_FROM_USE (use));
6c00f606
AM
1596 if (e->flags & EDGE_ABNORMAL)
1597 {
1598 /* This can only occur for virtual operands, since
1599 for the real ones SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
1600 would prevent replacement. */
ea057359 1601 gcc_checking_assert (virtual_operand_p (name));
6c00f606
AM
1602 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val) = 1;
1603 }
38965eb2
ZD
1604 }
1605 }
cfaab3a9 1606
726a989a 1607 if (gimple_code (stmt) != GIMPLE_PHI)
6c00f606 1608 {
e1ab3876 1609 gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
4642ed29 1610 gimple orig_stmt = stmt;
726a989a 1611 size_t i;
9af0df6b 1612
552d2db5
RG
1613 /* Mark the block if we changed the last stmt in it. */
1614 if (cfgcleanup_altered_bbs
1615 && stmt_ends_bb_p (stmt))
726a989a 1616 bitmap_set_bit (cfgcleanup_altered_bbs, gimple_bb (stmt)->index);
cfaab3a9 1617
552d2db5
RG
1618 /* FIXME. It shouldn't be required to keep TREE_CONSTANT
1619 on ADDR_EXPRs up-to-date on GIMPLE. Propagation will
1620 only change sth from non-invariant to invariant, and only
ef0d4c4d
RG
1621 when propagating constants. */
1622 if (is_gimple_min_invariant (val))
552d2db5
RG
1623 for (i = 0; i < gimple_num_ops (stmt); i++)
1624 {
1625 tree op = gimple_op (stmt, i);
1626 /* Operands may be empty here. For example, the labels
1627 of a GIMPLE_COND are nulled out following the creation
1628 of the corresponding CFG edges. */
1629 if (op && TREE_CODE (op) == ADDR_EXPR)
1630 recompute_tree_invariant_for_addr_expr (op);
1631 }
1632
1633 if (fold_stmt (&gsi))
511b4436
JJ
1634 stmt = gsi_stmt (gsi);
1635
77753f4d
JJ
1636 if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
1637 gimple_purge_dead_eh_edges (gimple_bb (stmt));
9af0df6b 1638
cff4e50d 1639 update_stmt (stmt);
6c00f606 1640 }
38965eb2 1641 }
6531d1be 1642
552d2db5 1643 gcc_checking_assert (has_zero_uses (name));
d5ab5675
ZD
1644
1645 /* Also update the trees stored in loop structures. */
1646 if (current_loops)
1647 {
1648 struct loop *loop;
1649
f0bd40b1 1650 FOR_EACH_LOOP (loop, 0)
d5ab5675 1651 {
42fd6772 1652 substitute_in_loop_info (loop, name, val);
d5ab5675
ZD
1653 }
1654 }
38965eb2 1655}
6de9cd9a
DN
1656
1657/* Merge block B into block A. */
1658
1659static void
726a989a 1660gimple_merge_blocks (basic_block a, basic_block b)
6de9cd9a 1661{
726a989a 1662 gimple_stmt_iterator last, gsi, psi;
6de9cd9a
DN
1663
1664 if (dump_file)
1665 fprintf (dump_file, "Merging blocks %d and %d\n", a->index, b->index);
1666
c4f548b8
DN
1667 /* Remove all single-valued PHI nodes from block B of the form
1668 V_i = PHI <V_j> by propagating V_j to all the uses of V_i. */
726a989a 1669 gsi = gsi_last_bb (a);
355a7673 1670 for (psi = gsi_start_phis (b); !gsi_end_p (psi); )
38965eb2 1671 {
726a989a
RB
1672 gimple phi = gsi_stmt (psi);
1673 tree def = gimple_phi_result (phi), use = gimple_phi_arg_def (phi, 0);
1674 gimple copy;
ea057359
RG
1675 bool may_replace_uses = (virtual_operand_p (def)
1676 || may_propagate_copy (def, use));
d7f0e25c 1677
7c8eb293
ZD
1678 /* In case we maintain loop closed ssa form, do not propagate arguments
1679 of loop exit phi nodes. */
d7f0e25c 1680 if (current_loops
f87000d0 1681 && loops_state_satisfies_p (LOOP_CLOSED_SSA)
ea057359 1682 && !virtual_operand_p (def)
d7f0e25c
ZD
1683 && TREE_CODE (use) == SSA_NAME
1684 && a->loop_father != b->loop_father)
1685 may_replace_uses = false;
1686
1687 if (!may_replace_uses)
38965eb2 1688 {
ea057359 1689 gcc_assert (!virtual_operand_p (def));
38965eb2 1690
128a79fb 1691 /* Note that just emitting the copies is fine -- there is no problem
38965eb2
ZD
1692 with ordering of phi nodes. This is because A is the single
1693 predecessor of B, therefore results of the phi nodes cannot
1694 appear as arguments of the phi nodes. */
726a989a
RB
1695 copy = gimple_build_assign (def, use);
1696 gsi_insert_after (&gsi, copy, GSI_NEW_STMT);
1697 remove_phi_node (&psi, false);
38965eb2
ZD
1698 }
1699 else
611021e1 1700 {
d0f76c4b
RG
1701 /* If we deal with a PHI for virtual operands, we can simply
1702 propagate these without fussing with folding or updating
1703 the stmt. */
ea057359 1704 if (virtual_operand_p (def))
d0f76c4b
RG
1705 {
1706 imm_use_iterator iter;
1707 use_operand_p use_p;
726a989a 1708 gimple stmt;
d0f76c4b
RG
1709
1710 FOR_EACH_IMM_USE_STMT (stmt, iter, def)
1711 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
1712 SET_USE (use_p, use);
7686fb74
RG
1713
1714 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
1715 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use) = 1;
d0f76c4b
RG
1716 }
1717 else
1718 replace_uses_by (def, use);
726a989a
RB
1719
1720 remove_phi_node (&psi, true);
611021e1 1721 }
38965eb2
ZD
1722 }
1723
6de9cd9a
DN
1724 /* Ensure that B follows A. */
1725 move_block_after (b, a);
1726
c5cbcccf 1727 gcc_assert (single_succ_edge (a)->flags & EDGE_FALLTHRU);
1e128c5f 1728 gcc_assert (!last_stmt (a) || !stmt_ends_bb_p (last_stmt (a)));
6de9cd9a 1729
726a989a
RB
1730 /* Remove labels from B and set gimple_bb to A for other statements. */
1731 for (gsi = gsi_start_bb (b); !gsi_end_p (gsi);)
6de9cd9a 1732 {
1d65f45c
RH
1733 gimple stmt = gsi_stmt (gsi);
1734 if (gimple_code (stmt) == GIMPLE_LABEL)
be477406 1735 {
1d65f45c
RH
1736 tree label = gimple_label_label (stmt);
1737 int lp_nr;
726a989a
RB
1738
1739 gsi_remove (&gsi, false);
be477406 1740
be477406
JL
1741 /* Now that we can thread computed gotos, we might have
1742 a situation where we have a forced label in block B
1743 However, the label at the start of block B might still be
1744 used in other ways (think about the runtime checking for
1745 Fortran assigned gotos). So we can not just delete the
1746 label. Instead we move the label to the start of block A. */
1d65f45c 1747 if (FORCED_LABEL (label))
be477406 1748 {
726a989a 1749 gimple_stmt_iterator dest_gsi = gsi_start_bb (a);
1d65f45c
RH
1750 gsi_insert_before (&dest_gsi, stmt, GSI_NEW_STMT);
1751 }
5619e52c
JJ
1752 /* Other user labels keep around in a form of a debug stmt. */
1753 else if (!DECL_ARTIFICIAL (label) && MAY_HAVE_DEBUG_STMTS)
1754 {
1755 gimple dbg = gimple_build_debug_bind (label,
1756 integer_zero_node,
1757 stmt);
1758 gimple_debug_bind_reset_value (dbg);
1759 gsi_insert_before (&gsi, dbg, GSI_SAME_STMT);
1760 }
1d65f45c
RH
1761
1762 lp_nr = EH_LANDING_PAD_NR (label);
1763 if (lp_nr)
1764 {
1765 eh_landing_pad lp = get_eh_landing_pad_from_number (lp_nr);
1766 lp->post_landing_pad = NULL;
be477406
JL
1767 }
1768 }
6de9cd9a
DN
1769 else
1770 {
1d65f45c 1771 gimple_set_bb (stmt, a);
726a989a 1772 gsi_next (&gsi);
6de9cd9a
DN
1773 }
1774 }
1775
726a989a
RB
1776 /* Merge the sequences. */
1777 last = gsi_last_bb (a);
1778 gsi_insert_seq_after (&last, bb_seq (b), GSI_NEW_STMT);
1779 set_bb_seq (b, NULL);
672987e8
ZD
1780
1781 if (cfgcleanup_altered_bbs)
1782 bitmap_set_bit (cfgcleanup_altered_bbs, a->index);
6de9cd9a
DN
1783}
1784
1785
bc23502b 1786/* Return the one of two successors of BB that is not reachable by a
2cd713a0 1787 complex edge, if there is one. Else, return BB. We use
bc23502b
PB
1788 this in optimizations that use post-dominators for their heuristics,
1789 to catch the cases in C++ where function calls are involved. */
6531d1be 1790
bc23502b 1791basic_block
6531d1be 1792single_noncomplex_succ (basic_block bb)
bc23502b
PB
1793{
1794 edge e0, e1;
1795 if (EDGE_COUNT (bb->succs) != 2)
1796 return bb;
6531d1be 1797
bc23502b
PB
1798 e0 = EDGE_SUCC (bb, 0);
1799 e1 = EDGE_SUCC (bb, 1);
1800 if (e0->flags & EDGE_COMPLEX)
1801 return e1->dest;
1802 if (e1->flags & EDGE_COMPLEX)
1803 return e0->dest;
6531d1be 1804
bc23502b 1805 return bb;
6531d1be 1806}
bc23502b 1807
6de9cd9a
DN
1808/* T is CALL_EXPR. Set current_function_calls_* flags. */
1809
1810void
726a989a 1811notice_special_calls (gimple call)
6de9cd9a 1812{
726a989a 1813 int flags = gimple_call_flags (call);
6de9cd9a
DN
1814
1815 if (flags & ECF_MAY_BE_ALLOCA)
e3b5732b 1816 cfun->calls_alloca = true;
6de9cd9a 1817 if (flags & ECF_RETURNS_TWICE)
e3b5732b 1818 cfun->calls_setjmp = true;
6de9cd9a
DN
1819}
1820
1821
1822/* Clear flags set by notice_special_calls. Used by dead code removal
1823 to update the flags. */
1824
1825void
1826clear_special_calls (void)
1827{
e3b5732b
JH
1828 cfun->calls_alloca = false;
1829 cfun->calls_setjmp = false;
6de9cd9a
DN
1830}
1831
6de9cd9a
DN
1832/* Remove PHI nodes associated with basic block BB and all edges out of BB. */
1833
1834static void
1835remove_phi_nodes_and_edges_for_unreachable_block (basic_block bb)
1836{
6de9cd9a
DN
1837 /* Since this block is no longer reachable, we can just delete all
1838 of its PHI nodes. */
81b822d5 1839 remove_phi_nodes (bb);
6de9cd9a
DN
1840
1841 /* Remove edges to BB's successors. */
628f6a4e 1842 while (EDGE_COUNT (bb->succs) > 0)
d0d2cc21 1843 remove_edge (EDGE_SUCC (bb, 0));
6de9cd9a
DN
1844}
1845
1846
1847/* Remove statements of basic block BB. */
1848
1849static void
1850remove_bb (basic_block bb)
1851{
726a989a 1852 gimple_stmt_iterator i;
6de9cd9a
DN
1853
1854 if (dump_file)
1855 {
1856 fprintf (dump_file, "Removing basic block %d\n", bb->index);
1857 if (dump_flags & TDF_DETAILS)
1858 {
c4669594 1859 dump_bb (dump_file, bb, 0, dump_flags);
6de9cd9a
DN
1860 fprintf (dump_file, "\n");
1861 }
1862 }
1863
2b271002
ZD
1864 if (current_loops)
1865 {
1866 struct loop *loop = bb->loop_father;
1867
598ec7bd
ZD
1868 /* If a loop gets removed, clean up the information associated
1869 with it. */
2b271002
ZD
1870 if (loop->latch == bb
1871 || loop->header == bb)
598ec7bd 1872 free_numbers_of_iterations_estimates_loop (loop);
2b271002
ZD
1873 }
1874
6de9cd9a 1875 /* Remove all the instructions in the block. */
726a989a 1876 if (bb_seq (bb) != NULL)
6de9cd9a 1877 {
b5b8b0ac
AO
1878 /* Walk backwards so as to get a chance to substitute all
1879 released DEFs into debug stmts. See
1880 eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
1881 details. */
1882 for (i = gsi_last_bb (bb); !gsi_end_p (i);)
77568960 1883 {
726a989a
RB
1884 gimple stmt = gsi_stmt (i);
1885 if (gimple_code (stmt) == GIMPLE_LABEL
1886 && (FORCED_LABEL (gimple_label_label (stmt))
1887 || DECL_NONLOCAL (gimple_label_label (stmt))))
7506e1cb
ZD
1888 {
1889 basic_block new_bb;
726a989a 1890 gimple_stmt_iterator new_gsi;
7506e1cb
ZD
1891
1892 /* A non-reachable non-local label may still be referenced.
1893 But it no longer needs to carry the extra semantics of
1894 non-locality. */
726a989a 1895 if (DECL_NONLOCAL (gimple_label_label (stmt)))
7506e1cb 1896 {
726a989a
RB
1897 DECL_NONLOCAL (gimple_label_label (stmt)) = 0;
1898 FORCED_LABEL (gimple_label_label (stmt)) = 1;
7506e1cb 1899 }
bb1ecfe8 1900
7506e1cb 1901 new_bb = bb->prev_bb;
726a989a
RB
1902 new_gsi = gsi_start_bb (new_bb);
1903 gsi_remove (&i, false);
1904 gsi_insert_before (&new_gsi, stmt, GSI_NEW_STMT);
7506e1cb
ZD
1905 }
1906 else
bb1ecfe8 1907 {
7506e1cb
ZD
1908 /* Release SSA definitions if we are in SSA. Note that we
1909 may be called when not in SSA. For example,
1910 final_cleanup calls this function via
1911 cleanup_tree_cfg. */
1912 if (gimple_in_ssa_p (cfun))
1913 release_defs (stmt);
1914
726a989a 1915 gsi_remove (&i, true);
bb1ecfe8 1916 }
6531d1be 1917
b5b8b0ac
AO
1918 if (gsi_end_p (i))
1919 i = gsi_last_bb (bb);
1920 else
1921 gsi_prev (&i);
43e05e45 1922 }
6de9cd9a
DN
1923 }
1924
6de9cd9a 1925 remove_phi_nodes_and_edges_for_unreachable_block (bb);
3e8b732e
MM
1926 bb->il.gimple.seq = NULL;
1927 bb->il.gimple.phi_nodes = NULL;
6de9cd9a
DN
1928}
1929
6de9cd9a 1930
35920270
KH
1931/* Given a basic block BB ending with COND_EXPR or SWITCH_EXPR, and a
1932 predicate VAL, return the edge that will be taken out of the block.
1933 If VAL does not match a unique edge, NULL is returned. */
6de9cd9a
DN
1934
1935edge
1936find_taken_edge (basic_block bb, tree val)
1937{
726a989a 1938 gimple stmt;
6de9cd9a
DN
1939
1940 stmt = last_stmt (bb);
1941
1e128c5f
GB
1942 gcc_assert (stmt);
1943 gcc_assert (is_ctrl_stmt (stmt));
6de9cd9a 1944
726a989a
RB
1945 if (val == NULL)
1946 return NULL;
1947
1948 if (!is_gimple_min_invariant (val))
6de9cd9a
DN
1949 return NULL;
1950
726a989a 1951 if (gimple_code (stmt) == GIMPLE_COND)
6de9cd9a
DN
1952 return find_taken_edge_cond_expr (bb, val);
1953
726a989a 1954 if (gimple_code (stmt) == GIMPLE_SWITCH)
6de9cd9a
DN
1955 return find_taken_edge_switch_expr (bb, val);
1956
be477406 1957 if (computed_goto_p (stmt))
1799efef
JL
1958 {
1959 /* Only optimize if the argument is a label, if the argument is
1960 not a label then we can not construct a proper CFG.
1961
1962 It may be the case that we only need to allow the LABEL_REF to
1963 appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
1964 appear inside a LABEL_EXPR just to be safe. */
1965 if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
1966 && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
1967 return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
1968 return NULL;
1969 }
be477406 1970
35920270 1971 gcc_unreachable ();
6de9cd9a
DN
1972}
1973
be477406
JL
1974/* Given a constant value VAL and the entry block BB to a GOTO_EXPR
1975 statement, determine which of the outgoing edges will be taken out of the
1976 block. Return NULL if either edge may be taken. */
1977
1978static edge
1979find_taken_edge_computed_goto (basic_block bb, tree val)
1980{
1981 basic_block dest;
1982 edge e = NULL;
1983
1984 dest = label_to_block (val);
1985 if (dest)
1986 {
1987 e = find_edge (bb, dest);
1988 gcc_assert (e != NULL);
1989 }
1990
1991 return e;
1992}
6de9cd9a
DN
1993
1994/* Given a constant value VAL and the entry block BB to a COND_EXPR
1995 statement, determine which of the two edges will be taken out of the
1996 block. Return NULL if either edge may be taken. */
1997
1998static edge
1999find_taken_edge_cond_expr (basic_block bb, tree val)
2000{
2001 edge true_edge, false_edge;
2002
2003 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
6531d1be 2004
f1b19062 2005 gcc_assert (TREE_CODE (val) == INTEGER_CST);
6e682d7e 2006 return (integer_zerop (val) ? false_edge : true_edge);
6de9cd9a
DN
2007}
2008
fca01525 2009/* Given an INTEGER_CST VAL and the entry block BB to a SWITCH_EXPR
6de9cd9a
DN
2010 statement, determine which edge will be taken out of the block. Return
2011 NULL if any edge may be taken. */
2012
2013static edge
2014find_taken_edge_switch_expr (basic_block bb, tree val)
2015{
6de9cd9a
DN
2016 basic_block dest_bb;
2017 edge e;
726a989a
RB
2018 gimple switch_stmt;
2019 tree taken_case;
6de9cd9a 2020
726a989a
RB
2021 switch_stmt = last_stmt (bb);
2022 taken_case = find_case_label_for_value (switch_stmt, val);
6de9cd9a
DN
2023 dest_bb = label_to_block (CASE_LABEL (taken_case));
2024
2025 e = find_edge (bb, dest_bb);
1e128c5f 2026 gcc_assert (e);
6de9cd9a
DN
2027 return e;
2028}
2029
2030
726a989a 2031/* Return the CASE_LABEL_EXPR that SWITCH_STMT will take for VAL.
f667741c
SB
2032 We can make optimal use here of the fact that the case labels are
2033 sorted: We can do a binary search for a case matching VAL. */
6de9cd9a
DN
2034
2035static tree
726a989a 2036find_case_label_for_value (gimple switch_stmt, tree val)
6de9cd9a 2037{
726a989a
RB
2038 size_t low, high, n = gimple_switch_num_labels (switch_stmt);
2039 tree default_case = gimple_switch_default_label (switch_stmt);
6de9cd9a 2040
726a989a 2041 for (low = 0, high = n; high - low > 1; )
6de9cd9a 2042 {
f667741c 2043 size_t i = (high + low) / 2;
726a989a 2044 tree t = gimple_switch_label (switch_stmt, i);
f667741c
SB
2045 int cmp;
2046
2047 /* Cache the result of comparing CASE_LOW and val. */
2048 cmp = tree_int_cst_compare (CASE_LOW (t), val);
6de9cd9a 2049
f667741c
SB
2050 if (cmp > 0)
2051 high = i;
2052 else
2053 low = i;
2054
2055 if (CASE_HIGH (t) == NULL)
6de9cd9a 2056 {
f667741c
SB
2057 /* A singe-valued case label. */
2058 if (cmp == 0)
6de9cd9a
DN
2059 return t;
2060 }
2061 else
2062 {
2063 /* A case range. We can only handle integer ranges. */
f667741c 2064 if (cmp <= 0 && tree_int_cst_compare (CASE_HIGH (t), val) >= 0)
6de9cd9a
DN
2065 return t;
2066 }
2067 }
2068
6de9cd9a
DN
2069 return default_case;
2070}
2071
2072
6de9cd9a
DN
2073/* Dump a basic block on stderr. */
2074
2075void
726a989a 2076gimple_debug_bb (basic_block bb)
6de9cd9a 2077{
c4669594 2078 dump_bb (stderr, bb, 0, TDF_VOPS|TDF_MEMSYMS|TDF_BLOCKS);
6de9cd9a
DN
2079}
2080
2081
2082/* Dump basic block with index N on stderr. */
2083
2084basic_block
726a989a 2085gimple_debug_bb_n (int n)
6de9cd9a 2086{
726a989a 2087 gimple_debug_bb (BASIC_BLOCK (n));
6de9cd9a 2088 return BASIC_BLOCK (n);
6531d1be 2089}
6de9cd9a
DN
2090
2091
2092/* Dump the CFG on stderr.
2093
2094 FLAGS are the same used by the tree dumping functions
398b1daa 2095 (see TDF_* in dumpfile.h). */
6de9cd9a
DN
2096
2097void
726a989a 2098gimple_debug_cfg (int flags)
6de9cd9a 2099{
726a989a 2100 gimple_dump_cfg (stderr, flags);
6de9cd9a
DN
2101}
2102
2103
2104/* Dump the program showing basic block boundaries on the given FILE.
2105
2106 FLAGS are the same used by the tree dumping functions (see TDF_* in
2107 tree.h). */
2108
2109void
726a989a 2110gimple_dump_cfg (FILE *file, int flags)
6de9cd9a
DN
2111{
2112 if (flags & TDF_DETAILS)
2113 {
6d8402ac 2114 dump_function_header (file, current_function_decl, flags);
6de9cd9a 2115 fprintf (file, ";; \n%d basic blocks, %d edges, last basic block %d.\n\n",
dc936fb2
DM
2116 n_basic_blocks_for_fn (cfun), n_edges_for_fn (cfun),
2117 last_basic_block);
6de9cd9a 2118
c4669594 2119 brief_dump_cfg (file, flags | TDF_COMMENT);
6de9cd9a
DN
2120 fprintf (file, "\n");
2121 }
2122
2123 if (flags & TDF_STATS)
2124 dump_cfg_stats (file);
2125
2126 dump_function_to_file (current_function_decl, file, flags | TDF_BLOCKS);
2127}
2128
2129
2130/* Dump CFG statistics on FILE. */
2131
2132void
2133dump_cfg_stats (FILE *file)
2134{
2135 static long max_num_merged_labels = 0;
2136 unsigned long size, total = 0;
7b0cab99 2137 long num_edges;
6de9cd9a
DN
2138 basic_block bb;
2139 const char * const fmt_str = "%-30s%-13s%12s\n";
f7fda749 2140 const char * const fmt_str_1 = "%-30s%13d%11lu%c\n";
cac50d94 2141 const char * const fmt_str_2 = "%-30s%13ld%11lu%c\n";
6de9cd9a 2142 const char * const fmt_str_3 = "%-43s%11lu%c\n";
7ee2468b 2143 const char *funcname = current_function_name ();
6de9cd9a
DN
2144
2145 fprintf (file, "\nCFG Statistics for %s\n\n", funcname);
2146
2147 fprintf (file, "---------------------------------------------------------\n");
2148 fprintf (file, fmt_str, "", " Number of ", "Memory");
2149 fprintf (file, fmt_str, "", " instances ", "used ");
2150 fprintf (file, "---------------------------------------------------------\n");
2151
0cae8d31 2152 size = n_basic_blocks_for_fn (cfun) * sizeof (struct basic_block_def);
6de9cd9a 2153 total += size;
0cae8d31 2154 fprintf (file, fmt_str_1, "Basic blocks", n_basic_blocks_for_fn (cfun),
f7fda749 2155 SCALE (size), LABEL (size));
6de9cd9a 2156
7b0cab99 2157 num_edges = 0;
6de9cd9a 2158 FOR_EACH_BB (bb)
7b0cab99
JH
2159 num_edges += EDGE_COUNT (bb->succs);
2160 size = num_edges * sizeof (struct edge_def);
6de9cd9a 2161 total += size;
cac50d94 2162 fprintf (file, fmt_str_2, "Edges", num_edges, SCALE (size), LABEL (size));
6de9cd9a 2163
6de9cd9a
DN
2164 fprintf (file, "---------------------------------------------------------\n");
2165 fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
2166 LABEL (total));
2167 fprintf (file, "---------------------------------------------------------\n");
2168 fprintf (file, "\n");
2169
2170 if (cfg_stats.num_merged_labels > max_num_merged_labels)
2171 max_num_merged_labels = cfg_stats.num_merged_labels;
2172
2173 fprintf (file, "Coalesced label blocks: %ld (Max so far: %ld)\n",
2174 cfg_stats.num_merged_labels, max_num_merged_labels);
2175
2176 fprintf (file, "\n");
2177}
2178
2179
2180/* Dump CFG statistics on stderr. Keep extern so that it's always
2181 linked in the final executable. */
2182
24e47c76 2183DEBUG_FUNCTION void
6de9cd9a
DN
2184debug_cfg_stats (void)
2185{
2186 dump_cfg_stats (stderr);
2187}
2188
6de9cd9a
DN
2189/*---------------------------------------------------------------------------
2190 Miscellaneous helpers
2191---------------------------------------------------------------------------*/
2192
8d960eda
EB
2193/* Return true if T, a GIMPLE_CALL, can make an abnormal transfer of control
2194 flow. Transfers of control flow associated with EH are excluded. */
2195
2196static bool
2197call_can_make_abnormal_goto (gimple t)
2198{
2199 /* If the function has no non-local labels, then a call cannot make an
2200 abnormal transfer of control. */
f6b64c35
RB
2201 if (!cfun->has_nonlocal_label
2202 && !cfun->calls_setjmp)
8d960eda
EB
2203 return false;
2204
2205 /* Likewise if the call has no side effects. */
2206 if (!gimple_has_side_effects (t))
2207 return false;
2208
2209 /* Likewise if the called function is leaf. */
2210 if (gimple_call_flags (t) & ECF_LEAF)
2211 return false;
2212
2213 return true;
2214}
2215
2216
2217/* Return true if T can make an abnormal transfer of control flow.
2218 Transfers of control flow associated with EH are excluded. */
2219
2220bool
2221stmt_can_make_abnormal_goto (gimple t)
2222{
2223 if (computed_goto_p (t))
2224 return true;
2225 if (is_gimple_call (t))
2226 return call_can_make_abnormal_goto (t);
2227 return false;
2228}
2229
2230
6de9cd9a
DN
2231/* Return true if T represents a stmt that always transfers control. */
2232
2233bool
726a989a 2234is_ctrl_stmt (gimple t)
6de9cd9a 2235{
40a32862
RH
2236 switch (gimple_code (t))
2237 {
2238 case GIMPLE_COND:
2239 case GIMPLE_SWITCH:
2240 case GIMPLE_GOTO:
2241 case GIMPLE_RETURN:
2242 case GIMPLE_RESX:
2243 return true;
2244 default:
2245 return false;
2246 }
6de9cd9a
DN
2247}
2248
2249
2250/* Return true if T is a statement that may alter the flow of control
2251 (e.g., a call to a non-returning function). */
2252
2253bool
726a989a 2254is_ctrl_altering_stmt (gimple t)
6de9cd9a 2255{
1e128c5f 2256 gcc_assert (t);
726a989a 2257
8b9db065 2258 switch (gimple_code (t))
6de9cd9a 2259 {
8b9db065
RH
2260 case GIMPLE_CALL:
2261 {
2262 int flags = gimple_call_flags (t);
726a989a 2263
8d960eda
EB
2264 /* A call alters control flow if it can make an abnormal goto. */
2265 if (call_can_make_abnormal_goto (t))
8b9db065 2266 return true;
6de9cd9a 2267
8b9db065 2268 /* A call also alters control flow if it does not return. */
5de8da9b 2269 if (flags & ECF_NORETURN)
8b9db065 2270 return true;
c54c785d 2271
0a35513e
AH
2272 /* TM ending statements have backedges out of the transaction.
2273 Return true so we split the basic block containing them.
2274 Note that the TM_BUILTIN test is merely an optimization. */
2275 if ((flags & ECF_TM_BUILTIN)
2276 && is_tm_ending_fndecl (gimple_call_fndecl (t)))
2277 return true;
2278
c54c785d
JH
2279 /* BUILT_IN_RETURN call is same as return statement. */
2280 if (gimple_call_builtin_p (t, BUILT_IN_RETURN))
2281 return true;
8b9db065
RH
2282 }
2283 break;
6de9cd9a 2284
1d65f45c
RH
2285 case GIMPLE_EH_DISPATCH:
2286 /* EH_DISPATCH branches to the individual catch handlers at
2287 this level of a try or allowed-exceptions region. It can
2288 fallthru to the next statement as well. */
2289 return true;
2290
1c384bf1
RH
2291 case GIMPLE_ASM:
2292 if (gimple_asm_nlabels (t) > 0)
2293 return true;
2294 break;
2295
8b9db065
RH
2296 CASE_GIMPLE_OMP:
2297 /* OpenMP directives alter control flow. */
2298 return true;
2299
0a35513e
AH
2300 case GIMPLE_TRANSACTION:
2301 /* A transaction start alters control flow. */
2302 return true;
2303
8b9db065
RH
2304 default:
2305 break;
2306 }
50674e96 2307
6de9cd9a 2308 /* If a statement can throw, it alters control flow. */
726a989a 2309 return stmt_can_throw_internal (t);
6de9cd9a
DN
2310}
2311
2312
4f6c2131 2313/* Return true if T is a simple local goto. */
6de9cd9a
DN
2314
2315bool
726a989a 2316simple_goto_p (gimple t)
6de9cd9a 2317{
726a989a
RB
2318 return (gimple_code (t) == GIMPLE_GOTO
2319 && TREE_CODE (gimple_goto_dest (t)) == LABEL_DECL);
4f6c2131
EB
2320}
2321
2322
726a989a
RB
2323/* Return true if STMT should start a new basic block. PREV_STMT is
2324 the statement preceding STMT. It is used when STMT is a label or a
2325 case label. Labels should only start a new basic block if their
2326 previous statement wasn't a label. Otherwise, sequence of labels
2327 would generate unnecessary basic blocks that only contain a single
2328 label. */
6de9cd9a
DN
2329
2330static inline bool
726a989a 2331stmt_starts_bb_p (gimple stmt, gimple prev_stmt)
6de9cd9a 2332{
726a989a 2333 if (stmt == NULL)
6de9cd9a
DN
2334 return false;
2335
726a989a
RB
2336 /* Labels start a new basic block only if the preceding statement
2337 wasn't a label of the same type. This prevents the creation of
2338 consecutive blocks that have nothing but a single label. */
2339 if (gimple_code (stmt) == GIMPLE_LABEL)
6de9cd9a
DN
2340 {
2341 /* Nonlocal and computed GOTO targets always start a new block. */
726a989a
RB
2342 if (DECL_NONLOCAL (gimple_label_label (stmt))
2343 || FORCED_LABEL (gimple_label_label (stmt)))
6de9cd9a
DN
2344 return true;
2345
726a989a 2346 if (prev_stmt && gimple_code (prev_stmt) == GIMPLE_LABEL)
6de9cd9a 2347 {
726a989a 2348 if (DECL_NONLOCAL (gimple_label_label (prev_stmt)))
6de9cd9a
DN
2349 return true;
2350
2351 cfg_stats.num_merged_labels++;
2352 return false;
2353 }
2354 else
2355 return true;
2356 }
f6b64c35
RB
2357 else if (gimple_code (stmt) == GIMPLE_CALL
2358 && gimple_call_flags (stmt) & ECF_RETURNS_TWICE)
2359 /* setjmp acts similar to a nonlocal GOTO target and thus should
2360 start a new block. */
2361 return true;
6de9cd9a
DN
2362
2363 return false;
2364}
2365
2366
2367/* Return true if T should end a basic block. */
2368
2369bool
726a989a 2370stmt_ends_bb_p (gimple t)
6de9cd9a
DN
2371{
2372 return is_ctrl_stmt (t) || is_ctrl_altering_stmt (t);
2373}
2374
726a989a 2375/* Remove block annotations and other data structures. */
6de9cd9a
DN
2376
2377void
242229bb 2378delete_tree_cfg_annotations (void)
6de9cd9a 2379{
9771b263 2380 vec_free (label_to_block_map);
6de9cd9a
DN
2381}
2382
2383
2384/* Return the first statement in basic block BB. */
2385
726a989a 2386gimple
6de9cd9a
DN
2387first_stmt (basic_block bb)
2388{
726a989a 2389 gimple_stmt_iterator i = gsi_start_bb (bb);
b5b8b0ac
AO
2390 gimple stmt = NULL;
2391
2392 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2393 {
2394 gsi_next (&i);
2395 stmt = NULL;
2396 }
2397 return stmt;
6de9cd9a
DN
2398}
2399
6c52e687
CC
2400/* Return the first non-label statement in basic block BB. */
2401
2402static gimple
2403first_non_label_stmt (basic_block bb)
2404{
2405 gimple_stmt_iterator i = gsi_start_bb (bb);
2406 while (!gsi_end_p (i) && gimple_code (gsi_stmt (i)) == GIMPLE_LABEL)
2407 gsi_next (&i);
2408 return !gsi_end_p (i) ? gsi_stmt (i) : NULL;
2409}
2410
6de9cd9a
DN
2411/* Return the last statement in basic block BB. */
2412
726a989a 2413gimple
6de9cd9a
DN
2414last_stmt (basic_block bb)
2415{
b5b8b0ac
AO
2416 gimple_stmt_iterator i = gsi_last_bb (bb);
2417 gimple stmt = NULL;
2418
2419 while (!gsi_end_p (i) && is_gimple_debug ((stmt = gsi_stmt (i))))
2420 {
2421 gsi_prev (&i);
2422 stmt = NULL;
2423 }
2424 return stmt;
6de9cd9a
DN
2425}
2426
6de9cd9a
DN
2427/* Return the last statement of an otherwise empty block. Return NULL
2428 if the block is totally empty, or if it contains more than one
2429 statement. */
2430
726a989a 2431gimple
6de9cd9a
DN
2432last_and_only_stmt (basic_block bb)
2433{
b5b8b0ac 2434 gimple_stmt_iterator i = gsi_last_nondebug_bb (bb);
726a989a 2435 gimple last, prev;
6de9cd9a 2436
726a989a
RB
2437 if (gsi_end_p (i))
2438 return NULL;
6de9cd9a 2439
726a989a 2440 last = gsi_stmt (i);
b5b8b0ac 2441 gsi_prev_nondebug (&i);
726a989a 2442 if (gsi_end_p (i))
6de9cd9a
DN
2443 return last;
2444
2445 /* Empty statements should no longer appear in the instruction stream.
2446 Everything that might have appeared before should be deleted by
726a989a 2447 remove_useless_stmts, and the optimizers should just gsi_remove
6de9cd9a
DN
2448 instead of smashing with build_empty_stmt.
2449
2450 Thus the only thing that should appear here in a block containing
2451 one executable statement is a label. */
726a989a
RB
2452 prev = gsi_stmt (i);
2453 if (gimple_code (prev) == GIMPLE_LABEL)
6de9cd9a
DN
2454 return last;
2455 else
726a989a 2456 return NULL;
82b85a85 2457}
6de9cd9a 2458
4f7db7f7
KH
2459/* Reinstall those PHI arguments queued in OLD_EDGE to NEW_EDGE. */
2460
2461static void
2462reinstall_phi_args (edge new_edge, edge old_edge)
2463{
9771b263 2464 edge_var_map_vector *v;
ea7e6d5a
AH
2465 edge_var_map *vm;
2466 int i;
726a989a 2467 gimple_stmt_iterator phis;
b8698a0f 2468
ea7e6d5a
AH
2469 v = redirect_edge_var_map_vector (old_edge);
2470 if (!v)
4f7db7f7 2471 return;
b8698a0f 2472
726a989a 2473 for (i = 0, phis = gsi_start_phis (new_edge->dest);
9771b263 2474 v->iterate (i, &vm) && !gsi_end_p (phis);
726a989a 2475 i++, gsi_next (&phis))
4f7db7f7 2476 {
726a989a 2477 gimple phi = gsi_stmt (phis);
ea7e6d5a
AH
2478 tree result = redirect_edge_var_map_result (vm);
2479 tree arg = redirect_edge_var_map_def (vm);
b8698a0f 2480
726a989a 2481 gcc_assert (result == gimple_phi_result (phi));
b8698a0f 2482
9e227d60 2483 add_phi_arg (phi, arg, new_edge, redirect_edge_var_map_location (vm));
4f7db7f7 2484 }
b8698a0f 2485
ea7e6d5a 2486 redirect_edge_var_map_clear (old_edge);
4f7db7f7
KH
2487}
2488
2a8a8292 2489/* Returns the basic block after which the new basic block created
b9a66240
ZD
2490 by splitting edge EDGE_IN should be placed. Tries to keep the new block
2491 near its "logical" location. This is of most help to humans looking
2492 at debugging dumps. */
2493
2494static basic_block
2495split_edge_bb_loc (edge edge_in)
2496{
2497 basic_block dest = edge_in->dest;
88e24a5a 2498 basic_block dest_prev = dest->prev_bb;
b9a66240 2499
88e24a5a
RH
2500 if (dest_prev)
2501 {
2502 edge e = find_edge (dest_prev, dest);
2503 if (e && !(e->flags & EDGE_COMPLEX))
2504 return edge_in->src;
2505 }
2506 return dest_prev;
b9a66240
ZD
2507}
2508
6de9cd9a
DN
2509/* Split a (typically critical) edge EDGE_IN. Return the new block.
2510 Abort on abnormal edges. */
2511
2512static basic_block
726a989a 2513gimple_split_edge (edge edge_in)
6de9cd9a 2514{
4741d956 2515 basic_block new_bb, after_bb, dest;
6de9cd9a 2516 edge new_edge, e;
6de9cd9a
DN
2517
2518 /* Abnormal edges cannot be split. */
1e128c5f 2519 gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
6de9cd9a 2520
6de9cd9a
DN
2521 dest = edge_in->dest;
2522
b9a66240 2523 after_bb = split_edge_bb_loc (edge_in);
6de9cd9a
DN
2524
2525 new_bb = create_empty_bb (after_bb);
b829f3fa
JH
2526 new_bb->frequency = EDGE_FREQUENCY (edge_in);
2527 new_bb->count = edge_in->count;
6de9cd9a 2528 new_edge = make_edge (new_bb, dest, EDGE_FALLTHRU);
b829f3fa
JH
2529 new_edge->probability = REG_BR_PROB_BASE;
2530 new_edge->count = edge_in->count;
6de9cd9a 2531
1e128c5f 2532 e = redirect_edge_and_branch (edge_in, new_bb);
c7b852c8 2533 gcc_assert (e == edge_in);
4f7db7f7 2534 reinstall_phi_args (new_edge, e);
6de9cd9a
DN
2535
2536 return new_bb;
2537}
2538
70f34814
RG
2539
2540/* Verify properties of the address expression T with base object BASE. */
2541
2542static tree
2543verify_address (tree t, tree base)
2544{
2545 bool old_constant;
2546 bool old_side_effects;
2547 bool new_constant;
2548 bool new_side_effects;
2549
2550 old_constant = TREE_CONSTANT (t);
2551 old_side_effects = TREE_SIDE_EFFECTS (t);
2552
2553 recompute_tree_invariant_for_addr_expr (t);
2554 new_side_effects = TREE_SIDE_EFFECTS (t);
2555 new_constant = TREE_CONSTANT (t);
2556
2557 if (old_constant != new_constant)
2558 {
2559 error ("constant not recomputed when ADDR_EXPR changed");
2560 return t;
2561 }
2562 if (old_side_effects != new_side_effects)
2563 {
2564 error ("side effects not recomputed when ADDR_EXPR changed");
2565 return t;
2566 }
2567
2568 if (!(TREE_CODE (base) == VAR_DECL
2569 || TREE_CODE (base) == PARM_DECL
2570 || TREE_CODE (base) == RESULT_DECL))
2571 return NULL_TREE;
2572
2573 if (DECL_GIMPLE_REG_P (base))
2574 {
2575 error ("DECL_GIMPLE_REG_P set on a variable with address taken");
2576 return base;
2577 }
2578
2579 return NULL_TREE;
2580}
2581
6de9cd9a 2582/* Callback for walk_tree, check that all elements with address taken are
7a442a1d
SB
2583 properly noticed as such. The DATA is an int* that is 1 if TP was seen
2584 inside a PHI node. */
6de9cd9a
DN
2585
2586static tree
2fbe90f2 2587verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
6de9cd9a
DN
2588{
2589 tree t = *tp, x;
2590
2591 if (TYPE_P (t))
2592 *walk_subtrees = 0;
6531d1be 2593
e8ca4159 2594 /* Check operand N for being valid GIMPLE and give error MSG if not. */
2fbe90f2 2595#define CHECK_OP(N, MSG) \
e8ca4159 2596 do { if (!is_gimple_val (TREE_OPERAND (t, N))) \
2fbe90f2 2597 { error (MSG); return TREE_OPERAND (t, N); }} while (0)
6de9cd9a
DN
2598
2599 switch (TREE_CODE (t))
2600 {
2601 case SSA_NAME:
2602 if (SSA_NAME_IN_FREE_LIST (t))
2603 {
2604 error ("SSA name in freelist but still referenced");
2605 return *tp;
2606 }
2607 break;
2608
26de0bcb 2609 case INDIRECT_REF:
70f34814
RG
2610 error ("INDIRECT_REF in gimple IL");
2611 return t;
2612
2613 case MEM_REF:
26de0bcb 2614 x = TREE_OPERAND (t, 0);
38a178dd
RG
2615 if (!POINTER_TYPE_P (TREE_TYPE (x))
2616 || !is_gimple_mem_ref_addr (x))
26de0bcb 2617 {
d8a07487 2618 error ("invalid first operand of MEM_REF");
26de0bcb
AP
2619 return x;
2620 }
70f34814
RG
2621 if (TREE_CODE (TREE_OPERAND (t, 1)) != INTEGER_CST
2622 || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 1))))
2623 {
d8a07487 2624 error ("invalid offset operand of MEM_REF");
70f34814
RG
2625 return TREE_OPERAND (t, 1);
2626 }
2627 if (TREE_CODE (x) == ADDR_EXPR
2628 && (x = verify_address (x, TREE_OPERAND (x, 0))))
2629 return x;
2630 *walk_subtrees = 0;
26de0bcb
AP
2631 break;
2632
0bca51f0
DN
2633 case ASSERT_EXPR:
2634 x = fold (ASSERT_EXPR_COND (t));
2635 if (x == boolean_false_node)
2636 {
2637 error ("ASSERT_EXPR with an always-false condition");
2638 return *tp;
2639 }
2640 break;
2641
6de9cd9a 2642 case MODIFY_EXPR:
d8a07487 2643 error ("MODIFY_EXPR not expected while having tuples");
e57fcb68 2644 return *tp;
6de9cd9a
DN
2645
2646 case ADDR_EXPR:
81fc3052 2647 {
70f34814 2648 tree tem;
81fc3052 2649
51eed280
PB
2650 gcc_assert (is_gimple_address (t));
2651
81fc3052
DB
2652 /* Skip any references (they will be checked when we recurse down the
2653 tree) and ensure that any variable used as a prefix is marked
2654 addressable. */
2655 for (x = TREE_OPERAND (t, 0);
2656 handled_component_p (x);
2657 x = TREE_OPERAND (x, 0))
2658 ;
2659
70f34814
RG
2660 if ((tem = verify_address (t, x)))
2661 return tem;
2662
5006671f
RG
2663 if (!(TREE_CODE (x) == VAR_DECL
2664 || TREE_CODE (x) == PARM_DECL
2665 || TREE_CODE (x) == RESULT_DECL))
81fc3052 2666 return NULL;
70f34814 2667
81fc3052
DB
2668 if (!TREE_ADDRESSABLE (x))
2669 {
2670 error ("address taken, but ADDRESSABLE bit not set");
2671 return x;
2672 }
bdb69bee 2673
81fc3052
DB
2674 break;
2675 }
6de9cd9a
DN
2676
2677 case COND_EXPR:
a6234684 2678 x = COND_EXPR_COND (t);
d40055ab 2679 if (!INTEGRAL_TYPE_P (TREE_TYPE (x)))
6de9cd9a 2680 {
d40055ab 2681 error ("non-integral used in condition");
6de9cd9a
DN
2682 return x;
2683 }
9c691961
AP
2684 if (!is_gimple_condexpr (x))
2685 {
ab532386 2686 error ("invalid conditional operand");
9c691961
AP
2687 return x;
2688 }
6de9cd9a
DN
2689 break;
2690
a134e5f3 2691 case NON_LVALUE_EXPR:
53020648
RG
2692 case TRUTH_NOT_EXPR:
2693 gcc_unreachable ();
a134e5f3 2694
1043771b 2695 CASE_CONVERT:
6de9cd9a 2696 case FIX_TRUNC_EXPR:
6de9cd9a
DN
2697 case FLOAT_EXPR:
2698 case NEGATE_EXPR:
2699 case ABS_EXPR:
2700 case BIT_NOT_EXPR:
ab532386 2701 CHECK_OP (0, "invalid operand to unary operator");
6de9cd9a
DN
2702 break;
2703
2704 case REALPART_EXPR:
2705 case IMAGPART_EXPR:
bbba1117
MJ
2706 case BIT_FIELD_REF:
2707 if (!is_gimple_reg_type (TREE_TYPE (t)))
2708 {
2709 error ("non-scalar BIT_FIELD_REF, IMAGPART_EXPR or REALPART_EXPR");
2710 return t;
2711 }
2712
d20188f3
MJ
2713 if (TREE_CODE (t) == BIT_FIELD_REF)
2714 {
e934916c
TV
2715 tree t0 = TREE_OPERAND (t, 0);
2716 tree t1 = TREE_OPERAND (t, 1);
2717 tree t2 = TREE_OPERAND (t, 2);
e934916c
TV
2718 if (!tree_fits_uhwi_p (t1)
2719 || !tree_fits_uhwi_p (t2))
d20188f3
MJ
2720 {
2721 error ("invalid position or size operand to BIT_FIELD_REF");
2722 return t;
2723 }
2724 if (INTEGRAL_TYPE_P (TREE_TYPE (t))
2725 && (TYPE_PRECISION (TREE_TYPE (t))
e934916c 2726 != tree_to_uhwi (t1)))
d20188f3
MJ
2727 {
2728 error ("integral result type precision does not match "
2729 "field size of BIT_FIELD_REF");
2730 return t;
2731 }
2732 else if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
2733 && TYPE_MODE (TREE_TYPE (t)) != BLKmode
2734 && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (t)))
e934916c 2735 != tree_to_uhwi (t1)))
d20188f3
MJ
2736 {
2737 error ("mode precision of non-integral result does not "
2738 "match field size of BIT_FIELD_REF");
2739 return t;
2740 }
b8815bd3
RB
2741 if (!AGGREGATE_TYPE_P (TREE_TYPE (t0))
2742 && (tree_to_uhwi (t1) + tree_to_uhwi (t2)
2743 > tree_to_uhwi (TYPE_SIZE (TREE_TYPE (t0)))))
e934916c
TV
2744 {
2745 error ("position plus size exceeds size of referenced object in "
2746 "BIT_FIELD_REF");
2747 return t;
2748 }
d20188f3
MJ
2749 }
2750 t = TREE_OPERAND (t, 0);
2751
bbba1117 2752 /* Fall-through. */
2fbe90f2
RK
2753 case COMPONENT_REF:
2754 case ARRAY_REF:
2755 case ARRAY_RANGE_REF:
2fbe90f2
RK
2756 case VIEW_CONVERT_EXPR:
2757 /* We have a nest of references. Verify that each of the operands
2758 that determine where to reference is either a constant or a variable,
2759 verify that the base is valid, and then show we've already checked
2760 the subtrees. */
afe84921 2761 while (handled_component_p (t))
2fbe90f2
RK
2762 {
2763 if (TREE_CODE (t) == COMPONENT_REF && TREE_OPERAND (t, 2))
ab532386 2764 CHECK_OP (2, "invalid COMPONENT_REF offset operator");
2fbe90f2
RK
2765 else if (TREE_CODE (t) == ARRAY_REF
2766 || TREE_CODE (t) == ARRAY_RANGE_REF)
2767 {
ab532386 2768 CHECK_OP (1, "invalid array index");
2fbe90f2 2769 if (TREE_OPERAND (t, 2))
ab532386 2770 CHECK_OP (2, "invalid array lower bound");
2fbe90f2 2771 if (TREE_OPERAND (t, 3))
ab532386 2772 CHECK_OP (3, "invalid array stride");
2fbe90f2 2773 }
d20188f3
MJ
2774 else if (TREE_CODE (t) == BIT_FIELD_REF
2775 || TREE_CODE (t) == REALPART_EXPR
2776 || TREE_CODE (t) == IMAGPART_EXPR)
2fbe90f2 2777 {
d20188f3
MJ
2778 error ("non-top-level BIT_FIELD_REF, IMAGPART_EXPR or "
2779 "REALPART_EXPR");
2780 return t;
2fbe90f2
RK
2781 }
2782
2783 t = TREE_OPERAND (t, 0);
2784 }
2785
bb0c55f6 2786 if (!is_gimple_min_invariant (t) && !is_gimple_lvalue (t))
2fbe90f2 2787 {
ab532386 2788 error ("invalid reference prefix");
2fbe90f2
RK
2789 return t;
2790 }
2791 *walk_subtrees = 0;
6de9cd9a 2792 break;
5be014d5
AP
2793 case PLUS_EXPR:
2794 case MINUS_EXPR:
2795 /* PLUS_EXPR and MINUS_EXPR don't work on pointers, they should be done using
2796 POINTER_PLUS_EXPR. */
2797 if (POINTER_TYPE_P (TREE_TYPE (t)))
2798 {
2799 error ("invalid operand to plus/minus, type is a pointer");
2800 return t;
2801 }
2802 CHECK_OP (0, "invalid operand to binary operator");
2803 CHECK_OP (1, "invalid operand to binary operator");
2804 break;
6de9cd9a 2805
5be014d5
AP
2806 case POINTER_PLUS_EXPR:
2807 /* Check to make sure the first operand is a pointer or reference type. */
2808 if (!POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
2809 {
2810 error ("invalid operand to pointer plus, first operand is not a pointer");
2811 return t;
2812 }
370f4759
RG
2813 /* Check to make sure the second operand is a ptrofftype. */
2814 if (!ptrofftype_p (TREE_TYPE (TREE_OPERAND (t, 1))))
5be014d5
AP
2815 {
2816 error ("invalid operand to pointer plus, second operand is not an "
370f4759 2817 "integer type of appropriate width");
5be014d5
AP
2818 return t;
2819 }
2820 /* FALLTHROUGH */
6de9cd9a
DN
2821 case LT_EXPR:
2822 case LE_EXPR:
2823 case GT_EXPR:
2824 case GE_EXPR:
2825 case EQ_EXPR:
2826 case NE_EXPR:
2827 case UNORDERED_EXPR:
2828 case ORDERED_EXPR:
2829 case UNLT_EXPR:
2830 case UNLE_EXPR:
2831 case UNGT_EXPR:
2832 case UNGE_EXPR:
2833 case UNEQ_EXPR:
d1a7edaf 2834 case LTGT_EXPR:
6de9cd9a
DN
2835 case MULT_EXPR:
2836 case TRUNC_DIV_EXPR:
2837 case CEIL_DIV_EXPR:
2838 case FLOOR_DIV_EXPR:
2839 case ROUND_DIV_EXPR:
2840 case TRUNC_MOD_EXPR:
2841 case CEIL_MOD_EXPR:
2842 case FLOOR_MOD_EXPR:
2843 case ROUND_MOD_EXPR:
2844 case RDIV_EXPR:
2845 case EXACT_DIV_EXPR:
2846 case MIN_EXPR:
2847 case MAX_EXPR:
2848 case LSHIFT_EXPR:
2849 case RSHIFT_EXPR:
2850 case LROTATE_EXPR:
2851 case RROTATE_EXPR:
2852 case BIT_IOR_EXPR:
2853 case BIT_XOR_EXPR:
2854 case BIT_AND_EXPR:
ab532386
JM
2855 CHECK_OP (0, "invalid operand to binary operator");
2856 CHECK_OP (1, "invalid operand to binary operator");
6de9cd9a
DN
2857 break;
2858
84816907
JM
2859 case CONSTRUCTOR:
2860 if (TREE_CONSTANT (t) && TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
2861 *walk_subtrees = 0;
2862 break;
2863
eb9f9259
NF
2864 case CASE_LABEL_EXPR:
2865 if (CASE_CHAIN (t))
2866 {
2867 error ("invalid CASE_CHAIN");
2868 return t;
2869 }
2870 break;
2871
6de9cd9a
DN
2872 default:
2873 break;
2874 }
2875 return NULL;
2fbe90f2
RK
2876
2877#undef CHECK_OP
6de9cd9a
DN
2878}
2879
7e98624c
RG
2880
2881/* Verify if EXPR is either a GIMPLE ID or a GIMPLE indirect reference.
2882 Returns true if there is an error, otherwise false. */
2883
2884static bool
726a989a 2885verify_types_in_gimple_min_lval (tree expr)
7e98624c
RG
2886{
2887 tree op;
2888
2889 if (is_gimple_id (expr))
2890 return false;
2891
be1ac4ec 2892 if (TREE_CODE (expr) != TARGET_MEM_REF
70f34814 2893 && TREE_CODE (expr) != MEM_REF)
7e98624c
RG
2894 {
2895 error ("invalid expression for min lvalue");
2896 return true;
2897 }
2898
9f509004
RG
2899 /* TARGET_MEM_REFs are strange beasts. */
2900 if (TREE_CODE (expr) == TARGET_MEM_REF)
2901 return false;
2902
7e98624c
RG
2903 op = TREE_OPERAND (expr, 0);
2904 if (!is_gimple_val (op))
2905 {
2906 error ("invalid operand in indirect reference");
2907 debug_generic_stmt (op);
2908 return true;
2909 }
70f34814 2910 /* Memory references now generally can involve a value conversion. */
7e98624c
RG
2911
2912 return false;
2913}
2914
3a19701a
RG
2915/* Verify if EXPR is a valid GIMPLE reference expression. If
2916 REQUIRE_LVALUE is true verifies it is an lvalue. Returns true
7e98624c
RG
2917 if there is an error, otherwise false. */
2918
2919static bool
3a19701a 2920verify_types_in_gimple_reference (tree expr, bool require_lvalue)
7e98624c
RG
2921{
2922 while (handled_component_p (expr))
2923 {
2924 tree op = TREE_OPERAND (expr, 0);
2925
2926 if (TREE_CODE (expr) == ARRAY_REF
2927 || TREE_CODE (expr) == ARRAY_RANGE_REF)
2928 {
2929 if (!is_gimple_val (TREE_OPERAND (expr, 1))
2930 || (TREE_OPERAND (expr, 2)
2931 && !is_gimple_val (TREE_OPERAND (expr, 2)))
2932 || (TREE_OPERAND (expr, 3)
2933 && !is_gimple_val (TREE_OPERAND (expr, 3))))
2934 {
2935 error ("invalid operands to array reference");
2936 debug_generic_stmt (expr);
2937 return true;
2938 }
2939 }
2940
2941 /* Verify if the reference array element types are compatible. */
2942 if (TREE_CODE (expr) == ARRAY_REF
2943 && !useless_type_conversion_p (TREE_TYPE (expr),
2944 TREE_TYPE (TREE_TYPE (op))))
2945 {
2946 error ("type mismatch in array reference");
2947 debug_generic_stmt (TREE_TYPE (expr));
2948 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2949 return true;
2950 }
2951 if (TREE_CODE (expr) == ARRAY_RANGE_REF
2952 && !useless_type_conversion_p (TREE_TYPE (TREE_TYPE (expr)),
2953 TREE_TYPE (TREE_TYPE (op))))
2954 {
2955 error ("type mismatch in array range reference");
2956 debug_generic_stmt (TREE_TYPE (TREE_TYPE (expr)));
2957 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2958 return true;
2959 }
2960
2961 if ((TREE_CODE (expr) == REALPART_EXPR
2962 || TREE_CODE (expr) == IMAGPART_EXPR)
2963 && !useless_type_conversion_p (TREE_TYPE (expr),
2964 TREE_TYPE (TREE_TYPE (op))))
2965 {
2966 error ("type mismatch in real/imagpart reference");
2967 debug_generic_stmt (TREE_TYPE (expr));
2968 debug_generic_stmt (TREE_TYPE (TREE_TYPE (op)));
2969 return true;
2970 }
2971
2972 if (TREE_CODE (expr) == COMPONENT_REF
2973 && !useless_type_conversion_p (TREE_TYPE (expr),
2974 TREE_TYPE (TREE_OPERAND (expr, 1))))
2975 {
2976 error ("type mismatch in component reference");
2977 debug_generic_stmt (TREE_TYPE (expr));
2978 debug_generic_stmt (TREE_TYPE (TREE_OPERAND (expr, 1)));
2979 return true;
2980 }
2981
cc12e760
MJ
2982 if (TREE_CODE (expr) == VIEW_CONVERT_EXPR)
2983 {
2984 /* For VIEW_CONVERT_EXPRs which are allowed here too, we only check
2985 that their operand is not an SSA name or an invariant when
2986 requiring an lvalue (this usually means there is a SRA or IPA-SRA
2987 bug). Otherwise there is nothing to verify, gross mismatches at
2988 most invoke undefined behavior. */
2989 if (require_lvalue
2990 && (TREE_CODE (op) == SSA_NAME
2991 || is_gimple_min_invariant (op)))
2992 {
d8a07487 2993 error ("conversion of an SSA_NAME on the left hand side");
cc12e760
MJ
2994 debug_generic_stmt (expr);
2995 return true;
2996 }
70f34814
RG
2997 else if (TREE_CODE (op) == SSA_NAME
2998 && TYPE_SIZE (TREE_TYPE (expr)) != TYPE_SIZE (TREE_TYPE (op)))
2999 {
d8a07487 3000 error ("conversion of register to a different size");
70f34814
RG
3001 debug_generic_stmt (expr);
3002 return true;
3003 }
cc12e760
MJ
3004 else if (!handled_component_p (op))
3005 return false;
3006 }
7e98624c
RG
3007
3008 expr = op;
3009 }
3010
70f34814
RG
3011 if (TREE_CODE (expr) == MEM_REF)
3012 {
3013 if (!is_gimple_mem_ref_addr (TREE_OPERAND (expr, 0)))
3014 {
d8a07487 3015 error ("invalid address operand in MEM_REF");
70f34814
RG
3016 debug_generic_stmt (expr);
3017 return true;
3018 }
3019 if (TREE_CODE (TREE_OPERAND (expr, 1)) != INTEGER_CST
3020 || !POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1))))
3021 {
d8a07487 3022 error ("invalid offset operand in MEM_REF");
70f34814
RG
3023 debug_generic_stmt (expr);
3024 return true;
3025 }
3026 }
4b228e61
RG
3027 else if (TREE_CODE (expr) == TARGET_MEM_REF)
3028 {
4d948885
RG
3029 if (!TMR_BASE (expr)
3030 || !is_gimple_mem_ref_addr (TMR_BASE (expr)))
23a534a1 3031 {
cff41484 3032 error ("invalid address operand in TARGET_MEM_REF");
23a534a1
RG
3033 return true;
3034 }
4b228e61
RG
3035 if (!TMR_OFFSET (expr)
3036 || TREE_CODE (TMR_OFFSET (expr)) != INTEGER_CST
3037 || !POINTER_TYPE_P (TREE_TYPE (TMR_OFFSET (expr))))
3038 {
d8a07487 3039 error ("invalid offset operand in TARGET_MEM_REF");
4b228e61
RG
3040 debug_generic_stmt (expr);
3041 return true;
3042 }
3043 }
70f34814 3044
3a19701a
RG
3045 return ((require_lvalue || !is_gimple_min_invariant (expr))
3046 && verify_types_in_gimple_min_lval (expr));
7e98624c
RG
3047}
3048
20dcff2a
RG
3049/* Returns true if there is one pointer type in TYPE_POINTER_TO (SRC_OBJ)
3050 list of pointer-to types that is trivially convertible to DEST. */
3051
3052static bool
3053one_pointer_to_useless_type_conversion_p (tree dest, tree src_obj)
3054{
3055 tree src;
3056
3057 if (!TYPE_POINTER_TO (src_obj))
3058 return true;
3059
3060 for (src = TYPE_POINTER_TO (src_obj); src; src = TYPE_NEXT_PTR_TO (src))
3061 if (useless_type_conversion_p (dest, src))
3062 return true;
3063
3064 return false;
3065}
3066
726a989a
RB
3067/* Return true if TYPE1 is a fixed-point type and if conversions to and
3068 from TYPE2 can be handled by FIXED_CONVERT_EXPR. */
3069
3070static bool
3071valid_fixed_convert_types_p (tree type1, tree type2)
3072{
3073 return (FIXED_POINT_TYPE_P (type1)
3074 && (INTEGRAL_TYPE_P (type2)
3075 || SCALAR_FLOAT_TYPE_P (type2)
3076 || FIXED_POINT_TYPE_P (type2)));
3077}
3078
726a989a
RB
3079/* Verify the contents of a GIMPLE_CALL STMT. Returns true when there
3080 is a problem, otherwise false. */
3081
3082static bool
b59d3976 3083verify_gimple_call (gimple stmt)
726a989a 3084{
b59d3976 3085 tree fn = gimple_call_fn (stmt);
34019e28 3086 tree fntype, fndecl;
f68a75df
RG
3087 unsigned i;
3088
25583c4f
RS
3089 if (gimple_call_internal_p (stmt))
3090 {
3091 if (fn)
3092 {
3093 error ("gimple call has two targets");
3094 debug_generic_stmt (fn);
3095 return true;
3096 }
3097 }
3098 else
3099 {
3100 if (!fn)
3101 {
3102 error ("gimple call has no target");
3103 return true;
3104 }
3105 }
3106
3107 if (fn && !is_gimple_call_addr (fn))
f68a75df
RG
3108 {
3109 error ("invalid function in gimple call");
3110 debug_generic_stmt (fn);
3111 return true;
3112 }
726a989a 3113
25583c4f
RS
3114 if (fn
3115 && (!POINTER_TYPE_P (TREE_TYPE (fn))
3116 || (TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != FUNCTION_TYPE
3117 && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) != METHOD_TYPE)))
b59d3976
RG
3118 {
3119 error ("non-function in gimple call");
3120 return true;
3121 }
726a989a 3122
34019e28
RG
3123 fndecl = gimple_call_fndecl (stmt);
3124 if (fndecl
3125 && TREE_CODE (fndecl) == FUNCTION_DECL
3126 && DECL_LOOPING_CONST_OR_PURE_P (fndecl)
3127 && !DECL_PURE_P (fndecl)
3128 && !TREE_READONLY (fndecl))
3129 {
3130 error ("invalid pure const state for function");
3131 return true;
3132 }
3133
b59d3976 3134 if (gimple_call_lhs (stmt)
cc12e760
MJ
3135 && (!is_gimple_lvalue (gimple_call_lhs (stmt))
3136 || verify_types_in_gimple_reference (gimple_call_lhs (stmt), true)))
b59d3976
RG
3137 {
3138 error ("invalid LHS in gimple call");
3139 return true;
3140 }
726a989a 3141
5de8da9b
AO
3142 if (gimple_call_lhs (stmt) && gimple_call_noreturn_p (stmt))
3143 {
3144 error ("LHS in noreturn call");
3145 return true;
3146 }
3147
9bfc434b 3148 fntype = gimple_call_fntype (stmt);
25583c4f
RS
3149 if (fntype
3150 && gimple_call_lhs (stmt)
b59d3976
RG
3151 && !useless_type_conversion_p (TREE_TYPE (gimple_call_lhs (stmt)),
3152 TREE_TYPE (fntype))
3153 /* ??? At least C++ misses conversions at assignments from
3154 void * call results.
3155 ??? Java is completely off. Especially with functions
3156 returning java.lang.Object.
3157 For now simply allow arbitrary pointer type conversions. */
3158 && !(POINTER_TYPE_P (TREE_TYPE (gimple_call_lhs (stmt)))
3159 && POINTER_TYPE_P (TREE_TYPE (fntype))))
3160 {
3161 error ("invalid conversion in gimple call");
3162 debug_generic_stmt (TREE_TYPE (gimple_call_lhs (stmt)));
3163 debug_generic_stmt (TREE_TYPE (fntype));
3164 return true;
3165 }
726a989a 3166
f68a75df
RG
3167 if (gimple_call_chain (stmt)
3168 && !is_gimple_val (gimple_call_chain (stmt)))
3169 {
3170 error ("invalid static chain in gimple call");
3171 debug_generic_stmt (gimple_call_chain (stmt));
3172 return true;
3173 }
3174
fe663f4e 3175 /* If there is a static chain argument, this should not be an indirect
9f62cb92 3176 call, and the decl should have DECL_STATIC_CHAIN set. */
fe663f4e
RH
3177 if (gimple_call_chain (stmt))
3178 {
1b0e3802 3179 if (!gimple_call_fndecl (stmt))
fe663f4e
RH
3180 {
3181 error ("static chain in indirect gimple call");
3182 return true;
3183 }
3184 fn = TREE_OPERAND (fn, 0);
3185
9f62cb92 3186 if (!DECL_STATIC_CHAIN (fn))
fe663f4e 3187 {
d8a07487 3188 error ("static chain with function that doesn%'t use one");
fe663f4e
RH
3189 return true;
3190 }
3191 }
3192
b59d3976
RG
3193 /* ??? The C frontend passes unpromoted arguments in case it
3194 didn't see a function declaration before the call. So for now
f68a75df 3195 leave the call arguments mostly unverified. Once we gimplify
b59d3976 3196 unit-at-a-time we have a chance to fix this. */
726a989a 3197
f68a75df
RG
3198 for (i = 0; i < gimple_call_num_args (stmt); ++i)
3199 {
3200 tree arg = gimple_call_arg (stmt, i);
523968bf
RG
3201 if ((is_gimple_reg_type (TREE_TYPE (arg))
3202 && !is_gimple_val (arg))
3203 || (!is_gimple_reg_type (TREE_TYPE (arg))
3204 && !is_gimple_lvalue (arg)))
f68a75df
RG
3205 {
3206 error ("invalid argument to gimple call");
3207 debug_generic_expr (arg);
8957a0ec 3208 return true;
f68a75df
RG
3209 }
3210 }
3211
b59d3976 3212 return false;
726a989a
RB
3213}
3214
b59d3976
RG
3215/* Verifies the gimple comparison with the result type TYPE and
3216 the operands OP0 and OP1. */
17d23165
RS
3217
3218static bool
b59d3976 3219verify_gimple_comparison (tree type, tree op0, tree op1)
17d23165 3220{
b59d3976
RG
3221 tree op0_type = TREE_TYPE (op0);
3222 tree op1_type = TREE_TYPE (op1);
726a989a 3223
b59d3976
RG
3224 if (!is_gimple_val (op0) || !is_gimple_val (op1))
3225 {
3226 error ("invalid operands in gimple comparison");
3227 return true;
3228 }
17d23165 3229
b59d3976
RG
3230 /* For comparisons we do not have the operations type as the
3231 effective type the comparison is carried out in. Instead
3232 we require that either the first operand is trivially
3233 convertible into the second, or the other way around.
b59d3976
RG
3234 Because we special-case pointers to void we allow
3235 comparisons of pointers with the same mode as well. */
544d960a
AS
3236 if (!useless_type_conversion_p (op0_type, op1_type)
3237 && !useless_type_conversion_p (op1_type, op0_type)
3238 && (!POINTER_TYPE_P (op0_type)
3239 || !POINTER_TYPE_P (op1_type)
3240 || TYPE_MODE (op0_type) != TYPE_MODE (op1_type)))
3241 {
3242 error ("mismatching comparison operand types");
b59d3976
RG
3243 debug_generic_expr (op0_type);
3244 debug_generic_expr (op1_type);
3245 return true;
3246 }
3247
544d960a
AS
3248 /* The resulting type of a comparison may be an effective boolean type. */
3249 if (INTEGRAL_TYPE_P (type)
3250 && (TREE_CODE (type) == BOOLEAN_TYPE
3251 || TYPE_PRECISION (type) == 1))
d8d638d9
MG
3252 {
3253 if (TREE_CODE (op0_type) == VECTOR_TYPE
3254 || TREE_CODE (op1_type) == VECTOR_TYPE)
3255 {
3256 error ("vector comparison returning a boolean");
3257 debug_generic_expr (op0_type);
3258 debug_generic_expr (op1_type);
3259 return true;
3260 }
3261 }
544d960a
AS
3262 /* Or an integer vector type with the same size and element count
3263 as the comparison operand types. */
3264 else if (TREE_CODE (type) == VECTOR_TYPE
3265 && TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE)
3266 {
3267 if (TREE_CODE (op0_type) != VECTOR_TYPE
3268 || TREE_CODE (op1_type) != VECTOR_TYPE)
3269 {
3270 error ("non-vector operands in vector comparison");
3271 debug_generic_expr (op0_type);
3272 debug_generic_expr (op1_type);
3273 return true;
3274 }
3275
3276 if (TYPE_VECTOR_SUBPARTS (type) != TYPE_VECTOR_SUBPARTS (op0_type)
ccb3dd5a 3277 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (type)))
74946978
MP
3278 != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0_type))))
3279 /* The result of a vector comparison is of signed
3280 integral type. */
3281 || TYPE_UNSIGNED (TREE_TYPE (type)))
544d960a
AS
3282 {
3283 error ("invalid vector comparison resulting type");
3284 debug_generic_expr (type);
3285 return true;
3286 }
3287 }
3288 else
3289 {
3290 error ("bogus comparison result type");
3291 debug_generic_expr (type);
3292 return true;
3293 }
3294
b59d3976
RG
3295 return false;
3296}
726a989a 3297
9f509004
RG
3298/* Verify a gimple assignment statement STMT with an unary rhs.
3299 Returns true if anything is wrong. */
7e98624c
RG
3300
3301static bool
9f509004 3302verify_gimple_assign_unary (gimple stmt)
7e98624c 3303{
726a989a
RB
3304 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3305 tree lhs = gimple_assign_lhs (stmt);
726a989a 3306 tree lhs_type = TREE_TYPE (lhs);
9f509004 3307 tree rhs1 = gimple_assign_rhs1 (stmt);
726a989a 3308 tree rhs1_type = TREE_TYPE (rhs1);
7e98624c 3309
afdac116 3310 if (!is_gimple_reg (lhs))
9f509004
RG
3311 {
3312 error ("non-register as LHS of unary operation");
3313 return true;
3314 }
3315
3316 if (!is_gimple_val (rhs1))
3317 {
3318 error ("invalid operand in unary operation");
3319 return true;
3320 }
3321
3322 /* First handle conversions. */
726a989a 3323 switch (rhs_code)
7e98624c 3324 {
1043771b 3325 CASE_CONVERT:
7e98624c 3326 {
c1d9cb02 3327 /* Allow conversions from pointer type to integral type only if
9f509004 3328 there is no sign or zero extension involved.
0d82a1c8 3329 For targets were the precision of ptrofftype doesn't match that
c1d9cb02 3330 of pointers we need to allow arbitrary conversions to ptrofftype. */
9f509004 3331 if ((POINTER_TYPE_P (lhs_type)
c1d9cb02 3332 && INTEGRAL_TYPE_P (rhs1_type))
9f509004
RG
3333 || (POINTER_TYPE_P (rhs1_type)
3334 && INTEGRAL_TYPE_P (lhs_type)
3335 && (TYPE_PRECISION (rhs1_type) >= TYPE_PRECISION (lhs_type)
0d82a1c8 3336 || ptrofftype_p (sizetype))))
7e98624c
RG
3337 return false;
3338
819f3b2c 3339 /* Allow conversion from integral to offset type and vice versa. */
726a989a 3340 if ((TREE_CODE (lhs_type) == OFFSET_TYPE
819f3b2c 3341 && INTEGRAL_TYPE_P (rhs1_type))
72d5c6c1
RG
3342 || (INTEGRAL_TYPE_P (lhs_type)
3343 && TREE_CODE (rhs1_type) == OFFSET_TYPE))
7e98624c
RG
3344 return false;
3345
3346 /* Otherwise assert we are converting between types of the
3347 same kind. */
726a989a 3348 if (INTEGRAL_TYPE_P (lhs_type) != INTEGRAL_TYPE_P (rhs1_type))
7e98624c
RG
3349 {
3350 error ("invalid types in nop conversion");
726a989a
RB
3351 debug_generic_expr (lhs_type);
3352 debug_generic_expr (rhs1_type);
7e98624c
RG
3353 return true;
3354 }
3355
3356 return false;
3357 }
3358
09e881c9
BE
3359 case ADDR_SPACE_CONVERT_EXPR:
3360 {
3361 if (!POINTER_TYPE_P (rhs1_type) || !POINTER_TYPE_P (lhs_type)
3362 || (TYPE_ADDR_SPACE (TREE_TYPE (rhs1_type))
3363 == TYPE_ADDR_SPACE (TREE_TYPE (lhs_type))))
3364 {
3365 error ("invalid types in address space conversion");
3366 debug_generic_expr (lhs_type);
3367 debug_generic_expr (rhs1_type);
3368 return true;
3369 }
3370
3371 return false;
3372 }
3373
17d23165
RS
3374 case FIXED_CONVERT_EXPR:
3375 {
726a989a
RB
3376 if (!valid_fixed_convert_types_p (lhs_type, rhs1_type)
3377 && !valid_fixed_convert_types_p (rhs1_type, lhs_type))
17d23165
RS
3378 {
3379 error ("invalid types in fixed-point conversion");
726a989a
RB
3380 debug_generic_expr (lhs_type);
3381 debug_generic_expr (rhs1_type);
17d23165
RS
3382 return true;
3383 }
3384
3385 return false;
3386 }
3387
7e98624c
RG
3388 case FLOAT_EXPR:
3389 {
9db8f45d
DP
3390 if ((!INTEGRAL_TYPE_P (rhs1_type) || !SCALAR_FLOAT_TYPE_P (lhs_type))
3391 && (!VECTOR_INTEGER_TYPE_P (rhs1_type)
c3284718 3392 || !VECTOR_FLOAT_TYPE_P (lhs_type)))
7e98624c
RG
3393 {
3394 error ("invalid types in conversion to floating point");
726a989a
RB
3395 debug_generic_expr (lhs_type);
3396 debug_generic_expr (rhs1_type);
7e98624c
RG
3397 return true;
3398 }
726a989a 3399
7e98624c
RG
3400 return false;
3401 }
3402
3403 case FIX_TRUNC_EXPR:
3404 {
9db8f45d
DP
3405 if ((!INTEGRAL_TYPE_P (lhs_type) || !SCALAR_FLOAT_TYPE_P (rhs1_type))
3406 && (!VECTOR_INTEGER_TYPE_P (lhs_type)
c3284718 3407 || !VECTOR_FLOAT_TYPE_P (rhs1_type)))
7e98624c
RG
3408 {
3409 error ("invalid types in conversion to integer");
726a989a
RB
3410 debug_generic_expr (lhs_type);
3411 debug_generic_expr (rhs1_type);
7e98624c
RG
3412 return true;
3413 }
726a989a 3414
7e98624c
RG
3415 return false;
3416 }
3417
587aa063
RG
3418 case VEC_UNPACK_HI_EXPR:
3419 case VEC_UNPACK_LO_EXPR:
3420 case REDUC_MAX_EXPR:
3421 case REDUC_MIN_EXPR:
3422 case REDUC_PLUS_EXPR:
3423 case VEC_UNPACK_FLOAT_HI_EXPR:
3424 case VEC_UNPACK_FLOAT_LO_EXPR:
3425 /* FIXME. */
3426 return false;
9f509004
RG
3427
3428 case NEGATE_EXPR:
3429 case ABS_EXPR:
3430 case BIT_NOT_EXPR:
3431 case PAREN_EXPR:
3432 case NON_LVALUE_EXPR:
3433 case CONJ_EXPR:
9f509004
RG
3434 break;
3435
3436 default:
3437 gcc_unreachable ();
3438 }
3439
3440 /* For the remaining codes assert there is no conversion involved. */
3441 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3442 {
3443 error ("non-trivial conversion in unary operation");
3444 debug_generic_expr (lhs_type);
3445 debug_generic_expr (rhs1_type);
3446 return true;
3447 }
3448
3449 return false;
3450}
3451
3452/* Verify a gimple assignment statement STMT with a binary rhs.
3453 Returns true if anything is wrong. */
3454
3455static bool
3456verify_gimple_assign_binary (gimple stmt)
3457{
3458 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3459 tree lhs = gimple_assign_lhs (stmt);
3460 tree lhs_type = TREE_TYPE (lhs);
3461 tree rhs1 = gimple_assign_rhs1 (stmt);
3462 tree rhs1_type = TREE_TYPE (rhs1);
3463 tree rhs2 = gimple_assign_rhs2 (stmt);
3464 tree rhs2_type = TREE_TYPE (rhs2);
3465
afdac116 3466 if (!is_gimple_reg (lhs))
9f509004
RG
3467 {
3468 error ("non-register as LHS of binary operation");
3469 return true;
3470 }
726a989a 3471
9f509004
RG
3472 if (!is_gimple_val (rhs1)
3473 || !is_gimple_val (rhs2))
3474 {
3475 error ("invalid operands in binary operation");
3476 return true;
3477 }
3478
3479 /* First handle operations that involve different types. */
3480 switch (rhs_code)
3481 {
3482 case COMPLEX_EXPR:
3483 {
3484 if (TREE_CODE (lhs_type) != COMPLEX_TYPE
3485 || !(INTEGRAL_TYPE_P (rhs1_type)
726a989a 3486 || SCALAR_FLOAT_TYPE_P (rhs1_type))
9f509004 3487 || !(INTEGRAL_TYPE_P (rhs2_type)
726a989a 3488 || SCALAR_FLOAT_TYPE_P (rhs2_type)))
7e98624c
RG
3489 {
3490 error ("type mismatch in complex expression");
726a989a
RB
3491 debug_generic_expr (lhs_type);
3492 debug_generic_expr (rhs1_type);
3493 debug_generic_expr (rhs2_type);
7e98624c
RG
3494 return true;
3495 }
726a989a 3496
7e98624c
RG
3497 return false;
3498 }
3499
7e98624c
RG
3500 case LSHIFT_EXPR:
3501 case RSHIFT_EXPR:
3502 case LROTATE_EXPR:
3503 case RROTATE_EXPR:
3504 {
587aa063
RG
3505 /* Shifts and rotates are ok on integral types, fixed point
3506 types and integer vector types. */
3507 if ((!INTEGRAL_TYPE_P (rhs1_type)
3508 && !FIXED_POINT_TYPE_P (rhs1_type)
3509 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
bf8e3b77 3510 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))))
587aa063
RG
3511 || (!INTEGRAL_TYPE_P (rhs2_type)
3512 /* Vector shifts of vectors are also ok. */
3513 && !(TREE_CODE (rhs1_type) == VECTOR_TYPE
bf8e3b77 3514 && INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
587aa063 3515 && TREE_CODE (rhs2_type) == VECTOR_TYPE
bf8e3b77 3516 && INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
726a989a 3517 || !useless_type_conversion_p (lhs_type, rhs1_type))
7e98624c
RG
3518 {
3519 error ("type mismatch in shift expression");
726a989a
RB
3520 debug_generic_expr (lhs_type);
3521 debug_generic_expr (rhs1_type);
3522 debug_generic_expr (rhs2_type);
7e98624c
RG
3523 return true;
3524 }
726a989a 3525
7e98624c
RG
3526 return false;
3527 }
3528
9f509004
RG
3529 case VEC_LSHIFT_EXPR:
3530 case VEC_RSHIFT_EXPR:
7e98624c 3531 {
9f509004 3532 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
0009b473 3533 || !(INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
65dcb901 3534 || POINTER_TYPE_P (TREE_TYPE (rhs1_type))
1fe479fd
RG
3535 || FIXED_POINT_TYPE_P (TREE_TYPE (rhs1_type))
3536 || SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs1_type)))
9f509004
RG
3537 || (!INTEGRAL_TYPE_P (rhs2_type)
3538 && (TREE_CODE (rhs2_type) != VECTOR_TYPE
3539 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs2_type))))
3540 || !useless_type_conversion_p (lhs_type, rhs1_type))
7e98624c 3541 {
9f509004
RG
3542 error ("type mismatch in vector shift expression");
3543 debug_generic_expr (lhs_type);
3544 debug_generic_expr (rhs1_type);
3545 debug_generic_expr (rhs2_type);
7e98624c
RG
3546 return true;
3547 }
65dcb901 3548 /* For shifting a vector of non-integral components we
1fe479fd 3549 only allow shifting by a constant multiple of the element size. */
65dcb901 3550 if (!INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
1fe479fd
RG
3551 && (TREE_CODE (rhs2) != INTEGER_CST
3552 || !div_if_zero_remainder (EXACT_DIV_EXPR, rhs2,
3553 TYPE_SIZE (TREE_TYPE (rhs1_type)))))
3554 {
3555 error ("non-element sized vector shift of floating point vector");
3556 return true;
3557 }
726a989a 3558
9f509004 3559 return false;
7e98624c
RG
3560 }
3561
36ba4aae
IR
3562 case WIDEN_LSHIFT_EXPR:
3563 {
3564 if (!INTEGRAL_TYPE_P (lhs_type)
3565 || !INTEGRAL_TYPE_P (rhs1_type)
3566 || TREE_CODE (rhs2) != INTEGER_CST
3567 || (2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)))
3568 {
3569 error ("type mismatch in widening vector shift expression");
3570 debug_generic_expr (lhs_type);
3571 debug_generic_expr (rhs1_type);
3572 debug_generic_expr (rhs2_type);
3573 return true;
3574 }
3575
3576 return false;
3577 }
3578
3579 case VEC_WIDEN_LSHIFT_HI_EXPR:
3580 case VEC_WIDEN_LSHIFT_LO_EXPR:
3581 {
3582 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3583 || TREE_CODE (lhs_type) != VECTOR_TYPE
3584 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1_type))
3585 || !INTEGRAL_TYPE_P (TREE_TYPE (lhs_type))
3586 || TREE_CODE (rhs2) != INTEGER_CST
3587 || (2 * TYPE_PRECISION (TREE_TYPE (rhs1_type))
3588 > TYPE_PRECISION (TREE_TYPE (lhs_type))))
3589 {
3590 error ("type mismatch in widening vector shift expression");
3591 debug_generic_expr (lhs_type);
3592 debug_generic_expr (rhs1_type);
3593 debug_generic_expr (rhs2_type);
3594 return true;
3595 }
3596
3597 return false;
3598 }
3599
646bea10 3600 case PLUS_EXPR:
cc99c5fe 3601 case MINUS_EXPR:
646bea10 3602 {
e67f39f7
RB
3603 tree lhs_etype = lhs_type;
3604 tree rhs1_etype = rhs1_type;
3605 tree rhs2_etype = rhs2_type;
3606 if (TREE_CODE (lhs_type) == VECTOR_TYPE)
646bea10
RG
3607 {
3608 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3609 || TREE_CODE (rhs2_type) != VECTOR_TYPE)
3610 {
3611 error ("invalid non-vector operands to vector valued plus");
3612 return true;
3613 }
e67f39f7
RB
3614 lhs_etype = TREE_TYPE (lhs_type);
3615 rhs1_etype = TREE_TYPE (rhs1_type);
3616 rhs2_etype = TREE_TYPE (rhs2_type);
646bea10 3617 }
e67f39f7
RB
3618 if (POINTER_TYPE_P (lhs_etype)
3619 || POINTER_TYPE_P (rhs1_etype)
3620 || POINTER_TYPE_P (rhs2_etype))
646bea10
RG
3621 {
3622 error ("invalid (pointer) operands to plus/minus");
3623 return true;
3624 }
3625
3626 /* Continue with generic binary expression handling. */
3627 break;
3628 }
3629
7e98624c
RG
3630 case POINTER_PLUS_EXPR:
3631 {
726a989a
RB
3632 if (!POINTER_TYPE_P (rhs1_type)
3633 || !useless_type_conversion_p (lhs_type, rhs1_type)
370f4759 3634 || !ptrofftype_p (rhs2_type))
7e98624c
RG
3635 {
3636 error ("type mismatch in pointer plus expression");
726a989a
RB
3637 debug_generic_stmt (lhs_type);
3638 debug_generic_stmt (rhs1_type);
3639 debug_generic_stmt (rhs2_type);
7e98624c
RG
3640 return true;
3641 }
7e98624c 3642
726a989a 3643 return false;
b8698a0f 3644 }
7e98624c 3645
7e98624c
RG
3646 case TRUTH_ANDIF_EXPR:
3647 case TRUTH_ORIF_EXPR:
3648 case TRUTH_AND_EXPR:
3649 case TRUTH_OR_EXPR:
3650 case TRUTH_XOR_EXPR:
7e98624c 3651
da5fb469 3652 gcc_unreachable ();
7e98624c 3653
9f509004
RG
3654 case LT_EXPR:
3655 case LE_EXPR:
3656 case GT_EXPR:
3657 case GE_EXPR:
3658 case EQ_EXPR:
3659 case NE_EXPR:
3660 case UNORDERED_EXPR:
3661 case ORDERED_EXPR:
3662 case UNLT_EXPR:
3663 case UNLE_EXPR:
3664 case UNGT_EXPR:
3665 case UNGE_EXPR:
3666 case UNEQ_EXPR:
3667 case LTGT_EXPR:
3668 /* Comparisons are also binary, but the result type is not
3669 connected to the operand types. */
3670 return verify_gimple_comparison (lhs_type, rhs1, rhs2);
7e98624c 3671
587aa063 3672 case WIDEN_MULT_EXPR:
5b58b39b
BS
3673 if (TREE_CODE (lhs_type) != INTEGER_TYPE)
3674 return true;
5dfe80ba 3675 return ((2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type))
5b58b39b
BS
3676 || (TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type)));
3677
3678 case WIDEN_SUM_EXPR:
587aa063
RG
3679 case VEC_WIDEN_MULT_HI_EXPR:
3680 case VEC_WIDEN_MULT_LO_EXPR:
3f30a9a6
RH
3681 case VEC_WIDEN_MULT_EVEN_EXPR:
3682 case VEC_WIDEN_MULT_ODD_EXPR:
587aa063
RG
3683 case VEC_PACK_TRUNC_EXPR:
3684 case VEC_PACK_SAT_EXPR:
3685 case VEC_PACK_FIX_TRUNC_EXPR:
587aa063
RG
3686 /* FIXME. */
3687 return false;
3688
9f509004 3689 case MULT_EXPR:
98449720 3690 case MULT_HIGHPART_EXPR:
9f509004
RG
3691 case TRUNC_DIV_EXPR:
3692 case CEIL_DIV_EXPR:
3693 case FLOOR_DIV_EXPR:
3694 case ROUND_DIV_EXPR:
3695 case TRUNC_MOD_EXPR:
3696 case CEIL_MOD_EXPR:
3697 case FLOOR_MOD_EXPR:
3698 case ROUND_MOD_EXPR:
3699 case RDIV_EXPR:
3700 case EXACT_DIV_EXPR:
3701 case MIN_EXPR:
3702 case MAX_EXPR:
3703 case BIT_IOR_EXPR:
3704 case BIT_XOR_EXPR:
3705 case BIT_AND_EXPR:
9f509004
RG
3706 /* Continue with generic binary expression handling. */
3707 break;
7e98624c 3708
9f509004
RG
3709 default:
3710 gcc_unreachable ();
3711 }
b691d4b0 3712
9f509004
RG
3713 if (!useless_type_conversion_p (lhs_type, rhs1_type)
3714 || !useless_type_conversion_p (lhs_type, rhs2_type))
3715 {
3716 error ("type mismatch in binary expression");
3717 debug_generic_stmt (lhs_type);
3718 debug_generic_stmt (rhs1_type);
3719 debug_generic_stmt (rhs2_type);
3720 return true;
3721 }
3722
3723 return false;
3724}
3725
0354c0c7
BS
3726/* Verify a gimple assignment statement STMT with a ternary rhs.
3727 Returns true if anything is wrong. */
3728
3729static bool
3730verify_gimple_assign_ternary (gimple stmt)
3731{
3732 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3733 tree lhs = gimple_assign_lhs (stmt);
3734 tree lhs_type = TREE_TYPE (lhs);
3735 tree rhs1 = gimple_assign_rhs1 (stmt);
3736 tree rhs1_type = TREE_TYPE (rhs1);
3737 tree rhs2 = gimple_assign_rhs2 (stmt);
3738 tree rhs2_type = TREE_TYPE (rhs2);
3739 tree rhs3 = gimple_assign_rhs3 (stmt);
3740 tree rhs3_type = TREE_TYPE (rhs3);
3741
afdac116 3742 if (!is_gimple_reg (lhs))
0354c0c7
BS
3743 {
3744 error ("non-register as LHS of ternary operation");
3745 return true;
3746 }
3747
4e71066d
RG
3748 if (((rhs_code == VEC_COND_EXPR || rhs_code == COND_EXPR)
3749 ? !is_gimple_condexpr (rhs1) : !is_gimple_val (rhs1))
0354c0c7
BS
3750 || !is_gimple_val (rhs2)
3751 || !is_gimple_val (rhs3))
3752 {
3753 error ("invalid operands in ternary operation");
3754 return true;
3755 }
3756
3757 /* First handle operations that involve different types. */
3758 switch (rhs_code)
3759 {
3760 case WIDEN_MULT_PLUS_EXPR:
3761 case WIDEN_MULT_MINUS_EXPR:
3762 if ((!INTEGRAL_TYPE_P (rhs1_type)
3763 && !FIXED_POINT_TYPE_P (rhs1_type))
3764 || !useless_type_conversion_p (rhs1_type, rhs2_type)
3765 || !useless_type_conversion_p (lhs_type, rhs3_type)
5dfe80ba 3766 || 2 * TYPE_PRECISION (rhs1_type) > TYPE_PRECISION (lhs_type)
0354c0c7
BS
3767 || TYPE_PRECISION (rhs1_type) != TYPE_PRECISION (rhs2_type))
3768 {
3769 error ("type mismatch in widening multiply-accumulate expression");
3770 debug_generic_expr (lhs_type);
3771 debug_generic_expr (rhs1_type);
3772 debug_generic_expr (rhs2_type);
3773 debug_generic_expr (rhs3_type);
3774 return true;
3775 }
3776 break;
3777
16949072
RG
3778 case FMA_EXPR:
3779 if (!useless_type_conversion_p (lhs_type, rhs1_type)
3780 || !useless_type_conversion_p (lhs_type, rhs2_type)
3781 || !useless_type_conversion_p (lhs_type, rhs3_type))
3782 {
3783 error ("type mismatch in fused multiply-add expression");
3784 debug_generic_expr (lhs_type);
3785 debug_generic_expr (rhs1_type);
3786 debug_generic_expr (rhs2_type);
3787 debug_generic_expr (rhs3_type);
3788 return true;
3789 }
3790 break;
3791
4e71066d
RG
3792 case COND_EXPR:
3793 case VEC_COND_EXPR:
3794 if (!useless_type_conversion_p (lhs_type, rhs2_type)
3795 || !useless_type_conversion_p (lhs_type, rhs3_type))
3796 {
3797 error ("type mismatch in conditional expression");
3798 debug_generic_expr (lhs_type);
3799 debug_generic_expr (rhs2_type);
3800 debug_generic_expr (rhs3_type);
3801 return true;
3802 }
3803 break;
3804
2205ed25 3805 case VEC_PERM_EXPR:
f90e8e2e
AS
3806 if (!useless_type_conversion_p (lhs_type, rhs1_type)
3807 || !useless_type_conversion_p (lhs_type, rhs2_type))
3808 {
2205ed25 3809 error ("type mismatch in vector permute expression");
f90e8e2e
AS
3810 debug_generic_expr (lhs_type);
3811 debug_generic_expr (rhs1_type);
3812 debug_generic_expr (rhs2_type);
3813 debug_generic_expr (rhs3_type);
3814 return true;
3815 }
3816
3817 if (TREE_CODE (rhs1_type) != VECTOR_TYPE
3818 || TREE_CODE (rhs2_type) != VECTOR_TYPE
3819 || TREE_CODE (rhs3_type) != VECTOR_TYPE)
3820 {
2205ed25 3821 error ("vector types expected in vector permute expression");
f90e8e2e
AS
3822 debug_generic_expr (lhs_type);
3823 debug_generic_expr (rhs1_type);
3824 debug_generic_expr (rhs2_type);
3825 debug_generic_expr (rhs3_type);
3826 return true;
3827 }
3828
3829 if (TYPE_VECTOR_SUBPARTS (rhs1_type) != TYPE_VECTOR_SUBPARTS (rhs2_type)
3830 || TYPE_VECTOR_SUBPARTS (rhs2_type)
3831 != TYPE_VECTOR_SUBPARTS (rhs3_type)
3832 || TYPE_VECTOR_SUBPARTS (rhs3_type)
3833 != TYPE_VECTOR_SUBPARTS (lhs_type))
3834 {
3835 error ("vectors with different element number found "
2205ed25 3836 "in vector permute expression");
f90e8e2e
AS
3837 debug_generic_expr (lhs_type);
3838 debug_generic_expr (rhs1_type);
3839 debug_generic_expr (rhs2_type);
3840 debug_generic_expr (rhs3_type);
3841 return true;
3842 }
3843
3844 if (TREE_CODE (TREE_TYPE (rhs3_type)) != INTEGER_TYPE
3845 || GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (rhs3_type)))
3846 != GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (rhs1_type))))
3847 {
2205ed25 3848 error ("invalid mask type in vector permute expression");
f90e8e2e
AS
3849 debug_generic_expr (lhs_type);
3850 debug_generic_expr (rhs1_type);
3851 debug_generic_expr (rhs2_type);
3852 debug_generic_expr (rhs3_type);
3853 return true;
3854 }
3855
3856 return false;
3857
f471fe72
RG
3858 case DOT_PROD_EXPR:
3859 case REALIGN_LOAD_EXPR:
3860 /* FIXME. */
3861 return false;
3862
0354c0c7
BS
3863 default:
3864 gcc_unreachable ();
3865 }
3866 return false;
3867}
3868
9f509004
RG
3869/* Verify a gimple assignment statement STMT with a single rhs.
3870 Returns true if anything is wrong. */
3871
3872static bool
3873verify_gimple_assign_single (gimple stmt)
3874{
3875 enum tree_code rhs_code = gimple_assign_rhs_code (stmt);
3876 tree lhs = gimple_assign_lhs (stmt);
3877 tree lhs_type = TREE_TYPE (lhs);
3878 tree rhs1 = gimple_assign_rhs1 (stmt);
3879 tree rhs1_type = TREE_TYPE (rhs1);
3880 bool res = false;
3881
3882 if (!useless_type_conversion_p (lhs_type, rhs1_type))
3883 {
3884 error ("non-trivial conversion at assignment");
3885 debug_generic_expr (lhs_type);
3886 debug_generic_expr (rhs1_type);
3887 return true;
7e98624c
RG
3888 }
3889
5f33a4fc 3890 if (gimple_clobber_p (stmt)
5d751b0c 3891 && !(DECL_P (lhs) || TREE_CODE (lhs) == MEM_REF))
5f33a4fc 3892 {
5d751b0c 3893 error ("non-decl/MEM_REF LHS in clobber statement");
5f33a4fc
RG
3894 debug_generic_expr (lhs);
3895 return true;
3896 }
3897
9f509004 3898 if (handled_component_p (lhs))
3a19701a 3899 res |= verify_types_in_gimple_reference (lhs, true);
9f509004
RG
3900
3901 /* Special codes we cannot handle via their class. */
3902 switch (rhs_code)
7e98624c 3903 {
9f509004
RG
3904 case ADDR_EXPR:
3905 {
3906 tree op = TREE_OPERAND (rhs1, 0);
3907 if (!is_gimple_addressable (op))
3908 {
3909 error ("invalid operand in unary expression");
3910 return true;
3911 }
f5e85907 3912
1b0e3802
RG
3913 /* Technically there is no longer a need for matching types, but
3914 gimple hygiene asks for this check. In LTO we can end up
3915 combining incompatible units and thus end up with addresses
3916 of globals that change their type to a common one. */
3917 if (!in_lto_p
3918 && !types_compatible_p (TREE_TYPE (op),
3919 TREE_TYPE (TREE_TYPE (rhs1)))
6b8b9e42
RG
3920 && !one_pointer_to_useless_type_conversion_p (TREE_TYPE (rhs1),
3921 TREE_TYPE (op)))
9f509004
RG
3922 {
3923 error ("type mismatch in address expression");
6b8b9e42
RG
3924 debug_generic_stmt (TREE_TYPE (rhs1));
3925 debug_generic_stmt (TREE_TYPE (op));
9f509004
RG
3926 return true;
3927 }
3928
3a19701a 3929 return verify_types_in_gimple_reference (op, true);
9f509004
RG
3930 }
3931
3932 /* tcc_reference */
70f34814
RG
3933 case INDIRECT_REF:
3934 error ("INDIRECT_REF in gimple IL");
3935 return true;
3936
9f509004
RG
3937 case COMPONENT_REF:
3938 case BIT_FIELD_REF:
9f509004
RG
3939 case ARRAY_REF:
3940 case ARRAY_RANGE_REF:
3941 case VIEW_CONVERT_EXPR:
3942 case REALPART_EXPR:
3943 case IMAGPART_EXPR:
3944 case TARGET_MEM_REF:
70f34814 3945 case MEM_REF:
9f509004
RG
3946 if (!is_gimple_reg (lhs)
3947 && is_gimple_reg_type (TREE_TYPE (lhs)))
f5e85907 3948 {
9f509004
RG
3949 error ("invalid rhs for gimple memory store");
3950 debug_generic_stmt (lhs);
3951 debug_generic_stmt (rhs1);
726a989a
RB
3952 return true;
3953 }
3a19701a 3954 return res || verify_types_in_gimple_reference (rhs1, false);
7e98624c 3955
9f509004
RG
3956 /* tcc_constant */
3957 case SSA_NAME:
3958 case INTEGER_CST:
3959 case REAL_CST:
3960 case FIXED_CST:
3961 case COMPLEX_CST:
3962 case VECTOR_CST:
3963 case STRING_CST:
3964 return res;
3965
3966 /* tcc_declaration */
3967 case CONST_DECL:
3968 return res;
3969 case VAR_DECL:
3970 case PARM_DECL:
3971 if (!is_gimple_reg (lhs)
3972 && !is_gimple_reg (rhs1)
3973 && is_gimple_reg_type (TREE_TYPE (lhs)))
2f9864e6 3974 {
9f509004
RG
3975 error ("invalid rhs for gimple memory store");
3976 debug_generic_stmt (lhs);
3977 debug_generic_stmt (rhs1);
2f9864e6
RG
3978 return true;
3979 }
9f509004 3980 return res;
7e98624c 3981
9f509004 3982 case CONSTRUCTOR:
13396b6e
JJ
3983 if (TREE_CODE (rhs1_type) == VECTOR_TYPE)
3984 {
3985 unsigned int i;
3986 tree elt_i, elt_v, elt_t = NULL_TREE;
3987
3988 if (CONSTRUCTOR_NELTS (rhs1) == 0)
3989 return res;
3990 /* For vector CONSTRUCTORs we require that either it is empty
3991 CONSTRUCTOR, or it is a CONSTRUCTOR of smaller vector elements
3992 (then the element count must be correct to cover the whole
3993 outer vector and index must be NULL on all elements, or it is
3994 a CONSTRUCTOR of scalar elements, where we as an exception allow
3995 smaller number of elements (assuming zero filling) and
3996 consecutive indexes as compared to NULL indexes (such
3997 CONSTRUCTORs can appear in the IL from FEs). */
3998 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs1), i, elt_i, elt_v)
3999 {
4000 if (elt_t == NULL_TREE)
4001 {
4002 elt_t = TREE_TYPE (elt_v);
4003 if (TREE_CODE (elt_t) == VECTOR_TYPE)
4004 {
4005 tree elt_t = TREE_TYPE (elt_v);
4006 if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
4007 TREE_TYPE (elt_t)))
4008 {
4009 error ("incorrect type of vector CONSTRUCTOR"
4010 " elements");
4011 debug_generic_stmt (rhs1);
4012 return true;
4013 }
4014 else if (CONSTRUCTOR_NELTS (rhs1)
4015 * TYPE_VECTOR_SUBPARTS (elt_t)
4016 != TYPE_VECTOR_SUBPARTS (rhs1_type))
4017 {
4018 error ("incorrect number of vector CONSTRUCTOR"
4019 " elements");
4020 debug_generic_stmt (rhs1);
4021 return true;
4022 }
4023 }
4024 else if (!useless_type_conversion_p (TREE_TYPE (rhs1_type),
4025 elt_t))
4026 {
4027 error ("incorrect type of vector CONSTRUCTOR elements");
4028 debug_generic_stmt (rhs1);
4029 return true;
4030 }
4031 else if (CONSTRUCTOR_NELTS (rhs1)
4032 > TYPE_VECTOR_SUBPARTS (rhs1_type))
4033 {
4034 error ("incorrect number of vector CONSTRUCTOR elements");
4035 debug_generic_stmt (rhs1);
4036 return true;
4037 }
4038 }
4039 else if (!useless_type_conversion_p (elt_t, TREE_TYPE (elt_v)))
4040 {
4041 error ("incorrect type of vector CONSTRUCTOR elements");
4042 debug_generic_stmt (rhs1);
4043 return true;
4044 }
4045 if (elt_i != NULL_TREE
4046 && (TREE_CODE (elt_t) == VECTOR_TYPE
4047 || TREE_CODE (elt_i) != INTEGER_CST
4048 || compare_tree_int (elt_i, i) != 0))
4049 {
4050 error ("vector CONSTRUCTOR with non-NULL element index");
4051 debug_generic_stmt (rhs1);
4052 return true;
4053 }
4054 }
4055 }
4056 return res;
9f509004
RG
4057 case OBJ_TYPE_REF:
4058 case ASSERT_EXPR:
4059 case WITH_SIZE_EXPR:
9f509004
RG
4060 /* FIXME. */
4061 return res;
7e98624c 4062
726a989a 4063 default:;
7e98624c
RG
4064 }
4065
9f509004 4066 return res;
7e98624c
RG
4067}
4068
9f509004
RG
4069/* Verify the contents of a GIMPLE_ASSIGN STMT. Returns true when there
4070 is a problem, otherwise false. */
4071
4072static bool
4073verify_gimple_assign (gimple stmt)
4074{
4075 switch (gimple_assign_rhs_class (stmt))
4076 {
4077 case GIMPLE_SINGLE_RHS:
4078 return verify_gimple_assign_single (stmt);
4079
4080 case GIMPLE_UNARY_RHS:
4081 return verify_gimple_assign_unary (stmt);
4082
4083 case GIMPLE_BINARY_RHS:
4084 return verify_gimple_assign_binary (stmt);
4085
0354c0c7
BS
4086 case GIMPLE_TERNARY_RHS:
4087 return verify_gimple_assign_ternary (stmt);
4088
9f509004
RG
4089 default:
4090 gcc_unreachable ();
4091 }
4092}
726a989a
RB
4093
4094/* Verify the contents of a GIMPLE_RETURN STMT. Returns true when there
4095 is a problem, otherwise false. */
7e98624c
RG
4096
4097static bool
b59d3976 4098verify_gimple_return (gimple stmt)
7e98624c 4099{
726a989a 4100 tree op = gimple_return_retval (stmt);
b59d3976 4101 tree restype = TREE_TYPE (TREE_TYPE (cfun->decl));
726a989a 4102
b59d3976
RG
4103 /* We cannot test for present return values as we do not fix up missing
4104 return values from the original source. */
726a989a
RB
4105 if (op == NULL)
4106 return false;
b8698a0f 4107
b59d3976
RG
4108 if (!is_gimple_val (op)
4109 && TREE_CODE (op) != RESULT_DECL)
4110 {
4111 error ("invalid operand in return statement");
4112 debug_generic_stmt (op);
4113 return true;
4114 }
4115
e3061843
RB
4116 if ((TREE_CODE (op) == RESULT_DECL
4117 && DECL_BY_REFERENCE (op))
4118 || (TREE_CODE (op) == SSA_NAME
70b5e7dc 4119 && SSA_NAME_VAR (op)
e3061843
RB
4120 && TREE_CODE (SSA_NAME_VAR (op)) == RESULT_DECL
4121 && DECL_BY_REFERENCE (SSA_NAME_VAR (op))))
4122 op = TREE_TYPE (op);
4123
4124 if (!useless_type_conversion_p (restype, TREE_TYPE (op)))
b59d3976
RG
4125 {
4126 error ("invalid conversion in return statement");
4127 debug_generic_stmt (restype);
4128 debug_generic_stmt (TREE_TYPE (op));
4129 return true;
4130 }
4131
4132 return false;
726a989a 4133}
7e98624c 4134
7e98624c 4135
b59d3976
RG
4136/* Verify the contents of a GIMPLE_GOTO STMT. Returns true when there
4137 is a problem, otherwise false. */
4138
4139static bool
4140verify_gimple_goto (gimple stmt)
4141{
4142 tree dest = gimple_goto_dest (stmt);
4143
4144 /* ??? We have two canonical forms of direct goto destinations, a
4145 bare LABEL_DECL and an ADDR_EXPR of a LABEL_DECL. */
4146 if (TREE_CODE (dest) != LABEL_DECL
4147 && (!is_gimple_val (dest)
4148 || !POINTER_TYPE_P (TREE_TYPE (dest))))
4149 {
4150 error ("goto destination is neither a label nor a pointer");
4151 return true;
4152 }
4153
4154 return false;
4155}
4156
726a989a
RB
4157/* Verify the contents of a GIMPLE_SWITCH STMT. Returns true when there
4158 is a problem, otherwise false. */
4159
4160static bool
b59d3976 4161verify_gimple_switch (gimple stmt)
726a989a 4162{
198fc9f1
SB
4163 unsigned int i, n;
4164 tree elt, prev_upper_bound = NULL_TREE;
4165 tree index_type, elt_type = NULL_TREE;
4166
726a989a 4167 if (!is_gimple_val (gimple_switch_index (stmt)))
7e98624c 4168 {
726a989a 4169 error ("invalid operand to switch statement");
b59d3976 4170 debug_generic_stmt (gimple_switch_index (stmt));
7e98624c
RG
4171 return true;
4172 }
4173
198fc9f1
SB
4174 index_type = TREE_TYPE (gimple_switch_index (stmt));
4175 if (! INTEGRAL_TYPE_P (index_type))
4176 {
4177 error ("non-integral type switch statement");
4178 debug_generic_expr (index_type);
4179 return true;
4180 }
4181
fd8d363e 4182 elt = gimple_switch_label (stmt, 0);
198fc9f1
SB
4183 if (CASE_LOW (elt) != NULL_TREE || CASE_HIGH (elt) != NULL_TREE)
4184 {
4185 error ("invalid default case label in switch statement");
4186 debug_generic_expr (elt);
4187 return true;
4188 }
4189
4190 n = gimple_switch_num_labels (stmt);
4191 for (i = 1; i < n; i++)
4192 {
4193 elt = gimple_switch_label (stmt, i);
4194
4195 if (! CASE_LOW (elt))
4196 {
4197 error ("invalid case label in switch statement");
4198 debug_generic_expr (elt);
4199 return true;
4200 }
4201 if (CASE_HIGH (elt)
4202 && ! tree_int_cst_lt (CASE_LOW (elt), CASE_HIGH (elt)))
4203 {
4204 error ("invalid case range in switch statement");
4205 debug_generic_expr (elt);
4206 return true;
4207 }
4208
4209 if (elt_type)
4210 {
4211 if (TREE_TYPE (CASE_LOW (elt)) != elt_type
4212 || (CASE_HIGH (elt) && TREE_TYPE (CASE_HIGH (elt)) != elt_type))
4213 {
4214 error ("type mismatch for case label in switch statement");
4215 debug_generic_expr (elt);
4216 return true;
4217 }
4218 }
4219 else
4220 {
4221 elt_type = TREE_TYPE (CASE_LOW (elt));
4222 if (TYPE_PRECISION (index_type) < TYPE_PRECISION (elt_type))
4223 {
4224 error ("type precision mismatch in switch statement");
4225 return true;
4226 }
4227 }
4228
4229 if (prev_upper_bound)
4230 {
4231 if (! tree_int_cst_lt (prev_upper_bound, CASE_LOW (elt)))
4232 {
4233 error ("case labels not sorted in switch statement");
4234 return true;
4235 }
4236 }
4237
4238 prev_upper_bound = CASE_HIGH (elt);
4239 if (! prev_upper_bound)
4240 prev_upper_bound = CASE_LOW (elt);
4241 }
4242
726a989a
RB
4243 return false;
4244}
7e98624c 4245
b5b8b0ac
AO
4246/* Verify a gimple debug statement STMT.
4247 Returns true if anything is wrong. */
4248
4249static bool
4250verify_gimple_debug (gimple stmt ATTRIBUTE_UNUSED)
4251{
4252 /* There isn't much that could be wrong in a gimple debug stmt. A
4253 gimple debug bind stmt, for example, maps a tree, that's usually
4254 a VAR_DECL or a PARM_DECL, but that could also be some scalarized
4255 component or member of an aggregate type, to another tree, that
4256 can be an arbitrary expression. These stmts expand into debug
4257 insns, and are converted to debug notes by var-tracking.c. */
4258 return false;
4259}
4260
34019e28
RG
4261/* Verify a gimple label statement STMT.
4262 Returns true if anything is wrong. */
4263
4264static bool
4265verify_gimple_label (gimple stmt)
4266{
4267 tree decl = gimple_label_label (stmt);
4268 int uid;
4269 bool err = false;
4270
4271 if (TREE_CODE (decl) != LABEL_DECL)
4272 return true;
5e581212
JH
4273 if (!DECL_NONLOCAL (decl) && !FORCED_LABEL (decl)
4274 && DECL_CONTEXT (decl) != current_function_decl)
4275 {
4276 error ("label's context is not the current function decl");
4277 err |= true;
4278 }
34019e28
RG
4279
4280 uid = LABEL_DECL_UID (decl);
4281 if (cfun->cfg
9771b263 4282 && (uid == -1 || (*label_to_block_map)[uid] != gimple_bb (stmt)))
34019e28
RG
4283 {
4284 error ("incorrect entry in label_to_block_map");
4285 err |= true;
4286 }
4287
4288 uid = EH_LANDING_PAD_NR (decl);
4289 if (uid)
4290 {
4291 eh_landing_pad lp = get_eh_landing_pad_from_number (uid);
4292 if (decl != lp->post_landing_pad)
4293 {
4294 error ("incorrect setting of landing pad number");
4295 err |= true;
4296 }
4297 }
4298
4299 return err;
4300}
b5b8b0ac 4301
7e98624c
RG
4302/* Verify the GIMPLE statement STMT. Returns true if there is an
4303 error, otherwise false. */
4304
4305static bool
34019e28 4306verify_gimple_stmt (gimple stmt)
7e98624c 4307{
726a989a 4308 switch (gimple_code (stmt))
7e98624c 4309 {
726a989a 4310 case GIMPLE_ASSIGN:
9f509004 4311 return verify_gimple_assign (stmt);
7e98624c 4312
726a989a 4313 case GIMPLE_LABEL:
34019e28 4314 return verify_gimple_label (stmt);
7e98624c 4315
726a989a 4316 case GIMPLE_CALL:
b59d3976 4317 return verify_gimple_call (stmt);
7e98624c 4318
726a989a 4319 case GIMPLE_COND:
f68a75df
RG
4320 if (TREE_CODE_CLASS (gimple_cond_code (stmt)) != tcc_comparison)
4321 {
4322 error ("invalid comparison code in gimple cond");
4323 return true;
4324 }
4325 if (!(!gimple_cond_true_label (stmt)
4326 || TREE_CODE (gimple_cond_true_label (stmt)) == LABEL_DECL)
4327 || !(!gimple_cond_false_label (stmt)
4328 || TREE_CODE (gimple_cond_false_label (stmt)) == LABEL_DECL))
4329 {
4330 error ("invalid labels in gimple cond");
4331 return true;
4332 }
4333
b59d3976
RG
4334 return verify_gimple_comparison (boolean_type_node,
4335 gimple_cond_lhs (stmt),
4336 gimple_cond_rhs (stmt));
7e98624c 4337
726a989a 4338 case GIMPLE_GOTO:
b59d3976 4339 return verify_gimple_goto (stmt);
7e98624c 4340
726a989a 4341 case GIMPLE_SWITCH:
b59d3976 4342 return verify_gimple_switch (stmt);
7e98624c 4343
726a989a 4344 case GIMPLE_RETURN:
b59d3976 4345 return verify_gimple_return (stmt);
7e98624c 4346
726a989a 4347 case GIMPLE_ASM:
7e98624c
RG
4348 return false;
4349
0a35513e
AH
4350 case GIMPLE_TRANSACTION:
4351 return verify_gimple_transaction (stmt);
4352
b59d3976
RG
4353 /* Tuples that do not have tree operands. */
4354 case GIMPLE_NOP:
b59d3976 4355 case GIMPLE_PREDICT:
1d65f45c
RH
4356 case GIMPLE_RESX:
4357 case GIMPLE_EH_DISPATCH:
40742b42 4358 case GIMPLE_EH_MUST_NOT_THROW:
b59d3976 4359 return false;
726a989a 4360
8b9db065
RH
4361 CASE_GIMPLE_OMP:
4362 /* OpenMP directives are validated by the FE and never operated
4363 on by the optimizers. Furthermore, GIMPLE_OMP_FOR may contain
4364 non-gimple expressions when the main index variable has had
4365 its address taken. This does not affect the loop itself
4366 because the header of an GIMPLE_OMP_FOR is merely used to determine
4367 how to setup the parallel iteration. */
4368 return false;
4369
b5b8b0ac
AO
4370 case GIMPLE_DEBUG:
4371 return verify_gimple_debug (stmt);
4372
7e98624c
RG
4373 default:
4374 gcc_unreachable ();
4375 }
4376}
4377
34019e28
RG
4378/* Verify the contents of a GIMPLE_PHI. Returns true if there is a problem,
4379 and false otherwise. */
4380
4381static bool
4382verify_gimple_phi (gimple phi)
4383{
4384 bool err = false;
4385 unsigned i;
4386 tree phi_result = gimple_phi_result (phi);
4387 bool virtual_p;
4388
4389 if (!phi_result)
4390 {
4391 error ("invalid PHI result");
4392 return true;
4393 }
4394
ea057359 4395 virtual_p = virtual_operand_p (phi_result);
34019e28
RG
4396 if (TREE_CODE (phi_result) != SSA_NAME
4397 || (virtual_p
4398 && SSA_NAME_VAR (phi_result) != gimple_vop (cfun)))
4399 {
4400 error ("invalid PHI result");
4401 err = true;
4402 }
4403
4404 for (i = 0; i < gimple_phi_num_args (phi); i++)
4405 {
4406 tree t = gimple_phi_arg_def (phi, i);
4407
4408 if (!t)
4409 {
4410 error ("missing PHI def");
4411 err |= true;
4412 continue;
4413 }
4414 /* Addressable variables do have SSA_NAMEs but they
4415 are not considered gimple values. */
4416 else if ((TREE_CODE (t) == SSA_NAME
ea057359 4417 && virtual_p != virtual_operand_p (t))
34019e28
RG
4418 || (virtual_p
4419 && (TREE_CODE (t) != SSA_NAME
4420 || SSA_NAME_VAR (t) != gimple_vop (cfun)))
4421 || (!virtual_p
4422 && !is_gimple_val (t)))
4423 {
4424 error ("invalid PHI argument");
4425 debug_generic_expr (t);
4426 err |= true;
4427 }
4428#ifdef ENABLE_TYPES_CHECKING
4429 if (!useless_type_conversion_p (TREE_TYPE (phi_result), TREE_TYPE (t)))
4430 {
4431 error ("incompatible types in PHI argument %u", i);
4432 debug_generic_stmt (TREE_TYPE (phi_result));
4433 debug_generic_stmt (TREE_TYPE (t));
4434 err |= true;
4435 }
4436#endif
4437 }
4438
4439 return err;
4440}
4441
726a989a 4442/* Verify the GIMPLE statements inside the sequence STMTS. */
7e98624c 4443
7dc83ebc 4444static bool
34019e28 4445verify_gimple_in_seq_2 (gimple_seq stmts)
7e98624c 4446{
726a989a 4447 gimple_stmt_iterator ittr;
7dc83ebc 4448 bool err = false;
7e98624c 4449
726a989a 4450 for (ittr = gsi_start (stmts); !gsi_end_p (ittr); gsi_next (&ittr))
7e98624c 4451 {
726a989a 4452 gimple stmt = gsi_stmt (ittr);
7e98624c 4453
726a989a
RB
4454 switch (gimple_code (stmt))
4455 {
b59d3976 4456 case GIMPLE_BIND:
34019e28 4457 err |= verify_gimple_in_seq_2 (gimple_bind_body (stmt));
b59d3976
RG
4458 break;
4459
4460 case GIMPLE_TRY:
34019e28
RG
4461 err |= verify_gimple_in_seq_2 (gimple_try_eval (stmt));
4462 err |= verify_gimple_in_seq_2 (gimple_try_cleanup (stmt));
b59d3976
RG
4463 break;
4464
4465 case GIMPLE_EH_FILTER:
34019e28 4466 err |= verify_gimple_in_seq_2 (gimple_eh_filter_failure (stmt));
b59d3976
RG
4467 break;
4468
0a35513e
AH
4469 case GIMPLE_EH_ELSE:
4470 err |= verify_gimple_in_seq_2 (gimple_eh_else_n_body (stmt));
4471 err |= verify_gimple_in_seq_2 (gimple_eh_else_e_body (stmt));
4472 break;
4473
b59d3976 4474 case GIMPLE_CATCH:
34019e28 4475 err |= verify_gimple_in_seq_2 (gimple_catch_handler (stmt));
b59d3976 4476 break;
7e98624c 4477
0a35513e
AH
4478 case GIMPLE_TRANSACTION:
4479 err |= verify_gimple_transaction (stmt);
4480 break;
4481
7e98624c 4482 default:
7dc83ebc 4483 {
34019e28 4484 bool err2 = verify_gimple_stmt (stmt);
7dc83ebc 4485 if (err2)
726a989a 4486 debug_gimple_stmt (stmt);
7dc83ebc
RG
4487 err |= err2;
4488 }
7e98624c
RG
4489 }
4490 }
7dc83ebc
RG
4491
4492 return err;
4493}
4494
0a35513e
AH
4495/* Verify the contents of a GIMPLE_TRANSACTION. Returns true if there
4496 is a problem, otherwise false. */
4497
4498static bool
4499verify_gimple_transaction (gimple stmt)
4500{
4501 tree lab = gimple_transaction_label (stmt);
4502 if (lab != NULL && TREE_CODE (lab) != LABEL_DECL)
4503 return true;
4504 return verify_gimple_in_seq_2 (gimple_transaction_body (stmt));
4505}
4506
7dc83ebc
RG
4507
4508/* Verify the GIMPLE statements inside the statement list STMTS. */
4509
34019e28
RG
4510DEBUG_FUNCTION void
4511verify_gimple_in_seq (gimple_seq stmts)
7dc83ebc 4512{
34019e28
RG
4513 timevar_push (TV_TREE_STMT_VERIFY);
4514 if (verify_gimple_in_seq_2 (stmts))
7dc83ebc 4515 internal_error ("verify_gimple failed");
34019e28 4516 timevar_pop (TV_TREE_STMT_VERIFY);
7e98624c
RG
4517}
4518
6de9cd9a
DN
4519/* Return true when the T can be shared. */
4520
c1bf2a39 4521static bool
6de9cd9a
DN
4522tree_node_can_be_shared (tree t)
4523{
6615c446 4524 if (IS_TYPE_OR_DECL_P (t)
6de9cd9a 4525 || is_gimple_min_invariant (t)
5e23162d 4526 || TREE_CODE (t) == SSA_NAME
953ff289
DN
4527 || t == error_mark_node
4528 || TREE_CODE (t) == IDENTIFIER_NODE)
6de9cd9a
DN
4529 return true;
4530
92b6dff3
JL
4531 if (TREE_CODE (t) == CASE_LABEL_EXPR)
4532 return true;
4533
6de9cd9a
DN
4534 if (DECL_P (t))
4535 return true;
4536
4537 return false;
4538}
4539
980d0812 4540/* Called via walk_tree. Verify tree sharing. */
6de9cd9a
DN
4541
4542static tree
980d0812 4543verify_node_sharing_1 (tree *tp, int *walk_subtrees, void *data)
6de9cd9a 4544{
980d0812 4545 struct pointer_set_t *visited = (struct pointer_set_t *) data;
6de9cd9a
DN
4546
4547 if (tree_node_can_be_shared (*tp))
4548 {
4549 *walk_subtrees = false;
4550 return NULL;
4551 }
4552
4437b50d
JH
4553 if (pointer_set_insert (visited, *tp))
4554 return *tp;
6de9cd9a
DN
4555
4556 return NULL;
4557}
4558
980d0812
RB
4559/* Called via walk_gimple_stmt. Verify tree sharing. */
4560
4561static tree
4562verify_node_sharing (tree *tp, int *walk_subtrees, void *data)
4563{
4564 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4565 return verify_node_sharing_1 (tp, walk_subtrees, wi->info);
4566}
4567
4437b50d
JH
4568static bool eh_error_found;
4569static int
4570verify_eh_throw_stmt_node (void **slot, void *data)
4571{
4572 struct throw_stmt_node *node = (struct throw_stmt_node *)*slot;
4573 struct pointer_set_t *visited = (struct pointer_set_t *) data;
4574
4575 if (!pointer_set_contains (visited, node->stmt))
4576 {
d8a07487 4577 error ("dead STMT in EH table");
726a989a 4578 debug_gimple_stmt (node->stmt);
4437b50d
JH
4579 eh_error_found = true;
4580 }
c13edb67 4581 return 1;
4437b50d
JH
4582}
4583
7bb01996
RB
4584/* Verify if the location LOCs block is in BLOCKS. */
4585
4586static bool
4587verify_location (pointer_set_t *blocks, location_t loc)
4588{
4589 tree block = LOCATION_BLOCK (loc);
4590 if (block != NULL_TREE
4591 && !pointer_set_contains (blocks, block))
4592 {
4593 error ("location references block not in block tree");
4594 return true;
4595 }
a9d5a059
RB
4596 if (block != NULL_TREE)
4597 return verify_location (blocks, BLOCK_SOURCE_LOCATION (block));
7bb01996
RB
4598 return false;
4599}
4600
50d4421c
RB
4601/* Called via walk_tree. Verify that expressions have no blocks. */
4602
4603static tree
4604verify_expr_no_block (tree *tp, int *walk_subtrees, void *)
4605{
4606 if (!EXPR_P (*tp))
4607 {
4608 *walk_subtrees = false;
4609 return NULL;
4610 }
4611
4612 location_t loc = EXPR_LOCATION (*tp);
4613 if (LOCATION_BLOCK (loc) != NULL)
4614 return *tp;
4615
4616 return NULL;
4617}
4618
7bb01996
RB
4619/* Called via walk_tree. Verify locations of expressions. */
4620
4621static tree
4622verify_expr_location_1 (tree *tp, int *walk_subtrees, void *data)
4623{
4624 struct pointer_set_t *blocks = (struct pointer_set_t *) data;
4625
64366d35 4626 if (TREE_CODE (*tp) == VAR_DECL
839b422f 4627 && DECL_HAS_DEBUG_EXPR_P (*tp))
64366d35
RB
4628 {
4629 tree t = DECL_DEBUG_EXPR (*tp);
50d4421c
RB
4630 tree addr = walk_tree (&t, verify_expr_no_block, NULL, NULL);
4631 if (addr)
4632 return addr;
4633 }
4634 if ((TREE_CODE (*tp) == VAR_DECL
4635 || TREE_CODE (*tp) == PARM_DECL
4636 || TREE_CODE (*tp) == RESULT_DECL)
4637 && DECL_HAS_VALUE_EXPR_P (*tp))
4638 {
4639 tree t = DECL_VALUE_EXPR (*tp);
4640 tree addr = walk_tree (&t, verify_expr_no_block, NULL, NULL);
64366d35
RB
4641 if (addr)
4642 return addr;
4643 }
4644
7bb01996
RB
4645 if (!EXPR_P (*tp))
4646 {
4647 *walk_subtrees = false;
4648 return NULL;
4649 }
4650
4651 location_t loc = EXPR_LOCATION (*tp);
4652 if (verify_location (blocks, loc))
4653 return *tp;
4654
4655 return NULL;
4656}
4657
4658/* Called via walk_gimple_op. Verify locations of expressions. */
4659
4660static tree
4661verify_expr_location (tree *tp, int *walk_subtrees, void *data)
4662{
4663 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
4664 return verify_expr_location_1 (tp, walk_subtrees, wi->info);
4665}
4666
4667/* Insert all subblocks of BLOCK into BLOCKS and recurse. */
4668
4669static void
4670collect_subblocks (pointer_set_t *blocks, tree block)
4671{
4672 tree t;
4673 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
4674 {
4675 pointer_set_insert (blocks, t);
4676 collect_subblocks (blocks, t);
4677 }
4678}
4679
34019e28 4680/* Verify the GIMPLE statements in the CFG of FN. */
6de9cd9a 4681
24e47c76 4682DEBUG_FUNCTION void
34019e28 4683verify_gimple_in_cfg (struct function *fn)
6de9cd9a
DN
4684{
4685 basic_block bb;
6de9cd9a 4686 bool err = false;
7bb01996 4687 struct pointer_set_t *visited, *visited_stmts, *blocks;
6de9cd9a
DN
4688
4689 timevar_push (TV_TREE_STMT_VERIFY);
4437b50d
JH
4690 visited = pointer_set_create ();
4691 visited_stmts = pointer_set_create ();
6de9cd9a 4692
7bb01996
RB
4693 /* Collect all BLOCKs referenced by the BLOCK tree of FN. */
4694 blocks = pointer_set_create ();
4695 if (DECL_INITIAL (fn->decl))
4696 {
4697 pointer_set_insert (blocks, DECL_INITIAL (fn->decl));
4698 collect_subblocks (blocks, DECL_INITIAL (fn->decl));
4699 }
4700
34019e28 4701 FOR_EACH_BB_FN (bb, fn)
6de9cd9a 4702 {
34019e28 4703 gimple_stmt_iterator gsi;
6de9cd9a 4704
726a989a 4705 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4706 {
34019e28
RG
4707 gimple phi = gsi_stmt (gsi);
4708 bool err2 = false;
4709 unsigned i;
4710
4437b50d 4711 pointer_set_insert (visited_stmts, phi);
34019e28 4712
726a989a 4713 if (gimple_bb (phi) != bb)
8de1fc1b 4714 {
726a989a 4715 error ("gimple_bb (phi) is set to a wrong basic block");
34019e28 4716 err2 = true;
8de1fc1b
KH
4717 }
4718
34019e28
RG
4719 err2 |= verify_gimple_phi (phi);
4720
7bb01996
RB
4721 /* Only PHI arguments have locations. */
4722 if (gimple_location (phi) != UNKNOWN_LOCATION)
4723 {
4724 error ("PHI node with location");
4725 err2 = true;
4726 }
4727
726a989a 4728 for (i = 0; i < gimple_phi_num_args (phi); i++)
6de9cd9a 4729 {
34019e28 4730 tree arg = gimple_phi_arg_def (phi, i);
980d0812
RB
4731 tree addr = walk_tree (&arg, verify_node_sharing_1,
4732 visited, NULL);
6de9cd9a
DN
4733 if (addr)
4734 {
ab532386 4735 error ("incorrect sharing of tree nodes");
726a989a 4736 debug_generic_expr (addr);
34019e28 4737 err2 |= true;
6de9cd9a 4738 }
7bb01996
RB
4739 location_t loc = gimple_phi_arg_location (phi, i);
4740 if (virtual_operand_p (gimple_phi_result (phi))
4741 && loc != UNKNOWN_LOCATION)
4742 {
4743 error ("virtual PHI with argument locations");
4744 err2 = true;
4745 }
4746 addr = walk_tree (&arg, verify_expr_location_1, blocks, NULL);
4747 if (addr)
4748 {
4749 debug_generic_expr (addr);
4750 err2 = true;
4751 }
4752 err2 |= verify_location (blocks, loc);
6de9cd9a 4753 }
211ca15c 4754
34019e28
RG
4755 if (err2)
4756 debug_gimple_stmt (phi);
4757 err |= err2;
6de9cd9a
DN
4758 }
4759
34019e28 4760 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4761 {
726a989a 4762 gimple stmt = gsi_stmt (gsi);
34019e28
RG
4763 bool err2 = false;
4764 struct walk_stmt_info wi;
4765 tree addr;
4766 int lp_nr;
8de1fc1b 4767
4437b50d 4768 pointer_set_insert (visited_stmts, stmt);
07beea0d 4769
726a989a 4770 if (gimple_bb (stmt) != bb)
8de1fc1b 4771 {
726a989a 4772 error ("gimple_bb (stmt) is set to a wrong basic block");
34019e28 4773 err2 = true;
8de1fc1b
KH
4774 }
4775
34019e28 4776 err2 |= verify_gimple_stmt (stmt);
7bb01996 4777 err2 |= verify_location (blocks, gimple_location (stmt));
34019e28
RG
4778
4779 memset (&wi, 0, sizeof (wi));
4780 wi.info = (void *) visited;
4781 addr = walk_gimple_op (stmt, verify_node_sharing, &wi);
4782 if (addr)
726a989a 4783 {
34019e28
RG
4784 error ("incorrect sharing of tree nodes");
4785 debug_generic_expr (addr);
4786 err2 |= true;
4787 }
726a989a 4788
7bb01996
RB
4789 memset (&wi, 0, sizeof (wi));
4790 wi.info = (void *) blocks;
4791 addr = walk_gimple_op (stmt, verify_expr_location, &wi);
4792 if (addr)
4793 {
4794 debug_generic_expr (addr);
4795 err2 |= true;
4796 }
4797
34019e28
RG
4798 /* ??? Instead of not checking these stmts at all the walker
4799 should know its context via wi. */
4800 if (!is_gimple_debug (stmt)
4801 && !is_gimple_omp (stmt))
4802 {
4803 memset (&wi, 0, sizeof (wi));
4804 addr = walk_gimple_op (stmt, verify_expr, &wi);
4805 if (addr)
726a989a 4806 {
34019e28
RG
4807 debug_generic_expr (addr);
4808 inform (gimple_location (stmt), "in statement");
4809 err2 |= true;
726a989a 4810 }
34019e28 4811 }
1d65f45c 4812
34019e28
RG
4813 /* If the statement is marked as part of an EH region, then it is
4814 expected that the statement could throw. Verify that when we
4815 have optimizations that simplify statements such that we prove
4816 that they cannot throw, that we update other data structures
4817 to match. */
4818 lp_nr = lookup_stmt_eh_lp (stmt);
4819 if (lp_nr != 0)
4820 {
4821 if (!stmt_could_throw_p (stmt))
1d65f45c 4822 {
34019e28
RG
4823 error ("statement marked for throw, but doesn%'t");
4824 err2 |= true;
4825 }
4826 else if (lp_nr > 0
4827 && !gsi_one_before_end_p (gsi)
4828 && stmt_can_throw_internal (stmt))
4829 {
4830 error ("statement marked for throw in middle of block");
4831 err2 |= true;
1d65f45c 4832 }
726a989a
RB
4833 }
4834
34019e28
RG
4835 if (err2)
4836 debug_gimple_stmt (stmt);
4837 err |= err2;
6de9cd9a
DN
4838 }
4839 }
726a989a 4840
4437b50d
JH
4841 eh_error_found = false;
4842 if (get_eh_throw_stmt_table (cfun))
4843 htab_traverse (get_eh_throw_stmt_table (cfun),
4844 verify_eh_throw_stmt_node,
4845 visited_stmts);
6de9cd9a 4846
34019e28
RG
4847 if (err || eh_error_found)
4848 internal_error ("verify_gimple failed");
6de9cd9a 4849
4437b50d
JH
4850 pointer_set_destroy (visited);
4851 pointer_set_destroy (visited_stmts);
7bb01996 4852 pointer_set_destroy (blocks);
6946b3f7 4853 verify_histograms ();
6de9cd9a
DN
4854 timevar_pop (TV_TREE_STMT_VERIFY);
4855}
4856
4857
4858/* Verifies that the flow information is OK. */
4859
4860static int
726a989a 4861gimple_verify_flow_info (void)
6de9cd9a
DN
4862{
4863 int err = 0;
4864 basic_block bb;
726a989a
RB
4865 gimple_stmt_iterator gsi;
4866 gimple stmt;
6de9cd9a 4867 edge e;
628f6a4e 4868 edge_iterator ei;
6de9cd9a 4869
fefa31b5
DM
4870 if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->il.gimple.seq
4871 || ENTRY_BLOCK_PTR_FOR_FN (cfun)->il.gimple.phi_nodes)
6de9cd9a 4872 {
7506e1cb 4873 error ("ENTRY_BLOCK has IL associated with it");
6de9cd9a
DN
4874 err = 1;
4875 }
4876
fefa31b5
DM
4877 if (EXIT_BLOCK_PTR_FOR_FN (cfun)->il.gimple.seq
4878 || EXIT_BLOCK_PTR_FOR_FN (cfun)->il.gimple.phi_nodes)
6de9cd9a 4879 {
7506e1cb 4880 error ("EXIT_BLOCK has IL associated with it");
6de9cd9a
DN
4881 err = 1;
4882 }
4883
fefa31b5 4884 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
6de9cd9a
DN
4885 if (e->flags & EDGE_FALLTHRU)
4886 {
ab532386 4887 error ("fallthru to exit from bb %d", e->src->index);
6de9cd9a
DN
4888 err = 1;
4889 }
4890
4891 FOR_EACH_BB (bb)
4892 {
4893 bool found_ctrl_stmt = false;
4894
726a989a 4895 stmt = NULL;
548414c6 4896
6de9cd9a 4897 /* Skip labels on the start of basic block. */
726a989a 4898 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4899 {
726a989a
RB
4900 tree label;
4901 gimple prev_stmt = stmt;
548414c6 4902
726a989a 4903 stmt = gsi_stmt (gsi);
548414c6 4904
726a989a 4905 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a
DN
4906 break;
4907
726a989a
RB
4908 label = gimple_label_label (stmt);
4909 if (prev_stmt && DECL_NONLOCAL (label))
548414c6 4910 {
953ff289 4911 error ("nonlocal label ");
726a989a 4912 print_generic_expr (stderr, label, 0);
953ff289
DN
4913 fprintf (stderr, " is not first in a sequence of labels in bb %d",
4914 bb->index);
548414c6
KH
4915 err = 1;
4916 }
4917
1197e789
RG
4918 if (prev_stmt && EH_LANDING_PAD_NR (label) != 0)
4919 {
4920 error ("EH landing pad label ");
4921 print_generic_expr (stderr, label, 0);
4922 fprintf (stderr, " is not first in a sequence of labels in bb %d",
4923 bb->index);
4924 err = 1;
4925 }
4926
726a989a 4927 if (label_to_block (label) != bb)
6de9cd9a 4928 {
953ff289 4929 error ("label ");
726a989a 4930 print_generic_expr (stderr, label, 0);
953ff289
DN
4931 fprintf (stderr, " to block does not match in bb %d",
4932 bb->index);
6de9cd9a
DN
4933 err = 1;
4934 }
4935
726a989a 4936 if (decl_function_context (label) != current_function_decl)
6de9cd9a 4937 {
953ff289 4938 error ("label ");
726a989a 4939 print_generic_expr (stderr, label, 0);
953ff289
DN
4940 fprintf (stderr, " has incorrect context in bb %d",
4941 bb->index);
6de9cd9a
DN
4942 err = 1;
4943 }
4944 }
4945
4946 /* Verify that body of basic block BB is free of control flow. */
726a989a 4947 for (; !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 4948 {
726a989a 4949 gimple stmt = gsi_stmt (gsi);
6de9cd9a
DN
4950
4951 if (found_ctrl_stmt)
4952 {
ab532386 4953 error ("control flow in the middle of basic block %d",
6de9cd9a
DN
4954 bb->index);
4955 err = 1;
4956 }
4957
4958 if (stmt_ends_bb_p (stmt))
4959 found_ctrl_stmt = true;
4960
726a989a 4961 if (gimple_code (stmt) == GIMPLE_LABEL)
6de9cd9a 4962 {
953ff289 4963 error ("label ");
726a989a 4964 print_generic_expr (stderr, gimple_label_label (stmt), 0);
953ff289 4965 fprintf (stderr, " in the middle of basic block %d", bb->index);
6de9cd9a
DN
4966 err = 1;
4967 }
4968 }
953ff289 4969
726a989a
RB
4970 gsi = gsi_last_bb (bb);
4971 if (gsi_end_p (gsi))
6de9cd9a
DN
4972 continue;
4973
726a989a 4974 stmt = gsi_stmt (gsi);
6de9cd9a 4975
1d65f45c
RH
4976 if (gimple_code (stmt) == GIMPLE_LABEL)
4977 continue;
4978
cc7220fd
JH
4979 err |= verify_eh_edges (stmt);
4980
6de9cd9a
DN
4981 if (is_ctrl_stmt (stmt))
4982 {
628f6a4e 4983 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
4984 if (e->flags & EDGE_FALLTHRU)
4985 {
ab532386 4986 error ("fallthru edge after a control statement in bb %d",
6de9cd9a
DN
4987 bb->index);
4988 err = 1;
4989 }
4990 }
4991
726a989a 4992 if (gimple_code (stmt) != GIMPLE_COND)
36b24193
ZD
4993 {
4994 /* Verify that there are no edges with EDGE_TRUE/FALSE_FLAG set
4995 after anything else but if statement. */
4996 FOR_EACH_EDGE (e, ei, bb->succs)
4997 if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE))
4998 {
726a989a 4999 error ("true/false edge after a non-GIMPLE_COND in bb %d",
36b24193
ZD
5000 bb->index);
5001 err = 1;
5002 }
5003 }
5004
726a989a 5005 switch (gimple_code (stmt))
6de9cd9a 5006 {
726a989a 5007 case GIMPLE_COND:
6de9cd9a
DN
5008 {
5009 edge true_edge;
5010 edge false_edge;
b8698a0f 5011
6de9cd9a
DN
5012 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
5013
726a989a
RB
5014 if (!true_edge
5015 || !false_edge
6de9cd9a
DN
5016 || !(true_edge->flags & EDGE_TRUE_VALUE)
5017 || !(false_edge->flags & EDGE_FALSE_VALUE)
5018 || (true_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
5019 || (false_edge->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL))
628f6a4e 5020 || EDGE_COUNT (bb->succs) >= 3)
6de9cd9a 5021 {
ab532386 5022 error ("wrong outgoing edge flags at end of bb %d",
6de9cd9a
DN
5023 bb->index);
5024 err = 1;
5025 }
6de9cd9a
DN
5026 }
5027 break;
5028
726a989a 5029 case GIMPLE_GOTO:
6de9cd9a
DN
5030 if (simple_goto_p (stmt))
5031 {
ab532386 5032 error ("explicit goto at end of bb %d", bb->index);
6531d1be 5033 err = 1;
6de9cd9a
DN
5034 }
5035 else
5036 {
6531d1be 5037 /* FIXME. We should double check that the labels in the
6de9cd9a 5038 destination blocks have their address taken. */
628f6a4e 5039 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
5040 if ((e->flags & (EDGE_FALLTHRU | EDGE_TRUE_VALUE
5041 | EDGE_FALSE_VALUE))
5042 || !(e->flags & EDGE_ABNORMAL))
5043 {
ab532386 5044 error ("wrong outgoing edge flags at end of bb %d",
6de9cd9a
DN
5045 bb->index);
5046 err = 1;
5047 }
5048 }
5049 break;
5050
c54c785d
JH
5051 case GIMPLE_CALL:
5052 if (!gimple_call_builtin_p (stmt, BUILT_IN_RETURN))
5053 break;
5054 /* ... fallthru ... */
726a989a 5055 case GIMPLE_RETURN:
c5cbcccf
ZD
5056 if (!single_succ_p (bb)
5057 || (single_succ_edge (bb)->flags
5058 & (EDGE_FALLTHRU | EDGE_ABNORMAL
5059 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
6de9cd9a 5060 {
ab532386 5061 error ("wrong outgoing edge flags at end of bb %d", bb->index);
6de9cd9a
DN
5062 err = 1;
5063 }
fefa31b5 5064 if (single_succ (bb) != EXIT_BLOCK_PTR_FOR_FN (cfun))
6de9cd9a 5065 {
ab532386 5066 error ("return edge does not point to exit in bb %d",
6de9cd9a
DN
5067 bb->index);
5068 err = 1;
5069 }
5070 break;
5071
726a989a 5072 case GIMPLE_SWITCH:
6de9cd9a 5073 {
7853504d 5074 tree prev;
6de9cd9a
DN
5075 edge e;
5076 size_t i, n;
6de9cd9a 5077
726a989a 5078 n = gimple_switch_num_labels (stmt);
6de9cd9a
DN
5079
5080 /* Mark all the destination basic blocks. */
5081 for (i = 0; i < n; ++i)
5082 {
726a989a 5083 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
6de9cd9a 5084 basic_block label_bb = label_to_block (lab);
1e128c5f 5085 gcc_assert (!label_bb->aux || label_bb->aux == (void *)1);
6de9cd9a
DN
5086 label_bb->aux = (void *)1;
5087 }
5088
7853504d 5089 /* Verify that the case labels are sorted. */
726a989a 5090 prev = gimple_switch_label (stmt, 0);
b7814a18 5091 for (i = 1; i < n; ++i)
7853504d 5092 {
726a989a
RB
5093 tree c = gimple_switch_label (stmt, i);
5094 if (!CASE_LOW (c))
7853504d 5095 {
726a989a
RB
5096 error ("found default case not at the start of "
5097 "case vector");
5098 err = 1;
7853504d
SB
5099 continue;
5100 }
726a989a
RB
5101 if (CASE_LOW (prev)
5102 && !tree_int_cst_lt (CASE_LOW (prev), CASE_LOW (c)))
7853504d 5103 {
953ff289 5104 error ("case labels not sorted: ");
7853504d
SB
5105 print_generic_expr (stderr, prev, 0);
5106 fprintf (stderr," is greater than ");
5107 print_generic_expr (stderr, c, 0);
5108 fprintf (stderr," but comes before it.\n");
5109 err = 1;
5110 }
5111 prev = c;
5112 }
b7814a18
RG
5113 /* VRP will remove the default case if it can prove it will
5114 never be executed. So do not verify there always exists
5115 a default case here. */
7853504d 5116
628f6a4e 5117 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
5118 {
5119 if (!e->dest->aux)
5120 {
ab532386 5121 error ("extra outgoing edge %d->%d",
6de9cd9a
DN
5122 bb->index, e->dest->index);
5123 err = 1;
5124 }
726a989a 5125
6de9cd9a
DN
5126 e->dest->aux = (void *)2;
5127 if ((e->flags & (EDGE_FALLTHRU | EDGE_ABNORMAL
5128 | EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)))
5129 {
ab532386 5130 error ("wrong outgoing edge flags at end of bb %d",
6de9cd9a
DN
5131 bb->index);
5132 err = 1;
5133 }
5134 }
5135
5136 /* Check that we have all of them. */
5137 for (i = 0; i < n; ++i)
5138 {
726a989a 5139 tree lab = CASE_LABEL (gimple_switch_label (stmt, i));
6de9cd9a
DN
5140 basic_block label_bb = label_to_block (lab);
5141
5142 if (label_bb->aux != (void *)2)
5143 {
726a989a 5144 error ("missing edge %i->%i", bb->index, label_bb->index);
6de9cd9a
DN
5145 err = 1;
5146 }
5147 }
5148
628f6a4e 5149 FOR_EACH_EDGE (e, ei, bb->succs)
6de9cd9a
DN
5150 e->dest->aux = (void *)0;
5151 }
1d65f45c
RH
5152 break;
5153
5154 case GIMPLE_EH_DISPATCH:
5155 err |= verify_eh_dispatch_edge (stmt);
5156 break;
6de9cd9a 5157
1d65f45c
RH
5158 default:
5159 break;
6de9cd9a
DN
5160 }
5161 }
5162
2b28c07a 5163 if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
6de9cd9a
DN
5164 verify_dominators (CDI_DOMINATORS);
5165
5166 return err;
5167}
5168
5169
f0b698c1 5170/* Updates phi nodes after creating a forwarder block joined
6de9cd9a
DN
5171 by edge FALLTHRU. */
5172
5173static void
726a989a 5174gimple_make_forwarder_block (edge fallthru)
6de9cd9a
DN
5175{
5176 edge e;
628f6a4e 5177 edge_iterator ei;
6de9cd9a 5178 basic_block dummy, bb;
726a989a
RB
5179 tree var;
5180 gimple_stmt_iterator gsi;
6de9cd9a
DN
5181
5182 dummy = fallthru->src;
5183 bb = fallthru->dest;
5184
c5cbcccf 5185 if (single_pred_p (bb))
6de9cd9a
DN
5186 return;
5187
cfaab3a9 5188 /* If we redirected a branch we must create new PHI nodes at the
6de9cd9a 5189 start of BB. */
726a989a 5190 for (gsi = gsi_start_phis (dummy); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 5191 {
726a989a 5192 gimple phi, new_phi;
b8698a0f 5193
726a989a
RB
5194 phi = gsi_stmt (gsi);
5195 var = gimple_phi_result (phi);
6de9cd9a 5196 new_phi = create_phi_node (var, bb);
070ecdfd 5197 gimple_phi_set_result (phi, copy_ssa_name (var, phi));
b8698a0f 5198 add_phi_arg (new_phi, gimple_phi_result (phi), fallthru,
9e227d60 5199 UNKNOWN_LOCATION);
6de9cd9a
DN
5200 }
5201
6de9cd9a 5202 /* Add the arguments we have stored on edges. */
628f6a4e 5203 FOR_EACH_EDGE (e, ei, bb->preds)
6de9cd9a
DN
5204 {
5205 if (e == fallthru)
5206 continue;
5207
71882046 5208 flush_pending_stmts (e);
6de9cd9a
DN
5209 }
5210}
5211
5212
6de9cd9a
DN
5213/* Return a non-special label in the head of basic block BLOCK.
5214 Create one if it doesn't exist. */
5215
d7621d3c 5216tree
726a989a 5217gimple_block_label (basic_block bb)
6de9cd9a 5218{
726a989a 5219 gimple_stmt_iterator i, s = gsi_start_bb (bb);
6de9cd9a 5220 bool first = true;
726a989a
RB
5221 tree label;
5222 gimple stmt;
6de9cd9a 5223
726a989a 5224 for (i = s; !gsi_end_p (i); first = false, gsi_next (&i))
6de9cd9a 5225 {
726a989a
RB
5226 stmt = gsi_stmt (i);
5227 if (gimple_code (stmt) != GIMPLE_LABEL)
6de9cd9a 5228 break;
726a989a 5229 label = gimple_label_label (stmt);
6de9cd9a
DN
5230 if (!DECL_NONLOCAL (label))
5231 {
5232 if (!first)
726a989a 5233 gsi_move_before (&i, &s);
6de9cd9a
DN
5234 return label;
5235 }
5236 }
5237
c2255bc4 5238 label = create_artificial_label (UNKNOWN_LOCATION);
726a989a
RB
5239 stmt = gimple_build_label (label);
5240 gsi_insert_before (&s, stmt, GSI_NEW_STMT);
6de9cd9a
DN
5241 return label;
5242}
5243
5244
5245/* Attempt to perform edge redirection by replacing a possibly complex
5246 jump instruction by a goto or by removing the jump completely.
5247 This can apply only if all edges now point to the same block. The
5248 parameters and return values are equivalent to
5249 redirect_edge_and_branch. */
5250
5251static edge
726a989a 5252gimple_try_redirect_by_replacing_jump (edge e, basic_block target)
6de9cd9a
DN
5253{
5254 basic_block src = e->src;
726a989a
RB
5255 gimple_stmt_iterator i;
5256 gimple stmt;
6de9cd9a 5257
07b43a87
KH
5258 /* We can replace or remove a complex jump only when we have exactly
5259 two edges. */
5260 if (EDGE_COUNT (src->succs) != 2
5261 /* Verify that all targets will be TARGET. Specifically, the
5262 edge that is not E must also go to TARGET. */
5263 || EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest != target)
6de9cd9a
DN
5264 return NULL;
5265
726a989a
RB
5266 i = gsi_last_bb (src);
5267 if (gsi_end_p (i))
6de9cd9a 5268 return NULL;
6de9cd9a 5269
726a989a
RB
5270 stmt = gsi_stmt (i);
5271
5272 if (gimple_code (stmt) == GIMPLE_COND || gimple_code (stmt) == GIMPLE_SWITCH)
6de9cd9a 5273 {
726a989a 5274 gsi_remove (&i, true);
6de9cd9a
DN
5275 e = ssa_redirect_edge (e, target);
5276 e->flags = EDGE_FALLTHRU;
5277 return e;
5278 }
5279
5280 return NULL;
5281}
5282
5283
5284/* Redirect E to DEST. Return NULL on failure. Otherwise, return the
5285 edge representing the redirected branch. */
5286
5287static edge
726a989a 5288gimple_redirect_edge_and_branch (edge e, basic_block dest)
6de9cd9a
DN
5289{
5290 basic_block bb = e->src;
726a989a 5291 gimple_stmt_iterator gsi;
6de9cd9a 5292 edge ret;
726a989a 5293 gimple stmt;
6de9cd9a 5294
4f6c2131 5295 if (e->flags & EDGE_ABNORMAL)
6de9cd9a
DN
5296 return NULL;
5297
6de9cd9a
DN
5298 if (e->dest == dest)
5299 return NULL;
5300
a3710436
JH
5301 if (e->flags & EDGE_EH)
5302 return redirect_eh_edge (e, dest);
5303
fefa31b5 5304 if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
1c061be5
RH
5305 {
5306 ret = gimple_try_redirect_by_replacing_jump (e, dest);
5307 if (ret)
5308 return ret;
5309 }
5310
726a989a
RB
5311 gsi = gsi_last_bb (bb);
5312 stmt = gsi_end_p (gsi) ? NULL : gsi_stmt (gsi);
6de9cd9a 5313
d130ae11 5314 switch (stmt ? gimple_code (stmt) : GIMPLE_ERROR_MARK)
6de9cd9a 5315 {
726a989a 5316 case GIMPLE_COND:
a9b77cd1 5317 /* For COND_EXPR, we only need to redirect the edge. */
6de9cd9a
DN
5318 break;
5319
726a989a 5320 case GIMPLE_GOTO:
6de9cd9a
DN
5321 /* No non-abnormal edges should lead from a non-simple goto, and
5322 simple ones should be represented implicitly. */
1e128c5f 5323 gcc_unreachable ();
6de9cd9a 5324
726a989a 5325 case GIMPLE_SWITCH:
6de9cd9a 5326 {
726a989a 5327 tree label = gimple_block_label (dest);
d6be0d7f 5328 tree cases = get_cases_for_edge (e, stmt);
6de9cd9a 5329
d6be0d7f
JL
5330 /* If we have a list of cases associated with E, then use it
5331 as it's a lot faster than walking the entire case vector. */
5332 if (cases)
6de9cd9a 5333 {
4edbbd3f 5334 edge e2 = find_edge (e->src, dest);
d6be0d7f
JL
5335 tree last, first;
5336
5337 first = cases;
5338 while (cases)
5339 {
5340 last = cases;
5341 CASE_LABEL (cases) = label;
1290e54c 5342 cases = CASE_CHAIN (cases);
d6be0d7f
JL
5343 }
5344
5345 /* If there was already an edge in the CFG, then we need
5346 to move all the cases associated with E to E2. */
5347 if (e2)
5348 {
5349 tree cases2 = get_cases_for_edge (e2, stmt);
5350
1290e54c
NF
5351 CASE_CHAIN (last) = CASE_CHAIN (cases2);
5352 CASE_CHAIN (cases2) = first;
d6be0d7f 5353 }
fc249fe5 5354 bitmap_set_bit (touched_switch_bbs, gimple_bb (stmt)->index);
6de9cd9a 5355 }
92b6dff3
JL
5356 else
5357 {
726a989a 5358 size_t i, n = gimple_switch_num_labels (stmt);
d6be0d7f
JL
5359
5360 for (i = 0; i < n; i++)
5361 {
726a989a 5362 tree elt = gimple_switch_label (stmt, i);
d6be0d7f
JL
5363 if (label_to_block (CASE_LABEL (elt)) == e->dest)
5364 CASE_LABEL (elt) = label;
5365 }
92b6dff3 5366 }
1c384bf1
RH
5367 }
5368 break;
d6be0d7f 5369
1c384bf1
RH
5370 case GIMPLE_ASM:
5371 {
5372 int i, n = gimple_asm_nlabels (stmt);
f8981d1c 5373 tree label = NULL;
1c384bf1
RH
5374
5375 for (i = 0; i < n; ++i)
5376 {
5377 tree cons = gimple_asm_label_op (stmt, i);
5378 if (label_to_block (TREE_VALUE (cons)) == e->dest)
f8981d1c
AO
5379 {
5380 if (!label)
5381 label = gimple_block_label (dest);
5382 TREE_VALUE (cons) = label;
5383 }
1c384bf1 5384 }
f8981d1c
AO
5385
5386 /* If we didn't find any label matching the former edge in the
5387 asm labels, we must be redirecting the fallthrough
5388 edge. */
5389 gcc_assert (label || (e->flags & EDGE_FALLTHRU));
6de9cd9a 5390 }
1c384bf1 5391 break;
6de9cd9a 5392
726a989a
RB
5393 case GIMPLE_RETURN:
5394 gsi_remove (&gsi, true);
6de9cd9a
DN
5395 e->flags |= EDGE_FALLTHRU;
5396 break;
5397
726a989a
RB
5398 case GIMPLE_OMP_RETURN:
5399 case GIMPLE_OMP_CONTINUE:
5400 case GIMPLE_OMP_SECTIONS_SWITCH:
5401 case GIMPLE_OMP_FOR:
e5c95afe
ZD
5402 /* The edges from OMP constructs can be simply redirected. */
5403 break;
5404
1d65f45c
RH
5405 case GIMPLE_EH_DISPATCH:
5406 if (!(e->flags & EDGE_FALLTHRU))
5407 redirect_eh_dispatch_edge (stmt, e, dest);
5408 break;
5409
0a35513e
AH
5410 case GIMPLE_TRANSACTION:
5411 /* The ABORT edge has a stored label associated with it, otherwise
5412 the edges are simply redirectable. */
5413 if (e->flags == 0)
5414 gimple_transaction_set_label (stmt, gimple_block_label (dest));
5415 break;
5416
6de9cd9a
DN
5417 default:
5418 /* Otherwise it must be a fallthru edge, and we don't need to
5419 do anything besides redirecting it. */
1e128c5f 5420 gcc_assert (e->flags & EDGE_FALLTHRU);
6de9cd9a
DN
5421 break;
5422 }
5423
5424 /* Update/insert PHI nodes as necessary. */
5425
5426 /* Now update the edges in the CFG. */
5427 e = ssa_redirect_edge (e, dest);
5428
5429 return e;
5430}
5431
14fa2cc0
ZD
5432/* Returns true if it is possible to remove edge E by redirecting
5433 it to the destination of the other edge from E->src. */
5434
5435static bool
726a989a 5436gimple_can_remove_branch_p (const_edge e)
14fa2cc0 5437{
496a4ef5 5438 if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
14fa2cc0
ZD
5439 return false;
5440
5441 return true;
5442}
6de9cd9a
DN
5443
5444/* Simple wrapper, as we can always redirect fallthru edges. */
5445
5446static basic_block
726a989a 5447gimple_redirect_edge_and_branch_force (edge e, basic_block dest)
6de9cd9a 5448{
726a989a 5449 e = gimple_redirect_edge_and_branch (e, dest);
1e128c5f 5450 gcc_assert (e);
6de9cd9a
DN
5451
5452 return NULL;
5453}
5454
5455
5456/* Splits basic block BB after statement STMT (but at least after the
5457 labels). If STMT is NULL, BB is split just after the labels. */
5458
5459static basic_block
726a989a 5460gimple_split_block (basic_block bb, void *stmt)
6de9cd9a 5461{
726a989a
RB
5462 gimple_stmt_iterator gsi;
5463 gimple_stmt_iterator gsi_tgt;
5464 gimple act;
5465 gimple_seq list;
6de9cd9a
DN
5466 basic_block new_bb;
5467 edge e;
628f6a4e 5468 edge_iterator ei;
6de9cd9a
DN
5469
5470 new_bb = create_empty_bb (bb);
5471
5472 /* Redirect the outgoing edges. */
628f6a4e
BE
5473 new_bb->succs = bb->succs;
5474 bb->succs = NULL;
5475 FOR_EACH_EDGE (e, ei, new_bb->succs)
6de9cd9a
DN
5476 e->src = new_bb;
5477
726a989a 5478 if (stmt && gimple_code ((gimple) stmt) == GIMPLE_LABEL)
6de9cd9a
DN
5479 stmt = NULL;
5480
726a989a
RB
5481 /* Move everything from GSI to the new basic block. */
5482 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 5483 {
726a989a
RB
5484 act = gsi_stmt (gsi);
5485 if (gimple_code (act) == GIMPLE_LABEL)
6de9cd9a
DN
5486 continue;
5487
5488 if (!stmt)
5489 break;
5490
5491 if (stmt == act)
5492 {
726a989a 5493 gsi_next (&gsi);
6de9cd9a
DN
5494 break;
5495 }
5496 }
5497
726a989a 5498 if (gsi_end_p (gsi))
597ae074
JH
5499 return new_bb;
5500
5501 /* Split the statement list - avoid re-creating new containers as this
b8698a0f 5502 brings ugly quadratic memory consumption in the inliner.
597ae074
JH
5503 (We are still quadratic since we need to update stmt BB pointers,
5504 sadly.) */
355a7673 5505 gsi_split_seq_before (&gsi, &list);
726a989a
RB
5506 set_bb_seq (new_bb, list);
5507 for (gsi_tgt = gsi_start (list);
5508 !gsi_end_p (gsi_tgt); gsi_next (&gsi_tgt))
5509 gimple_set_bb (gsi_stmt (gsi_tgt), new_bb);
6de9cd9a
DN
5510
5511 return new_bb;
5512}
5513
5514
5515/* Moves basic block BB after block AFTER. */
5516
5517static bool
726a989a 5518gimple_move_block_after (basic_block bb, basic_block after)
6de9cd9a
DN
5519{
5520 if (bb->prev_bb == after)
5521 return true;
5522
5523 unlink_block (bb);
5524 link_block (bb, after);
5525
5526 return true;
5527}
5528
5529
df92c640
SB
5530/* Return TRUE if block BB has no executable statements, otherwise return
5531 FALSE. */
5532
c1bf2a39 5533static bool
df92c640
SB
5534gimple_empty_block_p (basic_block bb)
5535{
5536 /* BB must have no executable statements. */
5537 gimple_stmt_iterator gsi = gsi_after_labels (bb);
5538 if (phi_nodes (bb))
5539 return false;
5540 if (gsi_end_p (gsi))
5541 return true;
5542 if (is_gimple_debug (gsi_stmt (gsi)))
5543 gsi_next_nondebug (&gsi);
5544 return gsi_end_p (gsi);
5545}
5546
5547
5548/* Split a basic block if it ends with a conditional branch and if the
5549 other part of the block is not empty. */
5550
5551static basic_block
5552gimple_split_block_before_cond_jump (basic_block bb)
5553{
5554 gimple last, split_point;
5555 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
5556 if (gsi_end_p (gsi))
5557 return NULL;
5558 last = gsi_stmt (gsi);
5559 if (gimple_code (last) != GIMPLE_COND
5560 && gimple_code (last) != GIMPLE_SWITCH)
5561 return NULL;
5562 gsi_prev_nondebug (&gsi);
5563 split_point = gsi_stmt (gsi);
5564 return split_block (bb, split_point)->dest;
5565}
5566
5567
6de9cd9a
DN
5568/* Return true if basic_block can be duplicated. */
5569
5570static bool
ca89096d 5571gimple_can_duplicate_bb_p (const_basic_block bb ATTRIBUTE_UNUSED)
6de9cd9a
DN
5572{
5573 return true;
5574}
5575
6de9cd9a
DN
5576/* Create a duplicate of the basic block BB. NOTE: This does not
5577 preserve SSA form. */
5578
5579static basic_block
726a989a 5580gimple_duplicate_bb (basic_block bb)
6de9cd9a
DN
5581{
5582 basic_block new_bb;
726a989a
RB
5583 gimple_stmt_iterator gsi, gsi_tgt;
5584 gimple_seq phis = phi_nodes (bb);
5585 gimple phi, stmt, copy;
6de9cd9a 5586
fefa31b5 5587 new_bb = create_empty_bb (EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb);
b0382c67 5588
84d65814
DN
5589 /* Copy the PHI nodes. We ignore PHI node arguments here because
5590 the incoming edges have not been setup yet. */
726a989a 5591 for (gsi = gsi_start (phis); !gsi_end_p (gsi); gsi_next (&gsi))
b0382c67 5592 {
726a989a 5593 phi = gsi_stmt (gsi);
dcc748dd
RG
5594 copy = create_phi_node (NULL_TREE, new_bb);
5595 create_new_def_for (gimple_phi_result (phi), copy,
726a989a 5596 gimple_phi_result_ptr (copy));
2fd5894f 5597 gimple_set_uid (copy, gimple_uid (phi));
b0382c67 5598 }
84d65814 5599
726a989a
RB
5600 gsi_tgt = gsi_start_bb (new_bb);
5601 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6de9cd9a 5602 {
84d65814
DN
5603 def_operand_p def_p;
5604 ssa_op_iter op_iter;
1ace6185 5605 tree lhs;
6de9cd9a 5606
726a989a
RB
5607 stmt = gsi_stmt (gsi);
5608 if (gimple_code (stmt) == GIMPLE_LABEL)
6de9cd9a
DN
5609 continue;
5610
5619e52c
JJ
5611 /* Don't duplicate label debug stmts. */
5612 if (gimple_debug_bind_p (stmt)
5613 && TREE_CODE (gimple_debug_bind_get_var (stmt))
5614 == LABEL_DECL)
5615 continue;
5616
84d65814
DN
5617 /* Create a new copy of STMT and duplicate STMT's virtual
5618 operands. */
726a989a
RB
5619 copy = gimple_copy (stmt);
5620 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
1d65f45c
RH
5621
5622 maybe_duplicate_eh_stmt (copy, stmt);
6946b3f7 5623 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
84d65814 5624
1ace6185
JJ
5625 /* When copying around a stmt writing into a local non-user
5626 aggregate, make sure it won't share stack slot with other
5627 vars. */
5628 lhs = gimple_get_lhs (stmt);
5629 if (lhs && TREE_CODE (lhs) != SSA_NAME)
5630 {
5631 tree base = get_base_address (lhs);
5632 if (base
5633 && (TREE_CODE (base) == VAR_DECL
5634 || TREE_CODE (base) == RESULT_DECL)
5635 && DECL_IGNORED_P (base)
5636 && !TREE_STATIC (base)
5637 && !DECL_EXTERNAL (base)
5638 && (TREE_CODE (base) != VAR_DECL
5639 || !DECL_HAS_VALUE_EXPR_P (base)))
5640 DECL_NONSHAREABLE (base) = 1;
5641 }
5642
84d65814
DN
5643 /* Create new names for all the definitions created by COPY and
5644 add replacement mappings for each new name. */
5645 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
5646 create_new_def_for (DEF_FROM_PTR (def_p), copy, def_p);
6de9cd9a
DN
5647 }
5648
5649 return new_bb;
5650}
5651
5f40b3cb
ZD
5652/* Adds phi node arguments for edge E_COPY after basic block duplication. */
5653
5654static void
5655add_phi_args_after_copy_edge (edge e_copy)
5656{
5657 basic_block bb, bb_copy = e_copy->src, dest;
5658 edge e;
5659 edge_iterator ei;
726a989a
RB
5660 gimple phi, phi_copy;
5661 tree def;
5662 gimple_stmt_iterator psi, psi_copy;
5f40b3cb 5663
726a989a 5664 if (gimple_seq_empty_p (phi_nodes (e_copy->dest)))
5f40b3cb
ZD
5665 return;
5666
5667 bb = bb_copy->flags & BB_DUPLICATED ? get_bb_original (bb_copy) : bb_copy;
5668
5669 if (e_copy->dest->flags & BB_DUPLICATED)
5670 dest = get_bb_original (e_copy->dest);
5671 else
5672 dest = e_copy->dest;
5673
5674 e = find_edge (bb, dest);
5675 if (!e)
5676 {
5677 /* During loop unrolling the target of the latch edge is copied.
5678 In this case we are not looking for edge to dest, but to
5679 duplicated block whose original was dest. */
5680 FOR_EACH_EDGE (e, ei, bb->succs)
5681 {
5682 if ((e->dest->flags & BB_DUPLICATED)
5683 && get_bb_original (e->dest) == dest)
5684 break;
5685 }
5686
5687 gcc_assert (e != NULL);
5688 }
5689
726a989a
RB
5690 for (psi = gsi_start_phis (e->dest),
5691 psi_copy = gsi_start_phis (e_copy->dest);
5692 !gsi_end_p (psi);
5693 gsi_next (&psi), gsi_next (&psi_copy))
5f40b3cb 5694 {
726a989a
RB
5695 phi = gsi_stmt (psi);
5696 phi_copy = gsi_stmt (psi_copy);
5f40b3cb 5697 def = PHI_ARG_DEF_FROM_EDGE (phi, e);
b8698a0f 5698 add_phi_arg (phi_copy, def, e_copy,
9e227d60 5699 gimple_phi_arg_location_from_edge (phi, e));
5f40b3cb
ZD
5700 }
5701}
5702
84d65814 5703
42759f1e
ZD
5704/* Basic block BB_COPY was created by code duplication. Add phi node
5705 arguments for edges going out of BB_COPY. The blocks that were
6580ee77 5706 duplicated have BB_DUPLICATED set. */
42759f1e
ZD
5707
5708void
5709add_phi_args_after_copy_bb (basic_block bb_copy)
5710{
5f40b3cb 5711 edge e_copy;
726a989a 5712 edge_iterator ei;
42759f1e 5713
628f6a4e 5714 FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
42759f1e 5715 {
5f40b3cb 5716 add_phi_args_after_copy_edge (e_copy);
42759f1e
ZD
5717 }
5718}
5719
5720/* Blocks in REGION_COPY array of length N_REGION were created by
5721 duplication of basic blocks. Add phi node arguments for edges
5f40b3cb
ZD
5722 going from these blocks. If E_COPY is not NULL, also add
5723 phi node arguments for its destination.*/
42759f1e
ZD
5724
5725void
5f40b3cb
ZD
5726add_phi_args_after_copy (basic_block *region_copy, unsigned n_region,
5727 edge e_copy)
42759f1e
ZD
5728{
5729 unsigned i;
5730
5731 for (i = 0; i < n_region; i++)
6580ee77 5732 region_copy[i]->flags |= BB_DUPLICATED;
42759f1e
ZD
5733
5734 for (i = 0; i < n_region; i++)
5735 add_phi_args_after_copy_bb (region_copy[i]);
5f40b3cb
ZD
5736 if (e_copy)
5737 add_phi_args_after_copy_edge (e_copy);
42759f1e
ZD
5738
5739 for (i = 0; i < n_region; i++)
6580ee77 5740 region_copy[i]->flags &= ~BB_DUPLICATED;
42759f1e
ZD
5741}
5742
42759f1e
ZD
5743/* Duplicates a REGION (set of N_REGION basic blocks) with just a single
5744 important exit edge EXIT. By important we mean that no SSA name defined
5745 inside region is live over the other exit edges of the region. All entry
5746 edges to the region must go to ENTRY->dest. The edge ENTRY is redirected
197ce793 5747 to the duplicate of the region. Dominance and loop information is
f14540b6
SE
5748 updated if UPDATE_DOMINANCE is true, but not the SSA web. If
5749 UPDATE_DOMINANCE is false then we assume that the caller will update the
5750 dominance information after calling this function. The new basic
5751 blocks are stored to REGION_COPY in the same order as they had in REGION,
5752 provided that REGION_COPY is not NULL.
42759f1e
ZD
5753 The function returns false if it is unable to copy the region,
5754 true otherwise. */
5755
5756bool
726a989a 5757gimple_duplicate_sese_region (edge entry, edge exit,
42759f1e 5758 basic_block *region, unsigned n_region,
f14540b6
SE
5759 basic_block *region_copy,
5760 bool update_dominance)
42759f1e 5761{
66f97d31 5762 unsigned i;
42759f1e
ZD
5763 bool free_region_copy = false, copying_header = false;
5764 struct loop *loop = entry->dest->loop_father;
5765 edge exit_copy;
9771b263 5766 vec<basic_block> doms;
42759f1e 5767 edge redirected;
09bac500
JH
5768 int total_freq = 0, entry_freq = 0;
5769 gcov_type total_count = 0, entry_count = 0;
42759f1e
ZD
5770
5771 if (!can_copy_bbs_p (region, n_region))
5772 return false;
5773
5774 /* Some sanity checking. Note that we do not check for all possible
5775 missuses of the functions. I.e. if you ask to copy something weird,
5776 it will work, but the state of structures probably will not be
5777 correct. */
42759f1e
ZD
5778 for (i = 0; i < n_region; i++)
5779 {
5780 /* We do not handle subloops, i.e. all the blocks must belong to the
5781 same loop. */
5782 if (region[i]->loop_father != loop)
5783 return false;
5784
5785 if (region[i] != entry->dest
5786 && region[i] == loop->header)
5787 return false;
5788 }
5789
561e8a90 5790 set_loop_copy (loop, loop);
42759f1e
ZD
5791
5792 /* In case the function is used for loop header copying (which is the primary
5793 use), ensure that EXIT and its copy will be new latch and entry edges. */
5794 if (loop->header == entry->dest)
5795 {
5796 copying_header = true;
561e8a90 5797 set_loop_copy (loop, loop_outer (loop));
42759f1e
ZD
5798
5799 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, exit->src))
5800 return false;
5801
5802 for (i = 0; i < n_region; i++)
5803 if (region[i] != exit->src
5804 && dominated_by_p (CDI_DOMINATORS, region[i], exit->src))
5805 return false;
5806 }
5807
5808 if (!region_copy)
5809 {
858904db 5810 region_copy = XNEWVEC (basic_block, n_region);
42759f1e
ZD
5811 free_region_copy = true;
5812 }
5813
6580ee77
JH
5814 initialize_original_copy_tables ();
5815
f14540b6
SE
5816 /* Record blocks outside the region that are dominated by something
5817 inside. */
5818 if (update_dominance)
5819 {
5820 doms.create (0);
5821 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5822 }
42759f1e 5823
09bac500
JH
5824 if (entry->dest->count)
5825 {
5826 total_count = entry->dest->count;
5827 entry_count = entry->count;
5828 /* Fix up corner cases, to avoid division by zero or creation of negative
5829 frequencies. */
5830 if (entry_count > total_count)
5831 entry_count = total_count;
5832 }
5833 else
5834 {
5835 total_freq = entry->dest->frequency;
5836 entry_freq = EDGE_FREQUENCY (entry);
5837 /* Fix up corner cases, to avoid division by zero or creation of negative
5838 frequencies. */
5839 if (total_freq == 0)
5840 total_freq = 1;
5841 else if (entry_freq > total_freq)
5842 entry_freq = total_freq;
5843 }
5deaef19 5844
b9a66240 5845 copy_bbs (region, n_region, region_copy, &exit, 1, &exit_copy, loop,
f14540b6 5846 split_edge_bb_loc (entry), update_dominance);
09bac500
JH
5847 if (total_count)
5848 {
5849 scale_bbs_frequencies_gcov_type (region, n_region,
5850 total_count - entry_count,
5851 total_count);
5852 scale_bbs_frequencies_gcov_type (region_copy, n_region, entry_count,
6531d1be 5853 total_count);
09bac500
JH
5854 }
5855 else
5856 {
5857 scale_bbs_frequencies_int (region, n_region, total_freq - entry_freq,
5858 total_freq);
5859 scale_bbs_frequencies_int (region_copy, n_region, entry_freq, total_freq);
5860 }
42759f1e
ZD
5861
5862 if (copying_header)
5863 {
5864 loop->header = exit->dest;
5865 loop->latch = exit->src;
5866 }
5867
5868 /* Redirect the entry and add the phi node arguments. */
6580ee77 5869 redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
42759f1e 5870 gcc_assert (redirected != NULL);
71882046 5871 flush_pending_stmts (entry);
42759f1e
ZD
5872
5873 /* Concerning updating of dominators: We must recount dominators
84d65814
DN
5874 for entry block and its copy. Anything that is outside of the
5875 region, but was dominated by something inside needs recounting as
5876 well. */
f14540b6
SE
5877 if (update_dominance)
5878 {
5879 set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
5880 doms.safe_push (get_bb_original (entry->dest));
5881 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
5882 doms.release ();
5883 }
42759f1e 5884
84d65814 5885 /* Add the other PHI node arguments. */
5f40b3cb
ZD
5886 add_phi_args_after_copy (region_copy, n_region, NULL);
5887
5f40b3cb
ZD
5888 if (free_region_copy)
5889 free (region_copy);
5890
5891 free_original_copy_tables ();
5892 return true;
5893}
5894
69958396
RL
5895/* Checks if BB is part of the region defined by N_REGION BBS. */
5896static bool
5897bb_part_of_region_p (basic_block bb, basic_block* bbs, unsigned n_region)
5898{
5899 unsigned int n;
5900
5901 for (n = 0; n < n_region; n++)
5902 {
5903 if (bb == bbs[n])
5904 return true;
5905 }
5906 return false;
5907}
5908
5f40b3cb
ZD
5909/* Duplicates REGION consisting of N_REGION blocks. The new blocks
5910 are stored to REGION_COPY in the same order in that they appear
5911 in REGION, if REGION_COPY is not NULL. ENTRY is the entry to
5912 the region, EXIT an exit from it. The condition guarding EXIT
5913 is moved to ENTRY. Returns true if duplication succeeds, false
5914 otherwise.
5915
b8698a0f
L
5916 For example,
5917
5f40b3cb
ZD
5918 some_code;
5919 if (cond)
5920 A;
5921 else
5922 B;
5923
5924 is transformed to
5925
5926 if (cond)
5927 {
5928 some_code;
5929 A;
5930 }
5931 else
5932 {
5933 some_code;
5934 B;
5935 }
5936*/
5937
5938bool
726a989a
RB
5939gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNUSED,
5940 basic_block *region ATTRIBUTE_UNUSED, unsigned n_region ATTRIBUTE_UNUSED,
5941 basic_block *region_copy ATTRIBUTE_UNUSED)
5f40b3cb
ZD
5942{
5943 unsigned i;
5944 bool free_region_copy = false;
5945 struct loop *loop = exit->dest->loop_father;
5946 struct loop *orig_loop = entry->dest->loop_father;
5947 basic_block switch_bb, entry_bb, nentry_bb;
9771b263 5948 vec<basic_block> doms;
5f40b3cb
ZD
5949 int total_freq = 0, exit_freq = 0;
5950 gcov_type total_count = 0, exit_count = 0;
5951 edge exits[2], nexits[2], e;
12037899 5952 gimple_stmt_iterator gsi;
726a989a 5953 gimple cond_stmt;
8adfe01d 5954 edge sorig, snew;
48710229 5955 basic_block exit_bb;
8adfe01d
RL
5956 gimple_stmt_iterator psi;
5957 gimple phi;
5958 tree def;
69958396 5959 struct loop *target, *aloop, *cloop;
5f40b3cb
ZD
5960
5961 gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
5962 exits[0] = exit;
5963 exits[1] = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit);
5964
5965 if (!can_copy_bbs_p (region, n_region))
5966 return false;
5967
5f40b3cb
ZD
5968 initialize_original_copy_tables ();
5969 set_loop_copy (orig_loop, loop);
69958396
RL
5970
5971 target= loop;
5972 for (aloop = orig_loop->inner; aloop; aloop = aloop->next)
5973 {
5974 if (bb_part_of_region_p (aloop->header, region, n_region))
5975 {
5976 cloop = duplicate_loop (aloop, target);
5977 duplicate_subloops (aloop, cloop);
5978 }
5979 }
5f40b3cb
ZD
5980
5981 if (!region_copy)
5982 {
5983 region_copy = XNEWVEC (basic_block, n_region);
5984 free_region_copy = true;
5985 }
5986
5006671f 5987 gcc_assert (!need_ssa_update_p (cfun));
5f40b3cb
ZD
5988
5989 /* Record blocks outside the region that are dominated by something
5990 inside. */
5991 doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
5992
5993 if (exit->src->count)
5994 {
5995 total_count = exit->src->count;
5996 exit_count = exit->count;
5997 /* Fix up corner cases, to avoid division by zero or creation of negative
5998 frequencies. */
5999 if (exit_count > total_count)
6000 exit_count = total_count;
6001 }
6002 else
6003 {
6004 total_freq = exit->src->frequency;
6005 exit_freq = EDGE_FREQUENCY (exit);
6006 /* Fix up corner cases, to avoid division by zero or creation of negative
6007 frequencies. */
6008 if (total_freq == 0)
6009 total_freq = 1;
6010 if (exit_freq > total_freq)
6011 exit_freq = total_freq;
6012 }
6013
6014 copy_bbs (region, n_region, region_copy, exits, 2, nexits, orig_loop,
f14540b6 6015 split_edge_bb_loc (exit), true);
5f40b3cb
ZD
6016 if (total_count)
6017 {
6018 scale_bbs_frequencies_gcov_type (region, n_region,
6019 total_count - exit_count,
6020 total_count);
6021 scale_bbs_frequencies_gcov_type (region_copy, n_region, exit_count,
6022 total_count);
6023 }
6024 else
6025 {
6026 scale_bbs_frequencies_int (region, n_region, total_freq - exit_freq,
6027 total_freq);
6028 scale_bbs_frequencies_int (region_copy, n_region, exit_freq, total_freq);
6029 }
6030
6031 /* Create the switch block, and put the exit condition to it. */
6032 entry_bb = entry->dest;
6033 nentry_bb = get_bb_copy (entry_bb);
6034 if (!last_stmt (entry->src)
6035 || !stmt_ends_bb_p (last_stmt (entry->src)))
6036 switch_bb = entry->src;
6037 else
6038 switch_bb = split_edge (entry);
6039 set_immediate_dominator (CDI_DOMINATORS, nentry_bb, switch_bb);
6040
726a989a
RB
6041 gsi = gsi_last_bb (switch_bb);
6042 cond_stmt = last_stmt (exit->src);
6043 gcc_assert (gimple_code (cond_stmt) == GIMPLE_COND);
6044 cond_stmt = gimple_copy (cond_stmt);
b8698a0f 6045
726a989a 6046 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
5f40b3cb
ZD
6047
6048 sorig = single_succ_edge (switch_bb);
6049 sorig->flags = exits[1]->flags;
6050 snew = make_edge (switch_bb, nentry_bb, exits[0]->flags);
6051
6052 /* Register the new edge from SWITCH_BB in loop exit lists. */
6053 rescan_loop_exit (snew, true, false);
6054
6055 /* Add the PHI node arguments. */
6056 add_phi_args_after_copy (region_copy, n_region, snew);
b8698a0f 6057
5f40b3cb
ZD
6058 /* Get rid of now superfluous conditions and associated edges (and phi node
6059 arguments). */
48710229 6060 exit_bb = exit->dest;
b8698a0f 6061
5f40b3cb 6062 e = redirect_edge_and_branch (exits[0], exits[1]->dest);
726a989a 6063 PENDING_STMT (e) = NULL;
b8698a0f 6064
8adfe01d
RL
6065 /* The latch of ORIG_LOOP was copied, and so was the backedge
6066 to the original header. We redirect this backedge to EXIT_BB. */
48710229 6067 for (i = 0; i < n_region; i++)
8adfe01d
RL
6068 if (get_bb_original (region_copy[i]) == orig_loop->latch)
6069 {
6070 gcc_assert (single_succ_edge (region_copy[i]));
6071 e = redirect_edge_and_branch (single_succ_edge (region_copy[i]), exit_bb);
6072 PENDING_STMT (e) = NULL;
6073 for (psi = gsi_start_phis (exit_bb);
6074 !gsi_end_p (psi);
6075 gsi_next (&psi))
6076 {
6077 phi = gsi_stmt (psi);
6078 def = PHI_ARG_DEF (phi, nexits[0]->dest_idx);
9e227d60 6079 add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e));
8adfe01d
RL
6080 }
6081 }
69958396 6082 e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
8adfe01d
RL
6083 PENDING_STMT (e) = NULL;
6084
5f40b3cb
ZD
6085 /* Anything that is outside of the region, but was dominated by something
6086 inside needs to update dominance info. */
6087 iterate_fix_dominators (CDI_DOMINATORS, doms, false);
9771b263 6088 doms.release ();
84d65814
DN
6089 /* Update the SSA web. */
6090 update_ssa (TODO_update_ssa);
6d8752c4 6091
42759f1e
ZD
6092 if (free_region_copy)
6093 free (region_copy);
6d8752c4 6094
6580ee77 6095 free_original_copy_tables ();
42759f1e
ZD
6096 return true;
6097}
6de9cd9a 6098
50674e96
DN
6099/* Add all the blocks dominated by ENTRY to the array BBS_P. Stop
6100 adding blocks when the dominator traversal reaches EXIT. This
6101 function silently assumes that ENTRY strictly dominates EXIT. */
6102
9f9f72aa 6103void
50674e96 6104gather_blocks_in_sese_region (basic_block entry, basic_block exit,
9771b263 6105 vec<basic_block> *bbs_p)
50674e96
DN
6106{
6107 basic_block son;
6108
6109 for (son = first_dom_son (CDI_DOMINATORS, entry);
6110 son;
6111 son = next_dom_son (CDI_DOMINATORS, son))
6112 {
9771b263 6113 bbs_p->safe_push (son);
50674e96
DN
6114 if (son != exit)
6115 gather_blocks_in_sese_region (son, exit, bbs_p);
6116 }
6117}
6118
917948d3
ZD
6119/* Replaces *TP with a duplicate (belonging to function TO_CONTEXT).
6120 The duplicates are recorded in VARS_MAP. */
6121
6122static void
6123replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
6124 tree to_context)
6125{
6126 tree t = *tp, new_t;
6127 struct function *f = DECL_STRUCT_FUNCTION (to_context);
6128 void **loc;
6129
6130 if (DECL_CONTEXT (t) == to_context)
6131 return;
6132
6133 loc = pointer_map_contains (vars_map, t);
6134
6135 if (!loc)
6136 {
6137 loc = pointer_map_insert (vars_map, t);
6138
6139 if (SSA_VAR_P (t))
6140 {
6141 new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
c021f10b 6142 add_local_decl (f, new_t);
917948d3
ZD
6143 }
6144 else
6145 {
6146 gcc_assert (TREE_CODE (t) == CONST_DECL);
6147 new_t = copy_node (t);
6148 }
6149 DECL_CONTEXT (new_t) = to_context;
6150
6151 *loc = new_t;
6152 }
6153 else
3d9a9f94 6154 new_t = (tree) *loc;
917948d3
ZD
6155
6156 *tp = new_t;
6157}
6158
726a989a 6159
917948d3
ZD
6160/* Creates an ssa name in TO_CONTEXT equivalent to NAME.
6161 VARS_MAP maps old ssa names and var_decls to the new ones. */
6162
6163static tree
6164replace_ssa_name (tree name, struct pointer_map_t *vars_map,
6165 tree to_context)
6166{
6167 void **loc;
70b5e7dc 6168 tree new_name;
917948d3 6169
ea057359 6170 gcc_assert (!virtual_operand_p (name));
917948d3
ZD
6171
6172 loc = pointer_map_contains (vars_map, name);
6173
6174 if (!loc)
6175 {
70b5e7dc
RG
6176 tree decl = SSA_NAME_VAR (name);
6177 if (decl)
6178 {
6179 replace_by_duplicate_decl (&decl, vars_map, to_context);
6180 new_name = make_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
6181 decl, SSA_NAME_DEF_STMT (name));
6182 if (SSA_NAME_IS_DEFAULT_DEF (name))
6183 set_ssa_default_def (DECL_STRUCT_FUNCTION (to_context),
6184 decl, new_name);
6185 }
6186 else
6187 new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
6188 name, SSA_NAME_DEF_STMT (name));
917948d3
ZD
6189
6190 loc = pointer_map_insert (vars_map, name);
6191 *loc = new_name;
6192 }
6193 else
3d9a9f94 6194 new_name = (tree) *loc;
917948d3
ZD
6195
6196 return new_name;
6197}
50674e96
DN
6198
6199struct move_stmt_d
6200{
b357f682
JJ
6201 tree orig_block;
6202 tree new_block;
50674e96
DN
6203 tree from_context;
6204 tree to_context;
917948d3 6205 struct pointer_map_t *vars_map;
fad41cd7 6206 htab_t new_label_map;
1d65f45c 6207 struct pointer_map_t *eh_map;
50674e96
DN
6208 bool remap_decls_p;
6209};
6210
6211/* Helper for move_block_to_fn. Set TREE_BLOCK in every expression
b357f682
JJ
6212 contained in *TP if it has been ORIG_BLOCK previously and change the
6213 DECL_CONTEXT of every local variable referenced in *TP. */
50674e96
DN
6214
6215static tree
726a989a 6216move_stmt_op (tree *tp, int *walk_subtrees, void *data)
50674e96 6217{
726a989a
RB
6218 struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
6219 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
fad41cd7 6220 tree t = *tp;
50674e96 6221
726a989a 6222 if (EXPR_P (t))
5368224f 6223 {
0c2b2040
RB
6224 tree block = TREE_BLOCK (t);
6225 if (block == p->orig_block
60478b9c 6226 || (p->orig_block == NULL_TREE
0c2b2040 6227 && block != NULL_TREE))
5368224f 6228 TREE_SET_BLOCK (t, p->new_block);
0c2b2040
RB
6229#ifdef ENABLE_CHECKING
6230 else if (block != NULL_TREE)
6231 {
6232 while (block && TREE_CODE (block) == BLOCK && block != p->orig_block)
6233 block = BLOCK_SUPERCONTEXT (block);
6234 gcc_assert (block == p->orig_block);
6235 }
6236#endif
5368224f 6237 }
917948d3 6238 else if (DECL_P (t) || TREE_CODE (t) == SSA_NAME)
50674e96 6239 {
917948d3
ZD
6240 if (TREE_CODE (t) == SSA_NAME)
6241 *tp = replace_ssa_name (t, p->vars_map, p->to_context);
6242 else if (TREE_CODE (t) == LABEL_DECL)
fad41cd7
RH
6243 {
6244 if (p->new_label_map)
6245 {
6246 struct tree_map in, *out;
fc8600f9 6247 in.base.from = t;
3d9a9f94
KG
6248 out = (struct tree_map *)
6249 htab_find_with_hash (p->new_label_map, &in, DECL_UID (t));
fad41cd7
RH
6250 if (out)
6251 *tp = t = out->to;
6252 }
50674e96 6253
fad41cd7
RH
6254 DECL_CONTEXT (t) = p->to_context;
6255 }
6256 else if (p->remap_decls_p)
50674e96 6257 {
917948d3
ZD
6258 /* Replace T with its duplicate. T should no longer appear in the
6259 parent function, so this looks wasteful; however, it may appear
6260 in referenced_vars, and more importantly, as virtual operands of
6261 statements, and in alias lists of other variables. It would be
6262 quite difficult to expunge it from all those places. ??? It might
6263 suffice to do this for addressable variables. */
6264 if ((TREE_CODE (t) == VAR_DECL
6265 && !is_global_var (t))
6266 || TREE_CODE (t) == CONST_DECL)
46eb666a 6267 replace_by_duplicate_decl (tp, p->vars_map, p->to_context);
50674e96 6268 }
917948d3 6269 *walk_subtrees = 0;
50674e96 6270 }
fad41cd7
RH
6271 else if (TYPE_P (t))
6272 *walk_subtrees = 0;
50674e96
DN
6273
6274 return NULL_TREE;
6275}
6276
1d65f45c
RH
6277/* Helper for move_stmt_r. Given an EH region number for the source
6278 function, map that to the duplicate EH regio number in the dest. */
6279
6280static int
6281move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
6282{
6283 eh_region old_r, new_r;
6284 void **slot;
6285
6286 old_r = get_eh_region_from_number (old_nr);
6287 slot = pointer_map_contains (p->eh_map, old_r);
6288 new_r = (eh_region) *slot;
6289
6290 return new_r->index;
6291}
6292
6293/* Similar, but operate on INTEGER_CSTs. */
6294
6295static tree
6296move_stmt_eh_region_tree_nr (tree old_t_nr, struct move_stmt_d *p)
6297{
6298 int old_nr, new_nr;
6299
9439e9a1 6300 old_nr = tree_to_shwi (old_t_nr);
1d65f45c
RH
6301 new_nr = move_stmt_eh_region_nr (old_nr, p);
6302
45a2c477 6303 return build_int_cst (integer_type_node, new_nr);
1d65f45c
RH
6304}
6305
726a989a
RB
6306/* Like move_stmt_op, but for gimple statements.
6307
6308 Helper for move_block_to_fn. Set GIMPLE_BLOCK in every expression
6309 contained in the current statement in *GSI_P and change the
6310 DECL_CONTEXT of every local variable referenced in the current
6311 statement. */
6312
6313static tree
6314move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
6315 struct walk_stmt_info *wi)
6316{
6317 struct move_stmt_d *p = (struct move_stmt_d *) wi->info;
6318 gimple stmt = gsi_stmt (*gsi_p);
6319 tree block = gimple_block (stmt);
6320
0c2b2040
RB
6321 if (block == p->orig_block
6322 || (p->orig_block == NULL_TREE
6323 && block != NULL_TREE))
726a989a 6324 gimple_set_block (stmt, p->new_block);
726a989a 6325
1d65f45c 6326 switch (gimple_code (stmt))
726a989a 6327 {
1d65f45c
RH
6328 case GIMPLE_CALL:
6329 /* Remap the region numbers for __builtin_eh_{pointer,filter}. */
6330 {
6331 tree r, fndecl = gimple_call_fndecl (stmt);
6332 if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
6333 switch (DECL_FUNCTION_CODE (fndecl))
6334 {
6335 case BUILT_IN_EH_COPY_VALUES:
6336 r = gimple_call_arg (stmt, 1);
6337 r = move_stmt_eh_region_tree_nr (r, p);
6338 gimple_call_set_arg (stmt, 1, r);
6339 /* FALLTHRU */
6340
6341 case BUILT_IN_EH_POINTER:
6342 case BUILT_IN_EH_FILTER:
6343 r = gimple_call_arg (stmt, 0);
6344 r = move_stmt_eh_region_tree_nr (r, p);
6345 gimple_call_set_arg (stmt, 0, r);
6346 break;
726a989a 6347
1d65f45c
RH
6348 default:
6349 break;
6350 }
6351 }
6352 break;
6353
6354 case GIMPLE_RESX:
6355 {
6356 int r = gimple_resx_region (stmt);
6357 r = move_stmt_eh_region_nr (r, p);
6358 gimple_resx_set_region (stmt, r);
6359 }
6360 break;
726a989a 6361
1d65f45c
RH
6362 case GIMPLE_EH_DISPATCH:
6363 {
6364 int r = gimple_eh_dispatch_region (stmt);
6365 r = move_stmt_eh_region_nr (r, p);
6366 gimple_eh_dispatch_set_region (stmt, r);
6367 }
6368 break;
6369
6370 case GIMPLE_OMP_RETURN:
6371 case GIMPLE_OMP_CONTINUE:
6372 break;
6373 default:
6374 if (is_gimple_omp (stmt))
6375 {
6376 /* Do not remap variables inside OMP directives. Variables
6377 referenced in clauses and directive header belong to the
6378 parent function and should not be moved into the child
6379 function. */
6380 bool save_remap_decls_p = p->remap_decls_p;
6381 p->remap_decls_p = false;
6382 *handled_ops_p = true;
6383
355a7673
MM
6384 walk_gimple_seq_mod (gimple_omp_body_ptr (stmt), move_stmt_r,
6385 move_stmt_op, wi);
1d65f45c
RH
6386
6387 p->remap_decls_p = save_remap_decls_p;
6388 }
6389 break;
726a989a
RB
6390 }
6391
6392 return NULL_TREE;
6393}
6394
50674e96
DN
6395/* Move basic block BB from function CFUN to function DEST_FN. The
6396 block is moved out of the original linked list and placed after
6397 block AFTER in the new list. Also, the block is removed from the
6398 original array of blocks and placed in DEST_FN's array of blocks.
6399 If UPDATE_EDGE_COUNT_P is true, the edge counts on both CFGs is
6400 updated to reflect the moved edges.
6531d1be 6401
917948d3
ZD
6402 The local variables are remapped to new instances, VARS_MAP is used
6403 to record the mapping. */
50674e96
DN
6404
6405static void
6406move_block_to_fn (struct function *dest_cfun, basic_block bb,
6407 basic_block after, bool update_edge_count_p,
1d65f45c 6408 struct move_stmt_d *d)
50674e96
DN
6409{
6410 struct control_flow_graph *cfg;
6411 edge_iterator ei;
6412 edge e;
726a989a 6413 gimple_stmt_iterator si;
728b26bb 6414 unsigned old_len, new_len;
50674e96 6415
3722506a
ZD
6416 /* Remove BB from dominance structures. */
6417 delete_from_dominance_info (CDI_DOMINATORS, bb);
d7ed20db
RB
6418
6419 /* Move BB from its current loop to the copy in the new function. */
5f40b3cb 6420 if (current_loops)
d7ed20db
RB
6421 {
6422 struct loop *new_loop = (struct loop *)bb->loop_father->aux;
6423 if (new_loop)
6424 bb->loop_father = new_loop;
6425 }
3722506a 6426
50674e96
DN
6427 /* Link BB to the new linked list. */
6428 move_block_after (bb, after);
6429
6430 /* Update the edge count in the corresponding flowgraphs. */
6431 if (update_edge_count_p)
6432 FOR_EACH_EDGE (e, ei, bb->succs)
6433 {
6434 cfun->cfg->x_n_edges--;
6435 dest_cfun->cfg->x_n_edges++;
6436 }
6437
6438 /* Remove BB from the original basic block array. */
9771b263 6439 (*cfun->cfg->x_basic_block_info)[bb->index] = NULL;
50674e96
DN
6440 cfun->cfg->x_n_basic_blocks--;
6441
6442 /* Grow DEST_CFUN's basic block array if needed. */
6443 cfg = dest_cfun->cfg;
6444 cfg->x_n_basic_blocks++;
3722506a
ZD
6445 if (bb->index >= cfg->x_last_basic_block)
6446 cfg->x_last_basic_block = bb->index + 1;
50674e96 6447
9771b263 6448 old_len = vec_safe_length (cfg->x_basic_block_info);
728b26bb 6449 if ((unsigned) cfg->x_last_basic_block >= old_len)
50674e96 6450 {
728b26bb 6451 new_len = cfg->x_last_basic_block + (cfg->x_last_basic_block + 3) / 4;
9771b263 6452 vec_safe_grow_cleared (cfg->x_basic_block_info, new_len);
50674e96
DN
6453 }
6454
9771b263 6455 (*cfg->x_basic_block_info)[bb->index] = bb;
50674e96 6456
917948d3 6457 /* Remap the variables in phi nodes. */
726a989a 6458 for (si = gsi_start_phis (bb); !gsi_end_p (si); )
917948d3 6459 {
726a989a 6460 gimple phi = gsi_stmt (si);
917948d3
ZD
6461 use_operand_p use;
6462 tree op = PHI_RESULT (phi);
6463 ssa_op_iter oi;
846b158c 6464 unsigned i;
917948d3 6465
ea057359 6466 if (virtual_operand_p (op))
5f40b3cb
ZD
6467 {
6468 /* Remove the phi nodes for virtual operands (alias analysis will be
6469 run for the new function, anyway). */
726a989a 6470 remove_phi_node (&si, true);
5f40b3cb
ZD
6471 continue;
6472 }
917948d3 6473
b357f682
JJ
6474 SET_PHI_RESULT (phi,
6475 replace_ssa_name (op, d->vars_map, dest_cfun->decl));
917948d3
ZD
6476 FOR_EACH_PHI_ARG (use, phi, oi, SSA_OP_USE)
6477 {
6478 op = USE_FROM_PTR (use);
6479 if (TREE_CODE (op) == SSA_NAME)
b357f682 6480 SET_USE (use, replace_ssa_name (op, d->vars_map, dest_cfun->decl));
917948d3 6481 }
726a989a 6482
846b158c
DC
6483 for (i = 0; i < EDGE_COUNT (bb->preds); i++)
6484 {
6485 location_t locus = gimple_phi_arg_location (phi, i);
6486 tree block = LOCATION_BLOCK (locus);
6487
6488 if (locus == UNKNOWN_LOCATION)
6489 continue;
6490 if (d->orig_block == NULL_TREE || block == d->orig_block)
6491 {
6492 if (d->new_block == NULL_TREE)
6493 locus = LOCATION_LOCUS (locus);
6494 else
6495 locus = COMBINE_LOCATION_DATA (line_table, locus, d->new_block);
6496 gimple_phi_arg_set_location (phi, i, locus);
6497 }
6498 }
6499
726a989a 6500 gsi_next (&si);
917948d3
ZD
6501 }
6502
726a989a 6503 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
50674e96 6504 {
726a989a 6505 gimple stmt = gsi_stmt (si);
726a989a 6506 struct walk_stmt_info wi;
50674e96 6507
726a989a
RB
6508 memset (&wi, 0, sizeof (wi));
6509 wi.info = d;
6510 walk_gimple_stmt (&si, move_stmt_r, move_stmt_op, &wi);
50674e96 6511
726a989a 6512 if (gimple_code (stmt) == GIMPLE_LABEL)
50674e96 6513 {
726a989a 6514 tree label = gimple_label_label (stmt);
50674e96
DN
6515 int uid = LABEL_DECL_UID (label);
6516
6517 gcc_assert (uid > -1);
6518
9771b263 6519 old_len = vec_safe_length (cfg->x_label_to_block_map);
50674e96
DN
6520 if (old_len <= (unsigned) uid)
6521 {
5006671f 6522 new_len = 3 * uid / 2 + 1;
9771b263 6523 vec_safe_grow_cleared (cfg->x_label_to_block_map, new_len);
50674e96
DN
6524 }
6525
9771b263
DN
6526 (*cfg->x_label_to_block_map)[uid] = bb;
6527 (*cfun->cfg->x_label_to_block_map)[uid] = NULL;
50674e96
DN
6528
6529 gcc_assert (DECL_CONTEXT (label) == dest_cfun->decl);
6530
cb91fab0
JH
6531 if (uid >= dest_cfun->cfg->last_label_uid)
6532 dest_cfun->cfg->last_label_uid = uid + 1;
50674e96 6533 }
fad41cd7 6534
1d65f45c
RH
6535 maybe_duplicate_eh_stmt_fn (dest_cfun, stmt, cfun, stmt, d->eh_map, 0);
6536 remove_stmt_from_eh_lp_fn (cfun, stmt);
6537
6538 gimple_duplicate_stmt_histograms (dest_cfun, stmt, cfun, stmt);
6539 gimple_remove_stmt_histograms (cfun, stmt);
917948d3 6540
5f40b3cb
ZD
6541 /* We cannot leave any operands allocated from the operand caches of
6542 the current function. */
6a58ccca 6543 free_stmt_operands (cfun, stmt);
5f40b3cb 6544 push_cfun (dest_cfun);
917948d3 6545 update_stmt (stmt);
5f40b3cb 6546 pop_cfun ();
fad41cd7 6547 }
7241571e
JJ
6548
6549 FOR_EACH_EDGE (e, ei, bb->succs)
60478b9c 6550 if (e->goto_locus != UNKNOWN_LOCATION)
7241571e 6551 {
5368224f 6552 tree block = LOCATION_BLOCK (e->goto_locus);
7241571e
JJ
6553 if (d->orig_block == NULL_TREE
6554 || block == d->orig_block)
5368224f
DC
6555 e->goto_locus = d->new_block ?
6556 COMBINE_LOCATION_DATA (line_table, e->goto_locus, d->new_block) :
6557 LOCATION_LOCUS (e->goto_locus);
7241571e 6558 }
fad41cd7
RH
6559}
6560
6561/* Examine the statements in BB (which is in SRC_CFUN); find and return
6562 the outermost EH region. Use REGION as the incoming base EH region. */
6563
1d65f45c 6564static eh_region
fad41cd7 6565find_outermost_region_in_block (struct function *src_cfun,
1d65f45c 6566 basic_block bb, eh_region region)
fad41cd7 6567{
726a989a 6568 gimple_stmt_iterator si;
6531d1be 6569
726a989a 6570 for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
fad41cd7 6571 {
726a989a 6572 gimple stmt = gsi_stmt (si);
1d65f45c
RH
6573 eh_region stmt_region;
6574 int lp_nr;
1799e5d5 6575
1d65f45c
RH
6576 lp_nr = lookup_stmt_eh_lp_fn (src_cfun, stmt);
6577 stmt_region = get_eh_region_from_lp_number_fn (src_cfun, lp_nr);
6578 if (stmt_region)
7e2df4a1 6579 {
1d65f45c 6580 if (region == NULL)
7e2df4a1
JJ
6581 region = stmt_region;
6582 else if (stmt_region != region)
6583 {
6584 region = eh_region_outermost (src_cfun, stmt_region, region);
1d65f45c 6585 gcc_assert (region != NULL);
7e2df4a1
JJ
6586 }
6587 }
50674e96 6588 }
fad41cd7
RH
6589
6590 return region;
50674e96
DN
6591}
6592
fad41cd7
RH
6593static tree
6594new_label_mapper (tree decl, void *data)
6595{
6596 htab_t hash = (htab_t) data;
6597 struct tree_map *m;
6598 void **slot;
6599
6600 gcc_assert (TREE_CODE (decl) == LABEL_DECL);
6601
3d9a9f94 6602 m = XNEW (struct tree_map);
fad41cd7 6603 m->hash = DECL_UID (decl);
fc8600f9 6604 m->base.from = decl;
c2255bc4 6605 m->to = create_artificial_label (UNKNOWN_LOCATION);
fad41cd7 6606 LABEL_DECL_UID (m->to) = LABEL_DECL_UID (decl);
cb91fab0
JH
6607 if (LABEL_DECL_UID (m->to) >= cfun->cfg->last_label_uid)
6608 cfun->cfg->last_label_uid = LABEL_DECL_UID (m->to) + 1;
fad41cd7
RH
6609
6610 slot = htab_find_slot_with_hash (hash, m, m->hash, INSERT);
6611 gcc_assert (*slot == NULL);
6612
6613 *slot = m;
6614
6615 return m->to;
6616}
50674e96 6617
b357f682
JJ
6618/* Change DECL_CONTEXT of all BLOCK_VARS in block, including
6619 subblocks. */
6620
6621static void
6622replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
6623 tree to_context)
6624{
6625 tree *tp, t;
6626
910ad8de 6627 for (tp = &BLOCK_VARS (block); *tp; tp = &DECL_CHAIN (*tp))
b357f682
JJ
6628 {
6629 t = *tp;
e1e2bac4
JJ
6630 if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != CONST_DECL)
6631 continue;
b357f682
JJ
6632 replace_by_duplicate_decl (&t, vars_map, to_context);
6633 if (t != *tp)
6634 {
6635 if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*tp))
6636 {
6637 SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (*tp));
6638 DECL_HAS_VALUE_EXPR_P (t) = 1;
6639 }
910ad8de 6640 DECL_CHAIN (t) = DECL_CHAIN (*tp);
b357f682
JJ
6641 *tp = t;
6642 }
6643 }
6644
6645 for (block = BLOCK_SUBBLOCKS (block); block; block = BLOCK_CHAIN (block))
6646 replace_block_vars_by_duplicates (block, vars_map, to_context);
6647}
6648
d7ed20db
RB
6649/* Fixup the loop arrays and numbers after moving LOOP and its subloops
6650 from FN1 to FN2. */
6651
6652static void
6653fixup_loop_arrays_after_move (struct function *fn1, struct function *fn2,
6654 struct loop *loop)
6655{
6656 /* Discard it from the old loop array. */
0fc822d0 6657 (*get_loops (fn1))[loop->num] = NULL;
d7ed20db
RB
6658
6659 /* Place it in the new loop array, assigning it a new number. */
0fc822d0
RB
6660 loop->num = number_of_loops (fn2);
6661 vec_safe_push (loops_for_fn (fn2)->larray, loop);
d7ed20db
RB
6662
6663 /* Recurse to children. */
6664 for (loop = loop->inner; loop; loop = loop->next)
6665 fixup_loop_arrays_after_move (fn1, fn2, loop);
6666}
6667
50674e96
DN
6668/* Move a single-entry, single-exit region delimited by ENTRY_BB and
6669 EXIT_BB to function DEST_CFUN. The whole region is replaced by a
6670 single basic block in the original CFG and the new basic block is
6671 returned. DEST_CFUN must not have a CFG yet.
6672
6673 Note that the region need not be a pure SESE region. Blocks inside
6674 the region may contain calls to abort/exit. The only restriction
6675 is that ENTRY_BB should be the only entry point and it must
6676 dominate EXIT_BB.
6677
b357f682
JJ
6678 Change TREE_BLOCK of all statements in ORIG_BLOCK to the new
6679 functions outermost BLOCK, move all subblocks of ORIG_BLOCK
6680 to the new function.
6681
50674e96
DN
6682 All local variables referenced in the region are assumed to be in
6683 the corresponding BLOCK_VARS and unexpanded variable lists
6684 associated with DEST_CFUN. */
6685
6686basic_block
6687move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
b357f682 6688 basic_block exit_bb, tree orig_block)
50674e96 6689{
9771b263 6690 vec<basic_block> bbs, dom_bbs;
917948d3
ZD
6691 basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, entry_bb);
6692 basic_block after, bb, *entry_pred, *exit_succ, abb;
6693 struct function *saved_cfun = cfun;
1d65f45c 6694 int *entry_flag, *exit_flag;
917948d3 6695 unsigned *entry_prob, *exit_prob;
09dc585e 6696 unsigned i, num_entry_edges, num_exit_edges, num_nodes;
50674e96
DN
6697 edge e;
6698 edge_iterator ei;
fad41cd7 6699 htab_t new_label_map;
1d65f45c 6700 struct pointer_map_t *vars_map, *eh_map;
5f40b3cb 6701 struct loop *loop = entry_bb->loop_father;
09dc585e 6702 struct loop *loop0 = get_loop (saved_cfun, 0);
b357f682 6703 struct move_stmt_d d;
50674e96
DN
6704
6705 /* If ENTRY does not strictly dominate EXIT, this cannot be an SESE
6706 region. */
6707 gcc_assert (entry_bb != exit_bb
2aee3e57
JJ
6708 && (!exit_bb
6709 || dominated_by_p (CDI_DOMINATORS, exit_bb, entry_bb)));
50674e96 6710
917948d3
ZD
6711 /* Collect all the blocks in the region. Manually add ENTRY_BB
6712 because it won't be added by dfs_enumerate_from. */
9771b263
DN
6713 bbs.create (0);
6714 bbs.safe_push (entry_bb);
50674e96
DN
6715 gather_blocks_in_sese_region (entry_bb, exit_bb, &bbs);
6716
917948d3
ZD
6717 /* The blocks that used to be dominated by something in BBS will now be
6718 dominated by the new block. */
6719 dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
9771b263
DN
6720 bbs.address (),
6721 bbs.length ());
917948d3 6722
50674e96
DN
6723 /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG. We need to remember
6724 the predecessor edges to ENTRY_BB and the successor edges to
6725 EXIT_BB so that we can re-attach them to the new basic block that
6726 will replace the region. */
6727 num_entry_edges = EDGE_COUNT (entry_bb->preds);
c302207e
SB
6728 entry_pred = XNEWVEC (basic_block, num_entry_edges);
6729 entry_flag = XNEWVEC (int, num_entry_edges);
917948d3 6730 entry_prob = XNEWVEC (unsigned, num_entry_edges);
50674e96
DN
6731 i = 0;
6732 for (ei = ei_start (entry_bb->preds); (e = ei_safe_edge (ei)) != NULL;)
6733 {
917948d3 6734 entry_prob[i] = e->probability;
50674e96
DN
6735 entry_flag[i] = e->flags;
6736 entry_pred[i++] = e->src;
6737 remove_edge (e);
6738 }
6739
2aee3e57 6740 if (exit_bb)
50674e96 6741 {
2aee3e57 6742 num_exit_edges = EDGE_COUNT (exit_bb->succs);
c302207e
SB
6743 exit_succ = XNEWVEC (basic_block, num_exit_edges);
6744 exit_flag = XNEWVEC (int, num_exit_edges);
917948d3 6745 exit_prob = XNEWVEC (unsigned, num_exit_edges);
2aee3e57
JJ
6746 i = 0;
6747 for (ei = ei_start (exit_bb->succs); (e = ei_safe_edge (ei)) != NULL;)
6748 {
917948d3 6749 exit_prob[i] = e->probability;
2aee3e57
JJ
6750 exit_flag[i] = e->flags;
6751 exit_succ[i++] = e->dest;
6752 remove_edge (e);
6753 }
6754 }
6755 else
6756 {
6757 num_exit_edges = 0;
6758 exit_succ = NULL;
6759 exit_flag = NULL;
917948d3 6760 exit_prob = NULL;
50674e96
DN
6761 }
6762
6763 /* Switch context to the child function to initialize DEST_FN's CFG. */
6764 gcc_assert (dest_cfun->cfg == NULL);
917948d3 6765 push_cfun (dest_cfun);
fad41cd7 6766
50674e96 6767 init_empty_tree_cfg ();
fad41cd7
RH
6768
6769 /* Initialize EH information for the new function. */
1d65f45c 6770 eh_map = NULL;
fad41cd7
RH
6771 new_label_map = NULL;
6772 if (saved_cfun->eh)
6773 {
1d65f45c 6774 eh_region region = NULL;
fad41cd7 6775
9771b263 6776 FOR_EACH_VEC_ELT (bbs, i, bb)
fad41cd7
RH
6777 region = find_outermost_region_in_block (saved_cfun, bb, region);
6778
6779 init_eh_for_function ();
1d65f45c 6780 if (region != NULL)
fad41cd7
RH
6781 {
6782 new_label_map = htab_create (17, tree_map_hash, tree_map_eq, free);
1d65f45c
RH
6783 eh_map = duplicate_eh_regions (saved_cfun, region, 0,
6784 new_label_mapper, new_label_map);
fad41cd7
RH
6785 }
6786 }
6787
d7ed20db 6788 /* Initialize an empty loop tree. */
0fc822d0
RB
6789 struct loops *loops = ggc_alloc_cleared_loops ();
6790 init_loops_structure (dest_cfun, loops, 1);
6791 loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES;
6792 set_loops_for_fn (dest_cfun, loops);
d7ed20db
RB
6793
6794 /* Move the outlined loop tree part. */
09dc585e 6795 num_nodes = bbs.length ();
d7ed20db
RB
6796 FOR_EACH_VEC_ELT (bbs, i, bb)
6797 {
09dc585e 6798 if (bb->loop_father->header == bb)
d7ed20db 6799 {
f3b331d1 6800 struct loop *this_loop = bb->loop_father;
09dc585e
JJ
6801 struct loop *outer = loop_outer (this_loop);
6802 if (outer == loop
6803 /* If the SESE region contains some bbs ending with
6804 a noreturn call, those are considered to belong
6805 to the outermost loop in saved_cfun, rather than
6806 the entry_bb's loop_father. */
6807 || outer == loop0)
6808 {
6809 if (outer != loop)
6810 num_nodes -= this_loop->num_nodes;
6811 flow_loop_tree_node_remove (bb->loop_father);
6812 flow_loop_tree_node_add (get_loop (dest_cfun, 0), this_loop);
6813 fixup_loop_arrays_after_move (saved_cfun, cfun, this_loop);
6814 }
d7ed20db 6815 }
09dc585e
JJ
6816 else if (bb->loop_father == loop0 && loop0 != loop)
6817 num_nodes--;
d7ed20db
RB
6818
6819 /* Remove loop exits from the outlined region. */
0fc822d0 6820 if (loops_for_fn (saved_cfun)->exits)
d7ed20db
RB
6821 FOR_EACH_EDGE (e, ei, bb->succs)
6822 {
6823 void **slot = htab_find_slot_with_hash
0fc822d0 6824 (loops_for_fn (saved_cfun)->exits, e,
d7ed20db
RB
6825 htab_hash_pointer (e), NO_INSERT);
6826 if (slot)
0fc822d0 6827 htab_clear_slot (loops_for_fn (saved_cfun)->exits, slot);
d7ed20db
RB
6828 }
6829 }
6830
6831
6832 /* Adjust the number of blocks in the tree root of the outlined part. */
0fc822d0 6833 get_loop (dest_cfun, 0)->num_nodes = bbs.length () + 2;
d7ed20db
RB
6834
6835 /* Setup a mapping to be used by move_block_to_fn. */
6836 loop->aux = current_loops->tree_root;
09dc585e 6837 loop0->aux = current_loops->tree_root;
d7ed20db 6838
917948d3
ZD
6839 pop_cfun ();
6840
50674e96 6841 /* Move blocks from BBS into DEST_CFUN. */
9771b263 6842 gcc_assert (bbs.length () >= 2);
50674e96 6843 after = dest_cfun->cfg->x_entry_block_ptr;
917948d3 6844 vars_map = pointer_map_create ();
b357f682
JJ
6845
6846 memset (&d, 0, sizeof (d));
1d65f45c
RH
6847 d.orig_block = orig_block;
6848 d.new_block = DECL_INITIAL (dest_cfun->decl);
b357f682
JJ
6849 d.from_context = cfun->decl;
6850 d.to_context = dest_cfun->decl;
1d65f45c 6851 d.vars_map = vars_map;
b357f682 6852 d.new_label_map = new_label_map;
1d65f45c 6853 d.eh_map = eh_map;
b357f682 6854 d.remap_decls_p = true;
b357f682 6855
9771b263 6856 FOR_EACH_VEC_ELT (bbs, i, bb)
50674e96
DN
6857 {
6858 /* No need to update edge counts on the last block. It has
6859 already been updated earlier when we detached the region from
6860 the original CFG. */
1d65f45c 6861 move_block_to_fn (dest_cfun, bb, after, bb != exit_bb, &d);
50674e96
DN
6862 after = bb;
6863 }
6864
d7ed20db 6865 loop->aux = NULL;
09dc585e 6866 loop0->aux = NULL;
d7ed20db 6867 /* Loop sizes are no longer correct, fix them up. */
09dc585e 6868 loop->num_nodes -= num_nodes;
d7ed20db
RB
6869 for (struct loop *outer = loop_outer (loop);
6870 outer; outer = loop_outer (outer))
09dc585e
JJ
6871 outer->num_nodes -= num_nodes;
6872 loop0->num_nodes -= bbs.length () - num_nodes;
d7ed20db 6873
f3b331d1
JJ
6874 if (saved_cfun->has_simduid_loops || saved_cfun->has_force_vect_loops)
6875 {
6876 struct loop *aloop;
6877 for (i = 0; vec_safe_iterate (loops->larray, i, &aloop); i++)
6878 if (aloop != NULL)
6879 {
6880 if (aloop->simduid)
6881 {
6882 replace_by_duplicate_decl (&aloop->simduid, d.vars_map,
6883 d.to_context);
6884 dest_cfun->has_simduid_loops = true;
6885 }
6886 if (aloop->force_vect)
6887 dest_cfun->has_force_vect_loops = true;
6888 }
6889 }
6890
b357f682
JJ
6891 /* Rewire BLOCK_SUBBLOCKS of orig_block. */
6892 if (orig_block)
6893 {
6894 tree block;
6895 gcc_assert (BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6896 == NULL_TREE);
6897 BLOCK_SUBBLOCKS (DECL_INITIAL (dest_cfun->decl))
6898 = BLOCK_SUBBLOCKS (orig_block);
6899 for (block = BLOCK_SUBBLOCKS (orig_block);
6900 block; block = BLOCK_CHAIN (block))
6901 BLOCK_SUPERCONTEXT (block) = DECL_INITIAL (dest_cfun->decl);
6902 BLOCK_SUBBLOCKS (orig_block) = NULL_TREE;
6903 }
6904
6905 replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
6906 vars_map, dest_cfun->decl);
6907
fad41cd7
RH
6908 if (new_label_map)
6909 htab_delete (new_label_map);
1d65f45c
RH
6910 if (eh_map)
6911 pointer_map_destroy (eh_map);
917948d3 6912 pointer_map_destroy (vars_map);
50674e96
DN
6913
6914 /* Rewire the entry and exit blocks. The successor to the entry
6915 block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
6916 the child function. Similarly, the predecessor of DEST_FN's
6917 EXIT_BLOCK_PTR turns into the predecessor of EXIT_BLOCK_PTR. We
6918 need to switch CFUN between DEST_CFUN and SAVED_CFUN so that the
6919 various CFG manipulation function get to the right CFG.
6920
6921 FIXME, this is silly. The CFG ought to become a parameter to
6922 these helpers. */
917948d3 6923 push_cfun (dest_cfun);
fefa31b5 6924 make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), entry_bb, EDGE_FALLTHRU);
2aee3e57 6925 if (exit_bb)
fefa31b5 6926 make_edge (exit_bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
917948d3 6927 pop_cfun ();
50674e96
DN
6928
6929 /* Back in the original function, the SESE region has disappeared,
6930 create a new basic block in its place. */
6931 bb = create_empty_bb (entry_pred[0]);
5f40b3cb
ZD
6932 if (current_loops)
6933 add_bb_to_loop (bb, loop);
50674e96 6934 for (i = 0; i < num_entry_edges; i++)
917948d3
ZD
6935 {
6936 e = make_edge (entry_pred[i], bb, entry_flag[i]);
6937 e->probability = entry_prob[i];
6938 }
50674e96
DN
6939
6940 for (i = 0; i < num_exit_edges; i++)
917948d3
ZD
6941 {
6942 e = make_edge (bb, exit_succ[i], exit_flag[i]);
6943 e->probability = exit_prob[i];
6944 }
6945
6946 set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
9771b263 6947 FOR_EACH_VEC_ELT (dom_bbs, i, abb)
917948d3 6948 set_immediate_dominator (CDI_DOMINATORS, abb, bb);
9771b263 6949 dom_bbs.release ();
50674e96 6950
2aee3e57
JJ
6951 if (exit_bb)
6952 {
917948d3 6953 free (exit_prob);
2aee3e57
JJ
6954 free (exit_flag);
6955 free (exit_succ);
6956 }
917948d3 6957 free (entry_prob);
50674e96
DN
6958 free (entry_flag);
6959 free (entry_pred);
9771b263 6960 bbs.release ();
50674e96
DN
6961
6962 return bb;
6963}
6964
84d65814 6965
398b1daa 6966/* Dump FUNCTION_DECL FN to file FILE using FLAGS (see TDF_* in dumpfile.h)
726a989a 6967 */
6de9cd9a
DN
6968
6969void
2eb712b4 6970dump_function_to_file (tree fndecl, FILE *file, int flags)
6de9cd9a 6971{
2eb712b4 6972 tree arg, var, old_current_fndecl = current_function_decl;
459ffad3 6973 struct function *dsf;
6de9cd9a
DN
6974 bool ignore_topmost_bind = false, any_var = false;
6975 basic_block bb;
6976 tree chain;
2eb712b4
MJ
6977 bool tmclone = (TREE_CODE (fndecl) == FUNCTION_DECL
6978 && decl_is_tm_clone (fndecl));
6979 struct function *fun = DECL_STRUCT_FUNCTION (fndecl);
6531d1be 6980
2eb712b4
MJ
6981 current_function_decl = fndecl;
6982 fprintf (file, "%s %s(", function_name (fun), tmclone ? "[tm-clone] " : "");
6de9cd9a 6983
2eb712b4 6984 arg = DECL_ARGUMENTS (fndecl);
6de9cd9a
DN
6985 while (arg)
6986 {
2f9ea521
RG
6987 print_generic_expr (file, TREE_TYPE (arg), dump_flags);
6988 fprintf (file, " ");
6de9cd9a 6989 print_generic_expr (file, arg, dump_flags);
3e894af1
KZ
6990 if (flags & TDF_VERBOSE)
6991 print_node (file, "", arg, 4);
910ad8de 6992 if (DECL_CHAIN (arg))
6de9cd9a 6993 fprintf (file, ", ");
910ad8de 6994 arg = DECL_CHAIN (arg);
6de9cd9a
DN
6995 }
6996 fprintf (file, ")\n");
6997
3e894af1 6998 if (flags & TDF_VERBOSE)
2eb712b4 6999 print_node (file, "", fndecl, 2);
3e894af1 7000
2eb712b4 7001 dsf = DECL_STRUCT_FUNCTION (fndecl);
feb4e5ba 7002 if (dsf && (flags & TDF_EH))
459ffad3
EB
7003 dump_eh_tree (file, dsf);
7004
2eb712b4 7005 if (flags & TDF_RAW && !gimple_has_body_p (fndecl))
6de9cd9a 7006 {
2eb712b4
MJ
7007 dump_node (fndecl, TDF_SLIM | flags, file);
7008 current_function_decl = old_current_fndecl;
6de9cd9a
DN
7009 return;
7010 }
7011
7012 /* When GIMPLE is lowered, the variables are no longer available in
7013 BIND_EXPRs, so display them separately. */
2eb712b4 7014 if (fun && fun->decl == fndecl && (fun->curr_properties & PROP_gimple_lcf))
6de9cd9a 7015 {
c021f10b 7016 unsigned ix;
6de9cd9a
DN
7017 ignore_topmost_bind = true;
7018
7019 fprintf (file, "{\n");
9771b263 7020 if (!vec_safe_is_empty (fun->local_decls))
2eb712b4 7021 FOR_EACH_LOCAL_DECL (fun, ix, var)
e28b8a60
RG
7022 {
7023 print_generic_decl (file, var, flags);
7024 if (flags & TDF_VERBOSE)
7025 print_node (file, "", var, 4);
7026 fprintf (file, "\n");
6de9cd9a 7027
e28b8a60
RG
7028 any_var = true;
7029 }
70b5e7dc
RG
7030 if (gimple_in_ssa_p (cfun))
7031 for (ix = 1; ix < num_ssa_names; ++ix)
7032 {
7033 tree name = ssa_name (ix);
7034 if (name && !SSA_NAME_VAR (name))
7035 {
7036 fprintf (file, " ");
7037 print_generic_expr (file, TREE_TYPE (name), flags);
7038 fprintf (file, " ");
7039 print_generic_expr (file, name, flags);
7040 fprintf (file, ";\n");
e28b8a60
RG
7041
7042 any_var = true;
70b5e7dc
RG
7043 }
7044 }
6de9cd9a
DN
7045 }
7046
9771b263
DN
7047 if (fun && fun->decl == fndecl
7048 && fun->cfg
2eb712b4 7049 && basic_block_info_for_function (fun))
6de9cd9a 7050 {
726a989a 7051 /* If the CFG has been built, emit a CFG-based dump. */
6de9cd9a
DN
7052 if (!ignore_topmost_bind)
7053 fprintf (file, "{\n");
7054
0cae8d31 7055 if (any_var && n_basic_blocks_for_fn (fun))
6de9cd9a
DN
7056 fprintf (file, "\n");
7057
2eb712b4 7058 FOR_EACH_BB_FN (bb, fun)
c4669594 7059 dump_bb (file, bb, 2, flags | TDF_COMMENT);
6531d1be 7060
6de9cd9a
DN
7061 fprintf (file, "}\n");
7062 }
2eb712b4 7063 else if (DECL_SAVED_TREE (fndecl) == NULL)
726a989a
RB
7064 {
7065 /* The function is now in GIMPLE form but the CFG has not been
7066 built yet. Emit the single sequence of GIMPLE statements
7067 that make up its body. */
2eb712b4 7068 gimple_seq body = gimple_body (fndecl);
726a989a
RB
7069
7070 if (gimple_seq_first_stmt (body)
7071 && gimple_seq_first_stmt (body) == gimple_seq_last_stmt (body)
7072 && gimple_code (gimple_seq_first_stmt (body)) == GIMPLE_BIND)
7073 print_gimple_seq (file, body, 0, flags);
7074 else
7075 {
7076 if (!ignore_topmost_bind)
7077 fprintf (file, "{\n");
7078
7079 if (any_var)
7080 fprintf (file, "\n");
7081
7082 print_gimple_seq (file, body, 2, flags);
7083 fprintf (file, "}\n");
7084 }
7085 }
6de9cd9a
DN
7086 else
7087 {
7088 int indent;
7089
7090 /* Make a tree based dump. */
2eb712b4 7091 chain = DECL_SAVED_TREE (fndecl);
953ff289 7092 if (chain && TREE_CODE (chain) == BIND_EXPR)
6de9cd9a
DN
7093 {
7094 if (ignore_topmost_bind)
7095 {
7096 chain = BIND_EXPR_BODY (chain);
7097 indent = 2;
7098 }
7099 else
7100 indent = 0;
7101 }
7102 else
7103 {
7104 if (!ignore_topmost_bind)
7105 fprintf (file, "{\n");
7106 indent = 2;
7107 }
7108
7109 if (any_var)
7110 fprintf (file, "\n");
7111
7112 print_generic_stmt_indented (file, chain, flags, indent);
7113 if (ignore_topmost_bind)
7114 fprintf (file, "}\n");
7115 }
7116
c31c32f9
JR
7117 if (flags & TDF_ENUMERATE_LOCALS)
7118 dump_enumerated_decls (file, flags);
6de9cd9a 7119 fprintf (file, "\n\n");
953ff289 7120
2eb712b4 7121 current_function_decl = old_current_fndecl;
953ff289
DN
7122}
7123
953ff289
DN
7124/* Dump FUNCTION_DECL FN to stderr using FLAGS (see TDF_* in tree.h) */
7125
24e47c76 7126DEBUG_FUNCTION void
953ff289
DN
7127debug_function (tree fn, int flags)
7128{
7129 dump_function_to_file (fn, stderr, flags);
6de9cd9a
DN
7130}
7131
7132
d7770457 7133/* Print on FILE the indexes for the predecessors of basic_block BB. */
6de9cd9a
DN
7134
7135static void
628f6a4e 7136print_pred_bbs (FILE *file, basic_block bb)
6de9cd9a 7137{
628f6a4e
BE
7138 edge e;
7139 edge_iterator ei;
7140
7141 FOR_EACH_EDGE (e, ei, bb->preds)
d7770457 7142 fprintf (file, "bb_%d ", e->src->index);
6de9cd9a
DN
7143}
7144
7145
d7770457 7146/* Print on FILE the indexes for the successors of basic_block BB. */
6de9cd9a
DN
7147
7148static void
628f6a4e 7149print_succ_bbs (FILE *file, basic_block bb)
6de9cd9a 7150{
628f6a4e
BE
7151 edge e;
7152 edge_iterator ei;
7153
7154 FOR_EACH_EDGE (e, ei, bb->succs)
d7770457 7155 fprintf (file, "bb_%d ", e->dest->index);
6de9cd9a
DN
7156}
7157
0c8efed8
SP
7158/* Print to FILE the basic block BB following the VERBOSITY level. */
7159
b8698a0f 7160void
0c8efed8
SP
7161print_loops_bb (FILE *file, basic_block bb, int indent, int verbosity)
7162{
7163 char *s_indent = (char *) alloca ((size_t) indent + 1);
7164 memset ((void *) s_indent, ' ', (size_t) indent);
7165 s_indent[indent] = '\0';
7166
7167 /* Print basic_block's header. */
7168 if (verbosity >= 2)
7169 {
7170 fprintf (file, "%s bb_%d (preds = {", s_indent, bb->index);
7171 print_pred_bbs (file, bb);
7172 fprintf (file, "}, succs = {");
7173 print_succ_bbs (file, bb);
7174 fprintf (file, "})\n");
7175 }
7176
7177 /* Print basic_block's body. */
7178 if (verbosity >= 3)
7179 {
7180 fprintf (file, "%s {\n", s_indent);
c4669594 7181 dump_bb (file, bb, indent + 4, TDF_VOPS|TDF_MEMSYMS);
0c8efed8
SP
7182 fprintf (file, "%s }\n", s_indent);
7183 }
7184}
7185
7186static void print_loop_and_siblings (FILE *, struct loop *, int, int);
6de9cd9a 7187
0c8efed8
SP
7188/* Pretty print LOOP on FILE, indented INDENT spaces. Following
7189 VERBOSITY level this outputs the contents of the loop, or just its
7190 structure. */
6de9cd9a
DN
7191
7192static void
0c8efed8 7193print_loop (FILE *file, struct loop *loop, int indent, int verbosity)
6de9cd9a
DN
7194{
7195 char *s_indent;
7196 basic_block bb;
6531d1be 7197
6de9cd9a
DN
7198 if (loop == NULL)
7199 return;
7200
7201 s_indent = (char *) alloca ((size_t) indent + 1);
7202 memset ((void *) s_indent, ' ', (size_t) indent);
7203 s_indent[indent] = '\0';
7204
0c8efed8 7205 /* Print loop's header. */
755a1ca5
RG
7206 fprintf (file, "%sloop_%d (", s_indent, loop->num);
7207 if (loop->header)
7208 fprintf (file, "header = %d", loop->header->index);
7209 else
7210 {
7211 fprintf (file, "deleted)\n");
7212 return;
7213 }
7214 if (loop->latch)
7215 fprintf (file, ", latch = %d", loop->latch->index);
7216 else
7217 fprintf (file, ", multiple latches");
0c8efed8
SP
7218 fprintf (file, ", niter = ");
7219 print_generic_expr (file, loop->nb_iterations, 0);
6531d1be 7220
0c8efed8
SP
7221 if (loop->any_upper_bound)
7222 {
7223 fprintf (file, ", upper_bound = ");
7224 dump_double_int (file, loop->nb_iterations_upper_bound, true);
7225 }
6531d1be 7226
0c8efed8
SP
7227 if (loop->any_estimate)
7228 {
7229 fprintf (file, ", estimate = ");
7230 dump_double_int (file, loop->nb_iterations_estimate, true);
7231 }
7232 fprintf (file, ")\n");
7233
7234 /* Print loop's body. */
7235 if (verbosity >= 1)
7236 {
7237 fprintf (file, "%s{\n", s_indent);
7238 FOR_EACH_BB (bb)
7239 if (bb->loop_father == loop)
7240 print_loops_bb (file, bb, indent, verbosity);
7241
7242 print_loop_and_siblings (file, loop->inner, indent + 2, verbosity);
7243 fprintf (file, "%s}\n", s_indent);
7244 }
6de9cd9a
DN
7245}
7246
0c8efed8
SP
7247/* Print the LOOP and its sibling loops on FILE, indented INDENT
7248 spaces. Following VERBOSITY level this outputs the contents of the
7249 loop, or just its structure. */
7250
7251static void
7b3b6ae4
LC
7252print_loop_and_siblings (FILE *file, struct loop *loop, int indent,
7253 int verbosity)
0c8efed8
SP
7254{
7255 if (loop == NULL)
7256 return;
7257
7258 print_loop (file, loop, indent, verbosity);
7259 print_loop_and_siblings (file, loop->next, indent, verbosity);
7260}
6de9cd9a
DN
7261
7262/* Follow a CFG edge from the entry point of the program, and on entry
7263 of a loop, pretty print the loop structure on FILE. */
7264
6531d1be 7265void
0c8efed8 7266print_loops (FILE *file, int verbosity)
6de9cd9a
DN
7267{
7268 basic_block bb;
6531d1be 7269
fefa31b5 7270 bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
6de9cd9a 7271 if (bb && bb->loop_father)
0c8efed8 7272 print_loop_and_siblings (file, bb->loop_father, 0, verbosity);
6de9cd9a
DN
7273}
7274
7b3b6ae4
LC
7275/* Dump a loop. */
7276
7277DEBUG_FUNCTION void
7278debug (struct loop &ref)
7279{
7280 print_loop (stderr, &ref, 0, /*verbosity*/0);
7281}
7282
7283DEBUG_FUNCTION void
7284debug (struct loop *ptr)
7285{
7286 if (ptr)
7287 debug (*ptr);
7288 else
7289 fprintf (stderr, "<nil>\n");
7290}
7291
7292/* Dump a loop verbosely. */
7293
7294DEBUG_FUNCTION void
7295debug_verbose (struct loop &ref)
7296{
7297 print_loop (stderr, &ref, 0, /*verbosity*/3);
7298}
7299
7300DEBUG_FUNCTION void
7301debug_verbose (struct loop *ptr)
7302{
7303 if (ptr)
7304 debug (*ptr);
7305 else
7306 fprintf (stderr, "<nil>\n");
7307}
7308
6de9cd9a 7309
0c8efed8
SP
7310/* Debugging loops structure at tree level, at some VERBOSITY level. */
7311
24e47c76 7312DEBUG_FUNCTION void
0c8efed8
SP
7313debug_loops (int verbosity)
7314{
7315 print_loops (stderr, verbosity);
7316}
7317
7318/* Print on stderr the code of LOOP, at some VERBOSITY level. */
6de9cd9a 7319
24e47c76 7320DEBUG_FUNCTION void
0c8efed8 7321debug_loop (struct loop *loop, int verbosity)
6de9cd9a 7322{
0c8efed8 7323 print_loop (stderr, loop, 0, verbosity);
6de9cd9a
DN
7324}
7325
0c8efed8
SP
7326/* Print on stderr the code of loop number NUM, at some VERBOSITY
7327 level. */
7328
24e47c76 7329DEBUG_FUNCTION void
0c8efed8
SP
7330debug_loop_num (unsigned num, int verbosity)
7331{
0fc822d0 7332 debug_loop (get_loop (cfun, num), verbosity);
0c8efed8 7333}
6de9cd9a
DN
7334
7335/* Return true if BB ends with a call, possibly followed by some
7336 instructions that must stay with the call. Return false,
7337 otherwise. */
7338
7339static bool
726a989a 7340gimple_block_ends_with_call_p (basic_block bb)
6de9cd9a 7341{
b5b8b0ac 7342 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
7dd536f1 7343 return !gsi_end_p (gsi) && is_gimple_call (gsi_stmt (gsi));
6de9cd9a
DN
7344}
7345
7346
7347/* Return true if BB ends with a conditional branch. Return false,
7348 otherwise. */
7349
7350static bool
726a989a 7351gimple_block_ends_with_condjump_p (const_basic_block bb)
6de9cd9a 7352{
726a989a
RB
7353 gimple stmt = last_stmt (CONST_CAST_BB (bb));
7354 return (stmt && gimple_code (stmt) == GIMPLE_COND);
6de9cd9a
DN
7355}
7356
7357
7358/* Return true if we need to add fake edge to exit at statement T.
726a989a 7359 Helper function for gimple_flow_call_edges_add. */
6de9cd9a
DN
7360
7361static bool
726a989a 7362need_fake_edge_p (gimple t)
6de9cd9a 7363{
726a989a
RB
7364 tree fndecl = NULL_TREE;
7365 int call_flags = 0;
6de9cd9a
DN
7366
7367 /* NORETURN and LONGJMP calls already have an edge to exit.
321cf1f2 7368 CONST and PURE calls do not need one.
6de9cd9a
DN
7369 We don't currently check for CONST and PURE here, although
7370 it would be a good idea, because those attributes are
7371 figured out from the RTL in mark_constant_function, and
7372 the counter incrementation code from -fprofile-arcs
7373 leads to different results from -fbranch-probabilities. */
726a989a 7374 if (is_gimple_call (t))
23ef6d21 7375 {
726a989a
RB
7376 fndecl = gimple_call_fndecl (t);
7377 call_flags = gimple_call_flags (t);
23ef6d21
BE
7378 }
7379
726a989a
RB
7380 if (is_gimple_call (t)
7381 && fndecl
7382 && DECL_BUILT_IN (fndecl)
23ef6d21 7383 && (call_flags & ECF_NOTHROW)
3cfa762b
RG
7384 && !(call_flags & ECF_RETURNS_TWICE)
7385 /* fork() doesn't really return twice, but the effect of
7386 wrapping it in __gcov_fork() which calls __gcov_flush()
7387 and clears the counters before forking has the same
7388 effect as returning twice. Force a fake edge. */
7389 && !(DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
7390 && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FORK))
7391 return false;
23ef6d21 7392
bfeb0869
JJ
7393 if (is_gimple_call (t))
7394 {
7395 edge_iterator ei;
7396 edge e;
7397 basic_block bb;
7398
7399 if (!(call_flags & ECF_NORETURN))
7400 return true;
7401
7402 bb = gimple_bb (t);
7403 FOR_EACH_EDGE (e, ei, bb->succs)
7404 if ((e->flags & EDGE_FAKE) == 0)
7405 return true;
7406 }
6de9cd9a 7407
e0c68ce9 7408 if (gimple_code (t) == GIMPLE_ASM
726a989a 7409 && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
6de9cd9a
DN
7410 return true;
7411
7412 return false;
7413}
7414
7415
7416/* Add fake edges to the function exit for any non constant and non
bfeb0869
JJ
7417 noreturn calls (or noreturn calls with EH/abnormal edges),
7418 volatile inline assembly in the bitmap of blocks specified by BLOCKS
7419 or to the whole CFG if BLOCKS is zero. Return the number of blocks
7420 that were split.
6de9cd9a
DN
7421
7422 The goal is to expose cases in which entering a basic block does
7423 not imply that all subsequent instructions must be executed. */
7424
7425static int
726a989a 7426gimple_flow_call_edges_add (sbitmap blocks)
6de9cd9a
DN
7427{
7428 int i;
7429 int blocks_split = 0;
7430 int last_bb = last_basic_block;
7431 bool check_last_block = false;
7432
0cae8d31 7433 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
6de9cd9a
DN
7434 return 0;
7435
7436 if (! blocks)
7437 check_last_block = true;
7438 else
fefa31b5
DM
7439 check_last_block = bitmap_bit_p (blocks,
7440 EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb->index);
6de9cd9a
DN
7441
7442 /* In the last basic block, before epilogue generation, there will be
7443 a fallthru edge to EXIT. Special care is required if the last insn
7444 of the last basic block is a call because make_edge folds duplicate
7445 edges, which would result in the fallthru edge also being marked
7446 fake, which would result in the fallthru edge being removed by
7447 remove_fake_edges, which would result in an invalid CFG.
7448
7449 Moreover, we can't elide the outgoing fake edge, since the block
7450 profiler needs to take this into account in order to solve the minimal
7451 spanning tree in the case that the call doesn't return.
7452
7453 Handle this by adding a dummy instruction in a new last basic block. */
7454 if (check_last_block)
7455 {
fefa31b5 7456 basic_block bb = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
f6f2ca8f 7457 gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
726a989a
RB
7458 gimple t = NULL;
7459
7460 if (!gsi_end_p (gsi))
7461 t = gsi_stmt (gsi);
6de9cd9a 7462
6a60530d 7463 if (t && need_fake_edge_p (t))
6de9cd9a
DN
7464 {
7465 edge e;
7466
fefa31b5 7467 e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
9ff3d2de
JL
7468 if (e)
7469 {
726a989a
RB
7470 gsi_insert_on_edge (e, gimple_build_nop ());
7471 gsi_commit_edge_inserts ();
9ff3d2de 7472 }
6de9cd9a
DN
7473 }
7474 }
7475
7476 /* Now add fake edges to the function exit for any non constant
7477 calls since there is no way that we can determine if they will
7478 return or not... */
7479 for (i = 0; i < last_bb; i++)
7480 {
7481 basic_block bb = BASIC_BLOCK (i);
726a989a
RB
7482 gimple_stmt_iterator gsi;
7483 gimple stmt, last_stmt;
6de9cd9a
DN
7484
7485 if (!bb)
7486 continue;
7487
d7c028c0 7488 if (blocks && !bitmap_bit_p (blocks, i))
6de9cd9a
DN
7489 continue;
7490
f6f2ca8f 7491 gsi = gsi_last_nondebug_bb (bb);
726a989a 7492 if (!gsi_end_p (gsi))
6de9cd9a 7493 {
726a989a 7494 last_stmt = gsi_stmt (gsi);
6de9cd9a
DN
7495 do
7496 {
726a989a 7497 stmt = gsi_stmt (gsi);
6de9cd9a
DN
7498 if (need_fake_edge_p (stmt))
7499 {
7500 edge e;
726a989a 7501
6de9cd9a
DN
7502 /* The handling above of the final block before the
7503 epilogue should be enough to verify that there is
7504 no edge to the exit block in CFG already.
7505 Calling make_edge in such case would cause us to
7506 mark that edge as fake and remove it later. */
7507#ifdef ENABLE_CHECKING
7508 if (stmt == last_stmt)
628f6a4e 7509 {
fefa31b5 7510 e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
9ff3d2de 7511 gcc_assert (e == NULL);
628f6a4e 7512 }
6de9cd9a
DN
7513#endif
7514
7515 /* Note that the following may create a new basic block
7516 and renumber the existing basic blocks. */
7517 if (stmt != last_stmt)
7518 {
7519 e = split_block (bb, stmt);
7520 if (e)
7521 blocks_split++;
7522 }
fefa31b5 7523 make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE);
6de9cd9a 7524 }
726a989a 7525 gsi_prev (&gsi);
6de9cd9a 7526 }
726a989a 7527 while (!gsi_end_p (gsi));
6de9cd9a
DN
7528 }
7529 }
7530
7531 if (blocks_split)
7532 verify_flow_info ();
7533
7534 return blocks_split;
7535}
7536
672987e8
ZD
7537/* Removes edge E and all the blocks dominated by it, and updates dominance
7538 information. The IL in E->src needs to be updated separately.
7539 If dominance info is not available, only the edge E is removed.*/
7540
7541void
7542remove_edge_and_dominated_blocks (edge e)
7543{
6e1aa848
DN
7544 vec<basic_block> bbs_to_remove = vNULL;
7545 vec<basic_block> bbs_to_fix_dom = vNULL;
672987e8
ZD
7546 bitmap df, df_idom;
7547 edge f;
7548 edge_iterator ei;
7549 bool none_removed = false;
7550 unsigned i;
7551 basic_block bb, dbb;
7552 bitmap_iterator bi;
7553
2b28c07a 7554 if (!dom_info_available_p (CDI_DOMINATORS))
672987e8
ZD
7555 {
7556 remove_edge (e);
7557 return;
7558 }
7559
7560 /* No updating is needed for edges to exit. */
fefa31b5 7561 if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
672987e8
ZD
7562 {
7563 if (cfgcleanup_altered_bbs)
7564 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
7565 remove_edge (e);
7566 return;
7567 }
7568
7569 /* First, we find the basic blocks to remove. If E->dest has a predecessor
7570 that is not dominated by E->dest, then this set is empty. Otherwise,
7571 all the basic blocks dominated by E->dest are removed.
7572
7573 Also, to DF_IDOM we store the immediate dominators of the blocks in
7574 the dominance frontier of E (i.e., of the successors of the
7575 removed blocks, if there are any, and of E->dest otherwise). */
7576 FOR_EACH_EDGE (f, ei, e->dest->preds)
7577 {
7578 if (f == e)
7579 continue;
7580
7581 if (!dominated_by_p (CDI_DOMINATORS, f->src, e->dest))
7582 {
7583 none_removed = true;
7584 break;
7585 }
7586 }
7587
7588 df = BITMAP_ALLOC (NULL);
7589 df_idom = BITMAP_ALLOC (NULL);
7590
7591 if (none_removed)
7592 bitmap_set_bit (df_idom,
7593 get_immediate_dominator (CDI_DOMINATORS, e->dest)->index);
7594 else
7595 {
438c239d 7596 bbs_to_remove = get_all_dominated_blocks (CDI_DOMINATORS, e->dest);
9771b263 7597 FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
672987e8
ZD
7598 {
7599 FOR_EACH_EDGE (f, ei, bb->succs)
7600 {
fefa31b5 7601 if (f->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
672987e8
ZD
7602 bitmap_set_bit (df, f->dest->index);
7603 }
7604 }
9771b263 7605 FOR_EACH_VEC_ELT (bbs_to_remove, i, bb)
672987e8
ZD
7606 bitmap_clear_bit (df, bb->index);
7607
7608 EXECUTE_IF_SET_IN_BITMAP (df, 0, i, bi)
7609 {
7610 bb = BASIC_BLOCK (i);
7611 bitmap_set_bit (df_idom,
7612 get_immediate_dominator (CDI_DOMINATORS, bb)->index);
7613 }
7614 }
7615
7616 if (cfgcleanup_altered_bbs)
7617 {
7618 /* Record the set of the altered basic blocks. */
7619 bitmap_set_bit (cfgcleanup_altered_bbs, e->src->index);
7620 bitmap_ior_into (cfgcleanup_altered_bbs, df);
7621 }
7622
7623 /* Remove E and the cancelled blocks. */
7624 if (none_removed)
7625 remove_edge (e);
7626 else
7627 {
b5b8b0ac
AO
7628 /* Walk backwards so as to get a chance to substitute all
7629 released DEFs into debug stmts. See
7630 eliminate_unnecessary_stmts() in tree-ssa-dce.c for more
7631 details. */
9771b263
DN
7632 for (i = bbs_to_remove.length (); i-- > 0; )
7633 delete_basic_block (bbs_to_remove[i]);
672987e8
ZD
7634 }
7635
7636 /* Update the dominance information. The immediate dominator may change only
7637 for blocks whose immediate dominator belongs to DF_IDOM:
b8698a0f 7638
672987e8
ZD
7639 Suppose that idom(X) = Y before removal of E and idom(X) != Y after the
7640 removal. Let Z the arbitrary block such that idom(Z) = Y and
7641 Z dominates X after the removal. Before removal, there exists a path P
7642 from Y to X that avoids Z. Let F be the last edge on P that is
7643 removed, and let W = F->dest. Before removal, idom(W) = Y (since Y
7644 dominates W, and because of P, Z does not dominate W), and W belongs to
b8698a0f 7645 the dominance frontier of E. Therefore, Y belongs to DF_IDOM. */
672987e8
ZD
7646 EXECUTE_IF_SET_IN_BITMAP (df_idom, 0, i, bi)
7647 {
7648 bb = BASIC_BLOCK (i);
7649 for (dbb = first_dom_son (CDI_DOMINATORS, bb);
7650 dbb;
7651 dbb = next_dom_son (CDI_DOMINATORS, dbb))
9771b263 7652 bbs_to_fix_dom.safe_push (dbb);
672987e8
ZD
7653 }
7654
66f97d31 7655 iterate_fix_dominators (CDI_DOMINATORS, bbs_to_fix_dom, true);
672987e8
ZD
7656
7657 BITMAP_FREE (df);
7658 BITMAP_FREE (df_idom);
9771b263
DN
7659 bbs_to_remove.release ();
7660 bbs_to_fix_dom.release ();
672987e8
ZD
7661}
7662
4f6c2131
EB
7663/* Purge dead EH edges from basic block BB. */
7664
1eaba2f2 7665bool
726a989a 7666gimple_purge_dead_eh_edges (basic_block bb)
1eaba2f2
RH
7667{
7668 bool changed = false;
628f6a4e
BE
7669 edge e;
7670 edge_iterator ei;
726a989a 7671 gimple stmt = last_stmt (bb);
1eaba2f2 7672
726a989a 7673 if (stmt && stmt_can_throw_internal (stmt))
1eaba2f2
RH
7674 return false;
7675
628f6a4e 7676 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
1eaba2f2 7677 {
1eaba2f2
RH
7678 if (e->flags & EDGE_EH)
7679 {
672987e8 7680 remove_edge_and_dominated_blocks (e);
1eaba2f2
RH
7681 changed = true;
7682 }
628f6a4e
BE
7683 else
7684 ei_next (&ei);
1eaba2f2
RH
7685 }
7686
7687 return changed;
7688}
7689
30fd5881
EB
7690/* Purge dead EH edges from basic block listed in BLOCKS. */
7691
1eaba2f2 7692bool
726a989a 7693gimple_purge_all_dead_eh_edges (const_bitmap blocks)
1eaba2f2
RH
7694{
7695 bool changed = false;
3cd8c58a 7696 unsigned i;
87c476a2 7697 bitmap_iterator bi;
1eaba2f2 7698
87c476a2
ZD
7699 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
7700 {
833ee764
JJ
7701 basic_block bb = BASIC_BLOCK (i);
7702
7703 /* Earlier gimple_purge_dead_eh_edges could have removed
7704 this basic block already. */
7705 gcc_assert (bb || changed);
7706 if (bb != NULL)
7707 changed |= gimple_purge_dead_eh_edges (bb);
87c476a2 7708 }
1eaba2f2
RH
7709
7710 return changed;
7711}
6de9cd9a 7712
30fd5881
EB
7713/* Purge dead abnormal call edges from basic block BB. */
7714
7715bool
7716gimple_purge_dead_abnormal_call_edges (basic_block bb)
7717{
7718 bool changed = false;
7719 edge e;
7720 edge_iterator ei;
7721 gimple stmt = last_stmt (bb);
7722
f6b64c35
RB
7723 if (!cfun->has_nonlocal_label
7724 && !cfun->calls_setjmp)
30fd5881
EB
7725 return false;
7726
7727 if (stmt && stmt_can_make_abnormal_goto (stmt))
7728 return false;
7729
7730 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
7731 {
7732 if (e->flags & EDGE_ABNORMAL)
7733 {
0107dca2
RB
7734 if (e->flags & EDGE_FALLTHRU)
7735 e->flags &= ~EDGE_ABNORMAL;
7736 else
7737 remove_edge_and_dominated_blocks (e);
30fd5881
EB
7738 changed = true;
7739 }
7740 else
7741 ei_next (&ei);
7742 }
7743
7744 return changed;
7745}
7746
7747/* Purge dead abnormal call edges from basic block listed in BLOCKS. */
7748
7749bool
7750gimple_purge_all_dead_abnormal_call_edges (const_bitmap blocks)
7751{
7752 bool changed = false;
7753 unsigned i;
7754 bitmap_iterator bi;
7755
7756 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
7757 {
7758 basic_block bb = BASIC_BLOCK (i);
7759
7760 /* Earlier gimple_purge_dead_abnormal_call_edges could have removed
7761 this basic block already. */
7762 gcc_assert (bb || changed);
7763 if (bb != NULL)
7764 changed |= gimple_purge_dead_abnormal_call_edges (bb);
7765 }
7766
7767 return changed;
7768}
7769
a100ac1e
KH
7770/* This function is called whenever a new edge is created or
7771 redirected. */
7772
7773static void
726a989a 7774gimple_execute_on_growing_pred (edge e)
a100ac1e
KH
7775{
7776 basic_block bb = e->dest;
7777
8eacd016 7778 if (!gimple_seq_empty_p (phi_nodes (bb)))
a100ac1e
KH
7779 reserve_phi_args_for_new_edge (bb);
7780}
7781
e51546f8
KH
7782/* This function is called immediately before edge E is removed from
7783 the edge vector E->dest->preds. */
7784
7785static void
726a989a 7786gimple_execute_on_shrinking_pred (edge e)
e51546f8 7787{
8eacd016 7788 if (!gimple_seq_empty_p (phi_nodes (e->dest)))
e51546f8
KH
7789 remove_phi_args (e);
7790}
7791
1cb7dfc3
MH
7792/*---------------------------------------------------------------------------
7793 Helper functions for Loop versioning
7794 ---------------------------------------------------------------------------*/
7795
7796/* Adjust phi nodes for 'first' basic block. 'second' basic block is a copy
7797 of 'first'. Both of them are dominated by 'new_head' basic block. When
7798 'new_head' was created by 'second's incoming edge it received phi arguments
7799 on the edge by split_edge(). Later, additional edge 'e' was created to
6531d1be
BF
7800 connect 'new_head' and 'first'. Now this routine adds phi args on this
7801 additional edge 'e' that new_head to second edge received as part of edge
726a989a 7802 splitting. */
1cb7dfc3
MH
7803
7804static void
726a989a
RB
7805gimple_lv_adjust_loop_header_phi (basic_block first, basic_block second,
7806 basic_block new_head, edge e)
1cb7dfc3 7807{
726a989a
RB
7808 gimple phi1, phi2;
7809 gimple_stmt_iterator psi1, psi2;
7810 tree def;
d0e12fc6
KH
7811 edge e2 = find_edge (new_head, second);
7812
7813 /* Because NEW_HEAD has been created by splitting SECOND's incoming
7814 edge, we should always have an edge from NEW_HEAD to SECOND. */
7815 gcc_assert (e2 != NULL);
1cb7dfc3
MH
7816
7817 /* Browse all 'second' basic block phi nodes and add phi args to
7818 edge 'e' for 'first' head. PHI args are always in correct order. */
7819
726a989a
RB
7820 for (psi2 = gsi_start_phis (second),
7821 psi1 = gsi_start_phis (first);
7822 !gsi_end_p (psi2) && !gsi_end_p (psi1);
7823 gsi_next (&psi2), gsi_next (&psi1))
1cb7dfc3 7824 {
726a989a
RB
7825 phi1 = gsi_stmt (psi1);
7826 phi2 = gsi_stmt (psi2);
7827 def = PHI_ARG_DEF (phi2, e2->dest_idx);
9e227d60 7828 add_phi_arg (phi1, def, e, gimple_phi_arg_location_from_edge (phi2, e2));
1cb7dfc3
MH
7829 }
7830}
7831
726a989a 7832
6531d1be
BF
7833/* Adds a if else statement to COND_BB with condition COND_EXPR.
7834 SECOND_HEAD is the destination of the THEN and FIRST_HEAD is
1cb7dfc3 7835 the destination of the ELSE part. */
726a989a 7836
1cb7dfc3 7837static void
726a989a
RB
7838gimple_lv_add_condition_to_bb (basic_block first_head ATTRIBUTE_UNUSED,
7839 basic_block second_head ATTRIBUTE_UNUSED,
7840 basic_block cond_bb, void *cond_e)
1cb7dfc3 7841{
726a989a
RB
7842 gimple_stmt_iterator gsi;
7843 gimple new_cond_expr;
1cb7dfc3
MH
7844 tree cond_expr = (tree) cond_e;
7845 edge e0;
7846
7847 /* Build new conditional expr */
726a989a
RB
7848 new_cond_expr = gimple_build_cond_from_tree (cond_expr,
7849 NULL_TREE, NULL_TREE);
1cb7dfc3 7850
6531d1be 7851 /* Add new cond in cond_bb. */
726a989a
RB
7852 gsi = gsi_last_bb (cond_bb);
7853 gsi_insert_after (&gsi, new_cond_expr, GSI_NEW_STMT);
7854
1cb7dfc3
MH
7855 /* Adjust edges appropriately to connect new head with first head
7856 as well as second head. */
7857 e0 = single_succ_edge (cond_bb);
7858 e0->flags &= ~EDGE_FALLTHRU;
7859 e0->flags |= EDGE_FALSE_VALUE;
7860}
7861
aa4723d7
SB
7862
7863/* Do book-keeping of basic block BB for the profile consistency checker.
7864 If AFTER_PASS is 0, do pre-pass accounting, or if AFTER_PASS is 1
7865 then do post-pass accounting. Store the counting in RECORD. */
7866static void
7867gimple_account_profile_record (basic_block bb, int after_pass,
7868 struct profile_record *record)
7869{
7870 gimple_stmt_iterator i;
7871 for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
7872 {
7873 record->size[after_pass]
7874 += estimate_num_insns (gsi_stmt (i), &eni_size_weights);
7875 if (profile_status == PROFILE_READ)
7876 record->time[after_pass]
7877 += estimate_num_insns (gsi_stmt (i),
7878 &eni_time_weights) * bb->count;
7879 else if (profile_status == PROFILE_GUESSED)
7880 record->time[after_pass]
7881 += estimate_num_insns (gsi_stmt (i),
7882 &eni_time_weights) * bb->frequency;
7883 }
7884}
7885
726a989a
RB
7886struct cfg_hooks gimple_cfg_hooks = {
7887 "gimple",
7888 gimple_verify_flow_info,
7889 gimple_dump_bb, /* dump_bb */
2c895bd1 7890 gimple_dump_bb_for_graph, /* dump_bb_for_graph */
6de9cd9a 7891 create_bb, /* create_basic_block */
726a989a
RB
7892 gimple_redirect_edge_and_branch, /* redirect_edge_and_branch */
7893 gimple_redirect_edge_and_branch_force, /* redirect_edge_and_branch_force */
7894 gimple_can_remove_branch_p, /* can_remove_branch_p */
6de9cd9a 7895 remove_bb, /* delete_basic_block */
726a989a
RB
7896 gimple_split_block, /* split_block */
7897 gimple_move_block_after, /* move_block_after */
7898 gimple_can_merge_blocks_p, /* can_merge_blocks_p */
7899 gimple_merge_blocks, /* merge_blocks */
7900 gimple_predict_edge, /* predict_edge */
10817317 7901 gimple_predicted_by_p, /* predicted_by_p */
726a989a
RB
7902 gimple_can_duplicate_bb_p, /* can_duplicate_block_p */
7903 gimple_duplicate_bb, /* duplicate_block */
7904 gimple_split_edge, /* split_edge */
7905 gimple_make_forwarder_block, /* make_forward_block */
6de9cd9a 7906 NULL, /* tidy_fallthru_edge */
cf103ca4 7907 NULL, /* force_nonfallthru */
726a989a
RB
7908 gimple_block_ends_with_call_p,/* block_ends_with_call_p */
7909 gimple_block_ends_with_condjump_p, /* block_ends_with_condjump_p */
10817317 7910 gimple_flow_call_edges_add, /* flow_call_edges_add */
726a989a
RB
7911 gimple_execute_on_growing_pred, /* execute_on_growing_pred */
7912 gimple_execute_on_shrinking_pred, /* execute_on_shrinking_pred */
7913 gimple_duplicate_loop_to_header_edge, /* duplicate loop for trees */
7914 gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
7915 gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
1cb7dfc3 7916 extract_true_false_edges_from_block, /* extract_cond_bb_edges */
df92c640
SB
7917 flush_pending_stmts, /* flush_pending_stmts */
7918 gimple_empty_block_p, /* block_empty_p */
7919 gimple_split_block_before_cond_jump, /* split_block_before_cond_jump */
aa4723d7 7920 gimple_account_profile_record,
6de9cd9a
DN
7921};
7922
7923
7924/* Split all critical edges. */
7925
c2924966 7926static unsigned int
6de9cd9a
DN
7927split_critical_edges (void)
7928{
7929 basic_block bb;
7930 edge e;
628f6a4e 7931 edge_iterator ei;
6de9cd9a 7932
d6be0d7f
JL
7933 /* split_edge can redirect edges out of SWITCH_EXPRs, which can get
7934 expensive. So we want to enable recording of edge to CASE_LABEL_EXPR
7935 mappings around the calls to split_edge. */
7936 start_recording_case_labels ();
6de9cd9a
DN
7937 FOR_ALL_BB (bb)
7938 {
628f6a4e 7939 FOR_EACH_EDGE (e, ei, bb->succs)
496a4ef5
JH
7940 {
7941 if (EDGE_CRITICAL_P (e) && !(e->flags & EDGE_ABNORMAL))
6de9cd9a 7942 split_edge (e);
b8698a0f 7943 /* PRE inserts statements to edges and expects that
496a4ef5
JH
7944 since split_critical_edges was done beforehand, committing edge
7945 insertions will not split more edges. In addition to critical
7946 edges we must split edges that have multiple successors and
b8698a0f 7947 end by control flow statements, such as RESX.
496a4ef5
JH
7948 Go ahead and split them too. This matches the logic in
7949 gimple_find_edge_insert_loc. */
7950 else if ((!single_pred_p (e->dest)
671f9f30 7951 || !gimple_seq_empty_p (phi_nodes (e->dest))
fefa31b5
DM
7952 || e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
7953 && e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
496a4ef5
JH
7954 && !(e->flags & EDGE_ABNORMAL))
7955 {
7956 gimple_stmt_iterator gsi;
7957
7958 gsi = gsi_last_bb (e->src);
7959 if (!gsi_end_p (gsi)
7960 && stmt_ends_bb_p (gsi_stmt (gsi))
c54c785d
JH
7961 && (gimple_code (gsi_stmt (gsi)) != GIMPLE_RETURN
7962 && !gimple_call_builtin_p (gsi_stmt (gsi),
7963 BUILT_IN_RETURN)))
496a4ef5
JH
7964 split_edge (e);
7965 }
7966 }
6de9cd9a 7967 }
d6be0d7f 7968 end_recording_case_labels ();
c2924966 7969 return 0;
6de9cd9a
DN
7970}
7971
27a4cd48
DM
7972namespace {
7973
7974const pass_data pass_data_split_crit_edges =
7975{
7976 GIMPLE_PASS, /* type */
7977 "crited", /* name */
7978 OPTGROUP_NONE, /* optinfo_flags */
7979 false, /* has_gate */
7980 true, /* has_execute */
7981 TV_TREE_SPLIT_EDGES, /* tv_id */
7982 PROP_cfg, /* properties_required */
7983 PROP_no_crit_edges, /* properties_provided */
7984 0, /* properties_destroyed */
7985 0, /* todo_flags_start */
7986 TODO_verify_flow, /* todo_flags_finish */
6de9cd9a 7987};
26277d41 7988
27a4cd48
DM
7989class pass_split_crit_edges : public gimple_opt_pass
7990{
7991public:
c3284718
RS
7992 pass_split_crit_edges (gcc::context *ctxt)
7993 : gimple_opt_pass (pass_data_split_crit_edges, ctxt)
27a4cd48
DM
7994 {}
7995
7996 /* opt_pass methods: */
7997 unsigned int execute () { return split_critical_edges (); }
7998
65d3284b 7999 opt_pass * clone () { return new pass_split_crit_edges (m_ctxt); }
27a4cd48
DM
8000}; // class pass_split_crit_edges
8001
8002} // anon namespace
8003
8004gimple_opt_pass *
8005make_pass_split_crit_edges (gcc::context *ctxt)
8006{
8007 return new pass_split_crit_edges (ctxt);
8008}
8009
26277d41 8010
726a989a 8011/* Build a ternary operation and gimplify it. Emit code before GSI.
26277d41
PB
8012 Return the gimple_val holding the result. */
8013
8014tree
726a989a 8015gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
26277d41
PB
8016 tree type, tree a, tree b, tree c)
8017{
8018 tree ret;
db3927fb 8019 location_t loc = gimple_location (gsi_stmt (*gsi));
26277d41 8020
db3927fb 8021 ret = fold_build3_loc (loc, code, type, a, b, c);
26277d41
PB
8022 STRIP_NOPS (ret);
8023
726a989a
RB
8024 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
8025 GSI_SAME_STMT);
26277d41
PB
8026}
8027
726a989a 8028/* Build a binary operation and gimplify it. Emit code before GSI.
26277d41
PB
8029 Return the gimple_val holding the result. */
8030
8031tree
726a989a 8032gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
26277d41
PB
8033 tree type, tree a, tree b)
8034{
8035 tree ret;
8036
db3927fb 8037 ret = fold_build2_loc (gimple_location (gsi_stmt (*gsi)), code, type, a, b);
26277d41
PB
8038 STRIP_NOPS (ret);
8039
726a989a
RB
8040 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
8041 GSI_SAME_STMT);
26277d41
PB
8042}
8043
726a989a 8044/* Build a unary operation and gimplify it. Emit code before GSI.
26277d41
PB
8045 Return the gimple_val holding the result. */
8046
8047tree
726a989a 8048gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
26277d41
PB
8049 tree a)
8050{
8051 tree ret;
8052
db3927fb 8053 ret = fold_build1_loc (gimple_location (gsi_stmt (*gsi)), code, type, a);
26277d41
PB
8054 STRIP_NOPS (ret);
8055
726a989a
RB
8056 return force_gimple_operand_gsi (gsi, ret, true, NULL, true,
8057 GSI_SAME_STMT);
26277d41
PB
8058}
8059
8060
6de9cd9a
DN
8061\f
8062/* Emit return warnings. */
8063
c2924966 8064static unsigned int
6de9cd9a
DN
8065execute_warn_function_return (void)
8066{
9506ac2b 8067 source_location location;
726a989a 8068 gimple last;
6de9cd9a 8069 edge e;
628f6a4e 8070 edge_iterator ei;
6de9cd9a 8071
d45eae79
SL
8072 if (!targetm.warn_func_return (cfun->decl))
8073 return 0;
8074
6de9cd9a
DN
8075 /* If we have a path to EXIT, then we do return. */
8076 if (TREE_THIS_VOLATILE (cfun->decl)
fefa31b5 8077 && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) > 0)
6de9cd9a 8078 {
9506ac2b 8079 location = UNKNOWN_LOCATION;
fefa31b5 8080 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
6de9cd9a
DN
8081 {
8082 last = last_stmt (e->src);
c54c785d
JH
8083 if ((gimple_code (last) == GIMPLE_RETURN
8084 || gimple_call_builtin_p (last, BUILT_IN_RETURN))
726a989a 8085 && (location = gimple_location (last)) != UNKNOWN_LOCATION)
6de9cd9a
DN
8086 break;
8087 }
9506ac2b
PB
8088 if (location == UNKNOWN_LOCATION)
8089 location = cfun->function_end_locus;
fab922b1 8090 warning_at (location, 0, "%<noreturn%> function does return");
6de9cd9a
DN
8091 }
8092
8093 /* If we see "return;" in some basic block, then we do reach the end
8094 without returning a value. */
8095 else if (warn_return_type
089efaa4 8096 && !TREE_NO_WARNING (cfun->decl)
fefa31b5 8097 && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) > 0
6de9cd9a
DN
8098 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (cfun->decl))))
8099 {
fefa31b5 8100 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
6de9cd9a 8101 {
726a989a
RB
8102 gimple last = last_stmt (e->src);
8103 if (gimple_code (last) == GIMPLE_RETURN
8104 && gimple_return_retval (last) == NULL
8105 && !gimple_no_warning_p (last))
6de9cd9a 8106 {
726a989a 8107 location = gimple_location (last);
9506ac2b
PB
8108 if (location == UNKNOWN_LOCATION)
8109 location = cfun->function_end_locus;
aa14403d 8110 warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function");
089efaa4 8111 TREE_NO_WARNING (cfun->decl) = 1;
6de9cd9a
DN
8112 break;
8113 }
8114 }
8115 }
c2924966 8116 return 0;
6de9cd9a
DN
8117}
8118
8119
8120/* Given a basic block B which ends with a conditional and has
8121 precisely two successors, determine which of the edges is taken if
8122 the conditional is true and which is taken if the conditional is
8123 false. Set TRUE_EDGE and FALSE_EDGE appropriately. */
8124
8125void
8126extract_true_false_edges_from_block (basic_block b,
8127 edge *true_edge,
8128 edge *false_edge)
8129{
628f6a4e 8130 edge e = EDGE_SUCC (b, 0);
6de9cd9a
DN
8131
8132 if (e->flags & EDGE_TRUE_VALUE)
8133 {
8134 *true_edge = e;
628f6a4e 8135 *false_edge = EDGE_SUCC (b, 1);
6de9cd9a
DN
8136 }
8137 else
8138 {
8139 *false_edge = e;
628f6a4e 8140 *true_edge = EDGE_SUCC (b, 1);
6de9cd9a
DN
8141 }
8142}
8143
27a4cd48
DM
8144namespace {
8145
8146const pass_data pass_data_warn_function_return =
8147{
8148 GIMPLE_PASS, /* type */
8149 "*warn_function_return", /* name */
8150 OPTGROUP_NONE, /* optinfo_flags */
8151 false, /* has_gate */
8152 true, /* has_execute */
8153 TV_NONE, /* tv_id */
8154 PROP_cfg, /* properties_required */
8155 0, /* properties_provided */
8156 0, /* properties_destroyed */
8157 0, /* todo_flags_start */
8158 0, /* todo_flags_finish */
6de9cd9a 8159};
aa313ed4 8160
27a4cd48
DM
8161class pass_warn_function_return : public gimple_opt_pass
8162{
8163public:
c3284718
RS
8164 pass_warn_function_return (gcc::context *ctxt)
8165 : gimple_opt_pass (pass_data_warn_function_return, ctxt)
27a4cd48
DM
8166 {}
8167
8168 /* opt_pass methods: */
8169 unsigned int execute () { return execute_warn_function_return (); }
8170
8171}; // class pass_warn_function_return
8172
8173} // anon namespace
8174
8175gimple_opt_pass *
8176make_pass_warn_function_return (gcc::context *ctxt)
8177{
8178 return new pass_warn_function_return (ctxt);
8179}
8180
a406865a
RG
8181/* Walk a gimplified function and warn for functions whose return value is
8182 ignored and attribute((warn_unused_result)) is set. This is done before
8183 inlining, so we don't have to worry about that. */
8184
8185static void
8186do_warn_unused_result (gimple_seq seq)
8187{
8188 tree fdecl, ftype;
8189 gimple_stmt_iterator i;
8190
8191 for (i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
8192 {
8193 gimple g = gsi_stmt (i);
8194
8195 switch (gimple_code (g))
8196 {
8197 case GIMPLE_BIND:
8198 do_warn_unused_result (gimple_bind_body (g));
8199 break;
8200 case GIMPLE_TRY:
8201 do_warn_unused_result (gimple_try_eval (g));
8202 do_warn_unused_result (gimple_try_cleanup (g));
8203 break;
8204 case GIMPLE_CATCH:
8205 do_warn_unused_result (gimple_catch_handler (g));
8206 break;
8207 case GIMPLE_EH_FILTER:
8208 do_warn_unused_result (gimple_eh_filter_failure (g));
8209 break;
8210
8211 case GIMPLE_CALL:
8212 if (gimple_call_lhs (g))
8213 break;
25583c4f
RS
8214 if (gimple_call_internal_p (g))
8215 break;
a406865a
RG
8216
8217 /* This is a naked call, as opposed to a GIMPLE_CALL with an
8218 LHS. All calls whose value is ignored should be
8219 represented like this. Look for the attribute. */
8220 fdecl = gimple_call_fndecl (g);
9bfc434b 8221 ftype = gimple_call_fntype (g);
a406865a
RG
8222
8223 if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
8224 {
8225 location_t loc = gimple_location (g);
8226
8227 if (fdecl)
8228 warning_at (loc, OPT_Wunused_result,
8229 "ignoring return value of %qD, "
8230 "declared with attribute warn_unused_result",
8231 fdecl);
8232 else
8233 warning_at (loc, OPT_Wunused_result,
8234 "ignoring return value of function "
8235 "declared with attribute warn_unused_result");
8236 }
8237 break;
8238
8239 default:
8240 /* Not a container, not a call, or a call whose value is used. */
8241 break;
8242 }
8243 }
8244}
8245
8246static unsigned int
8247run_warn_unused_result (void)
8248{
8249 do_warn_unused_result (gimple_body (current_function_decl));
8250 return 0;
8251}
8252
8253static bool
8254gate_warn_unused_result (void)
8255{
8256 return flag_warn_unused_result;
8257}
8258
27a4cd48
DM
8259namespace {
8260
8261const pass_data pass_data_warn_unused_result =
8262{
8263 GIMPLE_PASS, /* type */
8264 "*warn_unused_result", /* name */
8265 OPTGROUP_NONE, /* optinfo_flags */
8266 true, /* has_gate */
8267 true, /* has_execute */
8268 TV_NONE, /* tv_id */
8269 PROP_gimple_any, /* properties_required */
8270 0, /* properties_provided */
8271 0, /* properties_destroyed */
8272 0, /* todo_flags_start */
8273 0, /* todo_flags_finish */
a406865a 8274};
0823efed 8275
27a4cd48
DM
8276class pass_warn_unused_result : public gimple_opt_pass
8277{
8278public:
c3284718
RS
8279 pass_warn_unused_result (gcc::context *ctxt)
8280 : gimple_opt_pass (pass_data_warn_unused_result, ctxt)
27a4cd48
DM
8281 {}
8282
8283 /* opt_pass methods: */
8284 bool gate () { return gate_warn_unused_result (); }
8285 unsigned int execute () { return run_warn_unused_result (); }
8286
8287}; // class pass_warn_unused_result
8288
8289} // anon namespace
8290
8291gimple_opt_pass *
8292make_pass_warn_unused_result (gcc::context *ctxt)
8293{
8294 return new pass_warn_unused_result (ctxt);
8295}
8296
c1bf2a39
AM
8297/* IPA passes, compilation of earlier functions or inlining
8298 might have changed some properties, such as marked functions nothrow,
8299 pure, const or noreturn.
8300 Remove redundant edges and basic blocks, and create new ones if necessary.
8301
8302 This pass can't be executed as stand alone pass from pass manager, because
8303 in between inlining and this fixup the verify_flow_info would fail. */
8304
8305unsigned int
8306execute_fixup_cfg (void)
8307{
8308 basic_block bb;
8309 gimple_stmt_iterator gsi;
8310 int todo = gimple_in_ssa_p (cfun) ? TODO_verify_ssa : 0;
8311 gcov_type count_scale;
8312 edge e;
8313 edge_iterator ei;
8314
8315 count_scale
8316 = GCOV_COMPUTE_SCALE (cgraph_get_node (current_function_decl)->count,
fefa31b5 8317 ENTRY_BLOCK_PTR_FOR_FN (cfun)->count);
c1bf2a39 8318
fefa31b5
DM
8319 ENTRY_BLOCK_PTR_FOR_FN (cfun)->count =
8320 cgraph_get_node (current_function_decl)->count;
8321 EXIT_BLOCK_PTR_FOR_FN (cfun)->count =
8322 apply_scale (EXIT_BLOCK_PTR_FOR_FN (cfun)->count,
c1bf2a39
AM
8323 count_scale);
8324
fefa31b5 8325 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
c1bf2a39
AM
8326 e->count = apply_scale (e->count, count_scale);
8327
8328 FOR_EACH_BB (bb)
8329 {
8330 bb->count = apply_scale (bb->count, count_scale);
8331 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
8332 {
8333 gimple stmt = gsi_stmt (gsi);
8334 tree decl = is_gimple_call (stmt)
8335 ? gimple_call_fndecl (stmt)
8336 : NULL;
8337 if (decl)
8338 {
8339 int flags = gimple_call_flags (stmt);
8340 if (flags & (ECF_CONST | ECF_PURE | ECF_LOOPING_CONST_OR_PURE))
8341 {
8342 if (gimple_purge_dead_abnormal_call_edges (bb))
8343 todo |= TODO_cleanup_cfg;
8344
8345 if (gimple_in_ssa_p (cfun))
8346 {
8347 todo |= TODO_update_ssa | TODO_cleanup_cfg;
8348 update_stmt (stmt);
8349 }
8350 }
8351
8352 if (flags & ECF_NORETURN
8353 && fixup_noreturn_call (stmt))
8354 todo |= TODO_cleanup_cfg;
8355 }
8356
8357 if (maybe_clean_eh_stmt (stmt)
8358 && gimple_purge_dead_eh_edges (bb))
8359 todo |= TODO_cleanup_cfg;
8360 }
8361
8362 FOR_EACH_EDGE (e, ei, bb->succs)
8363 e->count = apply_scale (e->count, count_scale);
8364
8365 /* If we have a basic block with no successors that does not
8366 end with a control statement or a noreturn call end it with
8367 a call to __builtin_unreachable. This situation can occur
8368 when inlining a noreturn call that does in fact return. */
8369 if (EDGE_COUNT (bb->succs) == 0)
8370 {
8371 gimple stmt = last_stmt (bb);
8372 if (!stmt
8373 || (!is_ctrl_stmt (stmt)
8374 && (!is_gimple_call (stmt)
8375 || (gimple_call_flags (stmt) & ECF_NORETURN) == 0)))
8376 {
8377 stmt = gimple_build_call
8378 (builtin_decl_implicit (BUILT_IN_UNREACHABLE), 0);
8379 gimple_stmt_iterator gsi = gsi_last_bb (bb);
8380 gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
8381 }
8382 }
8383 }
8384 if (count_scale != REG_BR_PROB_BASE)
8385 compute_function_frequency ();
8386
8387 /* We just processed all calls. */
8388 if (cfun->gimple_df)
8389 vec_free (MODIFIED_NORETURN_CALLS (cfun));
8390
8391 /* Dump a textual representation of the flowgraph. */
8392 if (dump_file)
8393 gimple_dump_cfg (dump_file, dump_flags);
8394
8395 if (current_loops
8396 && (todo & TODO_cleanup_cfg))
8397 loops_state_set (LOOPS_NEED_FIXUP);
8398
8399 return todo;
8400}
8401
8402namespace {
8403
8404const pass_data pass_data_fixup_cfg =
8405{
8406 GIMPLE_PASS, /* type */
8407 "*free_cfg_annotations", /* name */
8408 OPTGROUP_NONE, /* optinfo_flags */
8409 false, /* has_gate */
8410 true, /* has_execute */
8411 TV_NONE, /* tv_id */
8412 PROP_cfg, /* properties_required */
8413 0, /* properties_provided */
8414 0, /* properties_destroyed */
8415 0, /* todo_flags_start */
8416 0, /* todo_flags_finish */
8417};
8418
8419class pass_fixup_cfg : public gimple_opt_pass
8420{
8421public:
8422 pass_fixup_cfg (gcc::context *ctxt)
8423 : gimple_opt_pass (pass_data_fixup_cfg, ctxt)
8424 {}
8425
8426 /* opt_pass methods: */
8427 opt_pass * clone () { return new pass_fixup_cfg (m_ctxt); }
8428 unsigned int execute () { return execute_fixup_cfg (); }
8429
8430}; // class pass_fixup_cfg
8431
8432} // anon namespace
8433
8434gimple_opt_pass *
8435make_pass_fixup_cfg (gcc::context *ctxt)
8436{
8437 return new pass_fixup_cfg (ctxt);
8438}
0823efed
DN
8439
8440/* Garbage collection support for edge_def. */
8441
8442extern void gt_ggc_mx (tree&);
8443extern void gt_ggc_mx (gimple&);
8444extern void gt_ggc_mx (rtx&);
8445extern void gt_ggc_mx (basic_block&);
8446
8447void
8448gt_ggc_mx (edge_def *e)
8449{
5368224f 8450 tree block = LOCATION_BLOCK (e->goto_locus);
0823efed
DN
8451 gt_ggc_mx (e->src);
8452 gt_ggc_mx (e->dest);
8453 if (current_ir_type () == IR_GIMPLE)
8454 gt_ggc_mx (e->insns.g);
8455 else
8456 gt_ggc_mx (e->insns.r);
5368224f 8457 gt_ggc_mx (block);
0823efed
DN
8458}
8459
8460/* PCH support for edge_def. */
8461
8462extern void gt_pch_nx (tree&);
8463extern void gt_pch_nx (gimple&);
8464extern void gt_pch_nx (rtx&);
8465extern void gt_pch_nx (basic_block&);
8466
8467void
8468gt_pch_nx (edge_def *e)
8469{
5368224f 8470 tree block = LOCATION_BLOCK (e->goto_locus);
0823efed
DN
8471 gt_pch_nx (e->src);
8472 gt_pch_nx (e->dest);
8473 if (current_ir_type () == IR_GIMPLE)
8474 gt_pch_nx (e->insns.g);
8475 else
8476 gt_pch_nx (e->insns.r);
5368224f 8477 gt_pch_nx (block);
0823efed
DN
8478}
8479
8480void
8481gt_pch_nx (edge_def *e, gt_pointer_operator op, void *cookie)
8482{
5368224f 8483 tree block = LOCATION_BLOCK (e->goto_locus);
0823efed
DN
8484 op (&(e->src), cookie);
8485 op (&(e->dest), cookie);
8486 if (current_ir_type () == IR_GIMPLE)
8487 op (&(e->insns.g), cookie);
8488 else
8489 op (&(e->insns.r), cookie);
5368224f 8490 op (&(block), cookie);
0823efed 8491}