Unify the management of RTL and tree-level dump files.
[gcc.git] / gcc / tree-tailcall.c
1 /* Tail call optimization on trees.
2 Copyright (C) 2003 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 2, 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 COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "rtl.h"
27 #include "tm_p.h"
28 #include "hard-reg-set.h"
29 #include "basic-block.h"
30 #include "function.h"
31 #include "tree-flow.h"
32 #include "tree-dump.h"
33 #include "diagnostic.h"
34 #include "except.h"
35 #include "tree-pass.h"
36 #include "flags.h"
37 #include "langhooks.h"
38
39 /* The file implements the tail recursion elimination. It is also used to
40 analyze the tail calls in general, passing the results to the rtl level
41 where they are used for sibcall optimization.
42
43 In addition to the standard tail recursion elimination, we handle the most
44 trivial cases of making the call tail recursive by creating accumulators.
45 For example the following function
46
47 int sum (int n)
48 {
49 if (n > 0)
50 return n + sum (n - 1);
51 else
52 return 0;
53 }
54
55 is transformed into
56
57 int sum (int n)
58 {
59 int acc = 0;
60
61 while (n > 0)
62 acc += n--;
63
64 return acc;
65 }
66
67 To do this, we maintain two accumulators (a_acc and m_acc) that indicate
68 when we reach the return x statement, we should return a_acc + x * m_acc
69 instead. They are initially initialized to 0 and 1, respectively,
70 so the semantics of the function is obviously preserved. If we are
71 guaranteed that the value of the accumulator never change, we
72 omit the accumulator.
73
74 There are three cases how the function may exit. The first one is
75 handled in adjust_return_value, the other two in adjust_accumulator_values
76 (the second case is actually a special case of the third one and we
77 present it separately just for clarity):
78
79 1) Just return x, where x is not in any of the remaining special shapes.
80 We rewrite this to a gimple equivalent of return m_acc * x + a_acc.
81
82 2) return f (...), where f is the current function, is rewritten in a
83 classical tail-recursion elimination way, into assignment of arguments
84 and jump to the start of the function. Values of the accumulators
85 are unchanged.
86
87 3) return a + m * f(...), where a and m do not depend on call to f.
88 To preserve the semantics described before we want this to be rewritten
89 in such a way that we finally return
90
91 a_acc + (a + m * f(...)) * m_acc = (a_acc + a * m_acc) + (m * m_acc) * f(...).
92
93 I.e. we increase a_acc by a * m_acc, multiply m_acc by m and
94 eliminate the tail call to f. Special cases when the value is just
95 added or just multiplied are obtained by setting a = 0 or m = 1.
96
97 TODO -- it is possible to do similar tricks for other operations. */
98
99 /* A structure that describes the tailcall. */
100
101 struct tailcall
102 {
103 /* The block in that the call occur. */
104 basic_block call_block;
105
106 /* The iterator pointing to the call statement. */
107 block_stmt_iterator call_bsi;
108
109 /* True if it is a call to the current function. */
110 bool tail_recursion;
111
112 /* The return value of the caller is mult * f + add, where f is the return
113 value of the call. */
114 tree mult, add;
115
116 /* Next tailcall in the chain. */
117 struct tailcall *next;
118 };
119
120 /* The variables holding the value of multiplicative and additive
121 accumulator. */
122 static tree m_acc, a_acc;
123
124 static bool suitable_for_tail_opt_p (void);
125 static bool optimize_tail_call (struct tailcall *, bool);
126 static void eliminate_tail_call (struct tailcall *);
127 static void find_tail_calls (basic_block, struct tailcall **);
128
129 /* Returns false when the function is not suitable for tail call optimization
130 from some reason (e.g. if it takes variable number of arguments). */
131
132 static bool
133 suitable_for_tail_opt_p (void)
134 {
135 int i;
136
137 if (current_function_stdarg)
138 return false;
139
140 /* No local variable should be call-clobbered. We ignore any kind
141 of memory tag, as these are not real variables. */
142 for (i = 0; i < (int) VARRAY_ACTIVE_SIZE (referenced_vars); i++)
143 {
144 tree var = VARRAY_TREE (referenced_vars, i);
145
146 if (!(TREE_STATIC (var) || DECL_EXTERNAL (var))
147 && var_ann (var)->mem_tag_kind == NOT_A_TAG
148 && is_call_clobbered (var))
149 return false;
150 }
151
152 return true;
153 }
154 /* Returns false when the function is not suitable for tail call optimization
155 from some reason (e.g. if it takes variable number of arguments).
156 This test must pass in addition to suitable_for_tail_opt_p in order to make
157 tail call discovery happen. */
158
159 static bool
160 suitable_for_tail_call_opt_p (void)
161 {
162 /* alloca (until we have stack slot life analysis) inhibits
163 sibling call optimizations, but not tail recursion. */
164 if (current_function_calls_alloca)
165 return false;
166
167 /* If we are using sjlj exceptions, we may need to add a call to
168 _Unwind_SjLj_Unregister at exit of the function. Which means
169 that we cannot do any sibcall transformations. */
170 if (USING_SJLJ_EXCEPTIONS && current_function_has_exception_handlers ())
171 return false;
172
173 /* Any function that calls setjmp might have longjmp called from
174 any called function. ??? We really should represent this
175 properly in the CFG so that this needn't be special cased. */
176 if (current_function_calls_setjmp)
177 return false;
178
179 return true;
180 }
181
182 /* Checks whether the expression EXPR in stmt AT is independent of the
183 statement pointed by BSI (in a sense that we already know EXPR's value
184 at BSI). We use the fact that we are only called from the chain of
185 basic blocks that have only single successor. Returns the expression
186 containing the value of EXPR at BSI. */
187
188 static tree
189 independent_of_stmt_p (tree expr, tree at, block_stmt_iterator bsi)
190 {
191 basic_block bb, call_bb, at_bb;
192 edge e;
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 /* Mark the blocks in the chain leading to the end. */
201 at_bb = bb_for_stmt (at);
202 call_bb = bb_for_stmt (bsi_stmt (bsi));
203 for (bb = call_bb; bb != at_bb; bb = bb->succ->dest)
204 bb->aux = &bb->aux;
205 bb->aux = &bb->aux;
206
207 while (1)
208 {
209 at = SSA_NAME_DEF_STMT (expr);
210 bb = bb_for_stmt (at);
211
212 /* The default definition or defined before the chain. */
213 if (!bb || !bb->aux)
214 break;
215
216 if (bb == call_bb)
217 {
218 for (; !bsi_end_p (bsi); bsi_next (&bsi))
219 if (bsi_stmt (bsi) == at)
220 break;
221
222 if (!bsi_end_p (bsi))
223 expr = NULL_TREE;
224 break;
225 }
226
227 if (TREE_CODE (at) != PHI_NODE)
228 {
229 expr = NULL_TREE;
230 break;
231 }
232
233 for (e = bb->pred; e; e = e->pred_next)
234 if (e->src->aux)
235 break;
236 if (!e)
237 abort ();
238
239 expr = PHI_ARG_DEF_FROM_EDGE (at, e);
240 if (TREE_CODE (expr) != SSA_NAME)
241 {
242 /* The value is a constant. */
243 break;
244 }
245 }
246
247 /* Unmark the blocks. */
248 for (bb = call_bb; bb != at_bb; bb = bb->succ->dest)
249 bb->aux = NULL;
250 bb->aux = NULL;
251
252 return expr;
253 }
254
255 /* Simulates the effect of an assignment of ASS in STMT on the return value
256 of the tail recursive CALL passed in ASS_VAR. M and A are the
257 multiplicative and the additive factor for the real return value. */
258
259 static bool
260 process_assignment (tree ass, tree stmt, block_stmt_iterator call, tree *m,
261 tree *a, tree *ass_var)
262 {
263 tree op0, op1, non_ass_var;
264 tree dest = TREE_OPERAND (ass, 0);
265 tree src = TREE_OPERAND (ass, 1);
266 enum tree_code code = TREE_CODE (src);
267 tree src_var = src;
268
269 /* See if this is a simple copy operation of an SSA name to the function
270 result. In that case we may have a simple tail call. Ignore type
271 conversions that can never produce extra code between the function
272 call and the function return. */
273 STRIP_NOPS (src_var);
274 if (TREE_CODE (src_var) == SSA_NAME)
275 {
276 if (src_var != *ass_var)
277 return false;
278
279 *ass_var = dest;
280 return true;
281 }
282
283 if (TREE_CODE_CLASS (code) != '2')
284 return false;
285
286 /* We only handle the code like
287
288 x = call ();
289 y = m * x;
290 z = y + a;
291 return z;
292
293 TODO -- Extend it for cases where the linear transformation of the output
294 is expressed in a more complicated way. */
295
296 op0 = TREE_OPERAND (src, 0);
297 op1 = TREE_OPERAND (src, 1);
298
299 if (op0 == *ass_var
300 && (non_ass_var = independent_of_stmt_p (op1, stmt, call)))
301 ;
302 else if (op1 == *ass_var
303 && (non_ass_var = independent_of_stmt_p (op0, stmt, call)))
304 ;
305 else
306 return false;
307
308 switch (code)
309 {
310 case PLUS_EXPR:
311 /* There should be no previous addition. TODO -- it should be fairly
312 straightforward to lift this restriction -- just allow storing
313 more complicated expressions in *A, and gimplify it in
314 adjust_accumulator_values. */
315 if (*a)
316 return false;
317 *a = non_ass_var;
318 *ass_var = dest;
319 return true;
320
321 case MULT_EXPR:
322 /* Similar remark applies here. Handling multiplication after addition
323 is just slightly more complicated -- we need to multiply both *A and
324 *M. */
325 if (*a || *m)
326 return false;
327 *m = non_ass_var;
328 *ass_var = dest;
329 return true;
330
331 /* TODO -- Handle other codes (NEGATE_EXPR, MINUS_EXPR). */
332
333 default:
334 return false;
335 }
336 }
337
338 /* Propagate VAR through phis on edge E. */
339
340 static tree
341 propagate_through_phis (tree var, edge e)
342 {
343 basic_block dest = e->dest;
344 tree phi;
345
346 for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
347 if (PHI_ARG_DEF_FROM_EDGE (phi, e) == var)
348 return PHI_RESULT (phi);
349
350 return var;
351 }
352
353 /* Finds tailcalls falling into basic block BB. The list of found tailcalls is
354 added to the start of RET. */
355
356 static void
357 find_tail_calls (basic_block bb, struct tailcall **ret)
358 {
359 tree ass_var, ret_var, stmt, func, param, args, call = NULL_TREE;
360 block_stmt_iterator bsi, absi;
361 bool tail_recursion;
362 struct tailcall *nw;
363 edge e;
364 tree m, a;
365 basic_block abb;
366 stmt_ann_t ann;
367
368 if (bb->succ->succ_next)
369 return;
370
371 for (bsi = bsi_last (bb); !bsi_end_p (bsi); bsi_prev (&bsi))
372 {
373 stmt = bsi_stmt (bsi);
374
375 /* Ignore labels. */
376 if (TREE_CODE (stmt) == LABEL_EXPR)
377 continue;
378
379 get_stmt_operands (stmt);
380
381 /* Check for a call. */
382 if (TREE_CODE (stmt) == MODIFY_EXPR)
383 {
384 ass_var = TREE_OPERAND (stmt, 0);
385 call = TREE_OPERAND (stmt, 1);
386 if (TREE_CODE (call) == WITH_SIZE_EXPR)
387 call = TREE_OPERAND (call, 0);
388 }
389 else
390 {
391 ass_var = NULL_TREE;
392 call = stmt;
393 }
394
395 if (TREE_CODE (call) == CALL_EXPR)
396 break;
397
398 /* If the statement has virtual or volatile operands, fail. */
399 ann = stmt_ann (stmt);
400 if (NUM_V_MAY_DEFS (V_MAY_DEF_OPS (ann))
401 || NUM_V_MUST_DEFS (V_MUST_DEF_OPS (ann))
402 || NUM_VUSES (VUSE_OPS (ann))
403 || ann->has_volatile_ops)
404 return;
405 }
406
407 if (bsi_end_p (bsi))
408 {
409 /* Recurse to the predecessors. */
410 for (e = bb->pred; e; e = e->pred_next)
411 find_tail_calls (e->src, ret);
412
413 return;
414 }
415
416 /* We found the call, check whether it is suitable. */
417 tail_recursion = false;
418 func = get_callee_fndecl (call);
419 if (func == current_function_decl)
420 {
421 for (param = DECL_ARGUMENTS (func), args = TREE_OPERAND (call, 1);
422 param && args;
423 param = TREE_CHAIN (param), args = TREE_CHAIN (args))
424 {
425 tree arg = TREE_VALUE (args);
426 if (param != arg
427 /* Make sure there are no problems with copying. Note we must
428 have a copyable type and the two arguments must have reasonably
429 equivalent types. The latter requirement could be relaxed if
430 we emitted a suitable type conversion statement. */
431 && (!is_gimple_reg_type (TREE_TYPE (param))
432 || !lang_hooks.types_compatible_p (TREE_TYPE (param),
433 TREE_TYPE (arg))))
434 break;
435 }
436 if (!args && !param)
437 tail_recursion = true;
438 }
439
440 /* Now check the statements after the call. None of them has virtual
441 operands, so they may only depend on the call through its return
442 value. The return value should also be dependent on each of them,
443 since we are running after dce. */
444 m = NULL_TREE;
445 a = NULL_TREE;
446
447 abb = bb;
448 absi = bsi;
449 while (1)
450 {
451 bsi_next (&absi);
452
453 while (bsi_end_p (absi))
454 {
455 ass_var = propagate_through_phis (ass_var, abb->succ);
456 abb = abb->succ->dest;
457 absi = bsi_start (abb);
458 }
459
460 stmt = bsi_stmt (absi);
461
462 if (TREE_CODE (stmt) == LABEL_EXPR)
463 continue;
464
465 if (TREE_CODE (stmt) == RETURN_EXPR)
466 break;
467
468 if (TREE_CODE (stmt) != MODIFY_EXPR)
469 return;
470
471 if (!process_assignment (stmt, stmt, bsi, &m, &a, &ass_var))
472 return;
473 }
474
475 /* See if this is a tail call we can handle. */
476 ret_var = TREE_OPERAND (stmt, 0);
477 if (ret_var
478 && TREE_CODE (ret_var) == MODIFY_EXPR)
479 {
480 tree ret_op = TREE_OPERAND (ret_var, 1);
481 STRIP_NOPS (ret_op);
482 if (!tail_recursion
483 && TREE_CODE (ret_op) != SSA_NAME)
484 return;
485
486 if (!process_assignment (ret_var, stmt, bsi, &m, &a, &ass_var))
487 return;
488 ret_var = TREE_OPERAND (ret_var, 0);
489 }
490
491 /* We may proceed if there either is no return value, or the return value
492 is identical to the call's return. */
493 if (ret_var
494 && (ret_var != ass_var))
495 return;
496
497 /* If this is not a tail recursive call, we cannot handle addends or
498 multiplicands. */
499 if (!tail_recursion && (m || a))
500 return;
501
502 nw = xmalloc (sizeof (struct tailcall));
503
504 nw->call_block = bb;
505 nw->call_bsi = bsi;
506
507 nw->tail_recursion = tail_recursion;
508
509 nw->mult = m;
510 nw->add = a;
511
512 nw->next = *ret;
513 *ret = nw;
514 }
515
516 /* Adjust the accumulator values according to A and M after BSI, and update
517 the phi nodes on edge BACK. */
518
519 static void
520 adjust_accumulator_values (block_stmt_iterator bsi, tree m, tree a, edge back)
521 {
522 tree stmt, var, phi, tmp;
523 tree ret_type = TREE_TYPE (DECL_RESULT (current_function_decl));
524 tree a_acc_arg = a_acc, m_acc_arg = m_acc;
525
526 if (a)
527 {
528 if (m_acc)
529 {
530 if (integer_onep (a))
531 var = m_acc;
532 else
533 {
534 stmt = build (MODIFY_EXPR, ret_type, NULL_TREE,
535 build (MULT_EXPR, ret_type, m_acc, a));
536
537 tmp = create_tmp_var (ret_type, "acc_tmp");
538 add_referenced_tmp_var (tmp);
539
540 var = make_ssa_name (tmp, stmt);
541 TREE_OPERAND (stmt, 0) = var;
542 bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
543 }
544 }
545 else
546 var = a;
547
548 stmt = build (MODIFY_EXPR, ret_type, NULL_TREE,
549 build (PLUS_EXPR, ret_type, a_acc, var));
550 var = make_ssa_name (SSA_NAME_VAR (a_acc), stmt);
551 TREE_OPERAND (stmt, 0) = var;
552 bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
553 a_acc_arg = var;
554 }
555
556 if (m)
557 {
558 stmt = build (MODIFY_EXPR, ret_type, NULL_TREE,
559 build (MULT_EXPR, ret_type, m_acc, m));
560 var = make_ssa_name (SSA_NAME_VAR (m_acc), stmt);
561 TREE_OPERAND (stmt, 0) = var;
562 bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
563 m_acc_arg = var;
564 }
565
566 if (a_acc)
567 {
568 for (phi = phi_nodes (back->dest); phi; phi = PHI_CHAIN (phi))
569 if (PHI_RESULT (phi) == a_acc)
570 break;
571
572 add_phi_arg (&phi, a_acc_arg, back);
573 }
574
575 if (m_acc)
576 {
577 for (phi = phi_nodes (back->dest); phi; phi = PHI_CHAIN (phi))
578 if (PHI_RESULT (phi) == m_acc)
579 break;
580
581 add_phi_arg (&phi, m_acc_arg, back);
582 }
583 }
584
585 /* Adjust value of the return at the end of BB according to M and A
586 accumulators. */
587
588 static void
589 adjust_return_value (basic_block bb, tree m, tree a)
590 {
591 tree ret_stmt = last_stmt (bb), ret_var, var, stmt, tmp;
592 tree ret_type = TREE_TYPE (DECL_RESULT (current_function_decl));
593 block_stmt_iterator bsi = bsi_last (bb);
594
595 if (TREE_CODE (ret_stmt) != RETURN_EXPR)
596 abort ();
597
598 ret_var = TREE_OPERAND (ret_stmt, 0);
599 if (!ret_var)
600 return;
601
602 if (TREE_CODE (ret_var) == MODIFY_EXPR)
603 {
604 ret_var->common.ann = (tree_ann_t) stmt_ann (ret_stmt);
605 bsi_replace (&bsi, ret_var, true);
606 SSA_NAME_DEF_STMT (TREE_OPERAND (ret_var, 0)) = ret_var;
607 ret_var = TREE_OPERAND (ret_var, 0);
608 ret_stmt = build1 (RETURN_EXPR, TREE_TYPE (ret_stmt), ret_var);
609 bsi_insert_after (&bsi, ret_stmt, BSI_NEW_STMT);
610 }
611
612 if (m)
613 {
614 stmt = build (MODIFY_EXPR, ret_type, NULL_TREE,
615 build (MULT_EXPR, ret_type, m_acc, ret_var));
616
617 tmp = create_tmp_var (ret_type, "acc_tmp");
618 add_referenced_tmp_var (tmp);
619
620 var = make_ssa_name (tmp, stmt);
621 TREE_OPERAND (stmt, 0) = var;
622 bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
623 }
624 else
625 var = ret_var;
626
627 if (a)
628 {
629 stmt = build (MODIFY_EXPR, ret_type, NULL_TREE,
630 build (PLUS_EXPR, ret_type, a_acc, var));
631
632 tmp = create_tmp_var (ret_type, "acc_tmp");
633 add_referenced_tmp_var (tmp);
634
635 var = make_ssa_name (tmp, stmt);
636 TREE_OPERAND (stmt, 0) = var;
637 bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
638 }
639
640 TREE_OPERAND (ret_stmt, 0) = var;
641 modify_stmt (ret_stmt);
642 }
643
644 /* Eliminates tail call described by T. TMP_VARS is a list of
645 temporary variables used to copy the function arguments. */
646
647 static void
648 eliminate_tail_call (struct tailcall *t)
649 {
650 tree param, stmt, args, rslt, call;
651 basic_block bb, first;
652 edge e;
653 tree phi;
654 stmt_ann_t ann;
655 v_may_def_optype v_may_defs;
656 unsigned i;
657 block_stmt_iterator bsi;
658
659 stmt = bsi_stmt (t->call_bsi);
660 get_stmt_operands (stmt);
661 ann = stmt_ann (stmt);
662 bb = t->call_block;
663
664 if (dump_file && (dump_flags & TDF_DETAILS))
665 {
666 fprintf (dump_file, "Eliminated tail recursion in bb %d : ",
667 bb->index);
668 print_generic_stmt (dump_file, stmt, TDF_SLIM);
669 fprintf (dump_file, "\n");
670 }
671
672 if (TREE_CODE (stmt) == MODIFY_EXPR)
673 stmt = TREE_OPERAND (stmt, 1);
674
675 first = ENTRY_BLOCK_PTR->succ->dest;
676
677 /* Remove the code after call_bsi that will become unreachable. The
678 possibly unreachable code in other blocks is removed later in
679 cfg cleanup. */
680 bsi = t->call_bsi;
681 bsi_next (&bsi);
682 while (!bsi_end_p (bsi))
683 {
684 /* Do not remove the return statement, so that redirect_edge_and_branch
685 sees how the block ends. */
686 if (TREE_CODE (bsi_stmt (bsi)) == RETURN_EXPR)
687 break;
688
689 bsi_remove (&bsi);
690 }
691
692 /* Replace the call by a jump to the start of function. */
693 e = redirect_edge_and_branch (t->call_block->succ, first);
694 if (!e)
695 abort ();
696 PENDING_STMT (e) = NULL_TREE;
697
698 /* Add phi node entries for arguments. Not every PHI node corresponds to
699 a function argument (there may be PHI nodes for virtual definitions of the
700 eliminated calls), so we search for a PHI corresponding to each argument
701 rather than searching for which argument a PHI node corresponds to. */
702
703 for (param = DECL_ARGUMENTS (current_function_decl),
704 args = TREE_OPERAND (stmt, 1);
705 param;
706 param = TREE_CHAIN (param),
707 args = TREE_CHAIN (args))
708 {
709
710 for (phi = phi_nodes (first); phi; phi = PHI_CHAIN (phi))
711 if (param == SSA_NAME_VAR (PHI_RESULT (phi)))
712 break;
713
714 /* The phi node indeed does not have to be there, in case the operand is
715 invariant in the function. */
716 if (!phi)
717 continue;
718
719 add_phi_arg (&phi, TREE_VALUE (args), e);
720 }
721
722 /* Add phi nodes for the call clobbered variables. */
723 v_may_defs = V_MAY_DEF_OPS (ann);
724 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
725 {
726 param = SSA_NAME_VAR (V_MAY_DEF_RESULT (v_may_defs, i));
727 for (phi = phi_nodes (first); phi; phi = PHI_CHAIN (phi))
728 if (param == SSA_NAME_VAR (PHI_RESULT (phi)))
729 break;
730
731 if (!phi)
732 {
733 tree name = var_ann (param)->default_def;
734 tree new_name;
735
736 if (!name)
737 {
738 /* It may happen that the tag does not have a default_def in case
739 when all uses of it are dominated by a MUST_DEF. This however
740 means that it is not necessary to add a phi node for this
741 tag. */
742 continue;
743 }
744 new_name = make_ssa_name (param, SSA_NAME_DEF_STMT (name));
745
746 var_ann (param)->default_def = new_name;
747 phi = create_phi_node (name, first);
748 SSA_NAME_DEF_STMT (name) = phi;
749 add_phi_arg (&phi, new_name, ENTRY_BLOCK_PTR->succ);
750
751 /* For all calls the same set of variables should be clobbered. This
752 means that there always should be the appropriate phi node except
753 for the first time we eliminate the call. */
754 if (first->pred->pred_next->pred_next)
755 abort ();
756 }
757
758 add_phi_arg (&phi, V_MAY_DEF_OP (v_may_defs, i), e);
759 }
760
761 /* Update the values of accumulators. */
762 adjust_accumulator_values (t->call_bsi, t->mult, t->add, e);
763
764 call = bsi_stmt (t->call_bsi);
765 if (TREE_CODE (call) == MODIFY_EXPR)
766 {
767 rslt = TREE_OPERAND (call, 0);
768
769 /* Result of the call will no longer be defined. So adjust the
770 SSA_NAME_DEF_STMT accordingly. */
771 SSA_NAME_DEF_STMT (rslt) = build_empty_stmt ();
772 }
773
774 bsi_remove (&t->call_bsi);
775 }
776
777 /* Optimizes the tailcall described by T. If OPT_TAILCALLS is true, also
778 mark the tailcalls for the sibcall optimization. */
779
780 static bool
781 optimize_tail_call (struct tailcall *t, bool opt_tailcalls)
782 {
783 if (t->tail_recursion)
784 {
785 eliminate_tail_call (t);
786 return true;
787 }
788
789 if (opt_tailcalls)
790 {
791 tree stmt = bsi_stmt (t->call_bsi);
792
793 stmt = get_call_expr_in (stmt);
794 CALL_EXPR_TAILCALL (stmt) = 1;
795 if (dump_file && (dump_flags & TDF_DETAILS))
796 {
797 fprintf (dump_file, "Found tail call ");
798 print_generic_expr (dump_file, stmt, dump_flags);
799 fprintf (dump_file, " in bb %i\n", t->call_block->index);
800 }
801 }
802
803 return false;
804 }
805
806 /* Optimizes tail calls in the function, turning the tail recursion
807 into iteration. */
808
809 static void
810 tree_optimize_tail_calls_1 (bool opt_tailcalls)
811 {
812 edge e;
813 bool phis_constructed = false;
814 struct tailcall *tailcalls = NULL, *act, *next;
815 bool changed = false;
816 basic_block first = ENTRY_BLOCK_PTR->succ->dest;
817 tree stmt, param, ret_type, tmp, phi;
818
819 if (!suitable_for_tail_opt_p ())
820 return;
821 if (opt_tailcalls)
822 opt_tailcalls = suitable_for_tail_call_opt_p ();
823
824 for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
825 {
826 /* Only traverse the normal exits, i.e. those that end with return
827 statement. */
828 stmt = last_stmt (e->src);
829
830 if (stmt
831 && TREE_CODE (stmt) == RETURN_EXPR)
832 find_tail_calls (e->src, &tailcalls);
833 }
834
835 /* Construct the phi nodes and accumulators if necessary. */
836 a_acc = m_acc = NULL_TREE;
837 for (act = tailcalls; act; act = act->next)
838 {
839 if (!act->tail_recursion)
840 continue;
841
842 if (!phis_constructed)
843 {
844 /* Ensure that there is only one predecessor of the block. */
845 if (first->pred->pred_next)
846 first = split_edge (ENTRY_BLOCK_PTR->succ);
847
848 /* Copy the args if needed. */
849 for (param = DECL_ARGUMENTS (current_function_decl);
850 param;
851 param = TREE_CHAIN (param))
852 if (var_ann (param)
853 /* Also parameters that are only defined but never used need not
854 be copied. */
855 && (var_ann (param)->default_def
856 && TREE_CODE (var_ann (param)->default_def) == SSA_NAME))
857 {
858 tree name = var_ann (param)->default_def;
859 tree new_name = make_ssa_name (param, SSA_NAME_DEF_STMT (name));
860 tree phi;
861
862 var_ann (param)->default_def = new_name;
863 phi = create_phi_node (name, first);
864 SSA_NAME_DEF_STMT (name) = phi;
865 add_phi_arg (&phi, new_name, first->pred);
866 }
867 phis_constructed = true;
868 }
869
870 if (act->add && !a_acc)
871 {
872 ret_type = TREE_TYPE (DECL_RESULT (current_function_decl));
873
874 tmp = create_tmp_var (ret_type, "add_acc");
875 add_referenced_tmp_var (tmp);
876
877 phi = create_phi_node (tmp, first);
878 add_phi_arg (&phi, fold_convert (ret_type, integer_zero_node),
879 first->pred);
880 a_acc = PHI_RESULT (phi);
881 }
882
883 if (act->mult && !m_acc)
884 {
885 ret_type = TREE_TYPE (DECL_RESULT (current_function_decl));
886
887 tmp = create_tmp_var (ret_type, "mult_acc");
888 add_referenced_tmp_var (tmp);
889
890 phi = create_phi_node (tmp, first);
891 add_phi_arg (&phi, fold_convert (ret_type, integer_one_node),
892 first->pred);
893 m_acc = PHI_RESULT (phi);
894 }
895 }
896
897 for (; tailcalls; tailcalls = next)
898 {
899 next = tailcalls->next;
900 changed |= optimize_tail_call (tailcalls, opt_tailcalls);
901 free (tailcalls);
902 }
903
904 if (a_acc || m_acc)
905 {
906 /* Modify the remaining return statements. */
907 for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
908 {
909 stmt = last_stmt (e->src);
910
911 if (stmt
912 && TREE_CODE (stmt) == RETURN_EXPR)
913 adjust_return_value (e->src, m_acc, a_acc);
914 }
915 }
916
917 if (changed)
918 {
919 free_dominance_info (CDI_DOMINATORS);
920 cleanup_tree_cfg ();
921 }
922 }
923
924 static void
925 execute_tail_recursion (void)
926 {
927 tree_optimize_tail_calls_1 (false);
928 }
929
930 static bool
931 gate_tail_calls (void)
932 {
933 return flag_optimize_sibling_calls != 0;
934 }
935
936 static void
937 execute_tail_calls (void)
938 {
939 tree_optimize_tail_calls_1 (true);
940 }
941
942 struct tree_opt_pass pass_tail_recursion =
943 {
944 "tailr", /* name */
945 NULL, /* gate */
946 execute_tail_recursion, /* execute */
947 NULL, /* sub */
948 NULL, /* next */
949 0, /* static_pass_number */
950 0, /* tv_id */
951 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
952 0, /* properties_provided */
953 0, /* properties_destroyed */
954 0, /* todo_flags_start */
955 TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
956 0 /* letter */
957 };
958
959 struct tree_opt_pass pass_tail_calls =
960 {
961 "tailc", /* name */
962 gate_tail_calls, /* gate */
963 execute_tail_calls, /* execute */
964 NULL, /* sub */
965 NULL, /* next */
966 0, /* static_pass_number */
967 0, /* tv_id */
968 PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
969 0, /* properties_provided */
970 0, /* properties_destroyed */
971 0, /* todo_flags_start */
972 TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
973 0 /* letter */
974 };