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