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