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