1 /* Single entry single exit control flow regions.
2 Copyright (C) 2008-2017 Free Software Foundation, Inc.
3 Contributed by Jan Sjodin <jan.sjodin@amd.com> and
4 Sebastian Pop <sebastian.pop@amd.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
29 #include "tree-pass.h"
31 #include "tree-pretty-print.h"
32 #include "fold-const.h"
34 #include "gimple-iterator.h"
35 #include "gimple-pretty-print.h"
36 #include "gimplify-me.h"
38 #include "tree-ssa-loop.h"
39 #include "tree-into-ssa.h"
41 #include "tree-data-ref.h"
42 #include "tree-scalar-evolution.h"
43 #include "tree-ssa-propagate.h"
47 /* For a USE in BB, if BB is outside REGION, mark the USE in the
51 sese_build_liveouts_use (sese_info_p region
, bitmap liveouts
, basic_block bb
,
54 gcc_assert (!bb_in_sese_p (bb
, region
->region
));
55 if (TREE_CODE (use
) != SSA_NAME
)
58 basic_block def_bb
= gimple_bb (SSA_NAME_DEF_STMT (use
));
60 if (!def_bb
|| !bb_in_sese_p (def_bb
, region
->region
))
63 unsigned ver
= SSA_NAME_VERSION (use
);
64 bitmap_set_bit (liveouts
, ver
);
67 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are
68 used in BB that is outside of the REGION. */
71 sese_build_liveouts_bb (sese_info_p region
, basic_block bb
)
76 for (gphi_iterator bsi
= gsi_start_phis (bb
); !gsi_end_p (bsi
);
78 FOR_EACH_PHI_ARG (use_p
, bsi
.phi (), iter
, SSA_OP_USE
)
79 sese_build_liveouts_use (region
, region
->liveout
,
80 bb
, USE_FROM_PTR (use_p
));
82 for (gimple_stmt_iterator bsi
= gsi_start_bb (bb
); !gsi_end_p (bsi
);
85 gimple
*stmt
= gsi_stmt (bsi
);
87 bitmap liveouts
= region
->liveout
;
88 if (is_gimple_debug (stmt
))
89 liveouts
= region
->debug_liveout
;
91 FOR_EACH_SSA_USE_OPERAND (use_p
, stmt
, iter
, SSA_OP_USE
)
92 sese_build_liveouts_use (region
, liveouts
, bb
, USE_FROM_PTR (use_p
));
96 /* Reset debug stmts that reference SSA_NAMES defined in REGION that
97 are not marked as liveouts. */
100 sese_reset_debug_liveouts (sese_info_p region
)
104 EXECUTE_IF_AND_COMPL_IN_BITMAP (region
->debug_liveout
, region
->liveout
,
107 tree name
= ssa_name (i
);
108 auto_vec
<gimple
*, 4> stmts
;
110 imm_use_iterator use_iter
;
111 FOR_EACH_IMM_USE_STMT (use_stmt
, use_iter
, name
)
113 if (! is_gimple_debug (use_stmt
)
114 || bb_in_sese_p (gimple_bb (use_stmt
), region
->region
))
116 stmts
.safe_push (use_stmt
);
118 while (!stmts
.is_empty ())
120 gimple
*stmt
= stmts
.pop ();
121 gimple_debug_bind_reset_value (stmt
);
127 /* Build the LIVEOUTS of REGION: the set of variables defined inside
128 and used outside the REGION. */
131 sese_build_liveouts (sese_info_p region
)
135 gcc_assert (region
->liveout
== NULL
136 && region
->debug_liveout
== NULL
);
138 region
->liveout
= BITMAP_ALLOC (NULL
);
139 region
->debug_liveout
= BITMAP_ALLOC (NULL
);
141 /* FIXME: We could start iterating form the successor of sese. */
142 FOR_EACH_BB_FN (bb
, cfun
)
143 if (!bb_in_sese_p (bb
, region
->region
))
144 sese_build_liveouts_bb (region
, bb
);
147 /* Builds a new SESE region from edges ENTRY and EXIT. */
150 new_sese_info (edge entry
, edge exit
)
152 sese_info_p region
= XNEW (struct sese_info_t
);
154 region
->region
.entry
= entry
;
155 region
->region
.exit
= exit
;
156 region
->liveout
= NULL
;
157 region
->debug_liveout
= NULL
;
158 region
->params
.create (3);
159 region
->rename_map
= new rename_map_t
;
160 region
->bbs
.create (3);
161 region
->incomplete_phis
.create (3);
167 /* Deletes REGION. */
170 free_sese_info (sese_info_p region
)
172 region
->params
.release ();
173 BITMAP_FREE (region
->liveout
);
174 BITMAP_FREE (region
->debug_liveout
);
176 for (rename_map_t::iterator it
= region
->rename_map
->begin ();
177 it
!= region
->rename_map
->end (); ++it
)
178 (*it
).second
.release ();
180 delete region
->rename_map
;
181 region
->rename_map
= NULL
;
182 region
->bbs
.release ();
183 region
->incomplete_phis
.release ();
188 /* Add exit phis for USE on EXIT. */
191 sese_add_exit_phis_edge (basic_block exit
, tree use
, edge false_e
, edge true_e
)
193 gphi
*phi
= create_phi_node (NULL_TREE
, exit
);
194 create_new_def_for (use
, phi
, gimple_phi_result_ptr (phi
));
195 add_phi_arg (phi
, use
, false_e
, UNKNOWN_LOCATION
);
196 add_phi_arg (phi
, use
, true_e
, UNKNOWN_LOCATION
);
200 /* Insert in the block BB phi nodes for variables defined in REGION
201 and used outside the REGION. The code generation moves REGION in
202 the else clause of an "if (1)" and generates code in the then
203 clause that is at this point empty:
212 sese_insert_phis_for_liveouts (sese_info_p region
, basic_block bb
,
213 edge false_e
, edge true_e
)
215 if (MAY_HAVE_DEBUG_STMTS
)
216 sese_reset_debug_liveouts (region
);
220 EXECUTE_IF_SET_IN_BITMAP (region
->liveout
, 0, i
, bi
)
221 if (!virtual_operand_p (ssa_name (i
)))
222 sese_add_exit_phis_edge (bb
, ssa_name (i
), false_e
, true_e
);
225 /* Returns the outermost loop in SCOP that contains BB. */
228 outermost_loop_in_sese_1 (sese_l
®ion
, basic_block bb
)
232 nest
= bb
->loop_father
;
233 while (loop_outer (nest
)
234 && loop_in_sese_p (loop_outer (nest
), region
))
235 nest
= loop_outer (nest
);
240 /* Same as outermost_loop_in_sese_1, returns the outermost loop
241 containing BB in REGION, but makes sure that the returned loop
242 belongs to the REGION, and so this returns the first loop in the
243 REGION when the loop containing BB does not belong to REGION. */
246 outermost_loop_in_sese (sese_l
®ion
, basic_block bb
)
248 loop_p nest
= outermost_loop_in_sese_1 (region
, bb
);
250 if (loop_in_sese_p (nest
, region
))
253 /* When the basic block BB does not belong to a loop in the region,
254 return the first loop in the region. */
257 if (loop_in_sese_p (nest
, region
))
266 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */
269 get_true_edge_from_guard_bb (basic_block bb
)
274 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
275 if (e
->flags
& EDGE_TRUE_VALUE
)
282 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared. */
285 get_false_edge_from_guard_bb (basic_block bb
)
290 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
291 if (!(e
->flags
& EDGE_TRUE_VALUE
))
298 /* Moves REGION in a condition expression:
306 move_sese_in_condition (sese_info_p region
)
308 basic_block region_entry_dest
= region
->region
.entry
->dest
;
309 basic_block pred_block
= split_edge (region
->region
.entry
);
310 basic_block merge_block
= split_edge (region
->region
.exit
);
312 edge true_edge
= make_edge (pred_block
, merge_block
, EDGE_TRUE_VALUE
);
313 edge false_edge
= find_edge (pred_block
, region_entry_dest
);
314 false_edge
->flags
&= ~EDGE_FALLTHRU
;
315 false_edge
->flags
|= EDGE_FALSE_VALUE
;
316 gimple_stmt_iterator gsi
= gsi_last_bb (pred_block
);
317 gcond
*cond
= gimple_build_cond (NE_EXPR
, integer_one_node
, integer_zero_node
,
318 NULL_TREE
, NULL_TREE
);
319 gsi_insert_after (&gsi
, cond
, GSI_CONTINUE_LINKING
);
320 if (dom_info_available_p (CDI_DOMINATORS
))
321 set_immediate_dominator (CDI_DOMINATORS
, merge_block
, pred_block
);
323 ifsese if_region
= XNEW (ifsese_s
);
324 if_region
->region
= XCNEW (sese_info_t
);
325 if_region
->true_region
= XCNEW (sese_info_t
);
326 if_region
->false_region
= XCNEW (sese_info_t
);
327 if_region
->region
->region
.entry
= single_pred_edge (pred_block
);
328 if_region
->region
->region
.exit
= single_succ_edge (merge_block
);
329 if_region
->false_region
->region
.entry
= false_edge
;
330 if_region
->false_region
->region
.exit
= region
->region
.exit
;
331 if_region
->true_region
->region
.entry
= true_edge
;
332 if_region
->true_region
->region
.exit
333 = single_succ_edge (split_edge (true_edge
));
335 region
->region
= if_region
->false_region
->region
;
340 /* Replaces the condition of the IF_REGION with CONDITION:
348 set_ifsese_condition (ifsese if_region
, tree condition
)
350 sese_info_p region
= if_region
->region
;
351 edge entry
= region
->region
.entry
;
352 basic_block bb
= entry
->dest
;
353 gimple
*last
= last_stmt (bb
);
354 gimple_stmt_iterator gsi
= gsi_last_bb (bb
);
357 gcc_assert (gimple_code (last
) == GIMPLE_COND
);
359 gsi_remove (&gsi
, true);
360 gsi
= gsi_last_bb (bb
);
361 condition
= force_gimple_operand_gsi (&gsi
, condition
, true, NULL
,
362 false, GSI_NEW_STMT
);
363 cond_stmt
= gimple_build_cond_from_tree (condition
, NULL_TREE
, NULL_TREE
);
364 gsi
= gsi_last_bb (bb
);
365 gsi_insert_after (&gsi
, cond_stmt
, GSI_NEW_STMT
);
368 /* Return true when T is defined outside REGION or when no definitions are
369 variant in REGION. When HAS_VDEFS is a valid pointer, sets HAS_VDEFS to true
370 when T depends on memory that may change in REGION. */
373 invariant_in_sese_p_rec (tree t
, const sese_l
®ion
, bool *has_vdefs
)
375 if (!defined_in_sese_p (t
, region
))
378 gimple
*stmt
= SSA_NAME_DEF_STMT (t
);
380 if (gimple_code (stmt
) == GIMPLE_PHI
381 || gimple_code (stmt
) == GIMPLE_CALL
)
384 /* VDEF is variant when it is in the region. */
385 if (gimple_vdef (stmt
))
392 /* A VUSE may or may not be variant following the VDEFs. */
393 if (tree vuse
= gimple_vuse (stmt
))
394 return invariant_in_sese_p_rec (vuse
, region
, has_vdefs
);
398 FOR_EACH_SSA_USE_OPERAND (use_p
, stmt
, iter
, SSA_OP_USE
)
400 tree use
= USE_FROM_PTR (use_p
);
402 if (!defined_in_sese_p (use
, region
))
405 if (!invariant_in_sese_p_rec (use
, region
, has_vdefs
))
412 /* Return true when DEF can be analyzed in REGION by the scalar
413 evolution analyzer. */
416 scev_analyzable_p (tree def
, sese_l
®ion
)
420 tree type
= TREE_TYPE (def
);
422 /* When Graphite generates code for a scev, the code generator
423 expresses the scev in function of a single induction variable.
424 This is unsafe for floating point computations, as it may replace
425 a floating point sum reduction with a multiplication. The
426 following test returns false for non integer types to avoid such
428 if (!INTEGRAL_TYPE_P (type
)
429 && !POINTER_TYPE_P (type
))
432 loop
= loop_containing_stmt (SSA_NAME_DEF_STMT (def
));
433 scev
= scalar_evolution_in_region (region
, loop
, def
);
435 return (!chrec_contains_undetermined (scev
)
436 && (TREE_CODE (scev
) != SSA_NAME
437 || !defined_in_sese_p (scev
, region
))
438 && scev_is_linear_expression (scev
)
440 || ! loop_in_sese_p (loop
, region
)
441 || ! chrec_contains_symbols_defined_in_loop (scev
, loop
->num
)));
444 /* Returns the scalar evolution of T in REGION. Every variable that
445 is not defined in the REGION is considered a parameter. */
448 scalar_evolution_in_region (const sese_l
®ion
, loop_p loop
, tree t
)
450 /* SCOP parameters. */
451 if (TREE_CODE (t
) == SSA_NAME
452 && !defined_in_sese_p (t
, region
))
455 if (!loop_in_sese_p (loop
, region
))
458 return instantiate_scev (region
.entry
, loop
,
459 analyze_scalar_evolution (loop
, t
));
462 /* Return true if BB is empty, contains only DEBUG_INSNs. */
465 sese_trivially_empty_bb_p (basic_block bb
)
467 gimple_stmt_iterator gsi
;
469 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
470 if (gimple_code (gsi_stmt (gsi
)) != GIMPLE_DEBUG
471 && gimple_code (gsi_stmt (gsi
)) != GIMPLE_LABEL
)
477 /* Pretty print edge E to FILE. */
480 print_edge (FILE *file
, const_edge e
)
482 fprintf (file
, "edge (bb_%d, bb_%d)", e
->src
->index
, e
->dest
->index
);
485 /* Pretty print sese S to FILE. */
488 print_sese (FILE *file
, const sese_l
&s
)
490 fprintf (file
, "(entry_"); print_edge (file
, s
.entry
);
491 fprintf (file
, ", exit_"); print_edge (file
, s
.exit
);
492 fprintf (file
, ")\n");
495 /* Pretty print edge E to STDERR. */
498 debug_edge (const_edge e
)
500 print_edge (stderr
, e
);
503 /* Pretty print sese S to STDERR. */
506 debug_sese (const sese_l
&s
)
508 print_sese (stderr
, s
);