]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/tree-tailcall.c
Make early return predictor more precise.
[thirdparty/gcc.git] / gcc / tree-tailcall.c
1 /* Tail call optimization on trees.
2 Copyright (C) 2003-2017 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "rtl.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "cfghooks.h"
28 #include "tree-pass.h"
29 #include "ssa.h"
30 #include "cgraph.h"
31 #include "gimple-pretty-print.h"
32 #include "fold-const.h"
33 #include "stor-layout.h"
34 #include "gimple-iterator.h"
35 #include "gimplify-me.h"
36 #include "tree-cfg.h"
37 #include "tree-into-ssa.h"
38 #include "tree-dfa.h"
39 #include "except.h"
40 #include "dbgcnt.h"
41 #include "cfgloop.h"
42 #include "common/common-target.h"
43 #include "ipa-utils.h"
44
45 /* The file implements the tail recursion elimination. It is also used to
46 analyze the tail calls in general, passing the results to the rtl level
47 where they are used for sibcall optimization.
48
49 In addition to the standard tail recursion elimination, we handle the most
50 trivial cases of making the call tail recursive by creating accumulators.
51 For example the following function
52
53 int sum (int n)
54 {
55 if (n > 0)
56 return n + sum (n - 1);
57 else
58 return 0;
59 }
60
61 is transformed into
62
63 int sum (int n)
64 {
65 int acc = 0;
66
67 while (n > 0)
68 acc += n--;
69
70 return acc;
71 }
72
73 To do this, we maintain two accumulators (a_acc and m_acc) that indicate
74 when we reach the return x statement, we should return a_acc + x * m_acc
75 instead. They are initially initialized to 0 and 1, respectively,
76 so the semantics of the function is obviously preserved. If we are
77 guaranteed that the value of the accumulator never change, we
78 omit the accumulator.
79
80 There are three cases how the function may exit. The first one is
81 handled in adjust_return_value, the other two in adjust_accumulator_values
82 (the second case is actually a special case of the third one and we
83 present it separately just for clarity):
84
85 1) Just return x, where x is not in any of the remaining special shapes.
86 We rewrite this to a gimple equivalent of return m_acc * x + a_acc.
87
88 2) return f (...), where f is the current function, is rewritten in a
89 classical tail-recursion elimination way, into assignment of arguments
90 and jump to the start of the function. Values of the accumulators
91 are unchanged.
92
93 3) return a + m * f(...), where a and m do not depend on call to f.
94 To preserve the semantics described before we want this to be rewritten
95 in such a way that we finally return
96
97 a_acc + (a + m * f(...)) * m_acc = (a_acc + a * m_acc) + (m * m_acc) * f(...).
98
99 I.e. we increase a_acc by a * m_acc, multiply m_acc by m and
100 eliminate the tail call to f. Special cases when the value is just
101 added or just multiplied are obtained by setting a = 0 or m = 1.
102
103 TODO -- it is possible to do similar tricks for other operations. */
104
105 /* A structure that describes the tailcall. */
106
107 struct tailcall
108 {
109 /* The iterator pointing to the call statement. */
110 gimple_stmt_iterator call_gsi;
111
112 /* True if it is a call to the current function. */
113 bool tail_recursion;
114
115 /* The return value of the caller is mult * f + add, where f is the return
116 value of the call. */
117 tree mult, add;
118
119 /* Next tailcall in the chain. */
120 struct tailcall *next;
121 };
122
123 /* The variables holding the value of multiplicative and additive
124 accumulator. */
125 static tree m_acc, a_acc;
126
127 static bool optimize_tail_call (struct tailcall *, bool);
128 static void eliminate_tail_call (struct tailcall *);
129
130 /* Returns false when the function is not suitable for tail call optimization
131 from some reason (e.g. if it takes variable number of arguments). */
132
133 static bool
134 suitable_for_tail_opt_p (void)
135 {
136 if (cfun->stdarg)
137 return false;
138
139 return true;
140 }
141 /* Returns false when the function is not suitable for tail call optimization
142 for some reason (e.g. if it takes variable number of arguments).
143 This test must pass in addition to suitable_for_tail_opt_p in order to make
144 tail call discovery happen. */
145
146 static bool
147 suitable_for_tail_call_opt_p (void)
148 {
149 tree param;
150
151 /* alloca (until we have stack slot life analysis) inhibits
152 sibling call optimizations, but not tail recursion. */
153 if (cfun->calls_alloca)
154 return false;
155
156 /* If we are using sjlj exceptions, we may need to add a call to
157 _Unwind_SjLj_Unregister at exit of the function. Which means
158 that we cannot do any sibcall transformations. */
159 if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ
160 && current_function_has_exception_handlers ())
161 return false;
162
163 /* Any function that calls setjmp might have longjmp called from
164 any called function. ??? We really should represent this
165 properly in the CFG so that this needn't be special cased. */
166 if (cfun->calls_setjmp)
167 return false;
168
169 /* ??? It is OK if the argument of a function is taken in some cases,
170 but not in all cases. See PR15387 and PR19616. Revisit for 4.1. */
171 for (param = DECL_ARGUMENTS (current_function_decl);
172 param;
173 param = DECL_CHAIN (param))
174 if (TREE_ADDRESSABLE (param))
175 return false;
176
177 return true;
178 }
179
180 /* Checks whether the expression EXPR in stmt AT is independent of the
181 statement pointed to by GSI (in a sense that we already know EXPR's value
182 at GSI). We use the fact that we are only called from the chain of
183 basic blocks that have only single successor. Returns the expression
184 containing the value of EXPR at GSI. */
185
186 static tree
187 independent_of_stmt_p (tree expr, gimple *at, gimple_stmt_iterator gsi,
188 bitmap to_move)
189 {
190 basic_block bb, call_bb, at_bb;
191 edge e;
192 edge_iterator ei;
193
194 if (is_gimple_min_invariant (expr))
195 return expr;
196
197 if (TREE_CODE (expr) != SSA_NAME)
198 return NULL_TREE;
199
200 if (bitmap_bit_p (to_move, SSA_NAME_VERSION (expr)))
201 return expr;
202
203 /* Mark the blocks in the chain leading to the end. */
204 at_bb = gimple_bb (at);
205 call_bb = gimple_bb (gsi_stmt (gsi));
206 for (bb = call_bb; bb != at_bb; bb = single_succ (bb))
207 bb->aux = &bb->aux;
208 bb->aux = &bb->aux;
209
210 while (1)
211 {
212 at = SSA_NAME_DEF_STMT (expr);
213 bb = gimple_bb (at);
214
215 /* The default definition or defined before the chain. */
216 if (!bb || !bb->aux)
217 break;
218
219 if (bb == call_bb)
220 {
221 for (; !gsi_end_p (gsi); gsi_next (&gsi))
222 if (gsi_stmt (gsi) == at)
223 break;
224
225 if (!gsi_end_p (gsi))
226 expr = NULL_TREE;
227 break;
228 }
229
230 if (gimple_code (at) != GIMPLE_PHI)
231 {
232 expr = NULL_TREE;
233 break;
234 }
235
236 FOR_EACH_EDGE (e, ei, bb->preds)
237 if (e->src->aux)
238 break;
239 gcc_assert (e);
240
241 expr = PHI_ARG_DEF_FROM_EDGE (at, e);
242 if (TREE_CODE (expr) != SSA_NAME)
243 {
244 /* The value is a constant. */
245 break;
246 }
247 }
248
249 /* Unmark the blocks. */
250 for (bb = call_bb; bb != at_bb; bb = single_succ (bb))
251 bb->aux = NULL;
252 bb->aux = NULL;
253
254 return expr;
255 }
256
257 enum par { FAIL, OK, TRY_MOVE };
258
259 /* Simulates the effect of an assignment STMT on the return value of the tail
260 recursive CALL passed in ASS_VAR. M and A are the multiplicative and the
261 additive factor for the real return value. */
262
263 static par
264 process_assignment (gassign *stmt,
265 gimple_stmt_iterator call, tree *m,
266 tree *a, tree *ass_var, bitmap to_move)
267 {
268 tree op0, op1 = NULL_TREE, non_ass_var = NULL_TREE;
269 tree dest = gimple_assign_lhs (stmt);
270 enum tree_code code = gimple_assign_rhs_code (stmt);
271 enum gimple_rhs_class rhs_class = get_gimple_rhs_class (code);
272 tree src_var = gimple_assign_rhs1 (stmt);
273
274 /* See if this is a simple copy operation of an SSA name to the function
275 result. In that case we may have a simple tail call. Ignore type
276 conversions that can never produce extra code between the function
277 call and the function return. */
278 if ((rhs_class == GIMPLE_SINGLE_RHS || gimple_assign_cast_p (stmt))
279 && src_var == *ass_var)
280 {
281 /* Reject a tailcall if the type conversion might need
282 additional code. */
283 if (gimple_assign_cast_p (stmt))
284 {
285 if (TYPE_MODE (TREE_TYPE (dest)) != TYPE_MODE (TREE_TYPE (src_var)))
286 return FAIL;
287
288 /* Even if the type modes are the same, if the precision of the
289 type is smaller than mode's precision,
290 reduce_to_bit_field_precision would generate additional code. */
291 if (INTEGRAL_TYPE_P (TREE_TYPE (dest))
292 && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (dest)))
293 > TYPE_PRECISION (TREE_TYPE (dest))))
294 return FAIL;
295 }
296
297 *ass_var = dest;
298 return OK;
299 }
300
301 switch (rhs_class)
302 {
303 case GIMPLE_BINARY_RHS:
304 op1 = gimple_assign_rhs2 (stmt);
305
306 /* Fall through. */
307
308 case GIMPLE_UNARY_RHS:
309 op0 = gimple_assign_rhs1 (stmt);
310 break;
311
312 default:
313 return FAIL;
314 }
315
316 /* Accumulator optimizations will reverse the order of operations.
317 We can only do that for floating-point types if we're assuming
318 that addition and multiplication are associative. */
319 if (!flag_associative_math)
320 if (FLOAT_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl))))
321 return FAIL;
322
323 if (rhs_class == GIMPLE_UNARY_RHS
324 && op0 == *ass_var)
325 ;
326 else if (op0 == *ass_var
327 && (non_ass_var = independent_of_stmt_p (op1, stmt, call,
328 to_move)))
329 ;
330 else if (op1 == *ass_var
331 && (non_ass_var = independent_of_stmt_p (op0, stmt, call,
332 to_move)))
333 ;
334 else
335 return TRY_MOVE;
336
337 switch (code)
338 {
339 case PLUS_EXPR:
340 *a = non_ass_var;
341 *ass_var = dest;
342 return OK;
343
344 case POINTER_PLUS_EXPR:
345 if (op0 != *ass_var)
346 return FAIL;
347 *a = non_ass_var;
348 *ass_var = dest;
349 return OK;
350
351 case MULT_EXPR:
352 *m = non_ass_var;
353 *ass_var = dest;
354 return OK;
355
356 case NEGATE_EXPR:
357 *m = build_minus_one_cst (TREE_TYPE (op0));
358 *ass_var = dest;
359 return OK;
360
361 case MINUS_EXPR:
362 if (*ass_var == op0)
363 *a = fold_build1 (NEGATE_EXPR, TREE_TYPE (non_ass_var), non_ass_var);
364 else
365 {
366 *m = build_minus_one_cst (TREE_TYPE (non_ass_var));
367 *a = fold_build1 (NEGATE_EXPR, TREE_TYPE (non_ass_var), non_ass_var);
368 }
369
370 *ass_var = dest;
371 return OK;
372
373 default:
374 return FAIL;
375 }
376 }
377
378 /* Propagate VAR through phis on edge E. */
379
380 static tree
381 propagate_through_phis (tree var, edge e)
382 {
383 basic_block dest = e->dest;
384 gphi_iterator gsi;
385
386 for (gsi = gsi_start_phis (dest); !gsi_end_p (gsi); gsi_next (&gsi))
387 {
388 gphi *phi = gsi.phi ();
389 if (PHI_ARG_DEF_FROM_EDGE (phi, e) == var)
390 return PHI_RESULT (phi);
391 }
392 return var;
393 }
394
395 /* Finds tailcalls falling into basic block BB. The list of found tailcalls is
396 added to the start of RET. */
397
398 static void
399 find_tail_calls (basic_block bb, struct tailcall **ret)
400 {
401 tree ass_var = NULL_TREE, ret_var, func, param;
402 gimple *stmt;
403 gcall *call = NULL;
404 gimple_stmt_iterator gsi, agsi;
405 bool tail_recursion;
406 struct tailcall *nw;
407 edge e;
408 tree m, a;
409 basic_block abb;
410 size_t idx;
411 tree var;
412
413 if (!single_succ_p (bb))
414 return;
415
416 for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
417 {
418 stmt = gsi_stmt (gsi);
419
420 /* Ignore labels, returns, nops, clobbers and debug stmts. */
421 if (gimple_code (stmt) == GIMPLE_LABEL
422 || gimple_code (stmt) == GIMPLE_RETURN
423 || gimple_code (stmt) == GIMPLE_NOP
424 || gimple_code (stmt) == GIMPLE_PREDICT
425 || gimple_clobber_p (stmt)
426 || is_gimple_debug (stmt))
427 continue;
428
429 /* Check for a call. */
430 if (is_gimple_call (stmt))
431 {
432 call = as_a <gcall *> (stmt);
433 ass_var = gimple_call_lhs (call);
434 break;
435 }
436
437 /* Allow simple copies between local variables, even if they're
438 aggregates. */
439 if (is_gimple_assign (stmt)
440 && auto_var_in_fn_p (gimple_assign_lhs (stmt), cfun->decl)
441 && auto_var_in_fn_p (gimple_assign_rhs1 (stmt), cfun->decl))
442 continue;
443
444 /* If the statement references memory or volatile operands, fail. */
445 if (gimple_references_memory_p (stmt)
446 || gimple_has_volatile_ops (stmt))
447 return;
448 }
449
450 if (gsi_end_p (gsi))
451 {
452 edge_iterator ei;
453 /* Recurse to the predecessors. */
454 FOR_EACH_EDGE (e, ei, bb->preds)
455 find_tail_calls (e->src, ret);
456
457 return;
458 }
459
460 /* If the LHS of our call is not just a simple register or local
461 variable, we can't transform this into a tail or sibling call.
462 This situation happens, in (e.g.) "*p = foo()" where foo returns a
463 struct. In this case we won't have a temporary here, but we need
464 to carry out the side effect anyway, so tailcall is impossible.
465
466 ??? In some situations (when the struct is returned in memory via
467 invisible argument) we could deal with this, e.g. by passing 'p'
468 itself as that argument to foo, but it's too early to do this here,
469 and expand_call() will not handle it anyway. If it ever can, then
470 we need to revisit this here, to allow that situation. */
471 if (ass_var
472 && !is_gimple_reg (ass_var)
473 && !auto_var_in_fn_p (ass_var, cfun->decl))
474 return;
475
476 /* We found the call, check whether it is suitable. */
477 tail_recursion = false;
478 func = gimple_call_fndecl (call);
479 if (func
480 && !DECL_BUILT_IN (func)
481 && recursive_call_p (current_function_decl, func))
482 {
483 tree arg;
484
485 for (param = DECL_ARGUMENTS (func), idx = 0;
486 param && idx < gimple_call_num_args (call);
487 param = DECL_CHAIN (param), idx ++)
488 {
489 arg = gimple_call_arg (call, idx);
490 if (param != arg)
491 {
492 /* Make sure there are no problems with copying. The parameter
493 have a copyable type and the two arguments must have reasonably
494 equivalent types. The latter requirement could be relaxed if
495 we emitted a suitable type conversion statement. */
496 if (!is_gimple_reg_type (TREE_TYPE (param))
497 || !useless_type_conversion_p (TREE_TYPE (param),
498 TREE_TYPE (arg)))
499 break;
500
501 /* The parameter should be a real operand, so that phi node
502 created for it at the start of the function has the meaning
503 of copying the value. This test implies is_gimple_reg_type
504 from the previous condition, however this one could be
505 relaxed by being more careful with copying the new value
506 of the parameter (emitting appropriate GIMPLE_ASSIGN and
507 updating the virtual operands). */
508 if (!is_gimple_reg (param))
509 break;
510 }
511 }
512 if (idx == gimple_call_num_args (call) && !param)
513 tail_recursion = true;
514 }
515
516 /* Make sure the tail invocation of this function does not indirectly
517 refer to local variables. (Passing variables directly by value
518 is OK.) */
519 FOR_EACH_LOCAL_DECL (cfun, idx, var)
520 {
521 if (TREE_CODE (var) != PARM_DECL
522 && auto_var_in_fn_p (var, cfun->decl)
523 && may_be_aliased (var)
524 && (ref_maybe_used_by_stmt_p (call, var)
525 || call_may_clobber_ref_p (call, var)))
526 return;
527 }
528
529 /* Now check the statements after the call. None of them has virtual
530 operands, so they may only depend on the call through its return
531 value. The return value should also be dependent on each of them,
532 since we are running after dce. */
533 m = NULL_TREE;
534 a = NULL_TREE;
535 auto_bitmap to_move_defs;
536 auto_vec<gimple *> to_move_stmts;
537
538 abb = bb;
539 agsi = gsi;
540 while (1)
541 {
542 tree tmp_a = NULL_TREE;
543 tree tmp_m = NULL_TREE;
544 gsi_next (&agsi);
545
546 while (gsi_end_p (agsi))
547 {
548 ass_var = propagate_through_phis (ass_var, single_succ_edge (abb));
549 abb = single_succ (abb);
550 agsi = gsi_start_bb (abb);
551 }
552
553 stmt = gsi_stmt (agsi);
554 if (gimple_code (stmt) == GIMPLE_RETURN)
555 break;
556
557 if (gimple_code (stmt) == GIMPLE_LABEL
558 || gimple_code (stmt) == GIMPLE_NOP
559 || gimple_code (stmt) == GIMPLE_PREDICT
560 || gimple_clobber_p (stmt)
561 || is_gimple_debug (stmt))
562 continue;
563
564 if (gimple_code (stmt) != GIMPLE_ASSIGN)
565 return;
566
567 /* This is a gimple assign. */
568 par ret = process_assignment (as_a <gassign *> (stmt), gsi,
569 &tmp_m, &tmp_a, &ass_var, to_move_defs);
570 if (ret == FAIL)
571 return;
572 else if (ret == TRY_MOVE)
573 {
574 if (! tail_recursion)
575 return;
576 for (unsigned opno = 1; opno < gimple_num_ops (stmt); ++opno)
577 {
578 tree op = gimple_op (stmt, opno);
579 if (independent_of_stmt_p (op, stmt, gsi, to_move_defs) != op)
580 return;
581 }
582 bitmap_set_bit (to_move_defs,
583 SSA_NAME_VERSION (gimple_assign_lhs (stmt)));
584 to_move_stmts.safe_push (stmt);
585 continue;
586 }
587
588 if (tmp_a)
589 {
590 tree type = TREE_TYPE (tmp_a);
591 if (a)
592 a = fold_build2 (PLUS_EXPR, type, fold_convert (type, a), tmp_a);
593 else
594 a = tmp_a;
595 }
596 if (tmp_m)
597 {
598 tree type = TREE_TYPE (tmp_m);
599 if (m)
600 m = fold_build2 (MULT_EXPR, type, fold_convert (type, m), tmp_m);
601 else
602 m = tmp_m;
603
604 if (a)
605 a = fold_build2 (MULT_EXPR, type, fold_convert (type, a), tmp_m);
606 }
607 }
608
609 /* See if this is a tail call we can handle. */
610 ret_var = gimple_return_retval (as_a <greturn *> (stmt));
611
612 /* We may proceed if there either is no return value, or the return value
613 is identical to the call's return. */
614 if (ret_var
615 && (ret_var != ass_var))
616 return;
617
618 /* If this is not a tail recursive call, we cannot handle addends or
619 multiplicands. */
620 if (!tail_recursion && (m || a))
621 return;
622
623 /* For pointers only allow additions. */
624 if (m && POINTER_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl))))
625 return;
626
627 /* Move queued defs. */
628 if (tail_recursion)
629 {
630 unsigned i;
631 FOR_EACH_VEC_ELT (to_move_stmts, i, stmt)
632 {
633 gimple_stmt_iterator mgsi = gsi_for_stmt (stmt);
634 gsi_move_before (&mgsi, &gsi);
635 }
636 }
637
638 nw = XNEW (struct tailcall);
639
640 nw->call_gsi = gsi;
641
642 nw->tail_recursion = tail_recursion;
643
644 nw->mult = m;
645 nw->add = a;
646
647 nw->next = *ret;
648 *ret = nw;
649 }
650
651 /* Helper to insert PHI_ARGH to the phi of VAR in the destination of edge E. */
652
653 static void
654 add_successor_phi_arg (edge e, tree var, tree phi_arg)
655 {
656 gphi_iterator gsi;
657
658 for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
659 if (PHI_RESULT (gsi.phi ()) == var)
660 break;
661
662 gcc_assert (!gsi_end_p (gsi));
663 add_phi_arg (gsi.phi (), phi_arg, e, UNKNOWN_LOCATION);
664 }
665
666 /* Creates a GIMPLE statement which computes the operation specified by
667 CODE, ACC and OP1 to a new variable with name LABEL and inserts the
668 statement in the position specified by GSI. Returns the
669 tree node of the statement's result. */
670
671 static tree
672 adjust_return_value_with_ops (enum tree_code code, const char *label,
673 tree acc, tree op1, gimple_stmt_iterator gsi)
674 {
675
676 tree ret_type = TREE_TYPE (DECL_RESULT (current_function_decl));
677 tree result = make_temp_ssa_name (ret_type, NULL, label);
678 gassign *stmt;
679
680 if (POINTER_TYPE_P (ret_type))
681 {
682 gcc_assert (code == PLUS_EXPR && TREE_TYPE (acc) == sizetype);
683 code = POINTER_PLUS_EXPR;
684 }
685 if (types_compatible_p (TREE_TYPE (acc), TREE_TYPE (op1))
686 && code != POINTER_PLUS_EXPR)
687 stmt = gimple_build_assign (result, code, acc, op1);
688 else
689 {
690 tree tem;
691 if (code == POINTER_PLUS_EXPR)
692 tem = fold_build2 (code, TREE_TYPE (op1), op1, acc);
693 else
694 tem = fold_build2 (code, TREE_TYPE (op1),
695 fold_convert (TREE_TYPE (op1), acc), op1);
696 tree rhs = fold_convert (ret_type, tem);
697 rhs = force_gimple_operand_gsi (&gsi, rhs,
698 false, NULL, true, GSI_SAME_STMT);
699 stmt = gimple_build_assign (result, rhs);
700 }
701
702 gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
703 return result;
704 }
705
706 /* Creates a new GIMPLE statement that adjusts the value of accumulator ACC by
707 the computation specified by CODE and OP1 and insert the statement
708 at the position specified by GSI as a new statement. Returns new SSA name
709 of updated accumulator. */
710
711 static tree
712 update_accumulator_with_ops (enum tree_code code, tree acc, tree op1,
713 gimple_stmt_iterator gsi)
714 {
715 gassign *stmt;
716 tree var = copy_ssa_name (acc);
717 if (types_compatible_p (TREE_TYPE (acc), TREE_TYPE (op1)))
718 stmt = gimple_build_assign (var, code, acc, op1);
719 else
720 {
721 tree rhs = fold_convert (TREE_TYPE (acc),
722 fold_build2 (code,
723 TREE_TYPE (op1),
724 fold_convert (TREE_TYPE (op1), acc),
725 op1));
726 rhs = force_gimple_operand_gsi (&gsi, rhs,
727 false, NULL, false, GSI_CONTINUE_LINKING);
728 stmt = gimple_build_assign (var, rhs);
729 }
730 gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
731 return var;
732 }
733
734 /* Adjust the accumulator values according to A and M after GSI, and update
735 the phi nodes on edge BACK. */
736
737 static void
738 adjust_accumulator_values (gimple_stmt_iterator gsi, tree m, tree a, edge back)
739 {
740 tree var, a_acc_arg, m_acc_arg;
741
742 if (m)
743 m = force_gimple_operand_gsi (&gsi, m, true, NULL, true, GSI_SAME_STMT);
744 if (a)
745 a = force_gimple_operand_gsi (&gsi, a, true, NULL, true, GSI_SAME_STMT);
746
747 a_acc_arg = a_acc;
748 m_acc_arg = m_acc;
749 if (a)
750 {
751 if (m_acc)
752 {
753 if (integer_onep (a))
754 var = m_acc;
755 else
756 var = adjust_return_value_with_ops (MULT_EXPR, "acc_tmp", m_acc,
757 a, gsi);
758 }
759 else
760 var = a;
761
762 a_acc_arg = update_accumulator_with_ops (PLUS_EXPR, a_acc, var, gsi);
763 }
764
765 if (m)
766 m_acc_arg = update_accumulator_with_ops (MULT_EXPR, m_acc, m, gsi);
767
768 if (a_acc)
769 add_successor_phi_arg (back, a_acc, a_acc_arg);
770
771 if (m_acc)
772 add_successor_phi_arg (back, m_acc, m_acc_arg);
773 }
774
775 /* Adjust value of the return at the end of BB according to M and A
776 accumulators. */
777
778 static void
779 adjust_return_value (basic_block bb, tree m, tree a)
780 {
781 tree retval;
782 greturn *ret_stmt = as_a <greturn *> (gimple_seq_last_stmt (bb_seq (bb)));
783 gimple_stmt_iterator gsi = gsi_last_bb (bb);
784
785 gcc_assert (gimple_code (ret_stmt) == GIMPLE_RETURN);
786
787 retval = gimple_return_retval (ret_stmt);
788 if (!retval || retval == error_mark_node)
789 return;
790
791 if (m)
792 retval = adjust_return_value_with_ops (MULT_EXPR, "mul_tmp", m_acc, retval,
793 gsi);
794 if (a)
795 retval = adjust_return_value_with_ops (PLUS_EXPR, "acc_tmp", a_acc, retval,
796 gsi);
797 gimple_return_set_retval (ret_stmt, retval);
798 update_stmt (ret_stmt);
799 }
800
801 /* Subtract COUNT and FREQUENCY from the basic block and it's
802 outgoing edge. */
803 static void
804 decrease_profile (basic_block bb, profile_count count, int frequency)
805 {
806 edge e;
807 bb->count = bb->count - count;
808 bb->frequency -= frequency;
809 if (bb->frequency < 0)
810 bb->frequency = 0;
811 if (!single_succ_p (bb))
812 {
813 gcc_assert (!EDGE_COUNT (bb->succs));
814 return;
815 }
816 e = single_succ_edge (bb);
817 e->count -= count;
818 }
819
820 /* Returns true if argument PARAM of the tail recursive call needs to be copied
821 when the call is eliminated. */
822
823 static bool
824 arg_needs_copy_p (tree param)
825 {
826 tree def;
827
828 if (!is_gimple_reg (param))
829 return false;
830
831 /* Parameters that are only defined but never used need not be copied. */
832 def = ssa_default_def (cfun, param);
833 if (!def)
834 return false;
835
836 return true;
837 }
838
839 /* Eliminates tail call described by T. TMP_VARS is a list of
840 temporary variables used to copy the function arguments. */
841
842 static void
843 eliminate_tail_call (struct tailcall *t)
844 {
845 tree param, rslt;
846 gimple *stmt, *call;
847 tree arg;
848 size_t idx;
849 basic_block bb, first;
850 edge e;
851 gphi *phi;
852 gphi_iterator gpi;
853 gimple_stmt_iterator gsi;
854 gimple *orig_stmt;
855
856 stmt = orig_stmt = gsi_stmt (t->call_gsi);
857 bb = gsi_bb (t->call_gsi);
858
859 if (dump_file && (dump_flags & TDF_DETAILS))
860 {
861 fprintf (dump_file, "Eliminated tail recursion in bb %d : ",
862 bb->index);
863 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
864 fprintf (dump_file, "\n");
865 }
866
867 gcc_assert (is_gimple_call (stmt));
868
869 first = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun));
870
871 /* Remove the code after call_gsi that will become unreachable. The
872 possibly unreachable code in other blocks is removed later in
873 cfg cleanup. */
874 gsi = t->call_gsi;
875 gimple_stmt_iterator gsi2 = gsi_last_bb (gimple_bb (gsi_stmt (gsi)));
876 while (gsi_stmt (gsi2) != gsi_stmt (gsi))
877 {
878 gimple *t = gsi_stmt (gsi2);
879 /* Do not remove the return statement, so that redirect_edge_and_branch
880 sees how the block ends. */
881 if (gimple_code (t) != GIMPLE_RETURN)
882 {
883 gimple_stmt_iterator gsi3 = gsi2;
884 gsi_prev (&gsi2);
885 gsi_remove (&gsi3, true);
886 release_defs (t);
887 }
888 else
889 gsi_prev (&gsi2);
890 }
891
892 /* Number of executions of function has reduced by the tailcall. */
893 e = single_succ_edge (gsi_bb (t->call_gsi));
894 decrease_profile (EXIT_BLOCK_PTR_FOR_FN (cfun), e->count, EDGE_FREQUENCY (e));
895 decrease_profile (ENTRY_BLOCK_PTR_FOR_FN (cfun), e->count,
896 EDGE_FREQUENCY (e));
897 if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
898 decrease_profile (e->dest, e->count, EDGE_FREQUENCY (e));
899
900 /* Replace the call by a jump to the start of function. */
901 e = redirect_edge_and_branch (single_succ_edge (gsi_bb (t->call_gsi)),
902 first);
903 gcc_assert (e);
904 PENDING_STMT (e) = NULL;
905
906 /* Add phi node entries for arguments. The ordering of the phi nodes should
907 be the same as the ordering of the arguments. */
908 for (param = DECL_ARGUMENTS (current_function_decl),
909 idx = 0, gpi = gsi_start_phis (first);
910 param;
911 param = DECL_CHAIN (param), idx++)
912 {
913 if (!arg_needs_copy_p (param))
914 continue;
915
916 arg = gimple_call_arg (stmt, idx);
917 phi = gpi.phi ();
918 gcc_assert (param == SSA_NAME_VAR (PHI_RESULT (phi)));
919
920 add_phi_arg (phi, arg, e, gimple_location (stmt));
921 gsi_next (&gpi);
922 }
923
924 /* Update the values of accumulators. */
925 adjust_accumulator_values (t->call_gsi, t->mult, t->add, e);
926
927 call = gsi_stmt (t->call_gsi);
928 rslt = gimple_call_lhs (call);
929 if (rslt != NULL_TREE && TREE_CODE (rslt) == SSA_NAME)
930 {
931 /* Result of the call will no longer be defined. So adjust the
932 SSA_NAME_DEF_STMT accordingly. */
933 SSA_NAME_DEF_STMT (rslt) = gimple_build_nop ();
934 }
935
936 gsi_remove (&t->call_gsi, true);
937 release_defs (call);
938 }
939
940 /* Optimizes the tailcall described by T. If OPT_TAILCALLS is true, also
941 mark the tailcalls for the sibcall optimization. */
942
943 static bool
944 optimize_tail_call (struct tailcall *t, bool opt_tailcalls)
945 {
946 if (t->tail_recursion)
947 {
948 eliminate_tail_call (t);
949 return true;
950 }
951
952 if (opt_tailcalls)
953 {
954 gcall *stmt = as_a <gcall *> (gsi_stmt (t->call_gsi));
955
956 gimple_call_set_tail (stmt, true);
957 cfun->tail_call_marked = true;
958 if (dump_file && (dump_flags & TDF_DETAILS))
959 {
960 fprintf (dump_file, "Found tail call ");
961 print_gimple_stmt (dump_file, stmt, 0, dump_flags);
962 fprintf (dump_file, " in bb %i\n", (gsi_bb (t->call_gsi))->index);
963 }
964 }
965
966 return false;
967 }
968
969 /* Creates a tail-call accumulator of the same type as the return type of the
970 current function. LABEL is the name used to creating the temporary
971 variable for the accumulator. The accumulator will be inserted in the
972 phis of a basic block BB with single predecessor with an initial value
973 INIT converted to the current function return type. */
974
975 static tree
976 create_tailcall_accumulator (const char *label, basic_block bb, tree init)
977 {
978 tree ret_type = TREE_TYPE (DECL_RESULT (current_function_decl));
979 if (POINTER_TYPE_P (ret_type))
980 ret_type = sizetype;
981
982 tree tmp = make_temp_ssa_name (ret_type, NULL, label);
983 gphi *phi;
984
985 phi = create_phi_node (tmp, bb);
986 /* RET_TYPE can be a float when -ffast-maths is enabled. */
987 add_phi_arg (phi, fold_convert (ret_type, init), single_pred_edge (bb),
988 UNKNOWN_LOCATION);
989 return PHI_RESULT (phi);
990 }
991
992 /* Optimizes tail calls in the function, turning the tail recursion
993 into iteration. */
994
995 static unsigned int
996 tree_optimize_tail_calls_1 (bool opt_tailcalls)
997 {
998 edge e;
999 bool phis_constructed = false;
1000 struct tailcall *tailcalls = NULL, *act, *next;
1001 bool changed = false;
1002 basic_block first = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun));
1003 tree param;
1004 gimple *stmt;
1005 edge_iterator ei;
1006
1007 if (!suitable_for_tail_opt_p ())
1008 return 0;
1009 if (opt_tailcalls)
1010 opt_tailcalls = suitable_for_tail_call_opt_p ();
1011
1012 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
1013 {
1014 /* Only traverse the normal exits, i.e. those that end with return
1015 statement. */
1016 stmt = last_stmt (e->src);
1017
1018 if (stmt
1019 && gimple_code (stmt) == GIMPLE_RETURN)
1020 find_tail_calls (e->src, &tailcalls);
1021 }
1022
1023 /* Construct the phi nodes and accumulators if necessary. */
1024 a_acc = m_acc = NULL_TREE;
1025 for (act = tailcalls; act; act = act->next)
1026 {
1027 if (!act->tail_recursion)
1028 continue;
1029
1030 if (!phis_constructed)
1031 {
1032 /* Ensure that there is only one predecessor of the block
1033 or if there are existing degenerate PHI nodes. */
1034 if (!single_pred_p (first)
1035 || !gimple_seq_empty_p (phi_nodes (first)))
1036 first =
1037 split_edge (single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
1038
1039 /* Copy the args if needed. */
1040 for (param = DECL_ARGUMENTS (current_function_decl);
1041 param;
1042 param = DECL_CHAIN (param))
1043 if (arg_needs_copy_p (param))
1044 {
1045 tree name = ssa_default_def (cfun, param);
1046 tree new_name = make_ssa_name (param, SSA_NAME_DEF_STMT (name));
1047 gphi *phi;
1048
1049 set_ssa_default_def (cfun, param, new_name);
1050 phi = create_phi_node (name, first);
1051 add_phi_arg (phi, new_name, single_pred_edge (first),
1052 EXPR_LOCATION (param));
1053 }
1054 phis_constructed = true;
1055 }
1056
1057 if (act->add && !a_acc)
1058 a_acc = create_tailcall_accumulator ("add_acc", first,
1059 integer_zero_node);
1060
1061 if (act->mult && !m_acc)
1062 m_acc = create_tailcall_accumulator ("mult_acc", first,
1063 integer_one_node);
1064 }
1065
1066 if (a_acc || m_acc)
1067 {
1068 /* When the tail call elimination using accumulators is performed,
1069 statements adding the accumulated value are inserted at all exits.
1070 This turns all other tail calls to non-tail ones. */
1071 opt_tailcalls = false;
1072 }
1073
1074 for (; tailcalls; tailcalls = next)
1075 {
1076 next = tailcalls->next;
1077 changed |= optimize_tail_call (tailcalls, opt_tailcalls);
1078 free (tailcalls);
1079 }
1080
1081 if (a_acc || m_acc)
1082 {
1083 /* Modify the remaining return statements. */
1084 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
1085 {
1086 stmt = last_stmt (e->src);
1087
1088 if (stmt
1089 && gimple_code (stmt) == GIMPLE_RETURN)
1090 adjust_return_value (e->src, m_acc, a_acc);
1091 }
1092 }
1093
1094 if (changed)
1095 {
1096 /* We may have created new loops. Make them magically appear. */
1097 loops_state_set (LOOPS_NEED_FIXUP);
1098 free_dominance_info (CDI_DOMINATORS);
1099 }
1100
1101 /* Add phi nodes for the virtual operands defined in the function to the
1102 header of the loop created by tail recursion elimination. Do so
1103 by triggering the SSA renamer. */
1104 if (phis_constructed)
1105 mark_virtual_operands_for_renaming (cfun);
1106
1107 if (changed)
1108 return TODO_cleanup_cfg | TODO_update_ssa_only_virtuals;
1109 return 0;
1110 }
1111
1112 static bool
1113 gate_tail_calls (void)
1114 {
1115 return flag_optimize_sibling_calls != 0 && dbg_cnt (tail_call);
1116 }
1117
1118 static unsigned int
1119 execute_tail_calls (void)
1120 {
1121 return tree_optimize_tail_calls_1 (true);
1122 }
1123
1124 namespace {
1125
1126 const pass_data pass_data_tail_recursion =
1127 {
1128 GIMPLE_PASS, /* type */
1129 "tailr", /* name */
1130 OPTGROUP_NONE, /* optinfo_flags */
1131 TV_NONE, /* tv_id */
1132 ( PROP_cfg | PROP_ssa ), /* properties_required */
1133 0, /* properties_provided */
1134 0, /* properties_destroyed */
1135 0, /* todo_flags_start */
1136 0, /* todo_flags_finish */
1137 };
1138
1139 class pass_tail_recursion : public gimple_opt_pass
1140 {
1141 public:
1142 pass_tail_recursion (gcc::context *ctxt)
1143 : gimple_opt_pass (pass_data_tail_recursion, ctxt)
1144 {}
1145
1146 /* opt_pass methods: */
1147 opt_pass * clone () { return new pass_tail_recursion (m_ctxt); }
1148 virtual bool gate (function *) { return gate_tail_calls (); }
1149 virtual unsigned int execute (function *)
1150 {
1151 return tree_optimize_tail_calls_1 (false);
1152 }
1153
1154 }; // class pass_tail_recursion
1155
1156 } // anon namespace
1157
1158 gimple_opt_pass *
1159 make_pass_tail_recursion (gcc::context *ctxt)
1160 {
1161 return new pass_tail_recursion (ctxt);
1162 }
1163
1164 namespace {
1165
1166 const pass_data pass_data_tail_calls =
1167 {
1168 GIMPLE_PASS, /* type */
1169 "tailc", /* name */
1170 OPTGROUP_NONE, /* optinfo_flags */
1171 TV_NONE, /* tv_id */
1172 ( PROP_cfg | PROP_ssa ), /* properties_required */
1173 0, /* properties_provided */
1174 0, /* properties_destroyed */
1175 0, /* todo_flags_start */
1176 0, /* todo_flags_finish */
1177 };
1178
1179 class pass_tail_calls : public gimple_opt_pass
1180 {
1181 public:
1182 pass_tail_calls (gcc::context *ctxt)
1183 : gimple_opt_pass (pass_data_tail_calls, ctxt)
1184 {}
1185
1186 /* opt_pass methods: */
1187 virtual bool gate (function *) { return gate_tail_calls (); }
1188 virtual unsigned int execute (function *) { return execute_tail_calls (); }
1189
1190 }; // class pass_tail_calls
1191
1192 } // anon namespace
1193
1194 gimple_opt_pass *
1195 make_pass_tail_calls (gcc::context *ctxt)
1196 {
1197 return new pass_tail_calls (ctxt);
1198 }