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