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