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