xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-ssa-loop-manip.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* High-level loop manipulation functions.
2*8feb0f0bSmrg    Copyright (C) 2004-2020 Free Software Foundation, Inc.
31debfc3dSmrg 
41debfc3dSmrg This file is part of GCC.
51debfc3dSmrg 
61debfc3dSmrg GCC is free software; you can redistribute it and/or modify it
71debfc3dSmrg under the terms of the GNU General Public License as published by the
81debfc3dSmrg Free Software Foundation; either version 3, or (at your option) any
91debfc3dSmrg later version.
101debfc3dSmrg 
111debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT
121debfc3dSmrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
131debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
141debfc3dSmrg for more details.
151debfc3dSmrg 
161debfc3dSmrg You should have received a copy of the GNU General Public License
171debfc3dSmrg along with GCC; see the file COPYING3.  If not see
181debfc3dSmrg <http://www.gnu.org/licenses/>.  */
191debfc3dSmrg 
201debfc3dSmrg #include "config.h"
211debfc3dSmrg #include "system.h"
221debfc3dSmrg #include "coretypes.h"
231debfc3dSmrg #include "backend.h"
241debfc3dSmrg #include "tree.h"
251debfc3dSmrg #include "gimple.h"
261debfc3dSmrg #include "cfghooks.h"
271debfc3dSmrg #include "tree-pass.h"	/* ??? for TODO_update_ssa but this isn't a pass.  */
281debfc3dSmrg #include "ssa.h"
291debfc3dSmrg #include "gimple-pretty-print.h"
301debfc3dSmrg #include "fold-const.h"
311debfc3dSmrg #include "cfganal.h"
321debfc3dSmrg #include "gimplify.h"
331debfc3dSmrg #include "gimple-iterator.h"
341debfc3dSmrg #include "gimplify-me.h"
351debfc3dSmrg #include "tree-cfg.h"
361debfc3dSmrg #include "tree-ssa-loop-ivopts.h"
371debfc3dSmrg #include "tree-ssa-loop-manip.h"
381debfc3dSmrg #include "tree-ssa-loop-niter.h"
391debfc3dSmrg #include "tree-ssa-loop.h"
401debfc3dSmrg #include "tree-into-ssa.h"
411debfc3dSmrg #include "tree-ssa.h"
421debfc3dSmrg #include "cfgloop.h"
431debfc3dSmrg #include "tree-scalar-evolution.h"
441debfc3dSmrg #include "tree-inline.h"
451debfc3dSmrg 
461debfc3dSmrg /* All bitmaps for rewriting into loop-closed SSA go on this obstack,
471debfc3dSmrg    so that we can free them all at once.  */
481debfc3dSmrg static bitmap_obstack loop_renamer_obstack;
491debfc3dSmrg 
501debfc3dSmrg /* Creates an induction variable with value BASE + STEP * iteration in LOOP.
511debfc3dSmrg    It is expected that neither BASE nor STEP are shared with other expressions
521debfc3dSmrg    (unless the sharing rules allow this).  Use VAR as a base var_decl for it
531debfc3dSmrg    (if NULL, a new temporary will be created).  The increment will occur at
541debfc3dSmrg    INCR_POS (after it if AFTER is true, before it otherwise).  INCR_POS and
551debfc3dSmrg    AFTER can be computed using standard_iv_increment_position.  The ssa versions
561debfc3dSmrg    of the variable before and after increment will be stored in VAR_BEFORE and
571debfc3dSmrg    VAR_AFTER (unless they are NULL).  */
581debfc3dSmrg 
591debfc3dSmrg void
create_iv(tree base,tree step,tree var,class loop * loop,gimple_stmt_iterator * incr_pos,bool after,tree * var_before,tree * var_after)60*8feb0f0bSmrg create_iv (tree base, tree step, tree var, class loop *loop,
611debfc3dSmrg 	   gimple_stmt_iterator *incr_pos, bool after,
621debfc3dSmrg 	   tree *var_before, tree *var_after)
631debfc3dSmrg {
641debfc3dSmrg   gassign *stmt;
651debfc3dSmrg   gphi *phi;
661debfc3dSmrg   tree initial, step1;
671debfc3dSmrg   gimple_seq stmts;
681debfc3dSmrg   tree vb, va;
691debfc3dSmrg   enum tree_code incr_op = PLUS_EXPR;
701debfc3dSmrg   edge pe = loop_preheader_edge (loop);
711debfc3dSmrg 
721debfc3dSmrg   if (var != NULL_TREE)
731debfc3dSmrg     {
741debfc3dSmrg       vb = make_ssa_name (var);
751debfc3dSmrg       va = make_ssa_name (var);
761debfc3dSmrg     }
771debfc3dSmrg   else
781debfc3dSmrg     {
791debfc3dSmrg       vb = make_temp_ssa_name (TREE_TYPE (base), NULL, "ivtmp");
801debfc3dSmrg       va = make_temp_ssa_name (TREE_TYPE (base), NULL, "ivtmp");
811debfc3dSmrg     }
821debfc3dSmrg   if (var_before)
831debfc3dSmrg     *var_before = vb;
841debfc3dSmrg   if (var_after)
851debfc3dSmrg     *var_after = va;
861debfc3dSmrg 
871debfc3dSmrg   /* For easier readability of the created code, produce MINUS_EXPRs
881debfc3dSmrg      when suitable.  */
891debfc3dSmrg   if (TREE_CODE (step) == INTEGER_CST)
901debfc3dSmrg     {
911debfc3dSmrg       if (TYPE_UNSIGNED (TREE_TYPE (step)))
921debfc3dSmrg 	{
931debfc3dSmrg 	  step1 = fold_build1 (NEGATE_EXPR, TREE_TYPE (step), step);
941debfc3dSmrg 	  if (tree_int_cst_lt (step1, step))
951debfc3dSmrg 	    {
961debfc3dSmrg 	      incr_op = MINUS_EXPR;
971debfc3dSmrg 	      step = step1;
981debfc3dSmrg 	    }
991debfc3dSmrg 	}
1001debfc3dSmrg       else
1011debfc3dSmrg 	{
1021debfc3dSmrg 	  bool ovf;
1031debfc3dSmrg 
1041debfc3dSmrg 	  if (!tree_expr_nonnegative_warnv_p (step, &ovf)
1051debfc3dSmrg 	      && may_negate_without_overflow_p (step))
1061debfc3dSmrg 	    {
1071debfc3dSmrg 	      incr_op = MINUS_EXPR;
1081debfc3dSmrg 	      step = fold_build1 (NEGATE_EXPR, TREE_TYPE (step), step);
1091debfc3dSmrg 	    }
1101debfc3dSmrg 	}
1111debfc3dSmrg     }
1121debfc3dSmrg   if (POINTER_TYPE_P (TREE_TYPE (base)))
1131debfc3dSmrg     {
1141debfc3dSmrg       if (TREE_CODE (base) == ADDR_EXPR)
1151debfc3dSmrg 	mark_addressable (TREE_OPERAND (base, 0));
1161debfc3dSmrg       step = convert_to_ptrofftype (step);
1171debfc3dSmrg       if (incr_op == MINUS_EXPR)
1181debfc3dSmrg 	step = fold_build1 (NEGATE_EXPR, TREE_TYPE (step), step);
1191debfc3dSmrg       incr_op = POINTER_PLUS_EXPR;
1201debfc3dSmrg     }
1211debfc3dSmrg   /* Gimplify the step if necessary.  We put the computations in front of the
1221debfc3dSmrg      loop (i.e. the step should be loop invariant).  */
1231debfc3dSmrg   step = force_gimple_operand (step, &stmts, true, NULL_TREE);
1241debfc3dSmrg   if (stmts)
1251debfc3dSmrg     gsi_insert_seq_on_edge_immediate (pe, stmts);
1261debfc3dSmrg 
1271debfc3dSmrg   stmt = gimple_build_assign (va, incr_op, vb, step);
128*8feb0f0bSmrg   /* Prevent the increment from inheriting a bogus location if it is not put
129*8feb0f0bSmrg      immediately after a statement whose location is known.  */
1301debfc3dSmrg   if (after)
131*8feb0f0bSmrg     {
132*8feb0f0bSmrg       if (gsi_end_p (*incr_pos)
133*8feb0f0bSmrg 	  || (is_gimple_debug (gsi_stmt (*incr_pos))
134*8feb0f0bSmrg 	      && gsi_bb (*incr_pos)
135*8feb0f0bSmrg 	      && gsi_end_p (gsi_last_nondebug_bb (gsi_bb (*incr_pos)))))
136*8feb0f0bSmrg 	{
137*8feb0f0bSmrg 	  edge e = single_succ_edge (gsi_bb (*incr_pos));
138*8feb0f0bSmrg 	  gimple_set_location (stmt, e->goto_locus);
139*8feb0f0bSmrg 	}
1401debfc3dSmrg       gsi_insert_after (incr_pos, stmt, GSI_NEW_STMT);
141*8feb0f0bSmrg     }
1421debfc3dSmrg   else
143*8feb0f0bSmrg     {
144*8feb0f0bSmrg       gimple_stmt_iterator gsi = *incr_pos;
145*8feb0f0bSmrg       if (!gsi_end_p (gsi) && is_gimple_debug (gsi_stmt (gsi)))
146*8feb0f0bSmrg 	gsi_next_nondebug (&gsi);
147*8feb0f0bSmrg       if (!gsi_end_p (gsi))
148*8feb0f0bSmrg 	gimple_set_location (stmt, gimple_location (gsi_stmt (gsi)));
1491debfc3dSmrg       gsi_insert_before (incr_pos, stmt, GSI_NEW_STMT);
150*8feb0f0bSmrg     }
1511debfc3dSmrg 
1521debfc3dSmrg   initial = force_gimple_operand (base, &stmts, true, var);
1531debfc3dSmrg   if (stmts)
1541debfc3dSmrg     gsi_insert_seq_on_edge_immediate (pe, stmts);
1551debfc3dSmrg 
1561debfc3dSmrg   phi = create_phi_node (vb, loop->header);
1571debfc3dSmrg   add_phi_arg (phi, initial, loop_preheader_edge (loop), UNKNOWN_LOCATION);
1581debfc3dSmrg   add_phi_arg (phi, va, loop_latch_edge (loop), UNKNOWN_LOCATION);
1591debfc3dSmrg }
1601debfc3dSmrg 
1611debfc3dSmrg /* Return the innermost superloop LOOP of USE_LOOP that is a superloop of
1621debfc3dSmrg    both DEF_LOOP and USE_LOOP.  */
1631debfc3dSmrg 
164*8feb0f0bSmrg static inline class loop *
find_sibling_superloop(class loop * use_loop,class loop * def_loop)165*8feb0f0bSmrg find_sibling_superloop (class loop *use_loop, class loop *def_loop)
1661debfc3dSmrg {
1671debfc3dSmrg   unsigned ud = loop_depth (use_loop);
1681debfc3dSmrg   unsigned dd = loop_depth (def_loop);
1691debfc3dSmrg   gcc_assert (ud > 0 && dd > 0);
1701debfc3dSmrg   if (ud > dd)
1711debfc3dSmrg     use_loop = superloop_at_depth (use_loop, dd);
1721debfc3dSmrg   if (ud < dd)
1731debfc3dSmrg     def_loop = superloop_at_depth (def_loop, ud);
1741debfc3dSmrg   while (loop_outer (use_loop) != loop_outer (def_loop))
1751debfc3dSmrg     {
1761debfc3dSmrg       use_loop = loop_outer (use_loop);
1771debfc3dSmrg       def_loop = loop_outer (def_loop);
1781debfc3dSmrg       gcc_assert (use_loop && def_loop);
1791debfc3dSmrg     }
1801debfc3dSmrg   return use_loop;
1811debfc3dSmrg }
1821debfc3dSmrg 
1831debfc3dSmrg /* DEF_BB is a basic block containing a DEF that needs rewriting into
1841debfc3dSmrg    loop-closed SSA form.  USE_BLOCKS is the set of basic blocks containing
1851debfc3dSmrg    uses of DEF that "escape" from the loop containing DEF_BB (i.e. blocks in
1861debfc3dSmrg    USE_BLOCKS are dominated by DEF_BB but not in the loop father of DEF_B).
1871debfc3dSmrg    ALL_EXITS[I] is the set of all basic blocks that exit loop I.
1881debfc3dSmrg 
1891debfc3dSmrg    Compute the subset of LOOP_EXITS that exit the loop containing DEF_BB
1901debfc3dSmrg    or one of its loop fathers, in which DEF is live.  This set is returned
1911debfc3dSmrg    in the bitmap LIVE_EXITS.
1921debfc3dSmrg 
1931debfc3dSmrg    Instead of computing the complete livein set of the def, we use the loop
1941debfc3dSmrg    nesting tree as a form of poor man's structure analysis.  This greatly
1951debfc3dSmrg    speeds up the analysis, which is important because this function may be
1961debfc3dSmrg    called on all SSA names that need rewriting, one at a time.  */
1971debfc3dSmrg 
1981debfc3dSmrg static void
compute_live_loop_exits(bitmap live_exits,bitmap use_blocks,bitmap * loop_exits,basic_block def_bb)1991debfc3dSmrg compute_live_loop_exits (bitmap live_exits, bitmap use_blocks,
2001debfc3dSmrg 			 bitmap *loop_exits, basic_block def_bb)
2011debfc3dSmrg {
2021debfc3dSmrg   unsigned i;
2031debfc3dSmrg   bitmap_iterator bi;
204*8feb0f0bSmrg   class loop *def_loop = def_bb->loop_father;
2051debfc3dSmrg   unsigned def_loop_depth = loop_depth (def_loop);
2061debfc3dSmrg   bitmap def_loop_exits;
2071debfc3dSmrg 
2081debfc3dSmrg   /* Normally the work list size is bounded by the number of basic
2091debfc3dSmrg      blocks in the largest loop.  We don't know this number, but we
2101debfc3dSmrg      can be fairly sure that it will be relatively small.  */
2111debfc3dSmrg   auto_vec<basic_block> worklist (MAX (8, n_basic_blocks_for_fn (cfun) / 128));
2121debfc3dSmrg 
2131debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (use_blocks, 0, i, bi)
2141debfc3dSmrg     {
2151debfc3dSmrg       basic_block use_bb = BASIC_BLOCK_FOR_FN (cfun, i);
216*8feb0f0bSmrg       class loop *use_loop = use_bb->loop_father;
2171debfc3dSmrg       gcc_checking_assert (def_loop != use_loop
2181debfc3dSmrg 			   && ! flow_loop_nested_p (def_loop, use_loop));
2191debfc3dSmrg       if (! flow_loop_nested_p (use_loop, def_loop))
2201debfc3dSmrg 	use_bb = find_sibling_superloop (use_loop, def_loop)->header;
2211debfc3dSmrg       if (bitmap_set_bit (live_exits, use_bb->index))
2221debfc3dSmrg 	worklist.safe_push (use_bb);
2231debfc3dSmrg     }
2241debfc3dSmrg 
2251debfc3dSmrg   /* Iterate until the worklist is empty.  */
2261debfc3dSmrg   while (! worklist.is_empty ())
2271debfc3dSmrg     {
2281debfc3dSmrg       edge e;
2291debfc3dSmrg       edge_iterator ei;
2301debfc3dSmrg 
2311debfc3dSmrg       /* Pull a block off the worklist.  */
2321debfc3dSmrg       basic_block bb = worklist.pop ();
2331debfc3dSmrg 
2341debfc3dSmrg       /* Make sure we have at least enough room in the work list
2351debfc3dSmrg 	 for all predecessors of this block.  */
2361debfc3dSmrg       worklist.reserve (EDGE_COUNT (bb->preds));
2371debfc3dSmrg 
2381debfc3dSmrg       /* For each predecessor block.  */
2391debfc3dSmrg       FOR_EACH_EDGE (e, ei, bb->preds)
2401debfc3dSmrg 	{
2411debfc3dSmrg 	  basic_block pred = e->src;
242*8feb0f0bSmrg 	  class loop *pred_loop = pred->loop_father;
2431debfc3dSmrg 	  unsigned pred_loop_depth = loop_depth (pred_loop);
2441debfc3dSmrg 	  bool pred_visited;
2451debfc3dSmrg 
2461debfc3dSmrg 	  /* We should have met DEF_BB along the way.  */
2471debfc3dSmrg 	  gcc_assert (pred != ENTRY_BLOCK_PTR_FOR_FN (cfun));
2481debfc3dSmrg 
2491debfc3dSmrg 	  if (pred_loop_depth >= def_loop_depth)
2501debfc3dSmrg 	    {
2511debfc3dSmrg 	      if (pred_loop_depth > def_loop_depth)
2521debfc3dSmrg 		pred_loop = superloop_at_depth (pred_loop, def_loop_depth);
2531debfc3dSmrg 	      /* If we've reached DEF_LOOP, our train ends here.  */
2541debfc3dSmrg 	      if (pred_loop == def_loop)
2551debfc3dSmrg 		continue;
2561debfc3dSmrg 	    }
2571debfc3dSmrg 	  else if (! flow_loop_nested_p (pred_loop, def_loop))
2581debfc3dSmrg 	    pred = find_sibling_superloop (pred_loop, def_loop)->header;
2591debfc3dSmrg 
2601debfc3dSmrg 	  /* Add PRED to the LIVEIN set.  PRED_VISITED is true if
2611debfc3dSmrg 	     we had already added PRED to LIVEIN before.  */
2621debfc3dSmrg 	  pred_visited = !bitmap_set_bit (live_exits, pred->index);
2631debfc3dSmrg 
2641debfc3dSmrg 	  /* If we have visited PRED before, don't add it to the worklist.
2651debfc3dSmrg 	     If BB dominates PRED, then we're probably looking at a loop.
2661debfc3dSmrg 	     We're only interested in looking up in the dominance tree
2671debfc3dSmrg 	     because DEF_BB dominates all the uses.  */
2681debfc3dSmrg 	  if (pred_visited || dominated_by_p (CDI_DOMINATORS, pred, bb))
2691debfc3dSmrg 	    continue;
2701debfc3dSmrg 
2711debfc3dSmrg 	  worklist.quick_push (pred);
2721debfc3dSmrg 	}
2731debfc3dSmrg     }
2741debfc3dSmrg 
2751debfc3dSmrg   def_loop_exits = BITMAP_ALLOC (&loop_renamer_obstack);
276*8feb0f0bSmrg   for (class loop *loop = def_loop;
2771debfc3dSmrg        loop != current_loops->tree_root;
2781debfc3dSmrg        loop = loop_outer (loop))
2791debfc3dSmrg     bitmap_ior_into (def_loop_exits, loop_exits[loop->num]);
2801debfc3dSmrg   bitmap_and_into (live_exits, def_loop_exits);
2811debfc3dSmrg   BITMAP_FREE (def_loop_exits);
2821debfc3dSmrg }
2831debfc3dSmrg 
2841debfc3dSmrg /* Add a loop-closing PHI for VAR in basic block EXIT.  */
2851debfc3dSmrg 
2861debfc3dSmrg static void
add_exit_phi(basic_block exit,tree var)2871debfc3dSmrg add_exit_phi (basic_block exit, tree var)
2881debfc3dSmrg {
2891debfc3dSmrg   gphi *phi;
2901debfc3dSmrg   edge e;
2911debfc3dSmrg   edge_iterator ei;
2921debfc3dSmrg 
2931debfc3dSmrg   /* Check that at least one of the edges entering the EXIT block exits
2941debfc3dSmrg      the loop, or a superloop of that loop, that VAR is defined in.  */
2951debfc3dSmrg   if (flag_checking)
2961debfc3dSmrg     {
2971debfc3dSmrg       gimple *def_stmt = SSA_NAME_DEF_STMT (var);
2981debfc3dSmrg       basic_block def_bb = gimple_bb (def_stmt);
2991debfc3dSmrg       FOR_EACH_EDGE (e, ei, exit->preds)
3001debfc3dSmrg 	{
301*8feb0f0bSmrg 	  class loop *aloop = find_common_loop (def_bb->loop_father,
3021debfc3dSmrg 						 e->src->loop_father);
3031debfc3dSmrg 	  if (!flow_bb_inside_loop_p (aloop, e->dest))
3041debfc3dSmrg 	    break;
3051debfc3dSmrg 	}
3061debfc3dSmrg       gcc_assert (e);
3071debfc3dSmrg     }
3081debfc3dSmrg 
3091debfc3dSmrg   phi = create_phi_node (NULL_TREE, exit);
3101debfc3dSmrg   create_new_def_for (var, phi, gimple_phi_result_ptr (phi));
3111debfc3dSmrg   FOR_EACH_EDGE (e, ei, exit->preds)
3121debfc3dSmrg     add_phi_arg (phi, var, e, UNKNOWN_LOCATION);
3131debfc3dSmrg 
3141debfc3dSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
3151debfc3dSmrg     {
3161debfc3dSmrg       fprintf (dump_file, ";; Created LCSSA PHI: ");
3171debfc3dSmrg       print_gimple_stmt (dump_file, phi, 0, dump_flags);
3181debfc3dSmrg     }
3191debfc3dSmrg }
3201debfc3dSmrg 
3211debfc3dSmrg /* Add exit phis for VAR that is used in LIVEIN.
3221debfc3dSmrg    Exits of the loops are stored in LOOP_EXITS.  */
3231debfc3dSmrg 
3241debfc3dSmrg static void
add_exit_phis_var(tree var,bitmap use_blocks,bitmap * loop_exits)3251debfc3dSmrg add_exit_phis_var (tree var, bitmap use_blocks, bitmap *loop_exits)
3261debfc3dSmrg {
3271debfc3dSmrg   unsigned index;
3281debfc3dSmrg   bitmap_iterator bi;
3291debfc3dSmrg   basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
3301debfc3dSmrg   bitmap live_exits = BITMAP_ALLOC (&loop_renamer_obstack);
3311debfc3dSmrg 
3321debfc3dSmrg   gcc_checking_assert (! bitmap_bit_p (use_blocks, def_bb->index));
3331debfc3dSmrg 
3341debfc3dSmrg   compute_live_loop_exits (live_exits, use_blocks, loop_exits, def_bb);
3351debfc3dSmrg 
3361debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (live_exits, 0, index, bi)
3371debfc3dSmrg     {
3381debfc3dSmrg       add_exit_phi (BASIC_BLOCK_FOR_FN (cfun, index), var);
3391debfc3dSmrg     }
3401debfc3dSmrg 
3411debfc3dSmrg   BITMAP_FREE (live_exits);
3421debfc3dSmrg }
3431debfc3dSmrg 
3441debfc3dSmrg /* Add exit phis for the names marked in NAMES_TO_RENAME.
3451debfc3dSmrg    Exits of the loops are stored in EXITS.  Sets of blocks where the ssa
3461debfc3dSmrg    names are used are stored in USE_BLOCKS.  */
3471debfc3dSmrg 
3481debfc3dSmrg static void
add_exit_phis(bitmap names_to_rename,bitmap * use_blocks,bitmap * loop_exits)3491debfc3dSmrg add_exit_phis (bitmap names_to_rename, bitmap *use_blocks, bitmap *loop_exits)
3501debfc3dSmrg {
3511debfc3dSmrg   unsigned i;
3521debfc3dSmrg   bitmap_iterator bi;
3531debfc3dSmrg 
3541debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (names_to_rename, 0, i, bi)
3551debfc3dSmrg     {
3561debfc3dSmrg       add_exit_phis_var (ssa_name (i), use_blocks[i], loop_exits);
3571debfc3dSmrg     }
3581debfc3dSmrg }
3591debfc3dSmrg 
3601debfc3dSmrg /* Fill the array of bitmaps LOOP_EXITS with all loop exit edge targets.  */
3611debfc3dSmrg 
3621debfc3dSmrg static void
get_loops_exits(bitmap * loop_exits)3631debfc3dSmrg get_loops_exits (bitmap *loop_exits)
3641debfc3dSmrg {
365*8feb0f0bSmrg   class loop *loop;
3661debfc3dSmrg   unsigned j;
3671debfc3dSmrg   edge e;
3681debfc3dSmrg 
3691debfc3dSmrg   FOR_EACH_LOOP (loop, 0)
3701debfc3dSmrg     {
3711debfc3dSmrg       vec<edge> exit_edges = get_loop_exit_edges (loop);
3721debfc3dSmrg       loop_exits[loop->num] = BITMAP_ALLOC (&loop_renamer_obstack);
3731debfc3dSmrg       FOR_EACH_VEC_ELT (exit_edges, j, e)
3741debfc3dSmrg         bitmap_set_bit (loop_exits[loop->num], e->dest->index);
3751debfc3dSmrg       exit_edges.release ();
3761debfc3dSmrg     }
3771debfc3dSmrg }
3781debfc3dSmrg 
3791debfc3dSmrg /* For USE in BB, if it is used outside of the loop it is defined in,
3801debfc3dSmrg    mark it for rewrite.  Record basic block BB where it is used
3811debfc3dSmrg    to USE_BLOCKS.  Record the ssa name index to NEED_PHIS bitmap.
3821debfc3dSmrg    Note that for USEs in phis, BB should be the src of the edge corresponding to
3831debfc3dSmrg    the use, rather than the bb containing the phi.  */
3841debfc3dSmrg 
3851debfc3dSmrg static void
find_uses_to_rename_use(basic_block bb,tree use,bitmap * use_blocks,bitmap need_phis)3861debfc3dSmrg find_uses_to_rename_use (basic_block bb, tree use, bitmap *use_blocks,
3871debfc3dSmrg 			 bitmap need_phis)
3881debfc3dSmrg {
3891debfc3dSmrg   unsigned ver;
3901debfc3dSmrg   basic_block def_bb;
391*8feb0f0bSmrg   class loop *def_loop;
3921debfc3dSmrg 
3931debfc3dSmrg   if (TREE_CODE (use) != SSA_NAME)
3941debfc3dSmrg     return;
3951debfc3dSmrg 
3961debfc3dSmrg   ver = SSA_NAME_VERSION (use);
3971debfc3dSmrg   def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
3981debfc3dSmrg   if (!def_bb)
3991debfc3dSmrg     return;
4001debfc3dSmrg   def_loop = def_bb->loop_father;
4011debfc3dSmrg 
4021debfc3dSmrg   /* If the definition is not inside a loop, it is not interesting.  */
4031debfc3dSmrg   if (!loop_outer (def_loop))
4041debfc3dSmrg     return;
4051debfc3dSmrg 
4061debfc3dSmrg   /* If the use is not outside of the loop it is defined in, it is not
4071debfc3dSmrg      interesting.  */
4081debfc3dSmrg   if (flow_bb_inside_loop_p (def_loop, bb))
4091debfc3dSmrg     return;
4101debfc3dSmrg 
4111debfc3dSmrg   /* If we're seeing VER for the first time, we still have to allocate
4121debfc3dSmrg      a bitmap for its uses.  */
4131debfc3dSmrg   if (bitmap_set_bit (need_phis, ver))
4141debfc3dSmrg     use_blocks[ver] = BITMAP_ALLOC (&loop_renamer_obstack);
4151debfc3dSmrg   bitmap_set_bit (use_blocks[ver], bb->index);
4161debfc3dSmrg }
4171debfc3dSmrg 
4181debfc3dSmrg /* For uses matching USE_FLAGS in STMT, mark names that are used outside of the
4191debfc3dSmrg    loop they are defined to rewrite.  Record the set of blocks in which the ssa
4201debfc3dSmrg    names are used to USE_BLOCKS, and the ssa names themselves to NEED_PHIS.  */
4211debfc3dSmrg 
4221debfc3dSmrg static void
find_uses_to_rename_stmt(gimple * stmt,bitmap * use_blocks,bitmap need_phis,int use_flags)4231debfc3dSmrg find_uses_to_rename_stmt (gimple *stmt, bitmap *use_blocks, bitmap need_phis,
4241debfc3dSmrg 			  int use_flags)
4251debfc3dSmrg {
4261debfc3dSmrg   ssa_op_iter iter;
4271debfc3dSmrg   tree var;
4281debfc3dSmrg   basic_block bb = gimple_bb (stmt);
4291debfc3dSmrg 
4301debfc3dSmrg   if (is_gimple_debug (stmt))
4311debfc3dSmrg     return;
4321debfc3dSmrg 
4331debfc3dSmrg   /* FOR_EACH_SSA_TREE_OPERAND iterator does not allows SSA_OP_VIRTUAL_USES
4341debfc3dSmrg      only.  */
4351debfc3dSmrg   if (use_flags == SSA_OP_VIRTUAL_USES)
4361debfc3dSmrg     {
4371debfc3dSmrg       tree vuse = gimple_vuse (stmt);
4381debfc3dSmrg       if (vuse != NULL_TREE)
4391debfc3dSmrg 	find_uses_to_rename_use (bb, gimple_vuse (stmt), use_blocks, need_phis);
4401debfc3dSmrg     }
4411debfc3dSmrg   else
4421debfc3dSmrg     FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, use_flags)
4431debfc3dSmrg       find_uses_to_rename_use (bb, var, use_blocks, need_phis);
4441debfc3dSmrg }
4451debfc3dSmrg 
4461debfc3dSmrg /* Marks names matching USE_FLAGS that are used in BB and outside of the loop
4471debfc3dSmrg    they are defined in for rewrite.  Records the set of blocks in which the ssa
4481debfc3dSmrg    names are used to USE_BLOCKS.  Record the SSA names that will
4491debfc3dSmrg    need exit PHIs in NEED_PHIS.  */
4501debfc3dSmrg 
4511debfc3dSmrg static void
find_uses_to_rename_bb(basic_block bb,bitmap * use_blocks,bitmap need_phis,int use_flags)4521debfc3dSmrg find_uses_to_rename_bb (basic_block bb, bitmap *use_blocks, bitmap need_phis,
4531debfc3dSmrg 			int use_flags)
4541debfc3dSmrg {
4551debfc3dSmrg   edge e;
4561debfc3dSmrg   edge_iterator ei;
4571debfc3dSmrg   bool do_virtuals = (use_flags & SSA_OP_VIRTUAL_USES) != 0;
4581debfc3dSmrg   bool do_nonvirtuals = (use_flags & SSA_OP_USE) != 0;
4591debfc3dSmrg 
4601debfc3dSmrg   FOR_EACH_EDGE (e, ei, bb->succs)
4611debfc3dSmrg     for (gphi_iterator bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi);
4621debfc3dSmrg 	 gsi_next (&bsi))
4631debfc3dSmrg       {
4641debfc3dSmrg         gphi *phi = bsi.phi ();
4651debfc3dSmrg 	bool virtual_p = virtual_operand_p (gimple_phi_result (phi));
4661debfc3dSmrg 	if ((virtual_p && do_virtuals)
4671debfc3dSmrg 	    || (!virtual_p && do_nonvirtuals))
4681debfc3dSmrg 	  find_uses_to_rename_use (bb, PHI_ARG_DEF_FROM_EDGE (phi, e),
4691debfc3dSmrg 				   use_blocks, need_phis);
4701debfc3dSmrg       }
4711debfc3dSmrg 
4721debfc3dSmrg   for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi);
4731debfc3dSmrg        gsi_next (&bsi))
4741debfc3dSmrg     find_uses_to_rename_stmt (gsi_stmt (bsi), use_blocks, need_phis,
4751debfc3dSmrg 			      use_flags);
4761debfc3dSmrg }
4771debfc3dSmrg 
4781debfc3dSmrg /* Marks names matching USE_FLAGS that are used outside of the loop they are
4791debfc3dSmrg    defined in for rewrite.  Records the set of blocks in which the ssa names are
4801debfc3dSmrg    used to USE_BLOCKS.  Record the SSA names that will need exit PHIs in
4811debfc3dSmrg    NEED_PHIS.  If CHANGED_BBS is not NULL, scan only blocks in this set.  */
4821debfc3dSmrg 
4831debfc3dSmrg static void
find_uses_to_rename(bitmap changed_bbs,bitmap * use_blocks,bitmap need_phis,int use_flags)4841debfc3dSmrg find_uses_to_rename (bitmap changed_bbs, bitmap *use_blocks, bitmap need_phis,
4851debfc3dSmrg 		     int use_flags)
4861debfc3dSmrg {
4871debfc3dSmrg   basic_block bb;
4881debfc3dSmrg   unsigned index;
4891debfc3dSmrg   bitmap_iterator bi;
4901debfc3dSmrg 
4911debfc3dSmrg   if (changed_bbs)
4921debfc3dSmrg     EXECUTE_IF_SET_IN_BITMAP (changed_bbs, 0, index, bi)
4931debfc3dSmrg       {
4941debfc3dSmrg 	bb = BASIC_BLOCK_FOR_FN (cfun, index);
4951debfc3dSmrg 	if (bb)
4961debfc3dSmrg 	  find_uses_to_rename_bb (bb, use_blocks, need_phis, use_flags);
4971debfc3dSmrg       }
4981debfc3dSmrg   else
4991debfc3dSmrg     FOR_EACH_BB_FN (bb, cfun)
5001debfc3dSmrg       find_uses_to_rename_bb (bb, use_blocks, need_phis, use_flags);
5011debfc3dSmrg }
5021debfc3dSmrg 
5031debfc3dSmrg /* Mark uses of DEF that are used outside of the loop they are defined in for
5041debfc3dSmrg    rewrite.  Record the set of blocks in which the ssa names are used to
5051debfc3dSmrg    USE_BLOCKS.  Record the SSA names that will need exit PHIs in NEED_PHIS.  */
5061debfc3dSmrg 
5071debfc3dSmrg static void
find_uses_to_rename_def(tree def,bitmap * use_blocks,bitmap need_phis)5081debfc3dSmrg find_uses_to_rename_def (tree def, bitmap *use_blocks, bitmap need_phis)
5091debfc3dSmrg {
5101debfc3dSmrg   gimple *use_stmt;
5111debfc3dSmrg   imm_use_iterator imm_iter;
5121debfc3dSmrg 
5131debfc3dSmrg   FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, def)
5141debfc3dSmrg     {
5151debfc3dSmrg       if (is_gimple_debug (use_stmt))
5161debfc3dSmrg 	continue;
5171debfc3dSmrg 
5181debfc3dSmrg       basic_block use_bb = gimple_bb (use_stmt);
5191debfc3dSmrg 
5201debfc3dSmrg       use_operand_p use_p;
5211debfc3dSmrg       FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
5221debfc3dSmrg 	{
5231debfc3dSmrg 	  if (gimple_code (use_stmt) == GIMPLE_PHI)
5241debfc3dSmrg 	    {
5251debfc3dSmrg 	      edge e = gimple_phi_arg_edge (as_a <gphi *> (use_stmt),
5261debfc3dSmrg 					    PHI_ARG_INDEX_FROM_USE (use_p));
5271debfc3dSmrg 	      use_bb = e->src;
5281debfc3dSmrg 	    }
5291debfc3dSmrg 	  find_uses_to_rename_use (use_bb, USE_FROM_PTR (use_p), use_blocks,
5301debfc3dSmrg 				   need_phis);
5311debfc3dSmrg 	}
5321debfc3dSmrg     }
5331debfc3dSmrg }
5341debfc3dSmrg 
5351debfc3dSmrg /* Marks names matching USE_FLAGS that are defined in LOOP and used outside of
5361debfc3dSmrg    it for rewrite.  Records the set of blocks in which the ssa names are used to
5371debfc3dSmrg    USE_BLOCKS.  Record the SSA names that will need exit PHIs in NEED_PHIS.  */
5381debfc3dSmrg 
5391debfc3dSmrg static void
find_uses_to_rename_in_loop(class loop * loop,bitmap * use_blocks,bitmap need_phis,int use_flags)540*8feb0f0bSmrg find_uses_to_rename_in_loop (class loop *loop, bitmap *use_blocks,
5411debfc3dSmrg 			     bitmap need_phis, int use_flags)
5421debfc3dSmrg {
5431debfc3dSmrg   bool do_virtuals = (use_flags & SSA_OP_VIRTUAL_USES) != 0;
5441debfc3dSmrg   bool do_nonvirtuals = (use_flags & SSA_OP_USE) != 0;
5451debfc3dSmrg   int def_flags = ((do_virtuals ? SSA_OP_VIRTUAL_DEFS : 0)
5461debfc3dSmrg 		   | (do_nonvirtuals ? SSA_OP_DEF : 0));
5471debfc3dSmrg 
5481debfc3dSmrg 
5491debfc3dSmrg   basic_block *bbs = get_loop_body (loop);
5501debfc3dSmrg 
5511debfc3dSmrg   for (unsigned int i = 0; i < loop->num_nodes; i++)
5521debfc3dSmrg     {
5531debfc3dSmrg       basic_block bb = bbs[i];
5541debfc3dSmrg 
5551debfc3dSmrg       for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
5561debfc3dSmrg 	   gsi_next (&bsi))
5571debfc3dSmrg 	{
5581debfc3dSmrg 	  gphi *phi = bsi.phi ();
5591debfc3dSmrg 	  tree res = gimple_phi_result (phi);
5601debfc3dSmrg 	  bool virtual_p = virtual_operand_p (res);
5611debfc3dSmrg 	  if ((virtual_p && do_virtuals)
5621debfc3dSmrg 	      || (!virtual_p && do_nonvirtuals))
5631debfc3dSmrg 	    find_uses_to_rename_def (res, use_blocks, need_phis);
5641debfc3dSmrg       }
5651debfc3dSmrg 
5661debfc3dSmrg       for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi);
5671debfc3dSmrg 	   gsi_next (&bsi))
5681debfc3dSmrg 	{
5691debfc3dSmrg 	  gimple *stmt = gsi_stmt (bsi);
5701debfc3dSmrg 	  /* FOR_EACH_SSA_TREE_OPERAND iterator does not allows
5711debfc3dSmrg 	     SSA_OP_VIRTUAL_DEFS only.  */
5721debfc3dSmrg 	  if (def_flags == SSA_OP_VIRTUAL_DEFS)
5731debfc3dSmrg 	    {
5741debfc3dSmrg 	      tree vdef = gimple_vdef (stmt);
5751debfc3dSmrg 	      if (vdef != NULL)
5761debfc3dSmrg 		find_uses_to_rename_def (vdef, use_blocks, need_phis);
5771debfc3dSmrg 	    }
5781debfc3dSmrg 	  else
5791debfc3dSmrg 	    {
5801debfc3dSmrg 	      tree var;
5811debfc3dSmrg 	      ssa_op_iter iter;
5821debfc3dSmrg 	      FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, def_flags)
5831debfc3dSmrg 		find_uses_to_rename_def (var, use_blocks, need_phis);
5841debfc3dSmrg 	    }
5851debfc3dSmrg 	}
5861debfc3dSmrg     }
5871debfc3dSmrg 
5881debfc3dSmrg   XDELETEVEC (bbs);
5891debfc3dSmrg }
5901debfc3dSmrg 
5911debfc3dSmrg /* Rewrites the program into a loop closed ssa form -- i.e. inserts extra
5921debfc3dSmrg    phi nodes to ensure that no variable is used outside the loop it is
5931debfc3dSmrg    defined in.
5941debfc3dSmrg 
5951debfc3dSmrg    This strengthening of the basic ssa form has several advantages:
5961debfc3dSmrg 
5971debfc3dSmrg    1) Updating it during unrolling/peeling/versioning is trivial, since
5981debfc3dSmrg       we do not need to care about the uses outside of the loop.
5991debfc3dSmrg       The same applies to virtual operands which are also rewritten into
6001debfc3dSmrg       loop closed SSA form.  Note that virtual operands are always live
6011debfc3dSmrg       until function exit.
6021debfc3dSmrg    2) The behavior of all uses of an induction variable is the same.
6031debfc3dSmrg       Without this, you need to distinguish the case when the variable
6041debfc3dSmrg       is used outside of the loop it is defined in, for example
6051debfc3dSmrg 
6061debfc3dSmrg       for (i = 0; i < 100; i++)
6071debfc3dSmrg 	{
6081debfc3dSmrg 	  for (j = 0; j < 100; j++)
6091debfc3dSmrg 	    {
6101debfc3dSmrg 	      k = i + j;
6111debfc3dSmrg 	      use1 (k);
6121debfc3dSmrg 	    }
6131debfc3dSmrg 	  use2 (k);
6141debfc3dSmrg 	}
6151debfc3dSmrg 
6161debfc3dSmrg       Looking from the outer loop with the normal SSA form, the first use of k
6171debfc3dSmrg       is not well-behaved, while the second one is an induction variable with
6181debfc3dSmrg       base 99 and step 1.
6191debfc3dSmrg 
6201debfc3dSmrg       If LOOP is non-null, only rewrite uses that have defs in LOOP.  Otherwise,
6211debfc3dSmrg       if CHANGED_BBS is not NULL, we look for uses outside loops only in the
6221debfc3dSmrg       basic blocks in this set.
6231debfc3dSmrg 
6241debfc3dSmrg       USE_FLAGS allows us to specify whether we want virtual, non-virtual or
6251debfc3dSmrg       both variables rewritten.
6261debfc3dSmrg 
6271debfc3dSmrg       UPDATE_FLAG is used in the call to update_ssa.  See
6281debfc3dSmrg       TODO_update_ssa* for documentation.  */
6291debfc3dSmrg 
6301debfc3dSmrg void
rewrite_into_loop_closed_ssa_1(bitmap changed_bbs,unsigned update_flag,int use_flags,class loop * loop)6311debfc3dSmrg rewrite_into_loop_closed_ssa_1 (bitmap changed_bbs, unsigned update_flag,
632*8feb0f0bSmrg 				int use_flags, class loop *loop)
6331debfc3dSmrg {
6341debfc3dSmrg   bitmap *use_blocks;
6351debfc3dSmrg   bitmap names_to_rename;
6361debfc3dSmrg 
6371debfc3dSmrg   loops_state_set (LOOP_CLOSED_SSA);
6381debfc3dSmrg   if (number_of_loops (cfun) <= 1)
6391debfc3dSmrg     return;
6401debfc3dSmrg 
6411debfc3dSmrg   /* If the pass has caused the SSA form to be out-of-date, update it
6421debfc3dSmrg      now.  */
6431debfc3dSmrg   if (update_flag != 0)
6441debfc3dSmrg     update_ssa (update_flag);
6451debfc3dSmrg   else if (flag_checking)
6461debfc3dSmrg     verify_ssa (true, true);
6471debfc3dSmrg 
6481debfc3dSmrg   bitmap_obstack_initialize (&loop_renamer_obstack);
6491debfc3dSmrg 
6501debfc3dSmrg   names_to_rename = BITMAP_ALLOC (&loop_renamer_obstack);
6511debfc3dSmrg 
6521debfc3dSmrg   /* Uses of names to rename.  We don't have to initialize this array,
6531debfc3dSmrg      because we know that we will only have entries for the SSA names
6541debfc3dSmrg      in NAMES_TO_RENAME.  */
6551debfc3dSmrg   use_blocks = XNEWVEC (bitmap, num_ssa_names);
6561debfc3dSmrg 
6571debfc3dSmrg   if (loop != NULL)
6581debfc3dSmrg     {
6591debfc3dSmrg       gcc_assert (changed_bbs == NULL);
6601debfc3dSmrg       find_uses_to_rename_in_loop (loop, use_blocks, names_to_rename,
6611debfc3dSmrg 				   use_flags);
6621debfc3dSmrg     }
6631debfc3dSmrg   else
6641debfc3dSmrg     {
6651debfc3dSmrg       gcc_assert (loop == NULL);
6661debfc3dSmrg       find_uses_to_rename (changed_bbs, use_blocks, names_to_rename, use_flags);
6671debfc3dSmrg     }
6681debfc3dSmrg 
6691debfc3dSmrg   if (!bitmap_empty_p (names_to_rename))
6701debfc3dSmrg     {
6711debfc3dSmrg       /* An array of bitmaps where LOOP_EXITS[I] is the set of basic blocks
6721debfc3dSmrg 	 that are the destination of an edge exiting loop number I.  */
6731debfc3dSmrg       bitmap *loop_exits = XNEWVEC (bitmap, number_of_loops (cfun));
6741debfc3dSmrg       get_loops_exits (loop_exits);
6751debfc3dSmrg 
6761debfc3dSmrg       /* Add the PHI nodes on exits of the loops for the names we need to
6771debfc3dSmrg 	 rewrite.  */
6781debfc3dSmrg       add_exit_phis (names_to_rename, use_blocks, loop_exits);
6791debfc3dSmrg 
6801debfc3dSmrg       free (loop_exits);
6811debfc3dSmrg 
6821debfc3dSmrg       /* Fix up all the names found to be used outside their original
6831debfc3dSmrg 	 loops.  */
6841debfc3dSmrg       update_ssa (TODO_update_ssa);
6851debfc3dSmrg     }
6861debfc3dSmrg 
6871debfc3dSmrg   bitmap_obstack_release (&loop_renamer_obstack);
6881debfc3dSmrg   free (use_blocks);
6891debfc3dSmrg }
6901debfc3dSmrg 
6911debfc3dSmrg /* Rewrites the non-virtual defs and uses into a loop closed ssa form.  If
6921debfc3dSmrg    CHANGED_BBS is not NULL, we look for uses outside loops only in the basic
6931debfc3dSmrg    blocks in this set.  UPDATE_FLAG is used in the call to update_ssa.  See
6941debfc3dSmrg    TODO_update_ssa* for documentation.  */
6951debfc3dSmrg 
6961debfc3dSmrg void
rewrite_into_loop_closed_ssa(bitmap changed_bbs,unsigned update_flag)6971debfc3dSmrg rewrite_into_loop_closed_ssa (bitmap changed_bbs, unsigned update_flag)
6981debfc3dSmrg {
6991debfc3dSmrg   rewrite_into_loop_closed_ssa_1 (changed_bbs, update_flag, SSA_OP_USE, NULL);
7001debfc3dSmrg }
7011debfc3dSmrg 
7021debfc3dSmrg /* Rewrites virtual defs and uses with def in LOOP into loop closed ssa
7031debfc3dSmrg    form.  */
7041debfc3dSmrg 
7051debfc3dSmrg void
rewrite_virtuals_into_loop_closed_ssa(class loop * loop)706*8feb0f0bSmrg rewrite_virtuals_into_loop_closed_ssa (class loop *loop)
7071debfc3dSmrg {
7081debfc3dSmrg   rewrite_into_loop_closed_ssa_1 (NULL, 0, SSA_OP_VIRTUAL_USES, loop);
7091debfc3dSmrg }
7101debfc3dSmrg 
711a2dc1f3fSmrg /* Check invariants of the loop closed ssa form for the def in DEF_BB.  */
7121debfc3dSmrg 
7131debfc3dSmrg static void
check_loop_closed_ssa_def(basic_block def_bb,tree def)714a2dc1f3fSmrg check_loop_closed_ssa_def (basic_block def_bb, tree def)
7151debfc3dSmrg {
716a2dc1f3fSmrg   use_operand_p use_p;
717a2dc1f3fSmrg   imm_use_iterator iterator;
718a2dc1f3fSmrg   FOR_EACH_IMM_USE_FAST (use_p, iterator, def)
719a2dc1f3fSmrg     {
720a2dc1f3fSmrg       if (is_gimple_debug (USE_STMT (use_p)))
721a2dc1f3fSmrg 	continue;
7221debfc3dSmrg 
723a2dc1f3fSmrg       basic_block use_bb = gimple_bb (USE_STMT (use_p));
724a2dc1f3fSmrg       if (is_a <gphi *> (USE_STMT (use_p)))
725a2dc1f3fSmrg 	use_bb = EDGE_PRED (use_bb, PHI_ARG_INDEX_FROM_USE (use_p))->src;
7261debfc3dSmrg 
727a2dc1f3fSmrg       gcc_assert (flow_bb_inside_loop_p (def_bb->loop_father, use_bb));
728a2dc1f3fSmrg     }
7291debfc3dSmrg }
7301debfc3dSmrg 
731a2dc1f3fSmrg /* Checks invariants of loop closed ssa form in BB.  */
7321debfc3dSmrg 
7331debfc3dSmrg static void
check_loop_closed_ssa_bb(basic_block bb)734a2dc1f3fSmrg check_loop_closed_ssa_bb (basic_block bb)
735a2dc1f3fSmrg {
736a2dc1f3fSmrg   for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
737a2dc1f3fSmrg        gsi_next (&bsi))
738a2dc1f3fSmrg     {
739a2dc1f3fSmrg       gphi *phi = bsi.phi ();
740a2dc1f3fSmrg 
741a2dc1f3fSmrg       if (!virtual_operand_p (PHI_RESULT (phi)))
742a2dc1f3fSmrg 	check_loop_closed_ssa_def (bb, PHI_RESULT (phi));
743a2dc1f3fSmrg     }
744a2dc1f3fSmrg 
745a2dc1f3fSmrg   for (gimple_stmt_iterator bsi = gsi_start_nondebug_bb (bb); !gsi_end_p (bsi);
746a2dc1f3fSmrg        gsi_next_nondebug (&bsi))
7471debfc3dSmrg     {
7481debfc3dSmrg       ssa_op_iter iter;
7491debfc3dSmrg       tree var;
750a2dc1f3fSmrg       gimple *stmt = gsi_stmt (bsi);
7511debfc3dSmrg 
752a2dc1f3fSmrg       FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_DEF)
753a2dc1f3fSmrg 	check_loop_closed_ssa_def (bb, var);
754a2dc1f3fSmrg     }
7551debfc3dSmrg }
7561debfc3dSmrg 
7571debfc3dSmrg /* Checks that invariants of the loop closed ssa form are preserved.
758a2dc1f3fSmrg    Call verify_ssa when VERIFY_SSA_P is true.  Note all loops are checked
759a2dc1f3fSmrg    if LOOP is NULL, otherwise, only LOOP is checked.  */
7601debfc3dSmrg 
7611debfc3dSmrg DEBUG_FUNCTION void
verify_loop_closed_ssa(bool verify_ssa_p,class loop * loop)762*8feb0f0bSmrg verify_loop_closed_ssa (bool verify_ssa_p, class loop *loop)
7631debfc3dSmrg {
7641debfc3dSmrg   if (number_of_loops (cfun) <= 1)
7651debfc3dSmrg     return;
7661debfc3dSmrg 
7671debfc3dSmrg   if (verify_ssa_p)
7681debfc3dSmrg     verify_ssa (false, true);
7691debfc3dSmrg 
7701debfc3dSmrg   timevar_push (TV_VERIFY_LOOP_CLOSED);
7711debfc3dSmrg 
772a2dc1f3fSmrg   if (loop == NULL)
7731debfc3dSmrg     {
774a2dc1f3fSmrg       basic_block bb;
7751debfc3dSmrg 
776a2dc1f3fSmrg       FOR_EACH_BB_FN (bb, cfun)
777a2dc1f3fSmrg 	if (bb->loop_father && bb->loop_father->num > 0)
778a2dc1f3fSmrg 	  check_loop_closed_ssa_bb (bb);
779a2dc1f3fSmrg     }
780a2dc1f3fSmrg   else
781a2dc1f3fSmrg     {
782a2dc1f3fSmrg       basic_block *bbs = get_loop_body (loop);
783a2dc1f3fSmrg 
784a2dc1f3fSmrg       for (unsigned i = 0; i < loop->num_nodes; ++i)
785a2dc1f3fSmrg 	check_loop_closed_ssa_bb (bbs[i]);
786a2dc1f3fSmrg 
787a2dc1f3fSmrg       free (bbs);
7881debfc3dSmrg     }
7891debfc3dSmrg 
7901debfc3dSmrg   timevar_pop (TV_VERIFY_LOOP_CLOSED);
7911debfc3dSmrg }
7921debfc3dSmrg 
7931debfc3dSmrg /* Split loop exit edge EXIT.  The things are a bit complicated by a need to
794c0a68be4Smrg    preserve the loop closed ssa form.  If COPY_CONSTANTS_P is true then
795c0a68be4Smrg    forwarder PHIs are also created for constant arguments.
796c0a68be4Smrg    The newly created block is returned.  */
7971debfc3dSmrg 
7981debfc3dSmrg basic_block
split_loop_exit_edge(edge exit,bool copy_constants_p)799c0a68be4Smrg split_loop_exit_edge (edge exit, bool copy_constants_p)
8001debfc3dSmrg {
8011debfc3dSmrg   basic_block dest = exit->dest;
8021debfc3dSmrg   basic_block bb = split_edge (exit);
8031debfc3dSmrg   gphi *phi, *new_phi;
8041debfc3dSmrg   tree new_name, name;
8051debfc3dSmrg   use_operand_p op_p;
8061debfc3dSmrg   gphi_iterator psi;
807c0a68be4Smrg   location_t locus;
8081debfc3dSmrg 
8091debfc3dSmrg   for (psi = gsi_start_phis (dest); !gsi_end_p (psi); gsi_next (&psi))
8101debfc3dSmrg     {
8111debfc3dSmrg       phi = psi.phi ();
8121debfc3dSmrg       op_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, single_succ_edge (bb));
8131debfc3dSmrg       locus = gimple_phi_arg_location_from_edge (phi, single_succ_edge (bb));
8141debfc3dSmrg 
8151debfc3dSmrg       name = USE_FROM_PTR (op_p);
8161debfc3dSmrg 
8171debfc3dSmrg       /* If the argument of the PHI node is a constant, we do not need
8181debfc3dSmrg 	 to keep it inside loop.  */
819c0a68be4Smrg       if (TREE_CODE (name) != SSA_NAME
820c0a68be4Smrg 	  && !copy_constants_p)
8211debfc3dSmrg 	continue;
8221debfc3dSmrg 
8231debfc3dSmrg       /* Otherwise create an auxiliary phi node that will copy the value
8241debfc3dSmrg 	 of the SSA name out of the loop.  */
825c0a68be4Smrg       new_name = duplicate_ssa_name (PHI_RESULT (phi), NULL);
8261debfc3dSmrg       new_phi = create_phi_node (new_name, bb);
8271debfc3dSmrg       add_phi_arg (new_phi, name, exit, locus);
8281debfc3dSmrg       SET_USE (op_p, new_name);
8291debfc3dSmrg     }
8301debfc3dSmrg 
8311debfc3dSmrg   return bb;
8321debfc3dSmrg }
8331debfc3dSmrg 
8341debfc3dSmrg /* Returns the basic block in that statements should be emitted for induction
8351debfc3dSmrg    variables incremented at the end of the LOOP.  */
8361debfc3dSmrg 
8371debfc3dSmrg basic_block
ip_end_pos(class loop * loop)838*8feb0f0bSmrg ip_end_pos (class loop *loop)
8391debfc3dSmrg {
8401debfc3dSmrg   return loop->latch;
8411debfc3dSmrg }
8421debfc3dSmrg 
8431debfc3dSmrg /* Returns the basic block in that statements should be emitted for induction
8441debfc3dSmrg    variables incremented just before exit condition of a LOOP.  */
8451debfc3dSmrg 
8461debfc3dSmrg basic_block
ip_normal_pos(class loop * loop)847*8feb0f0bSmrg ip_normal_pos (class loop *loop)
8481debfc3dSmrg {
8491debfc3dSmrg   gimple *last;
8501debfc3dSmrg   basic_block bb;
8511debfc3dSmrg   edge exit;
8521debfc3dSmrg 
8531debfc3dSmrg   if (!single_pred_p (loop->latch))
8541debfc3dSmrg     return NULL;
8551debfc3dSmrg 
8561debfc3dSmrg   bb = single_pred (loop->latch);
8571debfc3dSmrg   last = last_stmt (bb);
8581debfc3dSmrg   if (!last
8591debfc3dSmrg       || gimple_code (last) != GIMPLE_COND)
8601debfc3dSmrg     return NULL;
8611debfc3dSmrg 
8621debfc3dSmrg   exit = EDGE_SUCC (bb, 0);
8631debfc3dSmrg   if (exit->dest == loop->latch)
8641debfc3dSmrg     exit = EDGE_SUCC (bb, 1);
8651debfc3dSmrg 
8661debfc3dSmrg   if (flow_bb_inside_loop_p (loop, exit->dest))
8671debfc3dSmrg     return NULL;
8681debfc3dSmrg 
8691debfc3dSmrg   return bb;
8701debfc3dSmrg }
8711debfc3dSmrg 
8721debfc3dSmrg /* Stores the standard position for induction variable increment in LOOP
8731debfc3dSmrg    (just before the exit condition if it is available and latch block is empty,
8741debfc3dSmrg    end of the latch block otherwise) to BSI.  INSERT_AFTER is set to true if
8751debfc3dSmrg    the increment should be inserted after *BSI.  */
8761debfc3dSmrg 
8771debfc3dSmrg void
standard_iv_increment_position(class loop * loop,gimple_stmt_iterator * bsi,bool * insert_after)878*8feb0f0bSmrg standard_iv_increment_position (class loop *loop, gimple_stmt_iterator *bsi,
8791debfc3dSmrg 				bool *insert_after)
8801debfc3dSmrg {
8811debfc3dSmrg   basic_block bb = ip_normal_pos (loop), latch = ip_end_pos (loop);
8821debfc3dSmrg   gimple *last = last_stmt (latch);
8831debfc3dSmrg 
8841debfc3dSmrg   if (!bb
8851debfc3dSmrg       || (last && gimple_code (last) != GIMPLE_LABEL))
8861debfc3dSmrg     {
8871debfc3dSmrg       *bsi = gsi_last_bb (latch);
8881debfc3dSmrg       *insert_after = true;
8891debfc3dSmrg     }
8901debfc3dSmrg   else
8911debfc3dSmrg     {
8921debfc3dSmrg       *bsi = gsi_last_bb (bb);
8931debfc3dSmrg       *insert_after = false;
8941debfc3dSmrg     }
8951debfc3dSmrg }
8961debfc3dSmrg 
8971debfc3dSmrg /* Copies phi node arguments for duplicated blocks.  The index of the first
8981debfc3dSmrg    duplicated block is FIRST_NEW_BLOCK.  */
8991debfc3dSmrg 
9001debfc3dSmrg static void
copy_phi_node_args(unsigned first_new_block)9011debfc3dSmrg copy_phi_node_args (unsigned first_new_block)
9021debfc3dSmrg {
9031debfc3dSmrg   unsigned i;
9041debfc3dSmrg 
9051debfc3dSmrg   for (i = first_new_block; i < (unsigned) last_basic_block_for_fn (cfun); i++)
9061debfc3dSmrg     BASIC_BLOCK_FOR_FN (cfun, i)->flags |= BB_DUPLICATED;
9071debfc3dSmrg 
9081debfc3dSmrg   for (i = first_new_block; i < (unsigned) last_basic_block_for_fn (cfun); i++)
9091debfc3dSmrg     add_phi_args_after_copy_bb (BASIC_BLOCK_FOR_FN (cfun, i));
9101debfc3dSmrg 
9111debfc3dSmrg   for (i = first_new_block; i < (unsigned) last_basic_block_for_fn (cfun); i++)
9121debfc3dSmrg     BASIC_BLOCK_FOR_FN (cfun, i)->flags &= ~BB_DUPLICATED;
9131debfc3dSmrg }
9141debfc3dSmrg 
9151debfc3dSmrg 
9161debfc3dSmrg /* The same as cfgloopmanip.c:duplicate_loop_to_header_edge, but also
9171debfc3dSmrg    updates the PHI nodes at start of the copied region.  In order to
9181debfc3dSmrg    achieve this, only loops whose exits all lead to the same location
9191debfc3dSmrg    are handled.
9201debfc3dSmrg 
9211debfc3dSmrg    Notice that we do not completely update the SSA web after
9221debfc3dSmrg    duplication.  The caller is responsible for calling update_ssa
9231debfc3dSmrg    after the loop has been duplicated.  */
9241debfc3dSmrg 
9251debfc3dSmrg bool
gimple_duplicate_loop_to_header_edge(class loop * loop,edge e,unsigned int ndupl,sbitmap wont_exit,edge orig,vec<edge> * to_remove,int flags)926*8feb0f0bSmrg gimple_duplicate_loop_to_header_edge (class loop *loop, edge e,
9271debfc3dSmrg 				    unsigned int ndupl, sbitmap wont_exit,
9281debfc3dSmrg 				    edge orig, vec<edge> *to_remove,
9291debfc3dSmrg 				    int flags)
9301debfc3dSmrg {
9311debfc3dSmrg   unsigned first_new_block;
9321debfc3dSmrg 
9331debfc3dSmrg   if (!loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
9341debfc3dSmrg     return false;
9351debfc3dSmrg   if (!loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS))
9361debfc3dSmrg     return false;
9371debfc3dSmrg 
9381debfc3dSmrg   first_new_block = last_basic_block_for_fn (cfun);
9391debfc3dSmrg   if (!duplicate_loop_to_header_edge (loop, e, ndupl, wont_exit,
9401debfc3dSmrg 				      orig, to_remove, flags))
9411debfc3dSmrg     return false;
9421debfc3dSmrg 
9431debfc3dSmrg   /* Readd the removed phi args for e.  */
9441debfc3dSmrg   flush_pending_stmts (e);
9451debfc3dSmrg 
9461debfc3dSmrg   /* Copy the phi node arguments.  */
9471debfc3dSmrg   copy_phi_node_args (first_new_block);
9481debfc3dSmrg 
9491debfc3dSmrg   scev_reset ();
9501debfc3dSmrg 
9511debfc3dSmrg   return true;
9521debfc3dSmrg }
9531debfc3dSmrg 
9541debfc3dSmrg /* Returns true if we can unroll LOOP FACTOR times.  Number
9551debfc3dSmrg    of iterations of the loop is returned in NITER.  */
9561debfc3dSmrg 
9571debfc3dSmrg bool
can_unroll_loop_p(class loop * loop,unsigned factor,class tree_niter_desc * niter)958*8feb0f0bSmrg can_unroll_loop_p (class loop *loop, unsigned factor,
959*8feb0f0bSmrg 		   class tree_niter_desc *niter)
9601debfc3dSmrg {
9611debfc3dSmrg   edge exit;
9621debfc3dSmrg 
9631debfc3dSmrg   /* Check whether unrolling is possible.  We only want to unroll loops
9641debfc3dSmrg      for that we are able to determine number of iterations.  We also
9651debfc3dSmrg      want to split the extra iterations of the loop from its end,
9661debfc3dSmrg      therefore we require that the loop has precisely one
9671debfc3dSmrg      exit.  */
9681debfc3dSmrg 
9691debfc3dSmrg   exit = single_dom_exit (loop);
9701debfc3dSmrg   if (!exit)
9711debfc3dSmrg     return false;
9721debfc3dSmrg 
9731debfc3dSmrg   if (!number_of_iterations_exit (loop, exit, niter, false)
9741debfc3dSmrg       || niter->cmp == ERROR_MARK
9751debfc3dSmrg       /* Scalar evolutions analysis might have copy propagated
9761debfc3dSmrg 	 the abnormal ssa names into these expressions, hence
9771debfc3dSmrg 	 emitting the computations based on them during loop
9781debfc3dSmrg 	 unrolling might create overlapping life ranges for
9791debfc3dSmrg 	 them, and failures in out-of-ssa.  */
9801debfc3dSmrg       || contains_abnormal_ssa_name_p (niter->may_be_zero)
9811debfc3dSmrg       || contains_abnormal_ssa_name_p (niter->control.base)
9821debfc3dSmrg       || contains_abnormal_ssa_name_p (niter->control.step)
9831debfc3dSmrg       || contains_abnormal_ssa_name_p (niter->bound))
9841debfc3dSmrg     return false;
9851debfc3dSmrg 
9861debfc3dSmrg   /* And of course, we must be able to duplicate the loop.  */
9871debfc3dSmrg   if (!can_duplicate_loop_p (loop))
9881debfc3dSmrg     return false;
9891debfc3dSmrg 
9901debfc3dSmrg   /* The final loop should be small enough.  */
9911debfc3dSmrg   if (tree_num_loop_insns (loop, &eni_size_weights) * factor
992*8feb0f0bSmrg       > (unsigned) param_max_unrolled_insns)
9931debfc3dSmrg     return false;
9941debfc3dSmrg 
9951debfc3dSmrg   return true;
9961debfc3dSmrg }
9971debfc3dSmrg 
9981debfc3dSmrg /* Determines the conditions that control execution of LOOP unrolled FACTOR
9991debfc3dSmrg    times.  DESC is number of iterations of LOOP.  ENTER_COND is set to
10001debfc3dSmrg    condition that must be true if the main loop can be entered.
10011debfc3dSmrg    EXIT_BASE, EXIT_STEP, EXIT_CMP and EXIT_BOUND are set to values describing
10021debfc3dSmrg    how the exit from the unrolled loop should be controlled.  */
10031debfc3dSmrg 
10041debfc3dSmrg static void
determine_exit_conditions(class loop * loop,class tree_niter_desc * desc,unsigned factor,tree * enter_cond,tree * exit_base,tree * exit_step,enum tree_code * exit_cmp,tree * exit_bound)1005*8feb0f0bSmrg determine_exit_conditions (class loop *loop, class tree_niter_desc *desc,
10061debfc3dSmrg 			   unsigned factor, tree *enter_cond,
10071debfc3dSmrg 			   tree *exit_base, tree *exit_step,
10081debfc3dSmrg 			   enum tree_code *exit_cmp, tree *exit_bound)
10091debfc3dSmrg {
10101debfc3dSmrg   gimple_seq stmts;
10111debfc3dSmrg   tree base = desc->control.base;
10121debfc3dSmrg   tree step = desc->control.step;
10131debfc3dSmrg   tree bound = desc->bound;
10141debfc3dSmrg   tree type = TREE_TYPE (step);
10151debfc3dSmrg   tree bigstep, delta;
10161debfc3dSmrg   tree min = lower_bound_in_type (type, type);
10171debfc3dSmrg   tree max = upper_bound_in_type (type, type);
10181debfc3dSmrg   enum tree_code cmp = desc->cmp;
10191debfc3dSmrg   tree cond = boolean_true_node, assum;
10201debfc3dSmrg 
10211debfc3dSmrg   /* For pointers, do the arithmetics in the type of step.  */
10221debfc3dSmrg   base = fold_convert (type, base);
10231debfc3dSmrg   bound = fold_convert (type, bound);
10241debfc3dSmrg 
10251debfc3dSmrg   *enter_cond = boolean_false_node;
10261debfc3dSmrg   *exit_base = NULL_TREE;
10271debfc3dSmrg   *exit_step = NULL_TREE;
10281debfc3dSmrg   *exit_cmp = ERROR_MARK;
10291debfc3dSmrg   *exit_bound = NULL_TREE;
10301debfc3dSmrg   gcc_assert (cmp != ERROR_MARK);
10311debfc3dSmrg 
10321debfc3dSmrg   /* We only need to be correct when we answer question
10331debfc3dSmrg      "Do at least FACTOR more iterations remain?" in the unrolled loop.
10341debfc3dSmrg      Thus, transforming BASE + STEP * i <> BOUND to
10351debfc3dSmrg      BASE + STEP * i < BOUND is ok.  */
10361debfc3dSmrg   if (cmp == NE_EXPR)
10371debfc3dSmrg     {
10381debfc3dSmrg       if (tree_int_cst_sign_bit (step))
10391debfc3dSmrg 	cmp = GT_EXPR;
10401debfc3dSmrg       else
10411debfc3dSmrg 	cmp = LT_EXPR;
10421debfc3dSmrg     }
10431debfc3dSmrg   else if (cmp == LT_EXPR)
10441debfc3dSmrg     {
10451debfc3dSmrg       gcc_assert (!tree_int_cst_sign_bit (step));
10461debfc3dSmrg     }
10471debfc3dSmrg   else if (cmp == GT_EXPR)
10481debfc3dSmrg     {
10491debfc3dSmrg       gcc_assert (tree_int_cst_sign_bit (step));
10501debfc3dSmrg     }
10511debfc3dSmrg   else
10521debfc3dSmrg     gcc_unreachable ();
10531debfc3dSmrg 
10541debfc3dSmrg   /* The main body of the loop may be entered iff:
10551debfc3dSmrg 
10561debfc3dSmrg      1) desc->may_be_zero is false.
10571debfc3dSmrg      2) it is possible to check that there are at least FACTOR iterations
10581debfc3dSmrg 	of the loop, i.e., BOUND - step * FACTOR does not overflow.
10591debfc3dSmrg      3) # of iterations is at least FACTOR  */
10601debfc3dSmrg 
10611debfc3dSmrg   if (!integer_zerop (desc->may_be_zero))
10621debfc3dSmrg     cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
10631debfc3dSmrg 			invert_truthvalue (desc->may_be_zero),
10641debfc3dSmrg 			cond);
10651debfc3dSmrg 
10661debfc3dSmrg   bigstep = fold_build2 (MULT_EXPR, type, step,
10671debfc3dSmrg 			 build_int_cst_type (type, factor));
10681debfc3dSmrg   delta = fold_build2 (MINUS_EXPR, type, bigstep, step);
10691debfc3dSmrg   if (cmp == LT_EXPR)
10701debfc3dSmrg     assum = fold_build2 (GE_EXPR, boolean_type_node,
10711debfc3dSmrg 			 bound,
10721debfc3dSmrg 			 fold_build2 (PLUS_EXPR, type, min, delta));
10731debfc3dSmrg   else
10741debfc3dSmrg     assum = fold_build2 (LE_EXPR, boolean_type_node,
10751debfc3dSmrg 			 bound,
10761debfc3dSmrg 			 fold_build2 (PLUS_EXPR, type, max, delta));
10771debfc3dSmrg   cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, assum, cond);
10781debfc3dSmrg 
10791debfc3dSmrg   bound = fold_build2 (MINUS_EXPR, type, bound, delta);
10801debfc3dSmrg   assum = fold_build2 (cmp, boolean_type_node, base, bound);
10811debfc3dSmrg   cond = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, assum, cond);
10821debfc3dSmrg 
10831debfc3dSmrg   cond = force_gimple_operand (unshare_expr (cond), &stmts, false, NULL_TREE);
10841debfc3dSmrg   if (stmts)
10851debfc3dSmrg     gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
10861debfc3dSmrg   /* cond now may be a gimple comparison, which would be OK, but also any
10871debfc3dSmrg      other gimple rhs (say a && b).  In this case we need to force it to
10881debfc3dSmrg      operand.  */
10891debfc3dSmrg   if (!is_gimple_condexpr (cond))
10901debfc3dSmrg     {
10911debfc3dSmrg       cond = force_gimple_operand (cond, &stmts, true, NULL_TREE);
10921debfc3dSmrg       if (stmts)
10931debfc3dSmrg 	gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
10941debfc3dSmrg     }
10951debfc3dSmrg   *enter_cond = cond;
10961debfc3dSmrg 
10971debfc3dSmrg   base = force_gimple_operand (unshare_expr (base), &stmts, true, NULL_TREE);
10981debfc3dSmrg   if (stmts)
10991debfc3dSmrg     gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
11001debfc3dSmrg   bound = force_gimple_operand (unshare_expr (bound), &stmts, true, NULL_TREE);
11011debfc3dSmrg   if (stmts)
11021debfc3dSmrg     gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
11031debfc3dSmrg 
11041debfc3dSmrg   *exit_base = base;
11051debfc3dSmrg   *exit_step = bigstep;
11061debfc3dSmrg   *exit_cmp = cmp;
11071debfc3dSmrg   *exit_bound = bound;
11081debfc3dSmrg }
11091debfc3dSmrg 
11101debfc3dSmrg /* Scales the frequencies of all basic blocks in LOOP that are strictly
11111debfc3dSmrg    dominated by BB by NUM/DEN.  */
11121debfc3dSmrg 
11131debfc3dSmrg static void
scale_dominated_blocks_in_loop(class loop * loop,basic_block bb,profile_count num,profile_count den)1114*8feb0f0bSmrg scale_dominated_blocks_in_loop (class loop *loop, basic_block bb,
1115a2dc1f3fSmrg 				profile_count num, profile_count den)
11161debfc3dSmrg {
11171debfc3dSmrg   basic_block son;
11181debfc3dSmrg 
1119a2dc1f3fSmrg   if (!den.nonzero_p () && !(num == profile_count::zero ()))
11201debfc3dSmrg     return;
11211debfc3dSmrg 
11221debfc3dSmrg   for (son = first_dom_son (CDI_DOMINATORS, bb);
11231debfc3dSmrg        son;
11241debfc3dSmrg        son = next_dom_son (CDI_DOMINATORS, son))
11251debfc3dSmrg     {
11261debfc3dSmrg       if (!flow_bb_inside_loop_p (loop, son))
11271debfc3dSmrg 	continue;
1128a2dc1f3fSmrg       scale_bbs_frequencies_profile_count (&son, 1, num, den);
11291debfc3dSmrg       scale_dominated_blocks_in_loop (loop, son, num, den);
11301debfc3dSmrg     }
11311debfc3dSmrg }
11321debfc3dSmrg 
11331debfc3dSmrg /* Return estimated niter for LOOP after unrolling by FACTOR times.  */
11341debfc3dSmrg 
11351debfc3dSmrg gcov_type
niter_for_unrolled_loop(class loop * loop,unsigned factor)1136*8feb0f0bSmrg niter_for_unrolled_loop (class loop *loop, unsigned factor)
11371debfc3dSmrg {
11381debfc3dSmrg   gcc_assert (factor != 0);
11391debfc3dSmrg   bool profile_p = false;
11401debfc3dSmrg   gcov_type est_niter = expected_loop_iterations_unbounded (loop, &profile_p);
1141a2dc1f3fSmrg   /* Note that this is really CEIL (est_niter + 1, factor) - 1, where the
1142a2dc1f3fSmrg      "+ 1" converts latch iterations to loop iterations and the "- 1"
1143a2dc1f3fSmrg      converts back.  */
11441debfc3dSmrg   gcov_type new_est_niter = est_niter / factor;
11451debfc3dSmrg 
1146a2dc1f3fSmrg   if (est_niter == -1)
1147a2dc1f3fSmrg     return -1;
1148a2dc1f3fSmrg 
11491debfc3dSmrg   /* Without profile feedback, loops for which we do not know a better estimate
11501debfc3dSmrg      are assumed to roll 10 times.  When we unroll such loop, it appears to
11511debfc3dSmrg      roll too little, and it may even seem to be cold.  To avoid this, we
11521debfc3dSmrg      ensure that the created loop appears to roll at least 5 times (but at
11531debfc3dSmrg      most as many times as before unrolling).  Don't do adjustment if profile
11541debfc3dSmrg      feedback is present.  */
11551debfc3dSmrg   if (new_est_niter < 5 && !profile_p)
11561debfc3dSmrg     {
11571debfc3dSmrg       if (est_niter < 5)
11581debfc3dSmrg 	new_est_niter = est_niter;
11591debfc3dSmrg       else
11601debfc3dSmrg 	new_est_niter = 5;
11611debfc3dSmrg     }
11621debfc3dSmrg 
1163a2dc1f3fSmrg   if (loop->any_upper_bound)
1164a2dc1f3fSmrg     {
1165a2dc1f3fSmrg       /* As above, this is really CEIL (upper_bound + 1, factor) - 1.  */
1166a2dc1f3fSmrg       widest_int bound = wi::udiv_floor (loop->nb_iterations_upper_bound,
1167a2dc1f3fSmrg 					 factor);
1168a2dc1f3fSmrg       if (wi::ltu_p (bound, new_est_niter))
1169a2dc1f3fSmrg 	new_est_niter = bound.to_uhwi ();
1170a2dc1f3fSmrg     }
1171a2dc1f3fSmrg 
11721debfc3dSmrg   return new_est_niter;
11731debfc3dSmrg }
11741debfc3dSmrg 
11751debfc3dSmrg /* Unroll LOOP FACTOR times.  DESC describes number of iterations of LOOP.
11761debfc3dSmrg    EXIT is the exit of the loop to that DESC corresponds.
11771debfc3dSmrg 
11781debfc3dSmrg    If N is number of iterations of the loop and MAY_BE_ZERO is the condition
11791debfc3dSmrg    under that loop exits in the first iteration even if N != 0,
11801debfc3dSmrg 
11811debfc3dSmrg    while (1)
11821debfc3dSmrg      {
11831debfc3dSmrg        x = phi (init, next);
11841debfc3dSmrg 
11851debfc3dSmrg        pre;
11861debfc3dSmrg        if (st)
11871debfc3dSmrg          break;
11881debfc3dSmrg        post;
11891debfc3dSmrg      }
11901debfc3dSmrg 
11911debfc3dSmrg    becomes (with possibly the exit conditions formulated a bit differently,
11921debfc3dSmrg    avoiding the need to create a new iv):
11931debfc3dSmrg 
11941debfc3dSmrg    if (MAY_BE_ZERO || N < FACTOR)
11951debfc3dSmrg      goto rest;
11961debfc3dSmrg 
11971debfc3dSmrg    do
11981debfc3dSmrg      {
11991debfc3dSmrg        x = phi (init, next);
12001debfc3dSmrg 
12011debfc3dSmrg        pre;
12021debfc3dSmrg        post;
12031debfc3dSmrg        pre;
12041debfc3dSmrg        post;
12051debfc3dSmrg        ...
12061debfc3dSmrg        pre;
12071debfc3dSmrg        post;
12081debfc3dSmrg        N -= FACTOR;
12091debfc3dSmrg 
12101debfc3dSmrg      } while (N >= FACTOR);
12111debfc3dSmrg 
12121debfc3dSmrg    rest:
12131debfc3dSmrg      init' = phi (init, x);
12141debfc3dSmrg 
12151debfc3dSmrg    while (1)
12161debfc3dSmrg      {
12171debfc3dSmrg        x = phi (init', next);
12181debfc3dSmrg 
12191debfc3dSmrg        pre;
12201debfc3dSmrg        if (st)
12211debfc3dSmrg          break;
12221debfc3dSmrg        post;
12231debfc3dSmrg      }
12241debfc3dSmrg 
12251debfc3dSmrg    Before the loop is unrolled, TRANSFORM is called for it (only for the
12261debfc3dSmrg    unrolled loop, but not for its versioned copy).  DATA is passed to
12271debfc3dSmrg    TRANSFORM.  */
12281debfc3dSmrg 
12291debfc3dSmrg /* Probability in % that the unrolled loop is entered.  Just a guess.  */
12301debfc3dSmrg #define PROB_UNROLLED_LOOP_ENTERED 90
12311debfc3dSmrg 
12321debfc3dSmrg void
tree_transform_and_unroll_loop(class loop * loop,unsigned factor,edge exit,class tree_niter_desc * desc,transform_callback transform,void * data)1233*8feb0f0bSmrg tree_transform_and_unroll_loop (class loop *loop, unsigned factor,
1234*8feb0f0bSmrg 				edge exit, class tree_niter_desc *desc,
12351debfc3dSmrg 				transform_callback transform,
12361debfc3dSmrg 				void *data)
12371debfc3dSmrg {
12381debfc3dSmrg   gcond *exit_if;
12391debfc3dSmrg   tree ctr_before, ctr_after;
12401debfc3dSmrg   tree enter_main_cond, exit_base, exit_step, exit_bound;
12411debfc3dSmrg   enum tree_code exit_cmp;
12421debfc3dSmrg   gphi *phi_old_loop, *phi_new_loop, *phi_rest;
12431debfc3dSmrg   gphi_iterator psi_old_loop, psi_new_loop;
12441debfc3dSmrg   tree init, next, new_init;
1245*8feb0f0bSmrg   class loop *new_loop;
12461debfc3dSmrg   basic_block rest, exit_bb;
12471debfc3dSmrg   edge old_entry, new_entry, old_latch, precond_edge, new_exit;
12481debfc3dSmrg   edge new_nonexit, e;
12491debfc3dSmrg   gimple_stmt_iterator bsi;
12501debfc3dSmrg   use_operand_p op;
12511debfc3dSmrg   bool ok;
1252a2dc1f3fSmrg   unsigned i;
1253a2dc1f3fSmrg   profile_probability prob, prob_entry, scale_unrolled;
1254a2dc1f3fSmrg   profile_count freq_e, freq_h;
12551debfc3dSmrg   gcov_type new_est_niter = niter_for_unrolled_loop (loop, factor);
12561debfc3dSmrg   unsigned irr = loop_preheader_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP;
12571debfc3dSmrg   auto_vec<edge> to_remove;
12581debfc3dSmrg 
12591debfc3dSmrg   determine_exit_conditions (loop, desc, factor,
12601debfc3dSmrg 			     &enter_main_cond, &exit_base, &exit_step,
12611debfc3dSmrg 			     &exit_cmp, &exit_bound);
12621debfc3dSmrg 
12631debfc3dSmrg   /* Let us assume that the unrolled loop is quite likely to be entered.  */
12641debfc3dSmrg   if (integer_nonzerop (enter_main_cond))
1265a2dc1f3fSmrg     prob_entry = profile_probability::always ();
12661debfc3dSmrg   else
1267a2dc1f3fSmrg     prob_entry = profile_probability::guessed_always ()
1268a2dc1f3fSmrg 			.apply_scale (PROB_UNROLLED_LOOP_ENTERED, 100);
12691debfc3dSmrg 
12701debfc3dSmrg   /* The values for scales should keep profile consistent, and somewhat close
12711debfc3dSmrg      to correct.
12721debfc3dSmrg 
12731debfc3dSmrg      TODO: The current value of SCALE_REST makes it appear that the loop that
12741debfc3dSmrg      is created by splitting the remaining iterations of the unrolled loop is
12751debfc3dSmrg      executed the same number of times as the original loop, and with the same
12761debfc3dSmrg      frequencies, which is obviously wrong.  This does not appear to cause
12771debfc3dSmrg      problems, so we do not bother with fixing it for now.  To make the profile
12781debfc3dSmrg      correct, we would need to change the probability of the exit edge of the
12791debfc3dSmrg      loop, and recompute the distribution of frequencies in its body because
12801debfc3dSmrg      of this change (scale the frequencies of blocks before and after the exit
12811debfc3dSmrg      by appropriate factors).  */
12821debfc3dSmrg   scale_unrolled = prob_entry;
12831debfc3dSmrg 
1284a2dc1f3fSmrg   new_loop = loop_version (loop, enter_main_cond, NULL, prob_entry,
1285a2dc1f3fSmrg 			   prob_entry.invert (), scale_unrolled,
1286a2dc1f3fSmrg 			   profile_probability::guessed_always (),
1287a2dc1f3fSmrg 			   true);
12881debfc3dSmrg   gcc_assert (new_loop != NULL);
12891debfc3dSmrg   update_ssa (TODO_update_ssa);
12901debfc3dSmrg 
12911debfc3dSmrg   /* Prepare the cfg and update the phi nodes.  Move the loop exit to the
12921debfc3dSmrg      loop latch (and make its condition dummy, for the moment).  */
12931debfc3dSmrg   rest = loop_preheader_edge (new_loop)->src;
12941debfc3dSmrg   precond_edge = single_pred_edge (rest);
12951debfc3dSmrg   split_edge (loop_latch_edge (loop));
12961debfc3dSmrg   exit_bb = single_pred (loop->latch);
12971debfc3dSmrg 
12981debfc3dSmrg   /* Since the exit edge will be removed, the frequency of all the blocks
12991debfc3dSmrg      in the loop that are dominated by it must be scaled by
13001debfc3dSmrg      1 / (1 - exit->probability).  */
1301a2dc1f3fSmrg   if (exit->probability.initialized_p ())
13021debfc3dSmrg     scale_dominated_blocks_in_loop (loop, exit->src,
1303a2dc1f3fSmrg 				    /* We are scaling up here so probability
1304a2dc1f3fSmrg 				       does not fit.  */
1305a2dc1f3fSmrg 				    loop->header->count,
1306a2dc1f3fSmrg 				    loop->header->count
1307a2dc1f3fSmrg 				    - loop->header->count.apply_probability
1308a2dc1f3fSmrg 					 (exit->probability));
13091debfc3dSmrg 
13101debfc3dSmrg   bsi = gsi_last_bb (exit_bb);
13111debfc3dSmrg   exit_if = gimple_build_cond (EQ_EXPR, integer_zero_node,
13121debfc3dSmrg 			       integer_zero_node,
13131debfc3dSmrg 			       NULL_TREE, NULL_TREE);
13141debfc3dSmrg 
13151debfc3dSmrg   gsi_insert_after (&bsi, exit_if, GSI_NEW_STMT);
13161debfc3dSmrg   new_exit = make_edge (exit_bb, rest, EDGE_FALSE_VALUE | irr);
13171debfc3dSmrg   rescan_loop_exit (new_exit, true, false);
13181debfc3dSmrg 
13191debfc3dSmrg   /* Set the probability of new exit to the same of the old one.  Fix
13201debfc3dSmrg      the frequency of the latch block, by scaling it back by
13211debfc3dSmrg      1 - exit->probability.  */
13221debfc3dSmrg   new_exit->probability = exit->probability;
13231debfc3dSmrg   new_nonexit = single_pred_edge (loop->latch);
1324a2dc1f3fSmrg   new_nonexit->probability = exit->probability.invert ();
13251debfc3dSmrg   new_nonexit->flags = EDGE_TRUE_VALUE;
1326a2dc1f3fSmrg   if (new_nonexit->probability.initialized_p ())
1327a2dc1f3fSmrg     scale_bbs_frequencies (&loop->latch, 1, new_nonexit->probability);
13281debfc3dSmrg 
13291debfc3dSmrg   old_entry = loop_preheader_edge (loop);
13301debfc3dSmrg   new_entry = loop_preheader_edge (new_loop);
13311debfc3dSmrg   old_latch = loop_latch_edge (loop);
13321debfc3dSmrg   for (psi_old_loop = gsi_start_phis (loop->header),
13331debfc3dSmrg        psi_new_loop = gsi_start_phis (new_loop->header);
13341debfc3dSmrg        !gsi_end_p (psi_old_loop);
13351debfc3dSmrg        gsi_next (&psi_old_loop), gsi_next (&psi_new_loop))
13361debfc3dSmrg     {
13371debfc3dSmrg       phi_old_loop = psi_old_loop.phi ();
13381debfc3dSmrg       phi_new_loop = psi_new_loop.phi ();
13391debfc3dSmrg 
13401debfc3dSmrg       init = PHI_ARG_DEF_FROM_EDGE (phi_old_loop, old_entry);
13411debfc3dSmrg       op = PHI_ARG_DEF_PTR_FROM_EDGE (phi_new_loop, new_entry);
13421debfc3dSmrg       gcc_assert (operand_equal_for_phi_arg_p (init, USE_FROM_PTR (op)));
13431debfc3dSmrg       next = PHI_ARG_DEF_FROM_EDGE (phi_old_loop, old_latch);
13441debfc3dSmrg 
13451debfc3dSmrg       /* Prefer using original variable as a base for the new ssa name.
13461debfc3dSmrg 	 This is necessary for virtual ops, and useful in order to avoid
13471debfc3dSmrg 	 losing debug info for real ops.  */
13481debfc3dSmrg       if (TREE_CODE (next) == SSA_NAME
13491debfc3dSmrg 	  && useless_type_conversion_p (TREE_TYPE (next),
13501debfc3dSmrg 					TREE_TYPE (init)))
13511debfc3dSmrg 	new_init = copy_ssa_name (next);
13521debfc3dSmrg       else if (TREE_CODE (init) == SSA_NAME
13531debfc3dSmrg 	       && useless_type_conversion_p (TREE_TYPE (init),
13541debfc3dSmrg 					     TREE_TYPE (next)))
13551debfc3dSmrg 	new_init = copy_ssa_name (init);
13561debfc3dSmrg       else if (useless_type_conversion_p (TREE_TYPE (next), TREE_TYPE (init)))
13571debfc3dSmrg 	new_init = make_temp_ssa_name (TREE_TYPE (next), NULL, "unrinittmp");
13581debfc3dSmrg       else
13591debfc3dSmrg 	new_init = make_temp_ssa_name (TREE_TYPE (init), NULL, "unrinittmp");
13601debfc3dSmrg 
13611debfc3dSmrg       phi_rest = create_phi_node (new_init, rest);
13621debfc3dSmrg 
13631debfc3dSmrg       add_phi_arg (phi_rest, init, precond_edge, UNKNOWN_LOCATION);
13641debfc3dSmrg       add_phi_arg (phi_rest, next, new_exit, UNKNOWN_LOCATION);
13651debfc3dSmrg       SET_USE (op, new_init);
13661debfc3dSmrg     }
13671debfc3dSmrg 
13681debfc3dSmrg   remove_path (exit);
13691debfc3dSmrg 
13701debfc3dSmrg   /* Transform the loop.  */
13711debfc3dSmrg   if (transform)
13721debfc3dSmrg     (*transform) (loop, data);
13731debfc3dSmrg 
13741debfc3dSmrg   /* Unroll the loop and remove the exits in all iterations except for the
13751debfc3dSmrg      last one.  */
13761debfc3dSmrg   auto_sbitmap wont_exit (factor);
13771debfc3dSmrg   bitmap_ones (wont_exit);
13781debfc3dSmrg   bitmap_clear_bit (wont_exit, factor - 1);
13791debfc3dSmrg 
13801debfc3dSmrg   ok = gimple_duplicate_loop_to_header_edge
13811debfc3dSmrg 	  (loop, loop_latch_edge (loop), factor - 1,
13821debfc3dSmrg 	   wont_exit, new_exit, &to_remove, DLTHE_FLAG_UPDATE_FREQ);
13831debfc3dSmrg   gcc_assert (ok);
13841debfc3dSmrg 
13851debfc3dSmrg   FOR_EACH_VEC_ELT (to_remove, i, e)
13861debfc3dSmrg     {
13871debfc3dSmrg       ok = remove_path (e);
13881debfc3dSmrg       gcc_assert (ok);
13891debfc3dSmrg     }
13901debfc3dSmrg   update_ssa (TODO_update_ssa);
13911debfc3dSmrg 
13921debfc3dSmrg   /* Ensure that the frequencies in the loop match the new estimated
13931debfc3dSmrg      number of iterations, and change the probability of the new
13941debfc3dSmrg      exit edge.  */
13951debfc3dSmrg 
13961debfc3dSmrg   freq_h = loop->header->count;
1397a2dc1f3fSmrg   freq_e = (loop_preheader_edge (loop))->count ();
1398a2dc1f3fSmrg   if (freq_h.nonzero_p ())
13991debfc3dSmrg     {
14001debfc3dSmrg       /* Avoid dropping loop body profile counter to 0 because of zero count
14011debfc3dSmrg 	 in loop's preheader.  */
1402a2dc1f3fSmrg       if (freq_h.nonzero_p () && !(freq_e == profile_count::zero ()))
1403a2dc1f3fSmrg         freq_e = freq_e.force_nonzero ();
1404a2dc1f3fSmrg       scale_loop_frequencies (loop, freq_e.probability_in (freq_h));
14051debfc3dSmrg     }
14061debfc3dSmrg 
14071debfc3dSmrg   exit_bb = single_pred (loop->latch);
14081debfc3dSmrg   new_exit = find_edge (exit_bb, rest);
1409a2dc1f3fSmrg   new_exit->probability = profile_probability::always ()
1410a2dc1f3fSmrg 				.apply_scale (1, new_est_niter + 1);
14111debfc3dSmrg 
1412a2dc1f3fSmrg   rest->count += new_exit->count ();
14131debfc3dSmrg 
14141debfc3dSmrg   new_nonexit = single_pred_edge (loop->latch);
14151debfc3dSmrg   prob = new_nonexit->probability;
1416a2dc1f3fSmrg   new_nonexit->probability = new_exit->probability.invert ();
1417a2dc1f3fSmrg   prob = new_nonexit->probability / prob;
1418a2dc1f3fSmrg   if (prob.initialized_p ())
1419a2dc1f3fSmrg     scale_bbs_frequencies (&loop->latch, 1, prob);
14201debfc3dSmrg 
14211debfc3dSmrg   /* Finally create the new counter for number of iterations and add the new
14221debfc3dSmrg      exit instruction.  */
14231debfc3dSmrg   bsi = gsi_last_nondebug_bb (exit_bb);
14241debfc3dSmrg   exit_if = as_a <gcond *> (gsi_stmt (bsi));
14251debfc3dSmrg   create_iv (exit_base, exit_step, NULL_TREE, loop,
14261debfc3dSmrg 	     &bsi, false, &ctr_before, &ctr_after);
14271debfc3dSmrg   gimple_cond_set_code (exit_if, exit_cmp);
14281debfc3dSmrg   gimple_cond_set_lhs (exit_if, ctr_after);
14291debfc3dSmrg   gimple_cond_set_rhs (exit_if, exit_bound);
14301debfc3dSmrg   update_stmt (exit_if);
14311debfc3dSmrg 
14321debfc3dSmrg   checking_verify_flow_info ();
14331debfc3dSmrg   checking_verify_loop_structure ();
1434a2dc1f3fSmrg   checking_verify_loop_closed_ssa (true, loop);
1435a2dc1f3fSmrg   checking_verify_loop_closed_ssa (true, new_loop);
14361debfc3dSmrg }
14371debfc3dSmrg 
14381debfc3dSmrg /* Wrapper over tree_transform_and_unroll_loop for case we do not
14391debfc3dSmrg    want to transform the loop before unrolling.  The meaning
14401debfc3dSmrg    of the arguments is the same as for tree_transform_and_unroll_loop.  */
14411debfc3dSmrg 
14421debfc3dSmrg void
tree_unroll_loop(class loop * loop,unsigned factor,edge exit,class tree_niter_desc * desc)1443*8feb0f0bSmrg tree_unroll_loop (class loop *loop, unsigned factor,
1444*8feb0f0bSmrg 		  edge exit, class tree_niter_desc *desc)
14451debfc3dSmrg {
14461debfc3dSmrg   tree_transform_and_unroll_loop (loop, factor, exit, desc,
14471debfc3dSmrg 				  NULL, NULL);
14481debfc3dSmrg }
14491debfc3dSmrg 
14501debfc3dSmrg /* Rewrite the phi node at position PSI in function of the main
14511debfc3dSmrg    induction variable MAIN_IV and insert the generated code at GSI.  */
14521debfc3dSmrg 
14531debfc3dSmrg static void
rewrite_phi_with_iv(loop_p loop,gphi_iterator * psi,gimple_stmt_iterator * gsi,tree main_iv)14541debfc3dSmrg rewrite_phi_with_iv (loop_p loop,
14551debfc3dSmrg 		     gphi_iterator *psi,
14561debfc3dSmrg 		     gimple_stmt_iterator *gsi,
14571debfc3dSmrg 		     tree main_iv)
14581debfc3dSmrg {
14591debfc3dSmrg   affine_iv iv;
14601debfc3dSmrg   gassign *stmt;
14611debfc3dSmrg   gphi *phi = psi->phi ();
14621debfc3dSmrg   tree atype, mtype, val, res = PHI_RESULT (phi);
14631debfc3dSmrg 
14641debfc3dSmrg   if (virtual_operand_p (res) || res == main_iv)
14651debfc3dSmrg     {
14661debfc3dSmrg       gsi_next (psi);
14671debfc3dSmrg       return;
14681debfc3dSmrg     }
14691debfc3dSmrg 
14701debfc3dSmrg   if (!simple_iv (loop, loop, res, &iv, true))
14711debfc3dSmrg     {
14721debfc3dSmrg       gsi_next (psi);
14731debfc3dSmrg       return;
14741debfc3dSmrg     }
14751debfc3dSmrg 
14761debfc3dSmrg   remove_phi_node (psi, false);
14771debfc3dSmrg 
14781debfc3dSmrg   atype = TREE_TYPE (res);
14791debfc3dSmrg   mtype = POINTER_TYPE_P (atype) ? sizetype : atype;
14801debfc3dSmrg   val = fold_build2 (MULT_EXPR, mtype, unshare_expr (iv.step),
14811debfc3dSmrg 		     fold_convert (mtype, main_iv));
14821debfc3dSmrg   val = fold_build2 (POINTER_TYPE_P (atype)
14831debfc3dSmrg 		     ? POINTER_PLUS_EXPR : PLUS_EXPR,
14841debfc3dSmrg 		     atype, unshare_expr (iv.base), val);
14851debfc3dSmrg   val = force_gimple_operand_gsi (gsi, val, false, NULL_TREE, true,
14861debfc3dSmrg 				  GSI_SAME_STMT);
14871debfc3dSmrg   stmt = gimple_build_assign (res, val);
14881debfc3dSmrg   gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
14891debfc3dSmrg }
14901debfc3dSmrg 
14911debfc3dSmrg /* Rewrite all the phi nodes of LOOP in function of the main induction
14921debfc3dSmrg    variable MAIN_IV.  */
14931debfc3dSmrg 
14941debfc3dSmrg static void
rewrite_all_phi_nodes_with_iv(loop_p loop,tree main_iv)14951debfc3dSmrg rewrite_all_phi_nodes_with_iv (loop_p loop, tree main_iv)
14961debfc3dSmrg {
14971debfc3dSmrg   unsigned i;
14981debfc3dSmrg   basic_block *bbs = get_loop_body_in_dom_order (loop);
14991debfc3dSmrg   gphi_iterator psi;
15001debfc3dSmrg 
15011debfc3dSmrg   for (i = 0; i < loop->num_nodes; i++)
15021debfc3dSmrg     {
15031debfc3dSmrg       basic_block bb = bbs[i];
15041debfc3dSmrg       gimple_stmt_iterator gsi = gsi_after_labels (bb);
15051debfc3dSmrg 
15061debfc3dSmrg       if (bb->loop_father != loop)
15071debfc3dSmrg 	continue;
15081debfc3dSmrg 
15091debfc3dSmrg       for (psi = gsi_start_phis (bb); !gsi_end_p (psi); )
15101debfc3dSmrg 	rewrite_phi_with_iv (loop, &psi, &gsi, main_iv);
15111debfc3dSmrg     }
15121debfc3dSmrg 
15131debfc3dSmrg   free (bbs);
15141debfc3dSmrg }
15151debfc3dSmrg 
15161debfc3dSmrg /* Bases all the induction variables in LOOP on a single induction variable
15171debfc3dSmrg    (with base 0 and step 1), whose final value is compared with *NIT.  When the
15181debfc3dSmrg    IV type precision has to be larger than *NIT type precision, *NIT is
15191debfc3dSmrg    converted to the larger type, the conversion code is inserted before the
15201debfc3dSmrg    loop, and *NIT is updated to the new definition.  When BUMP_IN_LATCH is true,
15211debfc3dSmrg    the induction variable is incremented in the loop latch, otherwise it is
15221debfc3dSmrg    incremented in the loop header.  Return the induction variable that was
15231debfc3dSmrg    created.  */
15241debfc3dSmrg 
15251debfc3dSmrg tree
canonicalize_loop_ivs(class loop * loop,tree * nit,bool bump_in_latch)1526*8feb0f0bSmrg canonicalize_loop_ivs (class loop *loop, tree *nit, bool bump_in_latch)
15271debfc3dSmrg {
15281debfc3dSmrg   unsigned precision = TYPE_PRECISION (TREE_TYPE (*nit));
15291debfc3dSmrg   unsigned original_precision = precision;
15301debfc3dSmrg   tree type, var_before;
15311debfc3dSmrg   gimple_stmt_iterator gsi;
15321debfc3dSmrg   gphi_iterator psi;
15331debfc3dSmrg   gcond *stmt;
15341debfc3dSmrg   edge exit = single_dom_exit (loop);
15351debfc3dSmrg   gimple_seq stmts;
15361debfc3dSmrg   bool unsigned_p = false;
15371debfc3dSmrg 
15381debfc3dSmrg   for (psi = gsi_start_phis (loop->header);
15391debfc3dSmrg        !gsi_end_p (psi); gsi_next (&psi))
15401debfc3dSmrg     {
15411debfc3dSmrg       gphi *phi = psi.phi ();
15421debfc3dSmrg       tree res = PHI_RESULT (phi);
15431debfc3dSmrg       bool uns;
15441debfc3dSmrg 
15451debfc3dSmrg       type = TREE_TYPE (res);
15461debfc3dSmrg       if (virtual_operand_p (res)
15471debfc3dSmrg 	  || (!INTEGRAL_TYPE_P (type)
15481debfc3dSmrg 	      && !POINTER_TYPE_P (type))
15491debfc3dSmrg 	  || TYPE_PRECISION (type) < precision)
15501debfc3dSmrg 	continue;
15511debfc3dSmrg 
15521debfc3dSmrg       uns = POINTER_TYPE_P (type) | TYPE_UNSIGNED (type);
15531debfc3dSmrg 
15541debfc3dSmrg       if (TYPE_PRECISION (type) > precision)
15551debfc3dSmrg 	unsigned_p = uns;
15561debfc3dSmrg       else
15571debfc3dSmrg 	unsigned_p |= uns;
15581debfc3dSmrg 
15591debfc3dSmrg       precision = TYPE_PRECISION (type);
15601debfc3dSmrg     }
15611debfc3dSmrg 
1562a2dc1f3fSmrg   scalar_int_mode mode = smallest_int_mode_for_size (precision);
15631debfc3dSmrg   precision = GET_MODE_PRECISION (mode);
15641debfc3dSmrg   type = build_nonstandard_integer_type (precision, unsigned_p);
15651debfc3dSmrg 
1566c0a68be4Smrg   if (original_precision != precision
1567c0a68be4Smrg       || TYPE_UNSIGNED (TREE_TYPE (*nit)) != unsigned_p)
15681debfc3dSmrg     {
15691debfc3dSmrg       *nit = fold_convert (type, *nit);
15701debfc3dSmrg       *nit = force_gimple_operand (*nit, &stmts, true, NULL_TREE);
15711debfc3dSmrg       if (stmts)
15721debfc3dSmrg 	gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
15731debfc3dSmrg     }
15741debfc3dSmrg 
15751debfc3dSmrg   if (bump_in_latch)
15761debfc3dSmrg     gsi = gsi_last_bb (loop->latch);
15771debfc3dSmrg   else
15781debfc3dSmrg     gsi = gsi_last_nondebug_bb (loop->header);
15791debfc3dSmrg   create_iv (build_int_cst_type (type, 0), build_int_cst (type, 1), NULL_TREE,
15801debfc3dSmrg 	     loop, &gsi, bump_in_latch, &var_before, NULL);
15811debfc3dSmrg 
15821debfc3dSmrg   rewrite_all_phi_nodes_with_iv (loop, var_before);
15831debfc3dSmrg 
15841debfc3dSmrg   stmt = as_a <gcond *> (last_stmt (exit->src));
15851debfc3dSmrg   /* Make the loop exit if the control condition is not satisfied.  */
15861debfc3dSmrg   if (exit->flags & EDGE_TRUE_VALUE)
15871debfc3dSmrg     {
15881debfc3dSmrg       edge te, fe;
15891debfc3dSmrg 
15901debfc3dSmrg       extract_true_false_edges_from_block (exit->src, &te, &fe);
15911debfc3dSmrg       te->flags = EDGE_FALSE_VALUE;
15921debfc3dSmrg       fe->flags = EDGE_TRUE_VALUE;
15931debfc3dSmrg     }
15941debfc3dSmrg   gimple_cond_set_code (stmt, LT_EXPR);
15951debfc3dSmrg   gimple_cond_set_lhs (stmt, var_before);
15961debfc3dSmrg   gimple_cond_set_rhs (stmt, *nit);
15971debfc3dSmrg   update_stmt (stmt);
15981debfc3dSmrg 
15991debfc3dSmrg   return var_before;
16001debfc3dSmrg }
1601