]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ipa-split.c
Remove cgraph_local_info structure.
[thirdparty/gcc.git] / gcc / ipa-split.c
CommitLineData
3e485f62 1/* Function splitting pass
a5544970 2 Copyright (C) 2010-2019 Free Software Foundation, Inc.
3e485f62
JH
3 Contributed by Jan Hubicka <jh@suse.cz>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21/* The purpose of this pass is to split function bodies to improve
22 inlining. I.e. for function of the form:
23
24 func (...)
25 {
26 if (cheap_test)
27 something_small
28 else
29 something_big
30 }
31
32 Produce:
33
34 func.part (...)
35 {
36 something_big
37 }
38
39 func (...)
40 {
41 if (cheap_test)
42 something_small
43 else
44 func.part (...);
45 }
46
47 When func becomes inlinable and when cheap_test is often true, inlining func,
ed7656f6 48 but not fund.part leads to performance improvement similar as inlining
3e485f62
JH
49 original func while the code size growth is smaller.
50
51 The pass is organized in three stages:
52 1) Collect local info about basic block into BB_INFO structure and
53 compute function body estimated size and time.
54 2) Via DFS walk find all possible basic blocks where we can split
55 and chose best one.
56 3) If split point is found, split at the specified BB by creating a clone
57 and updating function to call it.
58
59 The decisions what functions to split are in execute_split_functions
60 and consider_split.
61
62 There are several possible future improvements for this pass including:
63
64 1) Splitting to break up large functions
65 2) Splitting to reduce stack frame usage
66 3) Allow split part of function to use values computed in the header part.
67 The values needs to be passed to split function, perhaps via same
68 interface as for nested functions or as argument.
69 4) Support for simple rematerialization. I.e. when split part use
70 value computed in header from function parameter in very cheap way, we
71 can just recompute it.
72 5) Support splitting of nested functions.
73 6) Support non-SSA arguments.
74 7) There is nothing preventing us from producing multiple parts of single function
75 when needed or splitting also the parts. */
76
77#include "config.h"
78#include "system.h"
79#include "coretypes.h"
c7131fb2 80#include "backend.h"
957060b5 81#include "rtl.h"
40e23961 82#include "tree.h"
c7131fb2 83#include "gimple.h"
957060b5
AM
84#include "cfghooks.h"
85#include "alloc-pool.h"
86#include "tree-pass.h"
c7131fb2 87#include "ssa.h"
957060b5
AM
88#include "cgraph.h"
89#include "diagnostic.h"
40e23961 90#include "fold-const.h"
60393bbc 91#include "cfganal.h"
d8a2d370 92#include "calls.h"
45b0be94 93#include "gimplify.h"
5be5c238 94#include "gimple-iterator.h"
18f429e2 95#include "gimplify-me.h"
5be5c238 96#include "gimple-walk.h"
dd912cb8 97#include "symbol-summary.h"
3e485f62 98#include "ipa-prop.h"
442b4905 99#include "tree-cfg.h"
442b4905
AM
100#include "tree-into-ssa.h"
101#include "tree-dfa.h"
3e485f62 102#include "tree-inline.h"
3e485f62
JH
103#include "params.h"
104#include "gimple-pretty-print.h"
27d020cf 105#include "ipa-fnsummary.h"
a9e0d843 106#include "cfgloop.h"
37555926 107#include "attribs.h"
3e485f62
JH
108
109/* Per basic block info. */
110
6c1dae73 111class split_bb_info
3e485f62 112{
6c1dae73 113public:
3e485f62 114 unsigned int size;
c2e87766 115 sreal time;
50686850 116};
3e485f62 117
11478306 118static vec<split_bb_info> bb_info_vec;
3e485f62
JH
119
120/* Description of split point. */
121
6c1dae73 122class split_point
3e485f62 123{
6c1dae73 124public:
3e485f62 125 /* Size of the partitions. */
c2e87766
JH
126 sreal header_time, split_time;
127 unsigned int header_size, split_size;
3e485f62 128
ed7656f6 129 /* SSA names that need to be passed into spit function. */
3e485f62
JH
130 bitmap ssa_names_to_pass;
131
132 /* Basic block where we split (that will become entry point of new function. */
133 basic_block entry_bb;
134
ed10d09b
JH
135 /* Count for entering the split part.
136 This is not count of the entry_bb because it may be in loop. */
137 profile_count count;
138
3e485f62
JH
139 /* Basic blocks we are splitting away. */
140 bitmap split_bbs;
241a2b9e
JH
141
142 /* True when return value is computed on split part and thus it needs
143 to be returned. */
144 bool split_part_set_retval;
3e485f62
JH
145};
146
147/* Best split point found. */
148
99b1c316 149class split_point best_split_point;
3e485f62 150
b2e25729
BS
151/* Set of basic blocks that are not allowed to dominate a split point. */
152
153static bitmap forbidden_dominators;
154
241a2b9e
JH
155static tree find_retval (basic_block return_bb);
156
1802378d 157/* Callback for walk_stmt_load_store_addr_ops. If T is non-SSA automatic
3e485f62
JH
158 variable, check it if it is present in bitmap passed via DATA. */
159
160static bool
355fe088 161test_nonssa_use (gimple *, tree t, tree, void *data)
3e485f62
JH
162{
163 t = get_base_address (t);
164
1802378d
EB
165 if (!t || is_gimple_reg (t))
166 return false;
167
168 if (TREE_CODE (t) == PARM_DECL
8813a647 169 || (VAR_P (t)
3e485f62 170 && auto_var_in_fn_p (t, current_function_decl))
1802378d 171 || TREE_CODE (t) == RESULT_DECL
412c4af7
JH
172 /* Normal labels are part of CFG and will be handled gratefuly.
173 Forced labels however can be used directly by statements and
174 need to stay in one partition along with their uses. */
175 || (TREE_CODE (t) == LABEL_DECL
176 && FORCED_LABEL (t)))
3e485f62 177 return bitmap_bit_p ((bitmap)data, DECL_UID (t));
241a2b9e 178
1802378d
EB
179 /* For DECL_BY_REFERENCE, the return value is actually a pointer. We want
180 to pretend that the value pointed to is actual result decl. */
181 if ((TREE_CODE (t) == MEM_REF || INDIRECT_REF_P (t))
241a2b9e 182 && TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
70b5e7dc 183 && SSA_NAME_VAR (TREE_OPERAND (t, 0))
241a2b9e
JH
184 && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND (t, 0))) == RESULT_DECL
185 && DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
1802378d
EB
186 return
187 bitmap_bit_p ((bitmap)data,
188 DECL_UID (DECL_RESULT (current_function_decl)));
189
3e485f62
JH
190 return false;
191}
192
193/* Dump split point CURRENT. */
194
195static void
99b1c316 196dump_split_point (FILE * file, class split_point *current)
3e485f62
JH
197{
198 fprintf (file,
cfef45c8 199 "Split point at BB %i\n"
c2e87766
JH
200 " header time: %f header size: %i\n"
201 " split time: %f split size: %i\n bbs: ",
202 current->entry_bb->index, current->header_time.to_double (),
203 current->header_size, current->split_time.to_double (),
204 current->split_size);
3e485f62
JH
205 dump_bitmap (file, current->split_bbs);
206 fprintf (file, " SSA names to pass: ");
207 dump_bitmap (file, current->ssa_names_to_pass);
208}
209
1802378d
EB
210/* Look for all BBs in header that might lead to the split part and verify
211 that they are not defining any non-SSA var used by the split part.
2094f1fc
JH
212 Parameters are the same as for consider_split. */
213
214static bool
99b1c316 215verify_non_ssa_vars (class split_point *current, bitmap non_ssa_vars,
2094f1fc
JH
216 basic_block return_bb)
217{
218 bitmap seen = BITMAP_ALLOC (NULL);
6e1aa848 219 vec<basic_block> worklist = vNULL;
2094f1fc
JH
220 edge e;
221 edge_iterator ei;
222 bool ok = true;
412c4af7 223 basic_block bb;
1802378d 224
2094f1fc 225 FOR_EACH_EDGE (e, ei, current->entry_bb->preds)
fefa31b5 226 if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
2094f1fc
JH
227 && !bitmap_bit_p (current->split_bbs, e->src->index))
228 {
9771b263 229 worklist.safe_push (e->src);
2094f1fc
JH
230 bitmap_set_bit (seen, e->src->index);
231 }
1802378d 232
9771b263 233 while (!worklist.is_empty ())
2094f1fc 234 {
412c4af7 235 bb = worklist.pop ();
2094f1fc 236 FOR_EACH_EDGE (e, ei, bb->preds)
fefa31b5 237 if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun)
fcaa4ca4 238 && bitmap_set_bit (seen, e->src->index))
2094f1fc
JH
239 {
240 gcc_checking_assert (!bitmap_bit_p (current->split_bbs,
241 e->src->index));
9771b263 242 worklist.safe_push (e->src);
2094f1fc 243 }
538dd0b7
DM
244 for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi);
245 gsi_next (&bsi))
2094f1fc 246 {
355fe088 247 gimple *stmt = gsi_stmt (bsi);
1802378d 248 if (is_gimple_debug (stmt))
2094f1fc
JH
249 continue;
250 if (walk_stmt_load_store_addr_ops
1802378d
EB
251 (stmt, non_ssa_vars, test_nonssa_use, test_nonssa_use,
252 test_nonssa_use))
2094f1fc
JH
253 {
254 ok = false;
255 goto done;
256 }
538dd0b7
DM
257 if (glabel *label_stmt = dyn_cast <glabel *> (stmt))
258 if (test_nonssa_use (stmt, gimple_label_label (label_stmt),
259 NULL_TREE, non_ssa_vars))
260 {
261 ok = false;
262 goto done;
263 }
2094f1fc 264 }
538dd0b7
DM
265 for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
266 gsi_next (&bsi))
2094f1fc
JH
267 {
268 if (walk_stmt_load_store_addr_ops
1802378d
EB
269 (gsi_stmt (bsi), non_ssa_vars, test_nonssa_use, test_nonssa_use,
270 test_nonssa_use))
2094f1fc
JH
271 {
272 ok = false;
273 goto done;
274 }
275 }
276 FOR_EACH_EDGE (e, ei, bb->succs)
277 {
278 if (e->dest != return_bb)
279 continue;
538dd0b7
DM
280 for (gphi_iterator bsi = gsi_start_phis (return_bb);
281 !gsi_end_p (bsi);
2094f1fc
JH
282 gsi_next (&bsi))
283 {
538dd0b7 284 gphi *stmt = bsi.phi ();
2094f1fc
JH
285 tree op = gimple_phi_arg_def (stmt, e->dest_idx);
286
ea057359 287 if (virtual_operand_p (gimple_phi_result (stmt)))
2094f1fc
JH
288 continue;
289 if (TREE_CODE (op) != SSA_NAME
9f1363cd 290 && test_nonssa_use (stmt, op, op, non_ssa_vars))
2094f1fc
JH
291 {
292 ok = false;
293 goto done;
294 }
295 }
296 }
297 }
412c4af7
JH
298
299 /* Verify that the rest of function does not define any label
300 used by the split part. */
301 FOR_EACH_BB_FN (bb, cfun)
302 if (!bitmap_bit_p (current->split_bbs, bb->index)
303 && !bitmap_bit_p (seen, bb->index))
304 {
305 gimple_stmt_iterator bsi;
306 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
538dd0b7 307 if (glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (bsi)))
412c4af7 308 {
538dd0b7
DM
309 if (test_nonssa_use (label_stmt,
310 gimple_label_label (label_stmt),
311 NULL_TREE, non_ssa_vars))
312 {
313 ok = false;
314 goto done;
315 }
412c4af7 316 }
538dd0b7 317 else
412c4af7
JH
318 break;
319 }
320
2094f1fc
JH
321done:
322 BITMAP_FREE (seen);
9771b263 323 worklist.release ();
2094f1fc
JH
324 return ok;
325}
326
b2e25729
BS
327/* If STMT is a call, check the callee against a list of forbidden
328 predicate functions. If a match is found, look for uses of the
329 call result in condition statements that compare against zero.
330 For each such use, find the block targeted by the condition
331 statement for the nonzero result, and set the bit for this block
332 in the forbidden dominators bitmap. The purpose of this is to avoid
333 selecting a split point where we are likely to lose the chance
334 to optimize away an unused function call. */
335
336static void
355fe088 337check_forbidden_calls (gimple *stmt)
b2e25729
BS
338{
339 imm_use_iterator use_iter;
340 use_operand_p use_p;
341 tree lhs;
342
343 /* At the moment, __builtin_constant_p is the only forbidden
344 predicate function call (see PR49642). */
345 if (!gimple_call_builtin_p (stmt, BUILT_IN_CONSTANT_P))
346 return;
347
348 lhs = gimple_call_lhs (stmt);
349
350 if (!lhs || TREE_CODE (lhs) != SSA_NAME)
351 return;
352
353 FOR_EACH_IMM_USE_FAST (use_p, use_iter, lhs)
354 {
355 tree op1;
356 basic_block use_bb, forbidden_bb;
357 enum tree_code code;
358 edge true_edge, false_edge;
538dd0b7 359 gcond *use_stmt;
b2e25729 360
538dd0b7
DM
361 use_stmt = dyn_cast <gcond *> (USE_STMT (use_p));
362 if (!use_stmt)
b2e25729
BS
363 continue;
364
365 /* Assuming canonical form for GIMPLE_COND here, with constant
366 in second position. */
367 op1 = gimple_cond_rhs (use_stmt);
368 code = gimple_cond_code (use_stmt);
369 use_bb = gimple_bb (use_stmt);
370
371 extract_true_false_edges_from_block (use_bb, &true_edge, &false_edge);
372
373 /* We're only interested in comparisons that distinguish
374 unambiguously from zero. */
375 if (!integer_zerop (op1) || code == LE_EXPR || code == GE_EXPR)
376 continue;
377
378 if (code == EQ_EXPR)
379 forbidden_bb = false_edge->dest;
380 else
381 forbidden_bb = true_edge->dest;
382
383 bitmap_set_bit (forbidden_dominators, forbidden_bb->index);
384 }
385}
386
387/* If BB is dominated by any block in the forbidden dominators set,
388 return TRUE; else FALSE. */
389
390static bool
391dominated_by_forbidden (basic_block bb)
392{
393 unsigned dom_bb;
394 bitmap_iterator bi;
395
396 EXECUTE_IF_SET_IN_BITMAP (forbidden_dominators, 1, dom_bb, bi)
397 {
06e28de2
DM
398 if (dominated_by_p (CDI_DOMINATORS, bb,
399 BASIC_BLOCK_FOR_FN (cfun, dom_bb)))
b2e25729
BS
400 return true;
401 }
402
403 return false;
404}
405
d5e254e1
IE
406/* For give split point CURRENT and return block RETURN_BB return 1
407 if ssa name VAL is set by split part and 0 otherwise. */
408static bool
99b1c316 409split_part_set_ssa_name_p (tree val, class split_point *current,
d5e254e1
IE
410 basic_block return_bb)
411{
412 if (TREE_CODE (val) != SSA_NAME)
413 return false;
414
415 return (!SSA_NAME_IS_DEFAULT_DEF (val)
416 && (bitmap_bit_p (current->split_bbs,
417 gimple_bb (SSA_NAME_DEF_STMT (val))->index)
418 || gimple_bb (SSA_NAME_DEF_STMT (val)) == return_bb));
419}
420
3e485f62
JH
421/* We found an split_point CURRENT. NON_SSA_VARS is bitmap of all non ssa
422 variables used and RETURN_BB is return basic block.
423 See if we can split function here. */
424
425static void
99b1c316 426consider_split (class split_point *current, bitmap non_ssa_vars,
3e485f62
JH
427 basic_block return_bb)
428{
429 tree parm;
430 unsigned int num_args = 0;
431 unsigned int call_overhead;
432 edge e;
433 edge_iterator ei;
538dd0b7 434 gphi_iterator bsi;
8b3057b3 435 unsigned int i;
241a2b9e 436 tree retval;
e70670cf 437 bool back_edge = false;
8b3057b3 438
3e485f62
JH
439 if (dump_file && (dump_flags & TDF_DETAILS))
440 dump_split_point (dump_file, current);
441
ed10d09b 442 current->count = profile_count::zero ();
8b3057b3 443 FOR_EACH_EDGE (e, ei, current->entry_bb->preds)
e70670cf
JH
444 {
445 if (e->flags & EDGE_DFS_BACK)
446 back_edge = true;
447 if (!bitmap_bit_p (current->split_bbs, e->src->index))
ed10d09b 448 current->count += e->count ();
e70670cf 449 }
8b3057b3 450
ed10d09b
JH
451 /* Do not split when we would end up calling function anyway.
452 Compares are three state, use !(...<...) to also give up when outcome
453 is unknown. */
454 if (!(current->count
455 < (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.apply_scale
456 (PARAM_VALUE (PARAM_PARTIAL_INLINING_ENTRY_PROBABILITY), 100))))
3e485f62 457 {
67914693 458 /* When profile is guessed, we cannot expect it to give us
e70670cf
JH
459 realistic estimate on likelyness of function taking the
460 complex path. As a special case, when tail of the function is
461 a loop, enable splitting since inlining code skipping the loop
462 is likely noticeable win. */
463 if (back_edge
0a6a6ac9 464 && profile_status_for_fn (cfun) != PROFILE_READ
ed10d09b
JH
465 && current->count
466 < ENTRY_BLOCK_PTR_FOR_FN (cfun)->count)
e70670cf
JH
467 {
468 if (dump_file && (dump_flags & TDF_DETAILS))
ed10d09b
JH
469 {
470 fprintf (dump_file,
471 " Split before loop, accepting despite low counts");
472 current->count.dump (dump_file);
473 fprintf (dump_file, " ");
474 ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.dump (dump_file);
475 }
e70670cf
JH
476 }
477 else
478 {
479 if (dump_file && (dump_flags & TDF_DETAILS))
480 fprintf (dump_file,
481 " Refused: incoming frequency is too large.\n");
482 return;
483 }
3e485f62
JH
484 }
485
486 if (!current->header_size)
487 {
488 if (dump_file && (dump_flags & TDF_DETAILS))
489 fprintf (dump_file, " Refused: header empty\n");
3e485f62
JH
490 return;
491 }
492
ed7656f6
JJ
493 /* Verify that PHI args on entry are either virtual or all their operands
494 incoming from header are the same. */
8b3057b3 495 for (bsi = gsi_start_phis (current->entry_bb); !gsi_end_p (bsi); gsi_next (&bsi))
3e485f62 496 {
538dd0b7 497 gphi *stmt = bsi.phi ();
8b3057b3
JH
498 tree val = NULL;
499
ea057359 500 if (virtual_operand_p (gimple_phi_result (stmt)))
8b3057b3
JH
501 continue;
502 for (i = 0; i < gimple_phi_num_args (stmt); i++)
503 {
504 edge e = gimple_phi_arg_edge (stmt, i);
505 if (!bitmap_bit_p (current->split_bbs, e->src->index))
506 {
507 tree edge_val = gimple_phi_arg_def (stmt, i);
508 if (val && edge_val != val)
509 {
510 if (dump_file && (dump_flags & TDF_DETAILS))
511 fprintf (dump_file,
512 " Refused: entry BB has PHI with multiple variants\n");
513 return;
514 }
515 val = edge_val;
516 }
517 }
3e485f62
JH
518 }
519
520
521 /* See what argument we will pass to the split function and compute
522 call overhead. */
523 call_overhead = eni_size_weights.call_cost;
524 for (parm = DECL_ARGUMENTS (current_function_decl); parm;
910ad8de 525 parm = DECL_CHAIN (parm))
3e485f62
JH
526 {
527 if (!is_gimple_reg (parm))
528 {
529 if (bitmap_bit_p (non_ssa_vars, DECL_UID (parm)))
530 {
531 if (dump_file && (dump_flags & TDF_DETAILS))
532 fprintf (dump_file,
533 " Refused: need to pass non-ssa param values\n");
534 return;
535 }
536 }
32244553 537 else
3e485f62 538 {
32244553
RG
539 tree ddef = ssa_default_def (cfun, parm);
540 if (ddef
541 && bitmap_bit_p (current->ssa_names_to_pass,
542 SSA_NAME_VERSION (ddef)))
543 {
544 if (!VOID_TYPE_P (TREE_TYPE (parm)))
b4c9af96 545 call_overhead += estimate_move_cost (TREE_TYPE (parm), false);
32244553
RG
546 num_args++;
547 }
3e485f62
JH
548 }
549 }
550 if (!VOID_TYPE_P (TREE_TYPE (current_function_decl)))
b4c9af96
RB
551 call_overhead += estimate_move_cost (TREE_TYPE (current_function_decl),
552 false);
3e485f62
JH
553
554 if (current->split_size <= call_overhead)
555 {
556 if (dump_file && (dump_flags & TDF_DETAILS))
557 fprintf (dump_file,
558 " Refused: split size is smaller than call overhead\n");
559 return;
560 }
b9aba9fd
JH
561 /* FIXME: The logic here is not very precise, because inliner does use
562 inline predicates to reduce function body size. We add 10 to anticipate
563 that. Next stage1 we should try to be more meaningful here. */
3e485f62
JH
564 if (current->header_size + call_overhead
565 >= (unsigned int)(DECL_DECLARED_INLINE_P (current_function_decl)
566 ? MAX_INLINE_INSNS_SINGLE
b9aba9fd 567 : MAX_INLINE_INSNS_AUTO) + 10)
3e485f62
JH
568 {
569 if (dump_file && (dump_flags & TDF_DETAILS))
570 fprintf (dump_file,
571 " Refused: header size is too large for inline candidate\n");
572 return;
573 }
574
7a161d5b
JH
575 /* Splitting functions brings the target out of comdat group; this will
576 lead to code duplication if the function is reused by other unit.
577 Limit this duplication. This is consistent with limit in tree-sra.c
578 FIXME: with LTO we ought to be able to do better! */
579 if (DECL_ONE_ONLY (current_function_decl)
b9aba9fd 580 && current->split_size >= (unsigned int) MAX_INLINE_INSNS_AUTO + 10)
7a161d5b
JH
581 {
582 if (dump_file && (dump_flags & TDF_DETAILS))
583 fprintf (dump_file,
584 " Refused: function is COMDAT and tail is too large\n");
585 return;
586 }
587 /* For comdat functions also reject very small tails; those will likely get
588 inlined back and we do not want to risk the duplication overhead.
589 FIXME: with LTO we ought to be able to do better! */
590 if (DECL_ONE_ONLY (current_function_decl)
591 && current->split_size
592 <= (unsigned int) PARAM_VALUE (PARAM_EARLY_INLINING_INSNS) / 2)
593 {
594 if (dump_file && (dump_flags & TDF_DETAILS))
595 fprintf (dump_file,
596 " Refused: function is COMDAT and tail is too small\n");
597 return;
598 }
599
3e485f62 600 /* FIXME: we currently can pass only SSA function parameters to the split
d402c33d 601 arguments. Once parm_adjustment infrastructure is supported by cloning,
3e485f62
JH
602 we can pass more than that. */
603 if (num_args != bitmap_count_bits (current->ssa_names_to_pass))
604 {
8b3057b3 605
3e485f62
JH
606 if (dump_file && (dump_flags & TDF_DETAILS))
607 fprintf (dump_file,
608 " Refused: need to pass non-param values\n");
609 return;
610 }
611
612 /* When there are non-ssa vars used in the split region, see if they
613 are used in the header region. If so, reject the split.
614 FIXME: we can use nested function support to access both. */
2094f1fc
JH
615 if (!bitmap_empty_p (non_ssa_vars)
616 && !verify_non_ssa_vars (current, non_ssa_vars, return_bb))
3e485f62 617 {
2094f1fc
JH
618 if (dump_file && (dump_flags & TDF_DETAILS))
619 fprintf (dump_file,
620 " Refused: split part has non-ssa uses\n");
3e485f62
JH
621 return;
622 }
b2e25729
BS
623
624 /* If the split point is dominated by a forbidden block, reject
625 the split. */
626 if (!bitmap_empty_p (forbidden_dominators)
627 && dominated_by_forbidden (current->entry_bb))
628 {
629 if (dump_file && (dump_flags & TDF_DETAILS))
630 fprintf (dump_file,
631 " Refused: split point dominated by forbidden block\n");
632 return;
633 }
634
241a2b9e
JH
635 /* See if retval used by return bb is computed by header or split part.
636 When it is computed by split part, we need to produce return statement
637 in the split part and add code to header to pass it around.
638
639 This is bit tricky to test:
640 1) When there is no return_bb or no return value, we always pass
641 value around.
642 2) Invariants are always computed by caller.
643 3) For SSA we need to look if defining statement is in header or split part
644 4) For non-SSA we need to look where the var is computed. */
645 retval = find_retval (return_bb);
646 if (!retval)
06ff7000
JJ
647 {
648 /* If there is a return_bb with no return value in function returning
649 value by reference, also make the split part return void, otherwise
650 we expansion would try to create a non-POD temporary, which is
651 invalid. */
652 if (return_bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
653 && DECL_RESULT (current_function_decl)
654 && DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
655 current->split_part_set_retval = false;
656 else
657 current->split_part_set_retval = true;
658 }
241a2b9e
JH
659 else if (is_gimple_min_invariant (retval))
660 current->split_part_set_retval = false;
661 /* Special case is value returned by reference we record as if it was non-ssa
662 set to result_decl. */
663 else if (TREE_CODE (retval) == SSA_NAME
70b5e7dc 664 && SSA_NAME_VAR (retval)
241a2b9e
JH
665 && TREE_CODE (SSA_NAME_VAR (retval)) == RESULT_DECL
666 && DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
667 current->split_part_set_retval
668 = bitmap_bit_p (non_ssa_vars, DECL_UID (SSA_NAME_VAR (retval)));
669 else if (TREE_CODE (retval) == SSA_NAME)
670 current->split_part_set_retval
d5e254e1 671 = split_part_set_ssa_name_p (retval, current, return_bb);
241a2b9e
JH
672 else if (TREE_CODE (retval) == PARM_DECL)
673 current->split_part_set_retval = false;
8813a647 674 else if (VAR_P (retval)
241a2b9e
JH
675 || TREE_CODE (retval) == RESULT_DECL)
676 current->split_part_set_retval
677 = bitmap_bit_p (non_ssa_vars, DECL_UID (retval));
678 else
679 current->split_part_set_retval = true;
680
28fc44f3
JJ
681 /* split_function fixes up at most one PHI non-virtual PHI node in return_bb,
682 for the return value. If there are other PHIs, give up. */
fefa31b5 683 if (return_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
28fc44f3 684 {
538dd0b7 685 gphi_iterator psi;
28fc44f3
JJ
686
687 for (psi = gsi_start_phis (return_bb); !gsi_end_p (psi); gsi_next (&psi))
538dd0b7 688 if (!virtual_operand_p (gimple_phi_result (psi.phi ()))
28fc44f3
JJ
689 && !(retval
690 && current->split_part_set_retval
691 && TREE_CODE (retval) == SSA_NAME
692 && !DECL_BY_REFERENCE (DECL_RESULT (current_function_decl))
538dd0b7 693 && SSA_NAME_DEF_STMT (retval) == psi.phi ()))
28fc44f3
JJ
694 {
695 if (dump_file && (dump_flags & TDF_DETAILS))
696 fprintf (dump_file,
697 " Refused: return bb has extra PHIs\n");
698 return;
699 }
700 }
701
702 if (dump_file && (dump_flags & TDF_DETAILS))
703 fprintf (dump_file, " Accepted!\n");
704
ed10d09b 705 /* At the moment chose split point with lowest count and that leaves
3e485f62
JH
706 out smallest size of header.
707 In future we might re-consider this heuristics. */
708 if (!best_split_point.split_bbs
ed10d09b
JH
709 || best_split_point.count
710 > current->count
711 || (best_split_point.count == current->count
3e485f62
JH
712 && best_split_point.split_size < current->split_size))
713
714 {
715 if (dump_file && (dump_flags & TDF_DETAILS))
716 fprintf (dump_file, " New best split point!\n");
717 if (best_split_point.ssa_names_to_pass)
718 {
719 BITMAP_FREE (best_split_point.ssa_names_to_pass);
720 BITMAP_FREE (best_split_point.split_bbs);
721 }
722 best_split_point = *current;
723 best_split_point.ssa_names_to_pass = BITMAP_ALLOC (NULL);
724 bitmap_copy (best_split_point.ssa_names_to_pass,
725 current->ssa_names_to_pass);
726 best_split_point.split_bbs = BITMAP_ALLOC (NULL);
727 bitmap_copy (best_split_point.split_bbs, current->split_bbs);
728 }
729}
730
2094f1fc
JH
731/* Return basic block containing RETURN statement. We allow basic blocks
732 of the form:
733 <retval> = tmp_var;
734 return <retval>
67914693 735 but return_bb cannot be more complex than this (except for
bfd71482 736 -fsanitize=thread we allow TSAN_FUNC_EXIT () internal call in there).
6626665f 737 If nothing is found, return the exit block.
2094f1fc 738
3e485f62
JH
739 When there are multiple RETURN statement, chose one with return value,
740 since that one is more likely shared by multiple code paths.
2094f1fc
JH
741
742 Return BB is special, because for function splitting it is the only
743 basic block that is duplicated in between header and split part of the
744 function.
745
3e485f62
JH
746 TODO: We might support multiple return blocks. */
747
748static basic_block
749find_return_bb (void)
750{
751 edge e;
fefa31b5 752 basic_block return_bb = EXIT_BLOCK_PTR_FOR_FN (cfun);
68457901
JJ
753 gimple_stmt_iterator bsi;
754 bool found_return = false;
755 tree retval = NULL_TREE;
3e485f62 756
fefa31b5 757 if (!single_pred_p (EXIT_BLOCK_PTR_FOR_FN (cfun)))
68457901
JJ
758 return return_bb;
759
fefa31b5 760 e = single_pred_edge (EXIT_BLOCK_PTR_FOR_FN (cfun));
68457901
JJ
761 for (bsi = gsi_last_bb (e->src); !gsi_end_p (bsi); gsi_prev (&bsi))
762 {
355fe088 763 gimple *stmt = gsi_stmt (bsi);
a348dc7f
JJ
764 if (gimple_code (stmt) == GIMPLE_LABEL
765 || is_gimple_debug (stmt)
766 || gimple_clobber_p (stmt))
68457901
JJ
767 ;
768 else if (gimple_code (stmt) == GIMPLE_ASSIGN
769 && found_return
770 && gimple_assign_single_p (stmt)
771 && (auto_var_in_fn_p (gimple_assign_rhs1 (stmt),
772 current_function_decl)
773 || is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
774 && retval == gimple_assign_lhs (stmt))
775 ;
538dd0b7 776 else if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
68457901
JJ
777 {
778 found_return = true;
538dd0b7 779 retval = gimple_return_retval (return_stmt);
68457901 780 }
bfd71482
JJ
781 /* For -fsanitize=thread, allow also TSAN_FUNC_EXIT () in the return
782 bb. */
783 else if ((flag_sanitize & SANITIZE_THREAD)
8e4284d0 784 && gimple_call_internal_p (stmt, IFN_TSAN_FUNC_EXIT))
bfd71482 785 ;
68457901
JJ
786 else
787 break;
788 }
789 if (gsi_end_p (bsi) && found_return)
790 return_bb = e->src;
3e485f62 791
3e485f62
JH
792 return return_bb;
793}
794
ed7656f6 795/* Given return basic block RETURN_BB, see where return value is really
2094f1fc
JH
796 stored. */
797static tree
798find_retval (basic_block return_bb)
799{
800 gimple_stmt_iterator bsi;
801 for (bsi = gsi_start_bb (return_bb); !gsi_end_p (bsi); gsi_next (&bsi))
538dd0b7
DM
802 if (greturn *return_stmt = dyn_cast <greturn *> (gsi_stmt (bsi)))
803 return gimple_return_retval (return_stmt);
a348dc7f
JJ
804 else if (gimple_code (gsi_stmt (bsi)) == GIMPLE_ASSIGN
805 && !gimple_clobber_p (gsi_stmt (bsi)))
2094f1fc
JH
806 return gimple_assign_rhs1 (gsi_stmt (bsi));
807 return NULL;
808}
809
1802378d
EB
810/* Callback for walk_stmt_load_store_addr_ops. If T is non-SSA automatic
811 variable, mark it as used in bitmap passed via DATA.
3e485f62
JH
812 Return true when access to T prevents splitting the function. */
813
814static bool
355fe088 815mark_nonssa_use (gimple *, tree t, tree, void *data)
3e485f62
JH
816{
817 t = get_base_address (t);
818
819 if (!t || is_gimple_reg (t))
820 return false;
821
822 /* At present we can't pass non-SSA arguments to split function.
823 FIXME: this can be relaxed by passing references to arguments. */
824 if (TREE_CODE (t) == PARM_DECL)
825 {
826 if (dump_file && (dump_flags & TDF_DETAILS))
1802378d
EB
827 fprintf (dump_file,
828 "Cannot split: use of non-ssa function parameter.\n");
3e485f62
JH
829 return true;
830 }
831
8813a647 832 if ((VAR_P (t) && auto_var_in_fn_p (t, current_function_decl))
1802378d 833 || TREE_CODE (t) == RESULT_DECL
8813a647 834 || (TREE_CODE (t) == LABEL_DECL && FORCED_LABEL (t)))
3e485f62 835 bitmap_set_bit ((bitmap)data, DECL_UID (t));
241a2b9e 836
1802378d
EB
837 /* For DECL_BY_REFERENCE, the return value is actually a pointer. We want
838 to pretend that the value pointed to is actual result decl. */
839 if ((TREE_CODE (t) == MEM_REF || INDIRECT_REF_P (t))
241a2b9e 840 && TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
70b5e7dc 841 && SSA_NAME_VAR (TREE_OPERAND (t, 0))
241a2b9e
JH
842 && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND (t, 0))) == RESULT_DECL
843 && DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
1802378d
EB
844 return
845 bitmap_bit_p ((bitmap)data,
846 DECL_UID (DECL_RESULT (current_function_decl)));
847
3e485f62
JH
848 return false;
849}
850
851/* Compute local properties of basic block BB we collect when looking for
852 split points. We look for ssa defs and store them in SET_SSA_NAMES,
853 for ssa uses and store them in USED_SSA_NAMES and for any non-SSA automatic
854 vars stored in NON_SSA_VARS.
855
856 When BB has edge to RETURN_BB, collect uses in RETURN_BB too.
857
858 Return false when BB contains something that prevents it from being put into
859 split function. */
860
861static bool
862visit_bb (basic_block bb, basic_block return_bb,
863 bitmap set_ssa_names, bitmap used_ssa_names,
864 bitmap non_ssa_vars)
865{
3e485f62
JH
866 edge e;
867 edge_iterator ei;
868 bool can_split = true;
869
538dd0b7
DM
870 for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi);
871 gsi_next (&bsi))
3e485f62 872 {
355fe088 873 gimple *stmt = gsi_stmt (bsi);
3e485f62
JH
874 tree op;
875 ssa_op_iter iter;
876 tree decl;
877
878 if (is_gimple_debug (stmt))
879 continue;
880
a348dc7f
JJ
881 if (gimple_clobber_p (stmt))
882 continue;
883
67914693 884 /* FIXME: We can split regions containing EH. We cannot however
3e485f62
JH
885 split RESX, EH_DISPATCH and EH_POINTER referring to same region
886 into different partitions. This would require tracking of
887 EH regions and checking in consider_split_point if they
888 are not used elsewhere. */
1da7d8c0 889 if (gimple_code (stmt) == GIMPLE_RESX)
3e485f62
JH
890 {
891 if (dump_file && (dump_flags & TDF_DETAILS))
1da7d8c0 892 fprintf (dump_file, "Cannot split: resx.\n");
3e485f62
JH
893 can_split = false;
894 }
895 if (gimple_code (stmt) == GIMPLE_EH_DISPATCH)
896 {
897 if (dump_file && (dump_flags & TDF_DETAILS))
1802378d 898 fprintf (dump_file, "Cannot split: eh dispatch.\n");
3e485f62
JH
899 can_split = false;
900 }
901
902 /* Check builtins that prevent splitting. */
903 if (gimple_code (stmt) == GIMPLE_CALL
904 && (decl = gimple_call_fndecl (stmt)) != NULL_TREE
3d78e008 905 && fndecl_built_in_p (decl, BUILT_IN_NORMAL))
3e485f62
JH
906 switch (DECL_FUNCTION_CODE (decl))
907 {
908 /* FIXME: once we will allow passing non-parm values to split part,
909 we need to be sure to handle correct builtin_stack_save and
910 builtin_stack_restore. At the moment we are safe; there is no
911 way to store builtin_stack_save result in non-SSA variable
912 since all calls to those are compiler generated. */
913 case BUILT_IN_APPLY:
61e03ffc 914 case BUILT_IN_APPLY_ARGS:
3e485f62
JH
915 case BUILT_IN_VA_START:
916 if (dump_file && (dump_flags & TDF_DETAILS))
1802378d
EB
917 fprintf (dump_file,
918 "Cannot split: builtin_apply and va_start.\n");
3e485f62
JH
919 can_split = false;
920 break;
921 case BUILT_IN_EH_POINTER:
922 if (dump_file && (dump_flags & TDF_DETAILS))
1802378d 923 fprintf (dump_file, "Cannot split: builtin_eh_pointer.\n");
3e485f62
JH
924 can_split = false;
925 break;
926 default:
927 break;
928 }
929
930 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF)
931 bitmap_set_bit (set_ssa_names, SSA_NAME_VERSION (op));
932 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
933 bitmap_set_bit (used_ssa_names, SSA_NAME_VERSION (op));
934 can_split &= !walk_stmt_load_store_addr_ops (stmt, non_ssa_vars,
935 mark_nonssa_use,
936 mark_nonssa_use,
937 mark_nonssa_use);
938 }
538dd0b7
DM
939 for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
940 gsi_next (&bsi))
3e485f62 941 {
538dd0b7 942 gphi *stmt = bsi.phi ();
8b3057b3 943 unsigned int i;
3e485f62 944
ea057359 945 if (virtual_operand_p (gimple_phi_result (stmt)))
3e485f62 946 continue;
8b3057b3
JH
947 bitmap_set_bit (set_ssa_names,
948 SSA_NAME_VERSION (gimple_phi_result (stmt)));
949 for (i = 0; i < gimple_phi_num_args (stmt); i++)
950 {
951 tree op = gimple_phi_arg_def (stmt, i);
952 if (TREE_CODE (op) == SSA_NAME)
953 bitmap_set_bit (used_ssa_names, SSA_NAME_VERSION (op));
954 }
3e485f62
JH
955 can_split &= !walk_stmt_load_store_addr_ops (stmt, non_ssa_vars,
956 mark_nonssa_use,
957 mark_nonssa_use,
958 mark_nonssa_use);
959 }
ed7656f6 960 /* Record also uses coming from PHI operand in return BB. */
3e485f62
JH
961 FOR_EACH_EDGE (e, ei, bb->succs)
962 if (e->dest == return_bb)
963 {
538dd0b7
DM
964 for (gphi_iterator bsi = gsi_start_phis (return_bb);
965 !gsi_end_p (bsi);
966 gsi_next (&bsi))
3e485f62 967 {
538dd0b7 968 gphi *stmt = bsi.phi ();
3e485f62
JH
969 tree op = gimple_phi_arg_def (stmt, e->dest_idx);
970
ea057359 971 if (virtual_operand_p (gimple_phi_result (stmt)))
3e485f62 972 continue;
3e485f62
JH
973 if (TREE_CODE (op) == SSA_NAME)
974 bitmap_set_bit (used_ssa_names, SSA_NAME_VERSION (op));
975 else
9f1363cd 976 can_split &= !mark_nonssa_use (stmt, op, op, non_ssa_vars);
3e485f62 977 }
3e485f62
JH
978 }
979 return can_split;
980}
981
982/* Stack entry for recursive DFS walk in find_split_point. */
983
6c1dae73 984class stack_entry
3e485f62 985{
6c1dae73 986public:
3e485f62
JH
987 /* Basic block we are examining. */
988 basic_block bb;
989
990 /* SSA names set and used by the BB and all BBs reachable
991 from it via DFS walk. */
992 bitmap set_ssa_names, used_ssa_names;
993 bitmap non_ssa_vars;
994
995 /* All BBS visited from this BB via DFS walk. */
996 bitmap bbs_visited;
997
998 /* Last examined edge in DFS walk. Since we walk unoriented graph,
ed7656f6 999 the value is up to sum of incoming and outgoing edges of BB. */
3e485f62
JH
1000 unsigned int edge_num;
1001
1002 /* Stack entry index of earliest BB reachable from current BB
ed7656f6 1003 or any BB visited later in DFS walk. */
3e485f62
JH
1004 int earliest;
1005
1006 /* Overall time and size of all BBs reached from this BB in DFS walk. */
c2e87766
JH
1007 sreal overall_time;
1008 int overall_size;
3e485f62 1009
67914693 1010 /* When false we cannot split on this BB. */
3e485f62 1011 bool can_split;
50686850 1012};
3e485f62
JH
1013
1014
1015/* Find all articulations and call consider_split on them.
1016 OVERALL_TIME and OVERALL_SIZE is time and size of the function.
1017
1018 We perform basic algorithm for finding an articulation in a graph
1019 created from CFG by considering it to be an unoriented graph.
1020
1021 The articulation is discovered via DFS walk. We collect earliest
1022 basic block on stack that is reachable via backward edge. Articulation
1023 is any basic block such that there is no backward edge bypassing it.
1024 To reduce stack usage we maintain heap allocated stack in STACK vector.
1025 AUX pointer of BB is set to index it appears in the stack or -1 once
1026 it is visited and popped off the stack.
1027
1028 The algorithm finds articulation after visiting the whole component
1029 reachable by it. This makes it convenient to collect information about
1030 the component used by consider_split. */
1031
1032static void
c2e87766 1033find_split_points (basic_block return_bb, sreal overall_time, int overall_size)
3e485f62
JH
1034{
1035 stack_entry first;
6e1aa848 1036 vec<stack_entry> stack = vNULL;
3e485f62 1037 basic_block bb;
99b1c316 1038 class split_point current;
3e485f62
JH
1039
1040 current.header_time = overall_time;
1041 current.header_size = overall_size;
1042 current.split_time = 0;
1043 current.split_size = 0;
1044 current.ssa_names_to_pass = BITMAP_ALLOC (NULL);
1045
fefa31b5 1046 first.bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
3e485f62
JH
1047 first.edge_num = 0;
1048 first.overall_time = 0;
1049 first.overall_size = 0;
1050 first.earliest = INT_MAX;
1051 first.set_ssa_names = 0;
1052 first.used_ssa_names = 0;
e15eb172 1053 first.non_ssa_vars = 0;
3e485f62 1054 first.bbs_visited = 0;
e15eb172 1055 first.can_split = false;
9771b263 1056 stack.safe_push (first);
fefa31b5 1057 ENTRY_BLOCK_PTR_FOR_FN (cfun)->aux = (void *)(intptr_t)-1;
3e485f62 1058
9771b263 1059 while (!stack.is_empty ())
3e485f62 1060 {
9771b263 1061 stack_entry *entry = &stack.last ();
3e485f62
JH
1062
1063 /* We are walking an acyclic graph, so edge_num counts
1064 succ and pred edges together. However when considering
1065 articulation, we want to have processed everything reachable
1066 from articulation but nothing that reaches into it. */
1067 if (entry->edge_num == EDGE_COUNT (entry->bb->succs)
fefa31b5 1068 && entry->bb != ENTRY_BLOCK_PTR_FOR_FN (cfun))
3e485f62 1069 {
9771b263 1070 int pos = stack.length ();
3e485f62
JH
1071 entry->can_split &= visit_bb (entry->bb, return_bb,
1072 entry->set_ssa_names,
1073 entry->used_ssa_names,
1074 entry->non_ssa_vars);
1075 if (pos <= entry->earliest && !entry->can_split
1076 && dump_file && (dump_flags & TDF_DETAILS))
1077 fprintf (dump_file,
67914693 1078 "found articulation at bb %i but cannot split\n",
3e485f62
JH
1079 entry->bb->index);
1080 if (pos <= entry->earliest && entry->can_split)
1081 {
1082 if (dump_file && (dump_flags & TDF_DETAILS))
1083 fprintf (dump_file, "found articulation at bb %i\n",
1084 entry->bb->index);
1085 current.entry_bb = entry->bb;
1086 current.ssa_names_to_pass = BITMAP_ALLOC (NULL);
1087 bitmap_and_compl (current.ssa_names_to_pass,
1088 entry->used_ssa_names, entry->set_ssa_names);
1089 current.header_time = overall_time - entry->overall_time;
1090 current.header_size = overall_size - entry->overall_size;
1091 current.split_time = entry->overall_time;
1092 current.split_size = entry->overall_size;
1093 current.split_bbs = entry->bbs_visited;
1094 consider_split (&current, entry->non_ssa_vars, return_bb);
1095 BITMAP_FREE (current.ssa_names_to_pass);
1096 }
1097 }
1098 /* Do actual DFS walk. */
1099 if (entry->edge_num
1100 < (EDGE_COUNT (entry->bb->succs)
1101 + EDGE_COUNT (entry->bb->preds)))
1102 {
1103 edge e;
1104 basic_block dest;
1105 if (entry->edge_num < EDGE_COUNT (entry->bb->succs))
1106 {
1107 e = EDGE_SUCC (entry->bb, entry->edge_num);
1108 dest = e->dest;
1109 }
1110 else
1111 {
1112 e = EDGE_PRED (entry->bb, entry->edge_num
1113 - EDGE_COUNT (entry->bb->succs));
1114 dest = e->src;
1115 }
1116
1117 entry->edge_num++;
1118
1119 /* New BB to visit, push it to the stack. */
fefa31b5 1120 if (dest != return_bb && dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
3e485f62
JH
1121 && !dest->aux)
1122 {
1123 stack_entry new_entry;
1124
1125 new_entry.bb = dest;
1126 new_entry.edge_num = 0;
1127 new_entry.overall_time
9771b263 1128 = bb_info_vec[dest->index].time;
3e485f62 1129 new_entry.overall_size
9771b263 1130 = bb_info_vec[dest->index].size;
3e485f62
JH
1131 new_entry.earliest = INT_MAX;
1132 new_entry.set_ssa_names = BITMAP_ALLOC (NULL);
1133 new_entry.used_ssa_names = BITMAP_ALLOC (NULL);
1134 new_entry.bbs_visited = BITMAP_ALLOC (NULL);
1135 new_entry.non_ssa_vars = BITMAP_ALLOC (NULL);
1136 new_entry.can_split = true;
1137 bitmap_set_bit (new_entry.bbs_visited, dest->index);
9771b263
DN
1138 stack.safe_push (new_entry);
1139 dest->aux = (void *)(intptr_t)stack.length ();
3e485f62
JH
1140 }
1141 /* Back edge found, record the earliest point. */
1142 else if ((intptr_t)dest->aux > 0
1143 && (intptr_t)dest->aux < entry->earliest)
1144 entry->earliest = (intptr_t)dest->aux;
1145 }
ed7656f6
JJ
1146 /* We are done with examining the edges. Pop off the value from stack
1147 and merge stuff we accumulate during the walk. */
fefa31b5 1148 else if (entry->bb != ENTRY_BLOCK_PTR_FOR_FN (cfun))
3e485f62 1149 {
9771b263 1150 stack_entry *prev = &stack[stack.length () - 2];
3e485f62
JH
1151
1152 entry->bb->aux = (void *)(intptr_t)-1;
1153 prev->can_split &= entry->can_split;
1154 if (prev->set_ssa_names)
1155 {
1156 bitmap_ior_into (prev->set_ssa_names, entry->set_ssa_names);
1157 bitmap_ior_into (prev->used_ssa_names, entry->used_ssa_names);
1158 bitmap_ior_into (prev->bbs_visited, entry->bbs_visited);
1159 bitmap_ior_into (prev->non_ssa_vars, entry->non_ssa_vars);
1160 }
1161 if (prev->earliest > entry->earliest)
1162 prev->earliest = entry->earliest;
1163 prev->overall_time += entry->overall_time;
1164 prev->overall_size += entry->overall_size;
1165 BITMAP_FREE (entry->set_ssa_names);
1166 BITMAP_FREE (entry->used_ssa_names);
1167 BITMAP_FREE (entry->bbs_visited);
1168 BITMAP_FREE (entry->non_ssa_vars);
9771b263 1169 stack.pop ();
3e485f62
JH
1170 }
1171 else
9771b263 1172 stack.pop ();
3e485f62 1173 }
fefa31b5 1174 ENTRY_BLOCK_PTR_FOR_FN (cfun)->aux = NULL;
11cd3bed 1175 FOR_EACH_BB_FN (bb, cfun)
3e485f62 1176 bb->aux = NULL;
9771b263 1177 stack.release ();
3e485f62
JH
1178 BITMAP_FREE (current.ssa_names_to_pass);
1179}
1180
1181/* Split function at SPLIT_POINT. */
1182
1183static void
99b1c316 1184split_function (basic_block return_bb, class split_point *split_point,
bfd71482 1185 bool add_tsan_func_exit)
3e485f62 1186{
6e1aa848 1187 vec<tree> args_to_pass = vNULL;
201176d3 1188 bitmap args_to_skip;
3e485f62
JH
1189 tree parm;
1190 int num = 0;
d52f5295 1191 cgraph_node *node, *cur_node = cgraph_node::get (current_function_decl);
3e485f62 1192 basic_block call_bb;
bfd71482 1193 gcall *call, *tsan_func_exit_call = NULL;
3e485f62
JH
1194 edge e;
1195 edge_iterator ei;
31db0fe0 1196 tree retval = NULL, real_retval = NULL;
355fe088 1197 gimple *last_stmt = NULL;
371556ee 1198 unsigned int i;
32244553 1199 tree arg, ddef;
3e485f62
JH
1200
1201 if (dump_file)
1202 {
1203 fprintf (dump_file, "\n\nSplitting function at:\n");
1204 dump_split_point (dump_file, split_point);
1205 }
1206
87f94429 1207 if (cur_node->can_change_signature)
201176d3
MJ
1208 args_to_skip = BITMAP_ALLOC (NULL);
1209 else
1210 args_to_skip = NULL;
1211
3e485f62
JH
1212 /* Collect the parameters of new function and args_to_skip bitmap. */
1213 for (parm = DECL_ARGUMENTS (current_function_decl);
910ad8de 1214 parm; parm = DECL_CHAIN (parm), num++)
201176d3
MJ
1215 if (args_to_skip
1216 && (!is_gimple_reg (parm)
32244553 1217 || (ddef = ssa_default_def (cfun, parm)) == NULL_TREE
201176d3 1218 || !bitmap_bit_p (split_point->ssa_names_to_pass,
32244553 1219 SSA_NAME_VERSION (ddef))))
3e485f62
JH
1220 bitmap_set_bit (args_to_skip, num);
1221 else
371556ee 1222 {
86814190
MJ
1223 /* This parm might not have been used up to now, but is going to be
1224 used, hence register it. */
86814190 1225 if (is_gimple_reg (parm))
32244553 1226 arg = get_or_create_ssa_default_def (cfun, parm);
86814190
MJ
1227 else
1228 arg = parm;
201176d3 1229
2b3c0885
RG
1230 if (!useless_type_conversion_p (DECL_ARG_TYPE (parm), TREE_TYPE (arg)))
1231 arg = fold_convert (DECL_ARG_TYPE (parm), arg);
9771b263 1232 args_to_pass.safe_push (arg);
371556ee 1233 }
3e485f62 1234
b69539cb 1235 /* See if the split function will return. */
ece95567 1236 bool split_part_return_p = false;
3e485f62 1237 FOR_EACH_EDGE (e, ei, return_bb->preds)
ece95567
RB
1238 {
1239 if (bitmap_bit_p (split_point->split_bbs, e->src->index))
1240 split_part_return_p = true;
ece95567 1241 }
3e485f62 1242
241a2b9e
JH
1243 /* Add return block to what will become the split function.
1244 We do not return; no return block is needed. */
1245 if (!split_part_return_p)
1246 ;
1247 /* We have no return block, so nothing is needed. */
fefa31b5 1248 else if (return_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
241a2b9e
JH
1249 ;
1250 /* When we do not want to return value, we need to construct
1251 new return block with empty return statement.
1252 FIXME: Once we are able to change return type, we should change function
1253 to return void instead of just outputting function with undefined return
1254 value. For structures this affects quality of codegen. */
b69539cb
JJ
1255 else if ((retval = find_retval (return_bb))
1256 && !split_point->split_part_set_retval)
241a2b9e
JH
1257 {
1258 bool redirected = true;
1259 basic_block new_return_bb = create_basic_block (NULL, 0, return_bb);
1260 gimple_stmt_iterator gsi = gsi_start_bb (new_return_bb);
1261 gsi_insert_after (&gsi, gimple_build_return (NULL), GSI_NEW_STMT);
ce6ec234 1262 new_return_bb->count = profile_count::zero ();
241a2b9e
JH
1263 while (redirected)
1264 {
1265 redirected = false;
1266 FOR_EACH_EDGE (e, ei, return_bb->preds)
1267 if (bitmap_bit_p (split_point->split_bbs, e->src->index))
1268 {
e7a74006 1269 new_return_bb->count += e->count ();
241a2b9e
JH
1270 redirect_edge_and_branch (e, new_return_bb);
1271 redirected = true;
1272 break;
1273 }
1274 }
357067f2 1275 e = make_single_succ_edge (new_return_bb, EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
726338f4 1276 add_bb_to_loop (new_return_bb, current_loops->tree_root);
241a2b9e 1277 bitmap_set_bit (split_point->split_bbs, new_return_bb->index);
2e5e346d
JL
1278 }
1279 /* When we pass around the value, use existing return block. */
1280 else
31db0fe0 1281 bitmap_set_bit (split_point->split_bbs, return_bb->index);
ece95567 1282
2e5e346d
JL
1283 /* If RETURN_BB has virtual operand PHIs, they must be removed and the
1284 virtual operand marked for renaming as we change the CFG in a way that
cfef45c8 1285 tree-inline is not able to compensate for.
2e5e346d
JL
1286
1287 Note this can happen whether or not we have a return value. If we have
1288 a return value, then RETURN_BB may have PHIs for real operands too. */
fefa31b5 1289 if (return_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
2e5e346d 1290 {
cfef45c8 1291 bool phi_p = false;
538dd0b7
DM
1292 for (gphi_iterator gsi = gsi_start_phis (return_bb);
1293 !gsi_end_p (gsi);)
241a2b9e 1294 {
538dd0b7 1295 gphi *stmt = gsi.phi ();
ea057359 1296 if (!virtual_operand_p (gimple_phi_result (stmt)))
2e5e346d
JL
1297 {
1298 gsi_next (&gsi);
1299 continue;
1300 }
6b8c9df8
RG
1301 mark_virtual_phi_result_for_renaming (stmt);
1302 remove_phi_node (&gsi, true);
cfef45c8 1303 phi_p = true;
241a2b9e 1304 }
cfef45c8
RG
1305 /* In reality we have to rename the reaching definition of the
1306 virtual operand at return_bb as we will eventually release it
1307 when we remove the code region we outlined.
1308 So we have to rename all immediate virtual uses of that region
1309 if we didn't see a PHI definition yet. */
1310 /* ??? In real reality we want to set the reaching vdef of the
1311 entry of the SESE region as the vuse of the call and the reaching
1312 vdef of the exit of the SESE region as the vdef of the call. */
1313 if (!phi_p)
538dd0b7
DM
1314 for (gimple_stmt_iterator gsi = gsi_start_bb (return_bb);
1315 !gsi_end_p (gsi);
1316 gsi_next (&gsi))
cfef45c8 1317 {
355fe088 1318 gimple *stmt = gsi_stmt (gsi);
cfef45c8
RG
1319 if (gimple_vuse (stmt))
1320 {
1321 gimple_set_vuse (stmt, NULL_TREE);
1322 update_stmt (stmt);
1323 }
1324 if (gimple_vdef (stmt))
1325 break;
1326 }
241a2b9e 1327 }
3e485f62 1328
ff6686d2
MJ
1329 ipa_param_adjustments *adjustments;
1330 bool skip_return = (!split_part_return_p
1331 || !split_point->split_part_set_retval);
1332 /* TODO: Perhaps get rid of args_to_skip entirely, after we make sure the
1333 debug info generation and discrepancy avoiding works well too. */
1334 if ((args_to_skip && !bitmap_empty_p (args_to_skip))
1335 || skip_return)
1336 {
1337 vec<ipa_adjusted_param, va_gc> *new_params = NULL;
1338 unsigned j;
1339 for (parm = DECL_ARGUMENTS (current_function_decl), j = 0;
1340 parm; parm = DECL_CHAIN (parm), j++)
1341 if (!args_to_skip || !bitmap_bit_p (args_to_skip, j))
1342 {
1343 ipa_adjusted_param adj;
1344 memset (&adj, 0, sizeof (adj));
1345 adj.op = IPA_PARAM_OP_COPY;
1346 adj.base_index = j;
1347 adj.prev_clone_index = j;
1348 vec_safe_push (new_params, adj);
1349 }
1350 adjustments = new ipa_param_adjustments (new_params, j, skip_return);
1351 }
1352 else
1353 adjustments = NULL;
1354
3e485f62 1355 /* Now create the actual clone. */
3dafb85c 1356 cgraph_edge::rebuild_edges ();
d52f5295 1357 node = cur_node->create_version_clone_with_body
ff6686d2 1358 (vNULL, NULL, adjustments,
e199dd0a 1359 split_point->split_bbs, split_point->entry_bb, "part");
ff6686d2 1360 delete adjustments;
41f669d8
JH
1361 node->split_part = true;
1362
c6cf6ef7
ML
1363 if (cur_node->same_comdat_group)
1364 {
1365 /* TODO: call is versionable if we make sure that all
1366 callers are inside of a comdat group. */
1367 cur_node->calls_comdat_local = 1;
1368 node->add_to_same_comdat_group (cur_node);
1369 }
1370
1371
9cec31f4
ML
1372 /* Let's take a time profile for splitted function. */
1373 node->tp_first_run = cur_node->tp_first_run + 1;
1374
d402c33d 1375 /* For usual cloning it is enough to clear builtin only when signature
67914693 1376 changes. For partial inlining we however cannot expect the part
d402c33d 1377 of builtin implementation to have same semantic as the whole. */
3d78e008 1378 if (fndecl_built_in_p (node->decl))
4d732405 1379 set_decl_built_in_function (node->decl, NOT_BUILT_IN, 0);
d5e254e1 1380
b69539cb
JJ
1381 /* If return_bb contains any clobbers that refer to SSA_NAMEs
1382 set in the split part, remove them. Also reset debug stmts that
1383 refer to SSA_NAMEs set in the split part. */
1384 if (return_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
1385 {
1386 gimple_stmt_iterator gsi = gsi_start_bb (return_bb);
1387 while (!gsi_end_p (gsi))
1388 {
1389 tree op;
1390 ssa_op_iter iter;
1391 gimple *stmt = gsi_stmt (gsi);
1392 bool remove = false;
1393 if (gimple_clobber_p (stmt) || is_gimple_debug (stmt))
1394 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
1395 {
1396 basic_block bb = gimple_bb (SSA_NAME_DEF_STMT (op));
1397 if (op != retval
1398 && bb
1399 && bb != return_bb
1400 && bitmap_bit_p (split_point->split_bbs, bb->index))
1401 {
1402 if (is_gimple_debug (stmt))
1403 {
1404 gimple_debug_bind_reset_value (stmt);
1405 update_stmt (stmt);
1406 }
1407 else
1408 remove = true;
1409 break;
1410 }
1411 }
1412 if (remove)
1413 gsi_remove (&gsi, true);
1414 else
1415 gsi_next (&gsi);
1416 }
1417 }
1418
9a6af450
EB
1419 /* If the original function is declared inline, there is no point in issuing
1420 a warning for the non-inlinable part. */
67348ccc 1421 DECL_NO_INLINE_WARNING_P (node->decl) = 1;
d52f5295 1422 cur_node->remove_callees ();
d122681a 1423 cur_node->remove_all_references ();
3e485f62 1424 if (!split_part_return_p)
67348ccc 1425 TREE_THIS_VOLATILE (node->decl) = 1;
3e485f62 1426 if (dump_file)
67348ccc 1427 dump_function_to_file (node->decl, dump_file, dump_flags);
3e485f62
JH
1428
1429 /* Create the basic block we place call into. It is the entry basic block
1430 split after last label. */
1431 call_bb = split_point->entry_bb;
538dd0b7 1432 for (gimple_stmt_iterator gsi = gsi_start_bb (call_bb); !gsi_end_p (gsi);)
3e485f62
JH
1433 if (gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
1434 {
1435 last_stmt = gsi_stmt (gsi);
1436 gsi_next (&gsi);
1437 }
1438 else
1439 break;
ed10d09b 1440 call_bb->count = split_point->count;
3e485f62
JH
1441 e = split_block (split_point->entry_bb, last_stmt);
1442 remove_edge (e);
1443
1444 /* Produce the call statement. */
538dd0b7 1445 gimple_stmt_iterator gsi = gsi_last_bb (call_bb);
9771b263 1446 FOR_EACH_VEC_ELT (args_to_pass, i, arg)
2b3c0885
RG
1447 if (!is_gimple_val (arg))
1448 {
1449 arg = force_gimple_operand_gsi (&gsi, arg, true, NULL_TREE,
f6e52e91 1450 false, GSI_CONTINUE_LINKING);
9771b263 1451 args_to_pass[i] = arg;
2b3c0885 1452 }
67348ccc 1453 call = gimple_build_call_vec (node->decl, args_to_pass);
3e485f62 1454 gimple_set_block (call, DECL_INITIAL (current_function_decl));
9771b263 1455 args_to_pass.release ();
3e485f62 1456
878eef4a
JJ
1457 /* For optimized away parameters, add on the caller side
1458 before the call
1459 DEBUG D#X => parm_Y(D)
1460 stmts and associate D#X with parm in decl_debug_args_lookup
1461 vector to say for debug info that if parameter parm had been passed,
1462 it would have value parm_Y(D). */
1463 if (args_to_skip)
878eef4a 1464 {
a49de7a4
JJ
1465 vec<tree, va_gc> **debug_args = NULL;
1466 unsigned i = 0, len = 0;
36f52e8f 1467 if (MAY_HAVE_DEBUG_BIND_STMTS)
878eef4a 1468 {
a49de7a4
JJ
1469 debug_args = decl_debug_args_lookup (node->decl);
1470 if (debug_args)
1471 len = vec_safe_length (*debug_args);
878eef4a 1472 }
a49de7a4
JJ
1473 for (parm = DECL_ARGUMENTS (current_function_decl), num = 0;
1474 parm; parm = DECL_CHAIN (parm), num++)
1475 if (bitmap_bit_p (args_to_skip, num) && is_gimple_reg (parm))
1476 {
1477 tree ddecl;
1478 gimple *def_temp;
1479
36f52e8f
AO
1480 /* This needs to be done even without
1481 MAY_HAVE_DEBUG_BIND_STMTS, otherwise if it didn't exist
1482 before, we'd end up with different SSA_NAME_VERSIONs
1483 between -g and -g0. */
a49de7a4 1484 arg = get_or_create_ssa_default_def (cfun, parm);
36f52e8f 1485 if (!MAY_HAVE_DEBUG_BIND_STMTS || debug_args == NULL)
a49de7a4
JJ
1486 continue;
1487
1488 while (i < len && (**debug_args)[i] != DECL_ORIGIN (parm))
1489 i += 2;
1490 if (i >= len)
1491 continue;
1492 ddecl = (**debug_args)[i + 1];
1493 def_temp
1494 = gimple_build_debug_bind (ddecl, unshare_expr (arg), call);
1495 gsi_insert_after (&gsi, def_temp, GSI_NEW_STMT);
1496 }
ff6686d2 1497 BITMAP_FREE (args_to_skip);
878eef4a
JJ
1498 }
1499
556e9ba0
JH
1500 /* We avoid address being taken on any variable used by split part,
1501 so return slot optimization is always possible. Moreover this is
1502 required to make DECL_BY_REFERENCE work. */
1503 if (aggregate_value_p (DECL_RESULT (current_function_decl),
22110e6c
EB
1504 TREE_TYPE (current_function_decl))
1505 && (!is_gimple_reg_type (TREE_TYPE (DECL_RESULT (current_function_decl)))
1506 || DECL_BY_REFERENCE (DECL_RESULT (current_function_decl))))
556e9ba0
JH
1507 gimple_call_set_return_slot_opt (call, true);
1508
bfd71482
JJ
1509 if (add_tsan_func_exit)
1510 tsan_func_exit_call = gimple_build_call_internal (IFN_TSAN_FUNC_EXIT, 0);
1511
3e485f62
JH
1512 /* Update return value. This is bit tricky. When we do not return,
1513 do nothing. When we return we might need to update return_bb
1514 or produce a new return statement. */
1515 if (!split_part_return_p)
bfd71482
JJ
1516 {
1517 gsi_insert_after (&gsi, call, GSI_NEW_STMT);
1518 if (tsan_func_exit_call)
1519 gsi_insert_after (&gsi, tsan_func_exit_call, GSI_NEW_STMT);
1520 }
3e485f62
JH
1521 else
1522 {
357067f2
JH
1523 e = make_single_succ_edge (call_bb, return_bb,
1524 return_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
1525 ? 0 : EDGE_FALLTHRU);
6938f93f
JH
1526
1527 /* If there is return basic block, see what value we need to store
1528 return value into and put call just before it. */
fefa31b5 1529 if (return_bb != EXIT_BLOCK_PTR_FOR_FN (cfun))
3e485f62 1530 {
b69539cb 1531 real_retval = retval;
241a2b9e 1532 if (real_retval && split_point->split_part_set_retval)
3e485f62 1533 {
538dd0b7 1534 gphi_iterator psi;
3e485f62 1535
6938f93f
JH
1536 /* See if we need new SSA_NAME for the result.
1537 When DECL_BY_REFERENCE is true, retval is actually pointer to
1538 return value and it is constant in whole function. */
1539 if (TREE_CODE (retval) == SSA_NAME
1540 && !DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
3e485f62 1541 {
070ecdfd 1542 retval = copy_ssa_name (retval, call);
6938f93f
JH
1543
1544 /* See if there is PHI defining return value. */
1545 for (psi = gsi_start_phis (return_bb);
1546 !gsi_end_p (psi); gsi_next (&psi))
538dd0b7 1547 if (!virtual_operand_p (gimple_phi_result (psi.phi ())))
6938f93f
JH
1548 break;
1549
1550 /* When there is PHI, just update its value. */
3e485f62
JH
1551 if (TREE_CODE (retval) == SSA_NAME
1552 && !gsi_end_p (psi))
538dd0b7 1553 add_phi_arg (psi.phi (), retval, e, UNKNOWN_LOCATION);
6938f93f
JH
1554 /* Otherwise update the return BB itself.
1555 find_return_bb allows at most one assignment to return value,
1556 so update first statement. */
1557 else
3e485f62 1558 {
2094f1fc
JH
1559 gimple_stmt_iterator bsi;
1560 for (bsi = gsi_start_bb (return_bb); !gsi_end_p (bsi);
1561 gsi_next (&bsi))
538dd0b7
DM
1562 if (greturn *return_stmt
1563 = dyn_cast <greturn *> (gsi_stmt (bsi)))
2094f1fc 1564 {
538dd0b7 1565 gimple_return_set_retval (return_stmt, retval);
2094f1fc
JH
1566 break;
1567 }
2e216592
JJ
1568 else if (gimple_code (gsi_stmt (bsi)) == GIMPLE_ASSIGN
1569 && !gimple_clobber_p (gsi_stmt (bsi)))
2094f1fc
JH
1570 {
1571 gimple_assign_set_rhs1 (gsi_stmt (bsi), retval);
1572 break;
1573 }
1574 update_stmt (gsi_stmt (bsi));
b69539cb
JJ
1575 /* Also adjust clobbers and debug stmts in return_bb. */
1576 for (bsi = gsi_start_bb (return_bb); !gsi_end_p (bsi);
1577 gsi_next (&bsi))
1578 {
1579 gimple *stmt = gsi_stmt (bsi);
1580 if (gimple_clobber_p (stmt)
1581 || is_gimple_debug (stmt))
1582 {
1583 ssa_op_iter iter;
1584 use_operand_p use_p;
1585 bool update = false;
1586 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter,
1587 SSA_OP_USE)
1588 if (USE_FROM_PTR (use_p) == real_retval)
1589 {
1590 SET_USE (use_p, retval);
1591 update = true;
1592 }
1593 if (update)
1594 update_stmt (stmt);
1595 }
1596 }
3e485f62
JH
1597 }
1598 }
556e9ba0 1599 if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
42b05b6e
RG
1600 {
1601 gimple_call_set_lhs (call, build_simple_mem_ref (retval));
1602 gsi_insert_after (&gsi, call, GSI_NEW_STMT);
1603 }
556e9ba0 1604 else
42b05b6e
RG
1605 {
1606 tree restype;
1607 restype = TREE_TYPE (DECL_RESULT (current_function_decl));
1608 gsi_insert_after (&gsi, call, GSI_NEW_STMT);
1609 if (!useless_type_conversion_p (TREE_TYPE (retval), restype))
1610 {
355fe088 1611 gimple *cpy;
b731b390 1612 tree tem = create_tmp_reg (restype);
42b05b6e 1613 tem = make_ssa_name (tem, call);
0d0e4a03 1614 cpy = gimple_build_assign (retval, NOP_EXPR, tem);
42b05b6e
RG
1615 gsi_insert_after (&gsi, cpy, GSI_NEW_STMT);
1616 retval = tem;
1617 }
1618 gimple_call_set_lhs (call, retval);
1619 update_stmt (call);
1620 }
3e485f62 1621 }
42b05b6e
RG
1622 else
1623 gsi_insert_after (&gsi, call, GSI_NEW_STMT);
bfd71482
JJ
1624 if (tsan_func_exit_call)
1625 gsi_insert_after (&gsi, tsan_func_exit_call, GSI_NEW_STMT);
3e485f62 1626 }
6938f93f
JH
1627 /* We don't use return block (there is either no return in function or
1628 multiple of them). So create new basic block with return statement.
1629 */
3e485f62
JH
1630 else
1631 {
538dd0b7 1632 greturn *ret;
241a2b9e
JH
1633 if (split_point->split_part_set_retval
1634 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
3e485f62 1635 {
4021f4a1 1636 retval = DECL_RESULT (current_function_decl);
8a9c1ae6
JH
1637
1638 /* We use temporary register to hold value when aggregate_value_p
1639 is false. Similarly for DECL_BY_REFERENCE we must avoid extra
1640 copy. */
1641 if (!aggregate_value_p (retval, TREE_TYPE (current_function_decl))
1642 && !DECL_BY_REFERENCE (retval))
b731b390 1643 retval = create_tmp_reg (TREE_TYPE (retval));
3e485f62 1644 if (is_gimple_reg (retval))
6938f93f
JH
1645 {
1646 /* When returning by reference, there is only one SSA name
1647 assigned to RESULT_DECL (that is pointer to return value).
1648 Look it up or create new one if it is missing. */
1649 if (DECL_BY_REFERENCE (retval))
32244553 1650 retval = get_or_create_ssa_default_def (cfun, retval);
6938f93f
JH
1651 /* Otherwise produce new SSA name for return value. */
1652 else
1653 retval = make_ssa_name (retval, call);
1654 }
556e9ba0
JH
1655 if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
1656 gimple_call_set_lhs (call, build_simple_mem_ref (retval));
1657 else
1658 gimple_call_set_lhs (call, retval);
a162f3af
JJ
1659 gsi_insert_after (&gsi, call, GSI_NEW_STMT);
1660 }
1661 else
1662 {
1663 gsi_insert_after (&gsi, call, GSI_NEW_STMT);
1664 if (retval
1665 && is_gimple_reg_type (TREE_TYPE (retval))
1666 && !is_gimple_val (retval))
1667 {
1668 gassign *g
1669 = gimple_build_assign (make_ssa_name (TREE_TYPE (retval)),
1670 retval);
1671 retval = gimple_assign_lhs (g);
1672 gsi_insert_after (&gsi, g, GSI_NEW_STMT);
1673 }
3e485f62 1674 }
bfd71482
JJ
1675 if (tsan_func_exit_call)
1676 gsi_insert_after (&gsi, tsan_func_exit_call, GSI_NEW_STMT);
3e485f62
JH
1677 ret = gimple_build_return (retval);
1678 gsi_insert_after (&gsi, ret, GSI_NEW_STMT);
1679 }
1680 }
1681 free_dominance_info (CDI_DOMINATORS);
1682 free_dominance_info (CDI_POST_DOMINATORS);
0bceb671 1683 compute_fn_summary (node, true);
3e485f62
JH
1684}
1685
1686/* Execute function splitting pass. */
1687
1688static unsigned int
1689execute_split_functions (void)
1690{
1691 gimple_stmt_iterator bsi;
1692 basic_block bb;
c2e87766
JH
1693 sreal overall_time = 0;
1694 int overall_size = 0;
3e485f62 1695 int todo = 0;
d52f5295 1696 struct cgraph_node *node = cgraph_node::get (current_function_decl);
3e485f62 1697
b2d2adc6
RG
1698 if (flags_from_decl_or_type (current_function_decl)
1699 & (ECF_NORETURN|ECF_MALLOC))
3e485f62
JH
1700 {
1701 if (dump_file)
b2d2adc6 1702 fprintf (dump_file, "Not splitting: noreturn/malloc function.\n");
3e485f62
JH
1703 return 0;
1704 }
1705 if (MAIN_NAME_P (DECL_NAME (current_function_decl)))
1706 {
1707 if (dump_file)
1708 fprintf (dump_file, "Not splitting: main function.\n");
1709 return 0;
1710 }
517048ce
JH
1711 if (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
1712 {
1713 if (dump_file)
1714 fprintf (dump_file, "Not splitting: function is unlikely executed.\n");
1715 return 0;
1716 }
3e485f62
JH
1717 /* This can be relaxed; function might become inlinable after splitting
1718 away the uninlinable part. */
0bceb671 1719 if (ipa_fn_summaries
56f62793
ML
1720 && ipa_fn_summaries->get (node)
1721 && !ipa_fn_summaries->get (node)->inlinable)
3e485f62
JH
1722 {
1723 if (dump_file)
1724 fprintf (dump_file, "Not splitting: not inlinable.\n");
1725 return 0;
1726 }
67348ccc 1727 if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
3e485f62
JH
1728 {
1729 if (dump_file)
ed7656f6 1730 fprintf (dump_file, "Not splitting: disregarding inline limits.\n");
3e485f62
JH
1731 return 0;
1732 }
1733 /* This can be relaxed; most of versioning tests actually prevents
1734 a duplication. */
1735 if (!tree_versionable_function_p (current_function_decl))
1736 {
1737 if (dump_file)
1738 fprintf (dump_file, "Not splitting: not versionable.\n");
1739 return 0;
1740 }
1741 /* FIXME: we could support this. */
1742 if (DECL_STRUCT_FUNCTION (current_function_decl)->static_chain_decl)
1743 {
1744 if (dump_file)
1745 fprintf (dump_file, "Not splitting: nested function.\n");
1746 return 0;
1747 }
3e485f62
JH
1748
1749 /* See if it makes sense to try to split.
1750 It makes sense to split if we inline, that is if we have direct calls to
1751 handle or direct calls are possibly going to appear as result of indirect
cf9712cc
JH
1752 inlining or LTO. Also handle -fprofile-generate as LTO to allow non-LTO
1753 training for LTO -fprofile-use build.
1754
3e485f62
JH
1755 Note that we are not completely conservative about disqualifying functions
1756 called once. It is possible that the caller is called more then once and
1757 then inlining would still benefit. */
c91061e6
JH
1758 if ((!node->callers
1759 /* Local functions called once will be completely inlined most of time. */
87f94429 1760 || (!node->callers->next_caller && node->local))
67348ccc 1761 && !node->address_taken
42685f72 1762 && !node->has_aliases_p ()
67348ccc 1763 && (!flag_lto || !node->externally_visible))
3e485f62
JH
1764 {
1765 if (dump_file)
1766 fprintf (dump_file, "Not splitting: not called directly "
1767 "or called once.\n");
1768 return 0;
1769 }
1770
1771 /* FIXME: We can actually split if splitting reduces call overhead. */
1772 if (!flag_inline_small_functions
1773 && !DECL_DECLARED_INLINE_P (current_function_decl))
1774 {
1775 if (dump_file)
1776 fprintf (dump_file, "Not splitting: not autoinlining and function"
1777 " is not inline.\n");
1778 return 0;
37555926
JH
1779 }
1780
1781 if (lookup_attribute ("noinline", DECL_ATTRIBUTES (current_function_decl)))
1782 {
1783 if (dump_file)
1784 fprintf (dump_file, "Not splitting: function is noinline.\n");
1785 return 0;
1786 }
1787 if (lookup_attribute ("section", DECL_ATTRIBUTES (current_function_decl)))
1788 {
1789 if (dump_file)
1790 fprintf (dump_file, "Not splitting: function is in user defined "
1791 "section.\n");
1792 return 0;
3e485f62
JH
1793 }
1794
e70670cf
JH
1795 /* We enforce splitting after loop headers when profile info is not
1796 available. */
0a6a6ac9 1797 if (profile_status_for_fn (cfun) != PROFILE_READ)
e70670cf
JH
1798 mark_dfs_back_edges ();
1799
b2e25729
BS
1800 /* Initialize bitmap to track forbidden calls. */
1801 forbidden_dominators = BITMAP_ALLOC (NULL);
1802 calculate_dominance_info (CDI_DOMINATORS);
1803
3e485f62 1804 /* Compute local info about basic blocks and determine function size/time. */
8b1c6fd7 1805 bb_info_vec.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
c2e87766 1806 best_split_point.split_bbs = NULL;
bfd71482
JJ
1807 basic_block return_bb = find_return_bb ();
1808 int tsan_exit_found = -1;
11cd3bed 1809 FOR_EACH_BB_FN (bb, cfun)
3e485f62 1810 {
c2e87766 1811 sreal time = 0;
3e485f62 1812 int size = 0;
c2e87766
JH
1813 sreal freq = bb->count.to_sreal_scale
1814 (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count);
3e485f62
JH
1815
1816 if (dump_file && (dump_flags & TDF_DETAILS))
1817 fprintf (dump_file, "Basic block %i\n", bb->index);
1818
1819 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1820 {
c2e87766
JH
1821 sreal this_time;
1822 int this_size;
355fe088 1823 gimple *stmt = gsi_stmt (bsi);
3e485f62
JH
1824
1825 this_size = estimate_num_insns (stmt, &eni_size_weights);
c2e87766
JH
1826 this_time = (sreal)estimate_num_insns (stmt, &eni_time_weights)
1827 * freq;
3e485f62
JH
1828 size += this_size;
1829 time += this_time;
b2e25729 1830 check_forbidden_calls (stmt);
3e485f62
JH
1831
1832 if (dump_file && (dump_flags & TDF_DETAILS))
1833 {
c2e87766
JH
1834 fprintf (dump_file, " freq:%4.2f size:%3i time:%4.2f ",
1835 freq.to_double (), this_size, this_time.to_double ());
ef6cb4c7 1836 print_gimple_stmt (dump_file, stmt, 0);
3e485f62 1837 }
bfd71482
JJ
1838
1839 if ((flag_sanitize & SANITIZE_THREAD)
8e4284d0 1840 && gimple_call_internal_p (stmt, IFN_TSAN_FUNC_EXIT))
bfd71482
JJ
1841 {
1842 /* We handle TSAN_FUNC_EXIT for splitting either in the
1843 return_bb, or in its immediate predecessors. */
1844 if ((bb != return_bb && !find_edge (bb, return_bb))
1845 || (tsan_exit_found != -1
1846 && tsan_exit_found != (bb != return_bb)))
1847 {
1848 if (dump_file)
1849 fprintf (dump_file, "Not splitting: TSAN_FUNC_EXIT"
1850 " in unexpected basic block.\n");
1851 BITMAP_FREE (forbidden_dominators);
1852 bb_info_vec.release ();
1853 return 0;
1854 }
1855 tsan_exit_found = bb != return_bb;
1856 }
3e485f62
JH
1857 }
1858 overall_time += time;
1859 overall_size += size;
9771b263
DN
1860 bb_info_vec[bb->index].time = time;
1861 bb_info_vec[bb->index].size = size;
3e485f62 1862 }
bfd71482 1863 find_split_points (return_bb, overall_time, overall_size);
3e485f62
JH
1864 if (best_split_point.split_bbs)
1865 {
bfd71482 1866 split_function (return_bb, &best_split_point, tsan_exit_found == 1);
3e485f62
JH
1867 BITMAP_FREE (best_split_point.ssa_names_to_pass);
1868 BITMAP_FREE (best_split_point.split_bbs);
1869 todo = TODO_update_ssa | TODO_cleanup_cfg;
1870 }
b2e25729 1871 BITMAP_FREE (forbidden_dominators);
9771b263 1872 bb_info_vec.release ();
3e485f62
JH
1873 return todo;
1874}
1875
27a4cd48
DM
1876namespace {
1877
1878const pass_data pass_data_split_functions =
3e485f62 1879{
27a4cd48
DM
1880 GIMPLE_PASS, /* type */
1881 "fnsplit", /* name */
1882 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
1883 TV_IPA_FNSPLIT, /* tv_id */
1884 PROP_cfg, /* properties_required */
1885 0, /* properties_provided */
1886 0, /* properties_destroyed */
1887 0, /* todo_flags_start */
3bea341f 1888 0, /* todo_flags_finish */
3e485f62 1889};
cf9712cc 1890
27a4cd48
DM
1891class pass_split_functions : public gimple_opt_pass
1892{
1893public:
c3284718
RS
1894 pass_split_functions (gcc::context *ctxt)
1895 : gimple_opt_pass (pass_data_split_functions, ctxt)
27a4cd48
DM
1896 {}
1897
1898 /* opt_pass methods: */
1a3d085c 1899 virtual bool gate (function *);
be55bfe6
TS
1900 virtual unsigned int execute (function *)
1901 {
1902 return execute_split_functions ();
1903 }
27a4cd48
DM
1904
1905}; // class pass_split_functions
1906
1a3d085c
TS
1907bool
1908pass_split_functions::gate (function *)
1909{
1910 /* When doing profile feedback, we want to execute the pass after profiling
1911 is read. So disable one in early optimization. */
1912 return (flag_partial_inlining
1913 && !profile_arc_flag && !flag_branch_probabilities);
1914}
1915
27a4cd48
DM
1916} // anon namespace
1917
1918gimple_opt_pass *
1919make_pass_split_functions (gcc::context *ctxt)
1920{
1921 return new pass_split_functions (ctxt);
1922}
1923
cf9712cc
JH
1924/* Execute function splitting pass. */
1925
1926static unsigned int
1927execute_feedback_split_functions (void)
1928{
1929 unsigned int retval = execute_split_functions ();
1930 if (retval)
1931 retval |= TODO_rebuild_cgraph_edges;
1932 return retval;
1933}
1934
27a4cd48
DM
1935namespace {
1936
1937const pass_data pass_data_feedback_split_functions =
cf9712cc 1938{
27a4cd48
DM
1939 GIMPLE_PASS, /* type */
1940 "feedback_fnsplit", /* name */
1941 OPTGROUP_NONE, /* optinfo_flags */
27a4cd48
DM
1942 TV_IPA_FNSPLIT, /* tv_id */
1943 PROP_cfg, /* properties_required */
1944 0, /* properties_provided */
1945 0, /* properties_destroyed */
1946 0, /* todo_flags_start */
3bea341f 1947 0, /* todo_flags_finish */
cf9712cc 1948};
27a4cd48
DM
1949
1950class pass_feedback_split_functions : public gimple_opt_pass
1951{
1952public:
c3284718
RS
1953 pass_feedback_split_functions (gcc::context *ctxt)
1954 : gimple_opt_pass (pass_data_feedback_split_functions, ctxt)
27a4cd48
DM
1955 {}
1956
1957 /* opt_pass methods: */
1a3d085c 1958 virtual bool gate (function *);
be55bfe6
TS
1959 virtual unsigned int execute (function *)
1960 {
1961 return execute_feedback_split_functions ();
1962 }
27a4cd48
DM
1963
1964}; // class pass_feedback_split_functions
1965
1a3d085c
TS
1966bool
1967pass_feedback_split_functions::gate (function *)
1968{
1969 /* We don't need to split when profiling at all, we are producing
1970 lousy code anyway. */
1971 return (flag_partial_inlining
1972 && flag_branch_probabilities);
1973}
1974
27a4cd48
DM
1975} // anon namespace
1976
1977gimple_opt_pass *
1978make_pass_feedback_split_functions (gcc::context *ctxt)
1979{
1980 return new pass_feedback_split_functions (ctxt);
1981}