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