Fix PR42681.
[official-gcc/Ramakrishna.git] / gcc / sese.c
blobf959bdb269e21d75d45d539e3a133d7bffc1bd02
1 /* Single entry single exit control flow regions.
2 Copyright (C) 2008, 2009 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)
11 any later version.
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/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "ggc.h"
27 #include "tree.h"
28 #include "rtl.h"
29 #include "basic-block.h"
30 #include "diagnostic.h"
31 #include "tree-flow.h"
32 #include "toplev.h"
33 #include "tree-dump.h"
34 #include "timevar.h"
35 #include "cfgloop.h"
36 #include "tree-chrec.h"
37 #include "tree-data-ref.h"
38 #include "tree-scalar-evolution.h"
39 #include "tree-pass.h"
40 #include "domwalk.h"
41 #include "value-prof.h"
42 #include "pointer-set.h"
43 #include "gimple.h"
44 #include "sese.h"
46 /* Print to stderr the element ELT. */
48 static void
49 debug_rename_elt (rename_map_elt elt)
51 fprintf (stderr, "(");
52 print_generic_expr (stderr, elt->old_name, 0);
53 fprintf (stderr, ", ");
54 print_generic_expr (stderr, elt->expr, 0);
55 fprintf (stderr, ")\n");
58 /* Helper function for debug_rename_map. */
60 static int
61 debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
63 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
64 debug_rename_elt (entry);
65 return 1;
68 /* Print to stderr all the elements of MAP. */
70 void
71 debug_rename_map (htab_t map)
73 htab_traverse (map, debug_rename_map_1, NULL);
76 /* Computes a hash function for database element ELT. */
78 hashval_t
79 rename_map_elt_info (const void *elt)
81 return SSA_NAME_VERSION (((const struct rename_map_elt_s *) elt)->old_name);
84 /* Compares database elements E1 and E2. */
86 int
87 eq_rename_map_elts (const void *e1, const void *e2)
89 const struct rename_map_elt_s *elt1 = (const struct rename_map_elt_s *) e1;
90 const struct rename_map_elt_s *elt2 = (const struct rename_map_elt_s *) e2;
92 return (elt1->old_name == elt2->old_name);
97 /* Print to stderr the element ELT. */
99 static void
100 debug_ivtype_elt (ivtype_map_elt elt)
102 fprintf (stderr, "(%s, ", elt->cloog_iv);
103 print_generic_expr (stderr, elt->type, 0);
104 fprintf (stderr, ")\n");
107 /* Helper function for debug_ivtype_map. */
109 static int
110 debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
112 struct ivtype_map_elt_s *entry = (struct ivtype_map_elt_s *) *slot;
113 debug_ivtype_elt (entry);
114 return 1;
117 /* Print to stderr all the elements of MAP. */
119 void
120 debug_ivtype_map (htab_t map)
122 htab_traverse (map, debug_ivtype_map_1, NULL);
125 /* Computes a hash function for database element ELT. */
127 hashval_t
128 ivtype_map_elt_info (const void *elt)
130 return htab_hash_pointer (((const struct ivtype_map_elt_s *) elt)->cloog_iv);
133 /* Compares database elements E1 and E2. */
136 eq_ivtype_map_elts (const void *e1, const void *e2)
138 const struct ivtype_map_elt_s *elt1 = (const struct ivtype_map_elt_s *) e1;
139 const struct ivtype_map_elt_s *elt2 = (const struct ivtype_map_elt_s *) e2;
141 return (elt1->cloog_iv == elt2->cloog_iv);
146 /* Record LOOP as occuring in REGION. */
148 static void
149 sese_record_loop (sese region, loop_p loop)
151 if (sese_contains_loop (region, loop))
152 return;
154 bitmap_set_bit (SESE_LOOPS (region), loop->num);
155 VEC_safe_push (loop_p, heap, SESE_LOOP_NEST (region), loop);
158 /* Build the loop nests contained in REGION. Returns true when the
159 operation was successful. */
161 void
162 build_sese_loop_nests (sese region)
164 unsigned i;
165 basic_block bb;
166 struct loop *loop0, *loop1;
168 FOR_EACH_BB (bb)
169 if (bb_in_sese_p (bb, region))
171 struct loop *loop = bb->loop_father;
173 /* Only add loops if they are completely contained in the SCoP. */
174 if (loop->header == bb
175 && bb_in_sese_p (loop->latch, region))
176 sese_record_loop (region, loop);
179 /* Make sure that the loops in the SESE_LOOP_NEST are ordered. It
180 can be the case that an inner loop is inserted before an outer
181 loop. To avoid this, semi-sort once. */
182 for (i = 0; VEC_iterate (loop_p, SESE_LOOP_NEST (region), i, loop0); i++)
184 if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1)
185 break;
187 loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1);
188 if (loop0->num > loop1->num)
190 VEC_replace (loop_p, SESE_LOOP_NEST (region), i, loop1);
191 VEC_replace (loop_p, SESE_LOOP_NEST (region), i + 1, loop0);
196 /* For a USE in BB, if BB is outside REGION, mark the USE in the
197 LIVEOUTS set. */
199 static void
200 sese_build_liveouts_use (sese region, bitmap liveouts, basic_block bb,
201 tree use)
203 unsigned ver;
204 basic_block def_bb;
206 if (TREE_CODE (use) != SSA_NAME)
207 return;
209 ver = SSA_NAME_VERSION (use);
210 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
212 if (!def_bb
213 || !bb_in_sese_p (def_bb, region)
214 || bb_in_sese_p (bb, region))
215 return;
217 bitmap_set_bit (liveouts, ver);
220 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are
221 used in BB that is outside of the REGION. */
223 static void
224 sese_build_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
226 gimple_stmt_iterator bsi;
227 edge e;
228 edge_iterator ei;
229 ssa_op_iter iter;
230 use_operand_p use_p;
232 FOR_EACH_EDGE (e, ei, bb->succs)
233 for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi))
234 sese_build_liveouts_use (region, liveouts, bb,
235 PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
237 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
239 gimple stmt = gsi_stmt (bsi);
241 if (is_gimple_debug (stmt))
242 continue;
244 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
245 sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
249 /* For a USE in BB, return true if BB is outside REGION and it's not
250 in the LIVEOUTS set. */
252 static bool
253 sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb,
254 tree use)
256 unsigned ver;
257 basic_block def_bb;
259 if (TREE_CODE (use) != SSA_NAME)
260 return false;
262 ver = SSA_NAME_VERSION (use);
264 /* If it's in liveouts, the variable will get a new PHI node, and
265 the debug use will be properly adjusted. */
266 if (bitmap_bit_p (liveouts, ver))
267 return false;
269 def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
271 if (!def_bb
272 || !bb_in_sese_p (def_bb, region)
273 || bb_in_sese_p (bb, region))
274 return false;
276 return true;
279 /* Reset debug stmts that reference SSA_NAMES defined in REGION that
280 are not marked as liveouts. */
282 static void
283 sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
285 gimple_stmt_iterator bsi;
286 ssa_op_iter iter;
287 use_operand_p use_p;
289 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
291 gimple stmt = gsi_stmt (bsi);
293 if (!is_gimple_debug (stmt))
294 continue;
296 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
297 if (sese_bad_liveouts_use (region, liveouts, bb,
298 USE_FROM_PTR (use_p)))
300 gimple_debug_bind_reset_value (stmt);
301 update_stmt (stmt);
302 break;
307 /* Build the LIVEOUTS of REGION: the set of variables defined inside
308 and used outside the REGION. */
310 static void
311 sese_build_liveouts (sese region, bitmap liveouts)
313 basic_block bb;
315 FOR_EACH_BB (bb)
316 sese_build_liveouts_bb (region, liveouts, bb);
317 if (MAY_HAVE_DEBUG_INSNS)
318 FOR_EACH_BB (bb)
319 sese_reset_debug_liveouts_bb (region, liveouts, bb);
322 /* Builds a new SESE region from edges ENTRY and EXIT. */
324 sese
325 new_sese (edge entry, edge exit)
327 sese region = XNEW (struct sese_s);
329 SESE_ENTRY (region) = entry;
330 SESE_EXIT (region) = exit;
331 SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
332 SESE_LOOP_NEST (region) = VEC_alloc (loop_p, heap, 3);
333 SESE_ADD_PARAMS (region) = true;
334 SESE_PARAMS (region) = VEC_alloc (tree, heap, 3);
336 return region;
339 /* Deletes REGION. */
341 void
342 free_sese (sese region)
344 if (SESE_LOOPS (region))
345 SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
347 VEC_free (tree, heap, SESE_PARAMS (region));
348 VEC_free (loop_p, heap, SESE_LOOP_NEST (region));
350 XDELETE (region);
353 /* Add exit phis for USE on EXIT. */
355 static void
356 sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
358 gimple phi = create_phi_node (use, exit);
360 create_new_def_for (gimple_phi_result (phi), phi,
361 gimple_phi_result_ptr (phi));
362 add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
363 add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
366 /* Insert in the block BB phi nodes for variables defined in REGION
367 and used outside the REGION. The code generation moves REGION in
368 the else clause of an "if (1)" and generates code in the then
369 clause that is at this point empty:
371 | if (1)
372 | empty;
373 | else
374 | REGION;
377 void
378 sese_insert_phis_for_liveouts (sese region, basic_block bb,
379 edge false_e, edge true_e)
381 unsigned i;
382 bitmap_iterator bi;
383 bitmap liveouts = BITMAP_ALLOC (NULL);
385 update_ssa (TODO_update_ssa);
387 sese_build_liveouts (region, liveouts);
388 EXECUTE_IF_SET_IN_BITMAP (liveouts, 0, i, bi)
389 sese_add_exit_phis_edge (bb, ssa_name (i), false_e, true_e);
390 BITMAP_FREE (liveouts);
392 update_ssa (TODO_update_ssa);
395 /* Get the definition of NAME before the SESE. Keep track of the
396 basic blocks that have been VISITED in a bitmap. */
398 static tree
399 get_vdef_before_sese (sese region, tree name, sbitmap visited)
401 unsigned i;
402 gimple stmt = SSA_NAME_DEF_STMT (name);
403 basic_block def_bb = gimple_bb (stmt);
405 if (!def_bb || !bb_in_sese_p (def_bb, region))
406 return name;
408 if (TEST_BIT (visited, def_bb->index))
409 return NULL_TREE;
411 SET_BIT (visited, def_bb->index);
413 switch (gimple_code (stmt))
415 case GIMPLE_PHI:
416 for (i = 0; i < gimple_phi_num_args (stmt); i++)
418 tree arg = gimple_phi_arg_def (stmt, i);
419 tree res;
421 if (gimple_bb (SSA_NAME_DEF_STMT (arg))
422 && def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (arg))->index)
423 continue;
425 res = get_vdef_before_sese (region, arg, visited);
426 if (res)
427 return res;
429 return NULL_TREE;
431 case GIMPLE_ASSIGN:
432 case GIMPLE_CALL:
434 use_operand_p use_p = gimple_vuse_op (stmt);
435 tree use = USE_FROM_PTR (use_p);
437 if (def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (use))->index)
438 RESET_BIT (visited, def_bb->index);
440 return get_vdef_before_sese (region, use, visited);
443 default:
444 return NULL_TREE;
448 /* Adjust a virtual phi node PHI that is placed at the end of the
449 generated code for SCOP:
451 | if (1)
452 | generated code from REGION;
453 | else
454 | REGION;
456 The FALSE_E edge comes from the original code, TRUE_E edge comes
457 from the code generated for the SCOP. */
459 static void
460 sese_adjust_vphi (sese region, gimple phi, edge true_e)
462 unsigned i;
464 gcc_assert (gimple_phi_num_args (phi) == 2);
466 for (i = 0; i < gimple_phi_num_args (phi); i++)
467 if (gimple_phi_arg_edge (phi, i) == true_e)
469 tree true_arg, false_arg, before_scop_arg;
470 sbitmap visited;
472 true_arg = gimple_phi_arg_def (phi, i);
473 if (!SSA_NAME_IS_DEFAULT_DEF (true_arg))
474 return;
476 false_arg = gimple_phi_arg_def (phi, i == 0 ? 1 : 0);
477 if (SSA_NAME_IS_DEFAULT_DEF (false_arg))
478 return;
480 visited = sbitmap_alloc (last_basic_block);
481 sbitmap_zero (visited);
482 before_scop_arg = get_vdef_before_sese (region, false_arg, visited);
483 gcc_assert (before_scop_arg != NULL_TREE);
484 SET_PHI_ARG_DEF (phi, i, before_scop_arg);
485 sbitmap_free (visited);
489 /* Returns the expression associated to OLD_NAME in MAP. */
491 static tree
492 get_rename (htab_t map, tree old_name)
494 struct rename_map_elt_s tmp;
495 PTR *slot;
497 tmp.old_name = old_name;
498 slot = htab_find_slot (map, &tmp, NO_INSERT);
500 if (slot && *slot)
501 return ((rename_map_elt) *slot)->expr;
503 return old_name;
506 /* Register in MAP the rename tuple (OLD_NAME, EXPR). */
508 void
509 set_rename (htab_t map, tree old_name, tree expr)
511 struct rename_map_elt_s tmp;
512 PTR *slot;
514 if (old_name == expr)
515 return;
517 tmp.old_name = old_name;
518 slot = htab_find_slot (map, &tmp, INSERT);
520 if (!slot)
521 return;
523 if (*slot)
524 free (*slot);
526 *slot = new_rename_map_elt (old_name, expr);
529 static void rename_variables_in_expr (htab_t, tree);
531 /* Renames the operand OP of expression T following the tuples
532 (OLD_NAME, EXPR) in RENAME_MAP. */
534 static void
535 rename_variables_in_operand (htab_t rename_map, tree t, int op)
537 tree operand = TREE_OPERAND (t, op);
539 if (TREE_CODE (operand) == SSA_NAME)
541 tree new_name = get_rename (rename_map, operand);
543 if (new_name != operand)
544 TREE_OPERAND (t, op) = new_name;
546 else
547 rename_variables_in_expr (rename_map, operand);
550 /* Renames the expression T following the tuples (OLD_NAME, EXPR) in
551 RENAME_MAP. */
553 static void
554 rename_variables_in_expr (htab_t rename_map, tree t)
556 if (!t)
557 return;
559 switch (TREE_CODE_LENGTH (TREE_CODE (t)))
561 case 3:
562 rename_variables_in_operand (rename_map, t, 2);
564 case 2:
565 rename_variables_in_operand (rename_map, t, 1);
567 case 1:
568 rename_variables_in_operand (rename_map, t, 0);
570 default:
571 return;
575 /* Renames all the loop->nb_iterations expressions following the
576 tuples (OLD_NAME, EXPR) in RENAME_MAP. */
578 void
579 rename_nb_iterations (htab_t rename_map)
581 loop_iterator li;
582 struct loop *loop;
584 FOR_EACH_LOOP (li, loop, 0)
586 rename_variables_in_expr (rename_map, loop->nb_iterations);
590 /* Adjusts the phi nodes in the block BB for variables defined in
591 SCOP_REGION and used outside the SCOP_REGION. The code generation
592 moves SCOP_REGION in the else clause of an "if (1)" and generates
593 code in the then clause:
595 | if (1)
596 | generated code from REGION;
597 | else
598 | REGION;
600 To adjust the phi nodes after the condition, the RENAME_MAP is
601 used. */
603 void
604 sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
605 edge false_e, edge true_e)
607 gimple_stmt_iterator si;
609 for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
611 unsigned i;
612 unsigned false_i = 0;
613 gimple phi = gsi_stmt (si);
614 tree res = gimple_phi_result (phi);
616 if (!is_gimple_reg (res))
618 sese_adjust_vphi (region, phi, true_e);
619 continue;
622 for (i = 0; i < gimple_phi_num_args (phi); i++)
623 if (gimple_phi_arg_edge (phi, i) == false_e)
625 false_i = i;
626 break;
629 for (i = 0; i < gimple_phi_num_args (phi); i++)
630 if (gimple_phi_arg_edge (phi, i) == true_e)
632 tree old_name = gimple_phi_arg_def (phi, false_i);
633 tree expr = get_rename (rename_map, old_name);
634 gimple_seq stmts;
636 gcc_assert (old_name != expr);
638 if (TREE_CODE (expr) != SSA_NAME
639 && is_gimple_reg (old_name))
641 tree type = TREE_TYPE (old_name);
642 tree var = create_tmp_var (type, "var");
644 expr = build2 (MODIFY_EXPR, type, var, expr);
645 expr = force_gimple_operand (expr, &stmts, true, NULL);
646 gsi_insert_seq_on_edge_immediate (true_e, stmts);
649 SET_PHI_ARG_DEF (phi, i, expr);
650 set_rename (rename_map, old_name, res);
655 /* Rename the SSA_NAMEs used in STMT and that appear in MAP. */
657 static void
658 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi)
660 ssa_op_iter iter;
661 use_operand_p use_p;
663 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
665 tree use = USE_FROM_PTR (use_p);
666 tree expr = get_rename (map, use);
667 tree type_use = TREE_TYPE (use);
668 tree type_expr = TREE_TYPE (expr);
669 gimple_seq stmts;
671 if (use == expr)
672 continue;
674 if (type_use != type_expr
675 || (TREE_CODE (expr) != SSA_NAME
676 && is_gimple_reg (use)))
678 tree var;
680 if (is_gimple_debug (stmt))
682 if (gimple_debug_bind_p (stmt))
683 gimple_debug_bind_reset_value (stmt);
684 else
685 gcc_unreachable ();
687 break;
690 var = create_tmp_var (type_use, "var");
692 if (type_use != type_expr)
693 expr = fold_convert (type_use, expr);
695 expr = build2 (MODIFY_EXPR, type_use, var, expr);
696 expr = force_gimple_operand (expr, &stmts, true, NULL);
697 gsi_insert_seq_before (insert_gsi, stmts, GSI_SAME_STMT);
700 replace_exp (use_p, expr);
703 update_stmt (stmt);
706 /* Returns true if NAME is a parameter of SESE. */
708 static bool
709 is_parameter (sese region, tree name)
711 int i;
712 tree p;
714 for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
715 if (p == name)
716 return true;
718 return false;
721 /* Returns true if NAME is an induction variable. */
723 static bool
724 is_iv (tree name)
726 return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
729 static void expand_scalar_variables_stmt (gimple, basic_block, sese,
730 htab_t, gimple_stmt_iterator *);
731 static tree
732 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block,
733 sese, htab_t, gimple_stmt_iterator *);
735 static tree
736 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region,
737 htab_t map, gimple_stmt_iterator *gsi)
739 int i, nargs = gimple_call_num_args (stmt);
740 VEC (tree, gc) *args = VEC_alloc (tree, gc, nargs);
741 tree fn_type = TREE_TYPE (gimple_call_fn (stmt));
742 tree fn = gimple_call_fndecl (stmt);
743 tree call_expr, var, lhs;
744 gimple call;
746 for (i = 0; i < nargs; i++)
748 tree arg = gimple_call_arg (stmt, i);
749 tree t = TREE_TYPE (arg);
751 var = create_tmp_var (t, "var");
752 arg = expand_scalar_variables_expr (t, arg, TREE_CODE (arg), NULL,
753 bb, region, map, gsi);
754 arg = build2 (MODIFY_EXPR, t, var, arg);
755 arg = force_gimple_operand_gsi (gsi, arg, true, NULL,
756 true, GSI_SAME_STMT);
757 VEC_quick_push (tree, args, arg);
760 lhs = gimple_call_lhs (stmt);
761 var = create_tmp_var (TREE_TYPE (lhs), "var");
762 call_expr = build_call_vec (fn_type, fn, args);
763 call = gimple_build_call_from_tree (call_expr);
764 var = make_ssa_name (var, call);
765 gimple_call_set_lhs (call, var);
766 gsi_insert_before (gsi, call, GSI_SAME_STMT);
768 return var;
771 /* Copies at GSI all the scalar computations on which the ssa_name OP0
772 depends on in the SESE: these are all the scalar variables used in
773 the definition of OP0, that are defined outside BB and still in the
774 SESE, i.e. not a parameter of the SESE. The expression that is
775 returned contains only induction variables from the generated code:
776 MAP contains the induction variables renaming mapping, and is used
777 to translate the names of induction variables. */
779 static tree
780 expand_scalar_variables_ssa_name (tree op0, basic_block bb,
781 sese region, htab_t map,
782 gimple_stmt_iterator *gsi)
784 gimple def_stmt;
785 tree new_op;
787 if (is_parameter (region, op0)
788 || is_iv (op0))
789 return get_rename (map, op0);
791 def_stmt = SSA_NAME_DEF_STMT (op0);
793 /* Check whether we already have a rename for OP0. */
794 new_op = get_rename (map, op0);
796 if (new_op != op0
797 && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb)
798 return new_op;
800 if (gimple_bb (def_stmt) == bb)
802 /* If the defining statement is in the basic block already
803 we do not need to create a new expression for it, we
804 only need to ensure its operands are expanded. */
805 expand_scalar_variables_stmt (def_stmt, bb, region, map, gsi);
806 return new_op;
808 else
810 if (!gimple_bb (def_stmt)
811 || !bb_in_sese_p (gimple_bb (def_stmt), region))
812 return new_op;
814 switch (gimple_code (def_stmt))
816 case GIMPLE_ASSIGN:
818 tree var0 = gimple_assign_rhs1 (def_stmt);
819 enum tree_code subcode = gimple_assign_rhs_code (def_stmt);
820 tree var1 = gimple_assign_rhs2 (def_stmt);
821 tree type = gimple_expr_type (def_stmt);
823 return expand_scalar_variables_expr (type, var0, subcode, var1, bb,
824 region, map, gsi);
827 case GIMPLE_CALL:
828 return expand_scalar_variables_call (def_stmt, bb, region, map, gsi);
830 default:
831 gcc_unreachable ();
832 return new_op;
837 /* Copies at GSI all the scalar computations on which the expression
838 OP0 CODE OP1 depends on in the SESE: these are all the scalar
839 variables used in OP0 and OP1, defined outside BB and still defined
840 in the SESE, i.e. not a parameter of the SESE. The expression that
841 is returned contains only induction variables from the generated
842 code: MAP contains the induction variables renaming mapping, and is
843 used to translate the names of induction variables. */
845 static tree
846 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code,
847 tree op1, basic_block bb, sese region,
848 htab_t map, gimple_stmt_iterator *gsi)
850 if (TREE_CODE_CLASS (code) == tcc_constant
851 || TREE_CODE_CLASS (code) == tcc_declaration)
852 return op0;
854 /* For data references we have to duplicate also its memory
855 indexing. */
856 if (TREE_CODE_CLASS (code) == tcc_reference)
858 switch (code)
860 case REALPART_EXPR:
861 case IMAGPART_EXPR:
863 tree op = TREE_OPERAND (op0, 0);
864 tree res = expand_scalar_variables_expr
865 (type, op, TREE_CODE (op), NULL, bb, region, map, gsi);
866 return build1 (code, type, res);
869 case INDIRECT_REF:
871 tree old_name = TREE_OPERAND (op0, 0);
872 tree expr = expand_scalar_variables_ssa_name
873 (old_name, bb, region, map, gsi);
875 if (TREE_CODE (expr) != SSA_NAME
876 && is_gimple_reg (old_name))
878 tree type = TREE_TYPE (old_name);
879 tree var = create_tmp_var (type, "var");
881 expr = build2 (MODIFY_EXPR, type, var, expr);
882 expr = force_gimple_operand_gsi (gsi, expr, true, NULL,
883 true, GSI_SAME_STMT);
886 return fold_build1 (code, type, expr);
889 case ARRAY_REF:
891 tree op00 = TREE_OPERAND (op0, 0);
892 tree op01 = TREE_OPERAND (op0, 1);
893 tree op02 = TREE_OPERAND (op0, 2);
894 tree op03 = TREE_OPERAND (op0, 3);
895 tree base = expand_scalar_variables_expr
896 (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, region,
897 map, gsi);
898 tree subscript = expand_scalar_variables_expr
899 (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, region,
900 map, gsi);
902 return build4 (ARRAY_REF, type, base, subscript, op02, op03);
905 default:
906 /* The above cases should catch everything. */
907 gcc_unreachable ();
911 if (TREE_CODE_CLASS (code) == tcc_unary)
913 tree op0_type = TREE_TYPE (op0);
914 enum tree_code op0_code = TREE_CODE (op0);
915 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
916 NULL, bb, region, map, gsi);
918 return fold_build1 (code, type, op0_expr);
921 if (TREE_CODE_CLASS (code) == tcc_binary
922 || TREE_CODE_CLASS (code) == tcc_comparison)
924 tree op0_type = TREE_TYPE (op0);
925 enum tree_code op0_code = TREE_CODE (op0);
926 tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
927 NULL, bb, region, map, gsi);
928 tree op1_type = TREE_TYPE (op1);
929 enum tree_code op1_code = TREE_CODE (op1);
930 tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code,
931 NULL, bb, region, map, gsi);
933 return fold_build2 (code, type, op0_expr, op1_expr);
936 if (code == SSA_NAME)
937 return expand_scalar_variables_ssa_name (op0, bb, region, map, gsi);
939 if (code == ADDR_EXPR)
941 tree op00 = TREE_OPERAND (op0, 0);
943 if (handled_component_p (op00)
944 && TREE_CODE (op00) == ARRAY_REF)
946 tree e = expand_scalar_variables_expr (TREE_TYPE (op00), op00,
947 TREE_CODE (op00),
948 NULL, bb, region, map, gsi);
949 return fold_build1 (code, TREE_TYPE (op0), e);
952 return op0;
955 gcc_unreachable ();
956 return NULL;
959 /* Copies at the beginning of BB all the scalar computations on which
960 STMT depends on in the SESE: these are all the scalar variables used
961 in STMT, defined outside BB and still defined in the SESE, i.e. not a
962 parameter of the SESE. The expression that is returned contains
963 only induction variables from the generated code: MAP contains the
964 induction variables renaming mapping, and is used to translate the
965 names of induction variables. */
967 static void
968 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
969 htab_t map, gimple_stmt_iterator *gsi)
971 ssa_op_iter iter;
972 use_operand_p use_p;
974 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
976 tree use = USE_FROM_PTR (use_p);
977 tree type = TREE_TYPE (use);
978 enum tree_code code = TREE_CODE (use);
979 tree use_expr;
981 if (!is_gimple_reg (use))
982 continue;
984 /* Don't expand USE if we already have a rename for it. */
985 use_expr = get_rename (map, use);
986 if (use_expr != use)
987 continue;
989 use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
990 region, map, gsi);
991 use_expr = fold_convert (type, use_expr);
993 if (use_expr == use)
994 continue;
996 if (is_gimple_debug (stmt))
998 if (gimple_debug_bind_p (stmt))
999 gimple_debug_bind_reset_value (stmt);
1000 else
1001 gcc_unreachable ();
1003 break;
1006 if (TREE_CODE (use_expr) != SSA_NAME)
1008 tree var = create_tmp_var (type, "var");
1010 use_expr = build2 (MODIFY_EXPR, type, var, use_expr);
1011 use_expr = force_gimple_operand_gsi (gsi, use_expr, true, NULL,
1012 true, GSI_SAME_STMT);
1015 replace_exp (use_p, use_expr);
1018 update_stmt (stmt);
1021 /* Copies at the beginning of BB all the scalar computations on which
1022 BB depends on in the SESE: these are all the scalar variables used
1023 in BB, defined outside BB and still defined in the SESE, i.e. not a
1024 parameter of the SESE. The expression that is returned contains
1025 only induction variables from the generated code: MAP contains the
1026 induction variables renaming mapping, and is used to translate the
1027 names of induction variables. */
1029 static void
1030 expand_scalar_variables (basic_block bb, sese region, htab_t map)
1032 gimple_stmt_iterator gsi;
1034 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
1036 gimple stmt = gsi_stmt (gsi);
1037 expand_scalar_variables_stmt (stmt, bb, region, map, &gsi);
1038 gsi_next (&gsi);
1042 /* Rename all the SSA_NAMEs from block BB according to the MAP. */
1044 static void
1045 rename_variables (basic_block bb, htab_t map)
1047 gimple_stmt_iterator gsi;
1048 gimple_stmt_iterator insert_gsi = gsi_start_bb (bb);
1050 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1051 rename_variables_in_stmt (gsi_stmt (gsi), map, &insert_gsi);
1054 /* Remove condition from BB. */
1056 static void
1057 remove_condition (basic_block bb)
1059 gimple last = last_stmt (bb);
1061 if (last && gimple_code (last) == GIMPLE_COND)
1063 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1064 gsi_remove (&gsi, true);
1068 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set. */
1070 edge
1071 get_true_edge_from_guard_bb (basic_block bb)
1073 edge e;
1074 edge_iterator ei;
1076 FOR_EACH_EDGE (e, ei, bb->succs)
1077 if (e->flags & EDGE_TRUE_VALUE)
1078 return e;
1080 gcc_unreachable ();
1081 return NULL;
1084 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared. */
1086 edge
1087 get_false_edge_from_guard_bb (basic_block bb)
1089 edge e;
1090 edge_iterator ei;
1092 FOR_EACH_EDGE (e, ei, bb->succs)
1093 if (!(e->flags & EDGE_TRUE_VALUE))
1094 return e;
1096 gcc_unreachable ();
1097 return NULL;
1100 /* Returns true when NAME is defined in LOOP. */
1102 static bool
1103 name_defined_in_loop_p (tree name, loop_p loop)
1105 gimple stmt = SSA_NAME_DEF_STMT (name);
1107 return (gimple_bb (stmt)->loop_father == loop);
1110 /* Returns true when EXPR contains SSA_NAMEs defined in LOOP. */
1112 static bool
1113 expr_defined_in_loop_p (tree expr, loop_p loop)
1115 switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
1117 case 3:
1118 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1119 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop)
1120 || expr_defined_in_loop_p (TREE_OPERAND (expr, 2), loop);
1122 case 2:
1123 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1124 || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop);
1126 case 1:
1127 return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop);
1129 case 0:
1130 return TREE_CODE (expr) == SSA_NAME
1131 && name_defined_in_loop_p (expr, loop);
1133 default:
1134 return false;
1138 /* Returns the gimple statement that uses NAME outside the loop it is
1139 defined in, returns NULL if there is no such loop close phi node.
1140 An invariant of the loop closed SSA form is that the only use of a
1141 variable, outside the loop it is defined in, is in the loop close
1142 phi node that just follows the loop. */
1144 static gimple
1145 alive_after_loop (tree name)
1147 use_operand_p use_p;
1148 imm_use_iterator imm_iter;
1149 loop_p loop = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father;
1151 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
1153 gimple stmt = USE_STMT (use_p);
1155 if (gimple_code (stmt) == GIMPLE_PHI
1156 && gimple_bb (stmt)->loop_father != loop)
1157 return stmt;
1160 return NULL;
1163 /* Return true if a close phi has not yet been inserted for the use of
1164 variable NAME on the single exit of LOOP. */
1166 static bool
1167 close_phi_not_yet_inserted_p (loop_p loop, tree name)
1169 gimple_stmt_iterator psi;
1170 basic_block bb = single_exit (loop)->dest;
1172 for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
1173 if (gimple_phi_arg_def (gsi_stmt (psi), 0) == name)
1174 return false;
1176 return true;
1179 /* A structure for passing parameters to add_loop_exit_phis. */
1181 typedef struct alep {
1182 loop_p loop;
1183 VEC (rename_map_elt, heap) *new_renames;
1184 } *alep_p;
1186 /* Helper function for htab_traverse in insert_loop_close_phis. */
1188 static int
1189 add_loop_exit_phis (void **slot, void *data)
1191 struct rename_map_elt_s *entry;
1192 alep_p a;
1193 loop_p loop;
1194 tree expr, new_name, old_name;
1195 bool def_in_loop_p, used_outside_p, need_close_phi_p;
1196 gimple old_close_phi;
1198 if (!slot || !*slot || !data)
1199 return 1;
1201 entry = (struct rename_map_elt_s *) *slot;
1202 a = (alep_p) data;
1203 loop = a->loop;
1204 new_name = expr = entry->expr;
1205 old_name = entry->old_name;
1207 def_in_loop_p = expr_defined_in_loop_p (expr, loop);
1208 if (!def_in_loop_p)
1209 return 1;
1211 /* Remove the old rename from the map when the expression is defined
1212 in the loop that we're closing. */
1213 free (*slot);
1214 *slot = NULL;
1216 if (TREE_CODE (expr) != SSA_NAME)
1217 return 1;
1219 old_close_phi = alive_after_loop (old_name);
1220 used_outside_p = (old_close_phi != NULL);
1221 need_close_phi_p = (used_outside_p
1222 && close_phi_not_yet_inserted_p (loop, new_name));
1224 /* Insert a loop close phi node. */
1225 if (need_close_phi_p)
1227 basic_block bb = single_exit (loop)->dest;
1228 gimple phi = create_phi_node (new_name, bb);
1229 tree new_res = create_new_def_for (gimple_phi_result (phi), phi,
1230 gimple_phi_result_ptr (phi));
1232 add_phi_arg (phi, new_name, single_pred_edge (bb), UNKNOWN_LOCATION);
1233 VEC_safe_push (rename_map_elt, heap, a->new_renames,
1234 new_rename_map_elt (gimple_phi_result (old_close_phi),
1235 new_res));
1238 return 1;
1241 /* Traverses MAP and removes from it all the tuples (OLD, NEW) where
1242 NEW is defined in LOOP. Inserts on the exit of LOOP the close phi
1243 node "RES = phi (NEW)" corresponding to "OLD_RES = phi (OLD)" in
1244 the original code. Inserts in MAP the tuple (OLD_RES, RES). */
1246 void
1247 insert_loop_close_phis (htab_t map, loop_p loop)
1249 int i;
1250 struct alep a;
1251 rename_map_elt elt;
1253 a.loop = loop;
1254 a.new_renames = VEC_alloc (rename_map_elt, heap, 3);
1255 update_ssa (TODO_update_ssa);
1256 htab_traverse (map, add_loop_exit_phis, &a);
1257 update_ssa (TODO_update_ssa);
1259 for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++)
1261 set_rename (map, elt->old_name, elt->expr);
1262 free (elt);
1265 VEC_free (rename_map_elt, heap, a.new_renames);
1268 /* Helper structure for htab_traverse in insert_guard_phis. */
1270 struct igp {
1271 basic_block bb;
1272 edge true_edge, false_edge;
1273 htab_t before_guard;
1276 /* Return the default name that is before the guard. */
1278 static tree
1279 default_before_guard (htab_t before_guard, tree old_name)
1281 tree res = get_rename (before_guard, old_name);
1283 if (res == old_name)
1285 if (is_gimple_reg (res))
1286 return fold_convert (TREE_TYPE (res), integer_zero_node);
1287 return gimple_default_def (cfun, SSA_NAME_VAR (res));
1290 return res;
1293 /* Prepares EXPR to be a good phi argument when the phi result is
1294 RES. Insert needed statements on edge E. */
1296 static tree
1297 convert_for_phi_arg (tree expr, tree res, edge e)
1299 tree type = TREE_TYPE (res);
1301 if (TREE_TYPE (expr) != type)
1302 expr = fold_convert (type, expr);
1304 if (TREE_CODE (expr) != SSA_NAME
1305 && !is_gimple_min_invariant (expr))
1307 tree var = create_tmp_var (type, "var");
1308 gimple_seq stmts;
1310 expr = build2 (MODIFY_EXPR, type, var, expr);
1311 expr = force_gimple_operand (expr, &stmts, true, NULL);
1312 gsi_insert_seq_on_edge_immediate (e, stmts);
1315 return expr;
1318 /* Helper function for htab_traverse in insert_guard_phis. */
1320 static int
1321 add_guard_exit_phis (void **slot, void *s)
1323 struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
1324 struct igp *i = (struct igp *) s;
1325 basic_block bb = i->bb;
1326 edge true_edge = i->true_edge;
1327 edge false_edge = i->false_edge;
1328 tree res = entry->old_name;
1329 tree name1 = entry->expr;
1330 tree name2 = default_before_guard (i->before_guard, res);
1331 gimple phi;
1333 /* Nothing to be merged if the name before the guard is the same as
1334 the one after. */
1335 if (name1 == name2)
1336 return 1;
1338 name1 = convert_for_phi_arg (name1, res, true_edge);
1339 name2 = convert_for_phi_arg (name2, res, false_edge);
1341 phi = create_phi_node (res, bb);
1342 res = create_new_def_for (gimple_phi_result (phi), phi,
1343 gimple_phi_result_ptr (phi));
1345 add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION);
1346 add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION);
1348 entry->expr = res;
1349 *slot = entry;
1350 return 1;
1353 /* Iterate over RENAME_MAP and get tuples of the form (OLD, NAME1).
1354 If there is a correspondent tuple (OLD, NAME2) in BEFORE_GUARD,
1355 with NAME1 different than NAME2, then insert in BB the phi node:
1357 | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
1359 if there is no tuple for OLD in BEFORE_GUARD, insert
1361 | RES = phi (NAME1 (on TRUE_EDGE),
1362 | DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
1364 Finally register in RENAME_MAP the tuple (OLD, RES). */
1366 void
1367 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge,
1368 htab_t before_guard, htab_t rename_map)
1370 struct igp i;
1371 i.bb = bb;
1372 i.true_edge = true_edge;
1373 i.false_edge = false_edge;
1374 i.before_guard = before_guard;
1376 update_ssa (TODO_update_ssa);
1377 htab_traverse (rename_map, add_guard_exit_phis, &i);
1378 update_ssa (TODO_update_ssa);
1381 /* Create a duplicate of the basic block BB. NOTE: This does not
1382 preserve SSA form. */
1384 static void
1385 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
1387 gimple_stmt_iterator gsi, gsi_tgt;
1389 gsi_tgt = gsi_start_bb (new_bb);
1390 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1392 def_operand_p def_p;
1393 ssa_op_iter op_iter;
1394 gimple stmt = gsi_stmt (gsi);
1395 gimple copy;
1397 if (gimple_code (stmt) == GIMPLE_LABEL)
1398 continue;
1400 /* Create a new copy of STMT and duplicate STMT's virtual
1401 operands. */
1402 copy = gimple_copy (stmt);
1403 gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
1404 mark_sym_for_renaming (gimple_vop (cfun));
1406 maybe_duplicate_eh_stmt (copy, stmt);
1407 gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
1409 /* Create new names for all the definitions created by COPY and
1410 add replacement mappings for each new name. */
1411 FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
1413 tree old_name = DEF_FROM_PTR (def_p);
1414 tree new_name = create_new_def_for (old_name, copy, def_p);
1415 set_rename (map, old_name, new_name);
1420 /* Copies BB and includes in the copied BB all the statements that can
1421 be reached following the use-def chains from the memory accesses,
1422 and returns the next edge following this new block. */
1424 edge
1425 copy_bb_and_scalar_dependences (basic_block bb, sese region,
1426 edge next_e, htab_t map)
1428 basic_block new_bb = split_edge (next_e);
1430 next_e = single_succ_edge (new_bb);
1431 graphite_copy_stmts_from_block (bb, new_bb, map);
1432 remove_condition (new_bb);
1433 remove_phi_nodes (new_bb);
1434 expand_scalar_variables (new_bb, region, map);
1435 rename_variables (new_bb, map);
1437 return next_e;
1440 /* Returns the outermost loop in SCOP that contains BB. */
1442 struct loop *
1443 outermost_loop_in_sese (sese region, basic_block bb)
1445 struct loop *nest;
1447 nest = bb->loop_father;
1448 while (loop_outer (nest)
1449 && loop_in_sese_p (loop_outer (nest), region))
1450 nest = loop_outer (nest);
1452 return nest;
1455 /* Sets the false region of an IF_REGION to REGION. */
1457 void
1458 if_region_set_false_region (ifsese if_region, sese region)
1460 basic_block condition = if_region_get_condition_block (if_region);
1461 edge false_edge = get_false_edge_from_guard_bb (condition);
1462 basic_block dummy = false_edge->dest;
1463 edge entry_region = SESE_ENTRY (region);
1464 edge exit_region = SESE_EXIT (region);
1465 basic_block before_region = entry_region->src;
1466 basic_block last_in_region = exit_region->src;
1467 void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
1468 htab_hash_pointer (exit_region),
1469 NO_INSERT);
1471 entry_region->flags = false_edge->flags;
1472 false_edge->flags = exit_region->flags;
1474 redirect_edge_pred (entry_region, condition);
1475 redirect_edge_pred (exit_region, before_region);
1476 redirect_edge_pred (false_edge, last_in_region);
1477 redirect_edge_succ (false_edge, single_succ (dummy));
1478 delete_basic_block (dummy);
1480 exit_region->flags = EDGE_FALLTHRU;
1481 recompute_all_dominators ();
1483 SESE_EXIT (region) = false_edge;
1485 if (if_region->false_region)
1486 free (if_region->false_region);
1487 if_region->false_region = region;
1489 if (slot)
1491 struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit);
1493 memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
1494 htab_clear_slot (current_loops->exits, slot);
1496 slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
1497 htab_hash_pointer (false_edge),
1498 INSERT);
1499 loop_exit->e = false_edge;
1500 *slot = loop_exit;
1501 false_edge->src->loop_father->exits->next = loop_exit;
1505 /* Creates an IFSESE with CONDITION on edge ENTRY. */
1507 ifsese
1508 create_if_region_on_edge (edge entry, tree condition)
1510 edge e;
1511 edge_iterator ei;
1512 sese sese_region = XNEW (struct sese_s);
1513 sese true_region = XNEW (struct sese_s);
1514 sese false_region = XNEW (struct sese_s);
1515 ifsese if_region = XNEW (struct ifsese_s);
1516 edge exit = create_empty_if_region_on_edge (entry, condition);
1518 if_region->region = sese_region;
1519 if_region->region->entry = entry;
1520 if_region->region->exit = exit;
1522 FOR_EACH_EDGE (e, ei, entry->dest->succs)
1524 if (e->flags & EDGE_TRUE_VALUE)
1526 true_region->entry = e;
1527 true_region->exit = single_succ_edge (e->dest);
1528 if_region->true_region = true_region;
1530 else if (e->flags & EDGE_FALSE_VALUE)
1532 false_region->entry = e;
1533 false_region->exit = single_succ_edge (e->dest);
1534 if_region->false_region = false_region;
1538 return if_region;
1541 /* Moves REGION in a condition expression:
1542 | if (1)
1544 | else
1545 | REGION;
1548 ifsese
1549 move_sese_in_condition (sese region)
1551 basic_block pred_block = split_edge (SESE_ENTRY (region));
1552 ifsese if_region;
1554 SESE_ENTRY (region) = single_succ_edge (pred_block);
1555 if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
1556 if_region_set_false_region (if_region, region);
1558 return if_region;
1561 /* Replaces the condition of the IF_REGION with CONDITION:
1562 | if (CONDITION)
1563 | true_region;
1564 | else
1565 | false_region;
1568 void
1569 set_ifsese_condition (ifsese if_region, tree condition)
1571 sese region = if_region->region;
1572 edge entry = region->entry;
1573 basic_block bb = entry->dest;
1574 gimple last = last_stmt (bb);
1575 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1576 gimple cond_stmt;
1578 gcc_assert (gimple_code (last) == GIMPLE_COND);
1580 gsi_remove (&gsi, true);
1581 gsi = gsi_last_bb (bb);
1582 condition = force_gimple_operand_gsi (&gsi, condition, true, NULL,
1583 false, GSI_NEW_STMT);
1584 cond_stmt = gimple_build_cond_from_tree (condition, NULL_TREE, NULL_TREE);
1585 gsi = gsi_last_bb (bb);
1586 gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
1589 /* Returns the scalar evolution of T in REGION. Every variable that
1590 is not defined in the REGION is considered a parameter. */
1592 tree
1593 scalar_evolution_in_region (sese region, loop_p loop, tree t)
1595 gimple def;
1596 struct loop *def_loop;
1597 basic_block before = block_before_sese (region);
1599 if (TREE_CODE (t) != SSA_NAME
1600 || loop_in_sese_p (loop, region))
1601 return instantiate_scev (before, loop,
1602 analyze_scalar_evolution (loop, t));
1604 if (!defined_in_sese_p (t, region))
1605 return t;
1607 def = SSA_NAME_DEF_STMT (t);
1608 def_loop = loop_containing_stmt (def);
1610 if (loop_in_sese_p (def_loop, region))
1612 t = analyze_scalar_evolution (def_loop, t);
1613 def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1);
1614 t = compute_overall_effect_of_inner_loop (def_loop, t);
1615 return t;
1617 else
1618 return instantiate_scev (before, loop, t);