xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/sese.c (revision 413d532bcc3f62d122e56d92e13ac64825a40baf)
1 /* Single entry single exit control flow regions.
2    Copyright (C) 2008, 2009, 2010
3    Free Software Foundation, Inc.
4    Contributed by Jan Sjodin <jan.sjodin@amd.com> and
5    Sebastian Pop <sebastian.pop@amd.com>.
6 
7 This file is part of GCC.
8 
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13 
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22 
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "ggc.h"
28 #include "tree.h"
29 #include "rtl.h"
30 #include "basic-block.h"
31 #include "diagnostic.h"
32 #include "tree-flow.h"
33 #include "toplev.h"
34 #include "tree-dump.h"
35 #include "timevar.h"
36 #include "cfgloop.h"
37 #include "tree-chrec.h"
38 #include "tree-data-ref.h"
39 #include "tree-scalar-evolution.h"
40 #include "tree-pass.h"
41 #include "domwalk.h"
42 #include "value-prof.h"
43 #include "pointer-set.h"
44 #include "gimple.h"
45 #include "sese.h"
46 
47 /* Print to stderr the element ELT.  */
48 
49 static void
50 debug_rename_elt (rename_map_elt elt)
51 {
52   fprintf (stderr, "(");
53   print_generic_expr (stderr, elt->old_name, 0);
54   fprintf (stderr, ", ");
55   print_generic_expr (stderr, elt->expr, 0);
56   fprintf (stderr, ")\n");
57 }
58 
59 /* Helper function for debug_rename_map.  */
60 
61 static int
62 debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
63 {
64   struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
65   debug_rename_elt (entry);
66   return 1;
67 }
68 
69 /* Print to stderr all the elements of MAP.  */
70 
71 void
72 debug_rename_map (htab_t map)
73 {
74   htab_traverse (map, debug_rename_map_1, NULL);
75 }
76 
77 /* Computes a hash function for database element ELT.  */
78 
79 hashval_t
80 rename_map_elt_info (const void *elt)
81 {
82   return SSA_NAME_VERSION (((const struct rename_map_elt_s *) elt)->old_name);
83 }
84 
85 /* Compares database elements E1 and E2.  */
86 
87 int
88 eq_rename_map_elts (const void *e1, const void *e2)
89 {
90   const struct rename_map_elt_s *elt1 = (const struct rename_map_elt_s *) e1;
91   const struct rename_map_elt_s *elt2 = (const struct rename_map_elt_s *) e2;
92 
93   return (elt1->old_name == elt2->old_name);
94 }
95 
96 
97 
98 /* Print to stderr the element ELT.  */
99 
100 static void
101 debug_ivtype_elt (ivtype_map_elt elt)
102 {
103   fprintf (stderr, "(%s, ", elt->cloog_iv);
104   print_generic_expr (stderr, elt->type, 0);
105   fprintf (stderr, ")\n");
106 }
107 
108 /* Helper function for debug_ivtype_map.  */
109 
110 static int
111 debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
112 {
113   struct ivtype_map_elt_s *entry = (struct ivtype_map_elt_s *) *slot;
114   debug_ivtype_elt (entry);
115   return 1;
116 }
117 
118 /* Print to stderr all the elements of MAP.  */
119 
120 void
121 debug_ivtype_map (htab_t map)
122 {
123   htab_traverse (map, debug_ivtype_map_1, NULL);
124 }
125 
126 /* Computes a hash function for database element ELT.  */
127 
128 hashval_t
129 ivtype_map_elt_info (const void *elt)
130 {
131   return htab_hash_pointer (((const struct ivtype_map_elt_s *) elt)->cloog_iv);
132 }
133 
134 /* Compares database elements E1 and E2.  */
135 
136 int
137 eq_ivtype_map_elts (const void *e1, const void *e2)
138 {
139   const struct ivtype_map_elt_s *elt1 = (const struct ivtype_map_elt_s *) e1;
140   const struct ivtype_map_elt_s *elt2 = (const struct ivtype_map_elt_s *) e2;
141 
142   return (elt1->cloog_iv == elt2->cloog_iv);
143 }
144 
145 
146 
147 /* Record LOOP as occuring in REGION.  */
148 
149 static void
150 sese_record_loop (sese region, loop_p loop)
151 {
152   if (sese_contains_loop (region, loop))
153     return;
154 
155   bitmap_set_bit (SESE_LOOPS (region), loop->num);
156   VEC_safe_push (loop_p, heap, SESE_LOOP_NEST (region), loop);
157 }
158 
159 /* Build the loop nests contained in REGION.  Returns true when the
160    operation was successful.  */
161 
162 void
163 build_sese_loop_nests (sese region)
164 {
165   unsigned i;
166   basic_block bb;
167   struct loop *loop0, *loop1;
168 
169   FOR_EACH_BB (bb)
170     if (bb_in_sese_p (bb, region))
171       {
172 	struct loop *loop = bb->loop_father;
173 
174 	/* Only add loops if they are completely contained in the SCoP.  */
175 	if (loop->header == bb
176 	    && bb_in_sese_p (loop->latch, region))
177 	  sese_record_loop (region, loop);
178       }
179 
180   /* Make sure that the loops in the SESE_LOOP_NEST are ordered.  It
181      can be the case that an inner loop is inserted before an outer
182      loop.  To avoid this, semi-sort once.  */
183   for (i = 0; VEC_iterate (loop_p, SESE_LOOP_NEST (region), i, loop0); i++)
184     {
185       if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1)
186 	break;
187 
188       loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1);
189       if (loop0->num > loop1->num)
190 	{
191 	  VEC_replace (loop_p, SESE_LOOP_NEST (region), i, loop1);
192 	  VEC_replace (loop_p, SESE_LOOP_NEST (region), i + 1, loop0);
193 	}
194     }
195 }
196 
197 /* For a USE in BB, if BB is outside REGION, mark the USE in the
198    LIVEOUTS set.  */
199 
200 static void
201 sese_build_liveouts_use (sese region, bitmap liveouts, basic_block bb,
202 			 tree use)
203 {
204   unsigned ver;
205   basic_block def_bb;
206 
207   if (TREE_CODE (use) != SSA_NAME)
208     return;
209 
210   ver = SSA_NAME_VERSION (use);
211   def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
212 
213   if (!def_bb
214       || !bb_in_sese_p (def_bb, region)
215       || bb_in_sese_p (bb, region))
216     return;
217 
218   bitmap_set_bit (liveouts, ver);
219 }
220 
221 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are
222    used in BB that is outside of the REGION.  */
223 
224 static void
225 sese_build_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
226 {
227   gimple_stmt_iterator bsi;
228   edge e;
229   edge_iterator ei;
230   ssa_op_iter iter;
231   use_operand_p use_p;
232 
233   FOR_EACH_EDGE (e, ei, bb->succs)
234     for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi))
235       sese_build_liveouts_use (region, liveouts, bb,
236 			       PHI_ARG_DEF_FROM_EDGE (gsi_stmt (bsi), e));
237 
238   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
239     {
240       gimple stmt = gsi_stmt (bsi);
241 
242       if (is_gimple_debug (stmt))
243 	continue;
244 
245       FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
246 	sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
247     }
248 }
249 
250 /* For a USE in BB, return true if BB is outside REGION and it's not
251    in the LIVEOUTS set.  */
252 
253 static bool
254 sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb,
255 		       tree use)
256 {
257   unsigned ver;
258   basic_block def_bb;
259 
260   if (TREE_CODE (use) != SSA_NAME)
261     return false;
262 
263   ver = SSA_NAME_VERSION (use);
264 
265   /* If it's in liveouts, the variable will get a new PHI node, and
266      the debug use will be properly adjusted.  */
267   if (bitmap_bit_p (liveouts, ver))
268     return false;
269 
270   def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
271 
272   if (!def_bb
273       || !bb_in_sese_p (def_bb, region)
274       || bb_in_sese_p (bb, region))
275     return false;
276 
277   return true;
278 }
279 
280 /* Reset debug stmts that reference SSA_NAMES defined in REGION that
281    are not marked as liveouts.  */
282 
283 static void
284 sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
285 {
286   gimple_stmt_iterator bsi;
287   ssa_op_iter iter;
288   use_operand_p use_p;
289 
290   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
291     {
292       gimple stmt = gsi_stmt (bsi);
293 
294       if (!is_gimple_debug (stmt))
295 	continue;
296 
297       FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
298 	if (sese_bad_liveouts_use (region, liveouts, bb,
299 				   USE_FROM_PTR (use_p)))
300 	  {
301 	    gimple_debug_bind_reset_value (stmt);
302 	    update_stmt (stmt);
303 	    break;
304 	  }
305     }
306 }
307 
308 /* Build the LIVEOUTS of REGION: the set of variables defined inside
309    and used outside the REGION.  */
310 
311 static void
312 sese_build_liveouts (sese region, bitmap liveouts)
313 {
314   basic_block bb;
315 
316   FOR_EACH_BB (bb)
317     sese_build_liveouts_bb (region, liveouts, bb);
318   if (MAY_HAVE_DEBUG_INSNS)
319     FOR_EACH_BB (bb)
320       sese_reset_debug_liveouts_bb (region, liveouts, bb);
321 }
322 
323 /* Builds a new SESE region from edges ENTRY and EXIT.  */
324 
325 sese
326 new_sese (edge entry, edge exit)
327 {
328   sese region = XNEW (struct sese_s);
329 
330   SESE_ENTRY (region) = entry;
331   SESE_EXIT (region) = exit;
332   SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
333   SESE_LOOP_NEST (region) = VEC_alloc (loop_p, heap, 3);
334   SESE_ADD_PARAMS (region) = true;
335   SESE_PARAMS (region) = VEC_alloc (tree, heap, 3);
336 
337   return region;
338 }
339 
340 /* Deletes REGION.  */
341 
342 void
343 free_sese (sese region)
344 {
345   if (SESE_LOOPS (region))
346     SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
347 
348   VEC_free (tree, heap, SESE_PARAMS (region));
349   VEC_free (loop_p, heap, SESE_LOOP_NEST (region));
350 
351   XDELETE (region);
352 }
353 
354 /* Add exit phis for USE on EXIT.  */
355 
356 static void
357 sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
358 {
359   gimple phi = create_phi_node (use, exit);
360 
361   create_new_def_for (gimple_phi_result (phi), phi,
362 		      gimple_phi_result_ptr (phi));
363   add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
364   add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
365 }
366 
367 /* Insert in the block BB phi nodes for variables defined in REGION
368    and used outside the REGION.  The code generation moves REGION in
369    the else clause of an "if (1)" and generates code in the then
370    clause that is at this point empty:
371 
372    | if (1)
373    |   empty;
374    | else
375    |   REGION;
376 */
377 
378 void
379 sese_insert_phis_for_liveouts (sese region, basic_block bb,
380 			       edge false_e, edge true_e)
381 {
382   unsigned i;
383   bitmap_iterator bi;
384   bitmap liveouts = BITMAP_ALLOC (NULL);
385 
386   update_ssa (TODO_update_ssa);
387 
388   sese_build_liveouts (region, liveouts);
389   EXECUTE_IF_SET_IN_BITMAP (liveouts, 0, i, bi)
390     sese_add_exit_phis_edge (bb, ssa_name (i), false_e, true_e);
391   BITMAP_FREE (liveouts);
392 
393   update_ssa (TODO_update_ssa);
394 }
395 
396 /* Get the definition of NAME before the SESE.  Keep track of the
397    basic blocks that have been VISITED in a bitmap.  */
398 
399 static tree
400 get_vdef_before_sese (sese region, tree name, sbitmap visited)
401 {
402   unsigned i;
403   gimple stmt = SSA_NAME_DEF_STMT (name);
404   basic_block def_bb = gimple_bb (stmt);
405 
406   if (!def_bb || !bb_in_sese_p (def_bb, region))
407     return name;
408 
409   if (TEST_BIT (visited, def_bb->index))
410     return NULL_TREE;
411 
412   SET_BIT (visited, def_bb->index);
413 
414   switch (gimple_code (stmt))
415     {
416     case GIMPLE_PHI:
417       for (i = 0; i < gimple_phi_num_args (stmt); i++)
418 	{
419 	  tree arg = gimple_phi_arg_def (stmt, i);
420 	  tree res;
421 
422 	  if (gimple_bb (SSA_NAME_DEF_STMT (arg))
423 	      && def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (arg))->index)
424 	    continue;
425 
426 	  res = get_vdef_before_sese (region, arg, visited);
427 	  if (res)
428 	    return res;
429 	}
430       return NULL_TREE;
431 
432     case GIMPLE_ASSIGN:
433     case GIMPLE_CALL:
434       {
435 	use_operand_p use_p = gimple_vuse_op (stmt);
436 	tree use = USE_FROM_PTR (use_p);
437 
438 	if (def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (use))->index)
439 	  RESET_BIT (visited, def_bb->index);
440 
441 	return get_vdef_before_sese (region, use, visited);
442       }
443 
444     default:
445       return NULL_TREE;
446     }
447 }
448 
449 /* Adjust a virtual phi node PHI that is placed at the end of the
450    generated code for SCOP:
451 
452    | if (1)
453    |   generated code from REGION;
454    | else
455    |   REGION;
456 
457    The FALSE_E edge comes from the original code, TRUE_E edge comes
458    from the code generated for the SCOP.  */
459 
460 static void
461 sese_adjust_vphi (sese region, gimple phi, edge true_e)
462 {
463   unsigned i;
464 
465   gcc_assert (gimple_phi_num_args (phi) == 2);
466 
467   for (i = 0; i < gimple_phi_num_args (phi); i++)
468     if (gimple_phi_arg_edge (phi, i) == true_e)
469       {
470 	tree true_arg, false_arg, before_scop_arg;
471 	sbitmap visited;
472 
473 	true_arg = gimple_phi_arg_def (phi, i);
474 	if (!SSA_NAME_IS_DEFAULT_DEF (true_arg))
475 	  return;
476 
477 	false_arg = gimple_phi_arg_def (phi, i == 0 ? 1 : 0);
478 	if (SSA_NAME_IS_DEFAULT_DEF (false_arg))
479 	  return;
480 
481 	visited = sbitmap_alloc (last_basic_block);
482 	sbitmap_zero (visited);
483 	before_scop_arg = get_vdef_before_sese (region, false_arg, visited);
484 	gcc_assert (before_scop_arg != NULL_TREE);
485 	SET_PHI_ARG_DEF (phi, i, before_scop_arg);
486 	sbitmap_free (visited);
487       }
488 }
489 
490 /* Returns the expression associated to OLD_NAME in MAP.  */
491 
492 static tree
493 get_rename (htab_t map, tree old_name)
494 {
495   struct rename_map_elt_s tmp;
496   PTR *slot;
497 
498   gcc_assert (TREE_CODE (old_name) == SSA_NAME);
499   tmp.old_name = old_name;
500   slot = htab_find_slot (map, &tmp, NO_INSERT);
501 
502   if (slot && *slot)
503     return ((rename_map_elt) *slot)->expr;
504 
505   return old_name;
506 }
507 
508 /* Register in MAP the rename tuple (OLD_NAME, EXPR).  */
509 
510 void
511 set_rename (htab_t map, tree old_name, tree expr)
512 {
513   struct rename_map_elt_s tmp;
514   PTR *slot;
515 
516   if (old_name == expr)
517     return;
518 
519   tmp.old_name = old_name;
520   slot = htab_find_slot (map, &tmp, INSERT);
521 
522   if (!slot)
523     return;
524 
525   if (*slot)
526     free (*slot);
527 
528   *slot = new_rename_map_elt (old_name, expr);
529 }
530 
531 /* Renames the expression T following the tuples (OLD_NAME, EXPR) in
532    the rename map M.  Returns the expression T after renaming.  */
533 
534 static tree
535 rename_variables_in_expr (htab_t m, tree t)
536 {
537   if (!t)
538     return t;
539 
540  if (TREE_CODE (t) == SSA_NAME)
541    return get_rename (m, t);
542 
543   switch (TREE_CODE_LENGTH (TREE_CODE (t)))
544     {
545     case 3:
546       TREE_OPERAND (t, 2) = rename_variables_in_expr (m, TREE_OPERAND (t, 2));
547 
548     case 2:
549       TREE_OPERAND (t, 1) = rename_variables_in_expr (m, TREE_OPERAND (t, 1));
550 
551     case 1:
552       TREE_OPERAND (t, 0) = rename_variables_in_expr (m, TREE_OPERAND (t, 0));
553 
554     default:
555       return t;
556     }
557 }
558 
559 /* Renames all the loop->nb_iterations expressions following the
560    tuples (OLD_NAME, EXPR) in RENAME_MAP.  */
561 
562 void
563 rename_nb_iterations (htab_t rename_map)
564 {
565   loop_iterator li;
566   struct loop *loop;
567 
568   FOR_EACH_LOOP (li, loop, 0)
569     loop->nb_iterations = rename_variables_in_expr (rename_map,
570 						    loop->nb_iterations);
571 }
572 
573 /* Renames all the parameters of SESE following the tuples (OLD_NAME,
574    EXPR) in RENAME_MAP.  */
575 
576 void
577 rename_sese_parameters (htab_t rename_map, sese region)
578 {
579   int i;
580   tree p;
581 
582   for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
583     VEC_replace (tree, SESE_PARAMS (region), i,
584 		 rename_variables_in_expr (rename_map, p));
585 }
586 
587 /* Adjusts the phi nodes in the block BB for variables defined in
588    SCOP_REGION and used outside the SCOP_REGION.  The code generation
589    moves SCOP_REGION in the else clause of an "if (1)" and generates
590    code in the then clause:
591 
592    | if (1)
593    |   generated code from REGION;
594    | else
595    |   REGION;
596 
597    To adjust the phi nodes after the condition, the RENAME_MAP is
598    used.  */
599 
600 void
601 sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
602 			  edge false_e, edge true_e)
603 {
604   gimple_stmt_iterator si;
605 
606   for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
607     {
608       unsigned i;
609       unsigned false_i = 0;
610       gimple phi = gsi_stmt (si);
611       tree res = gimple_phi_result (phi);
612 
613       if (!is_gimple_reg (res))
614 	{
615 	  sese_adjust_vphi (region, phi, true_e);
616 	  continue;
617 	}
618 
619       for (i = 0; i < gimple_phi_num_args (phi); i++)
620 	if (gimple_phi_arg_edge (phi, i) == false_e)
621 	  {
622 	    false_i = i;
623 	    break;
624 	  }
625 
626       for (i = 0; i < gimple_phi_num_args (phi); i++)
627 	if (gimple_phi_arg_edge (phi, i) == true_e)
628 	  {
629 	    tree old_name = gimple_phi_arg_def (phi, false_i);
630 	    tree expr = get_rename (rename_map, old_name);
631 	    gimple_seq stmts;
632 
633 	    gcc_assert (old_name != expr);
634 
635 	    if (TREE_CODE (expr) != SSA_NAME
636 		&& is_gimple_reg (old_name))
637 	      {
638 		tree type = TREE_TYPE (old_name);
639 		tree var = create_tmp_var (type, "var");
640 
641 		expr = build2 (MODIFY_EXPR, type, var, expr);
642 		expr = force_gimple_operand (expr, &stmts, true, NULL);
643 		gsi_insert_seq_on_edge_immediate (true_e, stmts);
644 	      }
645 
646 	    SET_PHI_ARG_DEF (phi, i, expr);
647 	    set_rename (rename_map, old_name, res);
648 	  }
649     }
650 }
651 
652 /* Rename the SSA_NAMEs used in STMT and that appear in MAP.  */
653 
654 static void
655 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi)
656 {
657   ssa_op_iter iter;
658   use_operand_p use_p;
659 
660   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
661     {
662       tree use = USE_FROM_PTR (use_p);
663       tree expr, type_use, type_expr;
664       gimple_seq stmts;
665 
666       if (TREE_CODE (use) != SSA_NAME)
667 	continue;
668 
669       expr = get_rename (map, use);
670       if (use == expr)
671 	continue;
672 
673       type_use = TREE_TYPE (use);
674       type_expr = TREE_TYPE (expr);
675 
676       if (type_use != type_expr
677 	  || (TREE_CODE (expr) != SSA_NAME
678 	      && is_gimple_reg (use)))
679 	{
680 	  tree var;
681 
682 	  if (is_gimple_debug (stmt))
683 	    {
684 	      if (gimple_debug_bind_p (stmt))
685 		gimple_debug_bind_reset_value (stmt);
686 	      else
687 		gcc_unreachable ();
688 
689 	      break;
690 	    }
691 
692 	  var = create_tmp_var (type_use, "var");
693 
694 	  if (type_use != type_expr)
695 	    expr = fold_convert (type_use, expr);
696 
697 	  expr = build2 (MODIFY_EXPR, type_use, var, expr);
698 	  expr = force_gimple_operand (expr, &stmts, true, NULL);
699 	  gsi_insert_seq_before (insert_gsi, stmts, GSI_SAME_STMT);
700 	}
701 
702       replace_exp (use_p, expr);
703     }
704 
705   update_stmt (stmt);
706 }
707 
708 /* Returns true if NAME is a parameter of SESE.  */
709 
710 static bool
711 is_parameter (sese region, tree name)
712 {
713   int i;
714   tree p;
715 
716   for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
717     if (p == name)
718       return true;
719 
720   return false;
721 }
722 
723 /* Returns true if NAME is an induction variable.  */
724 
725 static bool
726 is_iv (tree name)
727 {
728   return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
729 }
730 
731 static void expand_scalar_variables_stmt (gimple, basic_block, sese,
732 					  htab_t, gimple_stmt_iterator *);
733 static tree
734 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block,
735 			      sese, htab_t, gimple_stmt_iterator *);
736 
737 static tree
738 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region,
739 			      htab_t map, gimple_stmt_iterator *gsi)
740 {
741   int i, nargs = gimple_call_num_args (stmt);
742   VEC (tree, gc) *args = VEC_alloc (tree, gc, nargs);
743   tree fn_type = TREE_TYPE (gimple_call_fn (stmt));
744   tree fn = gimple_call_fndecl (stmt);
745   tree call_expr, var, lhs;
746   gimple call;
747 
748   for (i = 0; i < nargs; i++)
749     {
750       tree arg = gimple_call_arg (stmt, i);
751       tree t = TREE_TYPE (arg);
752 
753       var = create_tmp_var (t, "var");
754       arg = expand_scalar_variables_expr (t, arg, TREE_CODE (arg), NULL,
755 					  bb, region, map, gsi);
756       arg = build2 (MODIFY_EXPR, t, var, arg);
757       arg = force_gimple_operand_gsi (gsi, arg, true, NULL,
758 				      true, GSI_SAME_STMT);
759       VEC_quick_push (tree, args, arg);
760     }
761 
762   lhs = gimple_call_lhs (stmt);
763   var = create_tmp_var (TREE_TYPE (lhs), "var");
764   call_expr = build_call_vec (fn_type, fn, args);
765   call = gimple_build_call_from_tree (call_expr);
766   var = make_ssa_name (var, call);
767   gimple_call_set_lhs (call, var);
768   gsi_insert_before (gsi, call, GSI_SAME_STMT);
769 
770   return var;
771 }
772 
773 /* Copies at GSI all the scalar computations on which the ssa_name OP0
774    depends on in the SESE: these are all the scalar variables used in
775    the definition of OP0, that are defined outside BB and still in the
776    SESE, i.e. not a parameter of the SESE.  The expression that is
777    returned contains only induction variables from the generated code:
778    MAP contains the induction variables renaming mapping, and is used
779    to translate the names of induction variables.  */
780 
781 static tree
782 expand_scalar_variables_ssa_name (tree type, tree op0, basic_block bb,
783 				  sese region, htab_t map,
784 				  gimple_stmt_iterator *gsi)
785 {
786   gimple def_stmt;
787   tree new_op;
788 
789   if (is_parameter (region, op0)
790       || is_iv (op0))
791     return fold_convert (type, get_rename (map, op0));
792 
793   def_stmt = SSA_NAME_DEF_STMT (op0);
794 
795   /* Check whether we already have a rename for OP0.  */
796   new_op = get_rename (map, op0);
797 
798   if (new_op != op0
799       && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb)
800     return fold_convert (type, new_op);
801 
802   if (gimple_bb (def_stmt) == bb)
803     {
804       /* If the defining statement is in the basic block already
805 	 we do not need to create a new expression for it, we
806 	 only need to ensure its operands are expanded.  */
807       expand_scalar_variables_stmt (def_stmt, bb, region, map, gsi);
808       return fold_convert (type, new_op);
809     }
810   else
811     {
812       if (!gimple_bb (def_stmt)
813 	  || !bb_in_sese_p (gimple_bb (def_stmt), region))
814 	return fold_convert (type, new_op);
815 
816       switch (gimple_code (def_stmt))
817 	{
818 	case GIMPLE_ASSIGN:
819 	  {
820 	    tree var0 = gimple_assign_rhs1 (def_stmt);
821 	    enum tree_code subcode = gimple_assign_rhs_code (def_stmt);
822 	    tree var1 = gimple_assign_rhs2 (def_stmt);
823 	    tree type = gimple_expr_type (def_stmt);
824 
825 	    return expand_scalar_variables_expr (type, var0, subcode, var1, bb,
826 						 region, map, gsi);
827 	  }
828 
829 	case GIMPLE_CALL:
830 	  return expand_scalar_variables_call (def_stmt, bb, region, map, gsi);
831 
832 	default:
833 	  gcc_unreachable ();
834 	  return new_op;
835 	}
836     }
837 }
838 
839 /* Copies at GSI all the scalar computations on which the expression
840    OP0 CODE OP1 depends on in the SESE: these are all the scalar
841    variables used in OP0 and OP1, defined outside BB and still defined
842    in the SESE, i.e. not a parameter of the SESE.  The expression that
843    is returned contains only induction variables from the generated
844    code: MAP contains the induction variables renaming mapping, and is
845    used to translate the names of induction variables.  */
846 
847 static tree
848 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code,
849 			      tree op1, basic_block bb, sese region,
850 			      htab_t map, gimple_stmt_iterator *gsi)
851 {
852   if (TREE_CODE_CLASS (code) == tcc_constant
853       || TREE_CODE_CLASS (code) == tcc_declaration)
854     return op0;
855 
856   /* For data references we have to duplicate also its memory
857      indexing.  */
858   if (TREE_CODE_CLASS (code) == tcc_reference)
859     {
860       switch (code)
861 	{
862 	case REALPART_EXPR:
863 	case IMAGPART_EXPR:
864 	  {
865 	    tree op = TREE_OPERAND (op0, 0);
866 	    tree res = expand_scalar_variables_expr
867 	      (type, op, TREE_CODE (op), NULL, bb, region, map, gsi);
868 	    return build1 (code, type, res);
869 	  }
870 
871 	case INDIRECT_REF:
872 	  {
873 	    tree old_name = TREE_OPERAND (op0, 0);
874 	    tree expr = expand_scalar_variables_ssa_name
875 	      (type, old_name, bb, region, map, gsi);
876 
877 	    if (TREE_CODE (expr) != SSA_NAME
878 		&& is_gimple_reg (old_name))
879 	      {
880 		tree type = TREE_TYPE (old_name);
881 		tree var = create_tmp_var (type, "var");
882 
883 		expr = build2 (MODIFY_EXPR, type, var, expr);
884 		expr = force_gimple_operand_gsi (gsi, expr, true, NULL,
885 						 true, GSI_SAME_STMT);
886 	      }
887 
888 	    return fold_build1 (code, type, expr);
889 	  }
890 
891 	case ARRAY_REF:
892 	  {
893 	    tree op00 = TREE_OPERAND (op0, 0);
894 	    tree op01 = TREE_OPERAND (op0, 1);
895 	    tree op02 = TREE_OPERAND (op0, 2);
896 	    tree op03 = TREE_OPERAND (op0, 3);
897 	    tree base = expand_scalar_variables_expr
898 	      (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, region,
899 	       map, gsi);
900 	    tree subscript = expand_scalar_variables_expr
901 	      (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, region,
902 	       map, gsi);
903 
904 	    return build4 (ARRAY_REF, type, base, subscript, op02, op03);
905 	  }
906 
907 	case COMPONENT_REF:
908 	  return op0;
909 
910 	default:
911 	  /* The above cases should catch everything.  */
912 	  gcc_unreachable ();
913 	}
914     }
915 
916   if (TREE_CODE_CLASS (code) == tcc_unary)
917     {
918       tree op0_type = TREE_TYPE (op0);
919       enum tree_code op0_code = TREE_CODE (op0);
920       tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
921 						    NULL, bb, region, map, gsi);
922 
923       return fold_build1 (code, type, op0_expr);
924     }
925 
926   if (TREE_CODE_CLASS (code) == tcc_binary
927       || TREE_CODE_CLASS (code) == tcc_comparison)
928     {
929       tree op0_type = TREE_TYPE (op0);
930       enum tree_code op0_code = TREE_CODE (op0);
931       tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
932 						    NULL, bb, region, map, gsi);
933       tree op1_type = TREE_TYPE (op1);
934       enum tree_code op1_code = TREE_CODE (op1);
935       tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code,
936 						    NULL, bb, region, map, gsi);
937 
938       return fold_build2 (code, type, op0_expr, op1_expr);
939     }
940 
941   if (code == SSA_NAME)
942     return expand_scalar_variables_ssa_name (type, op0, bb, region, map, gsi);
943 
944   if (code == ADDR_EXPR)
945     {
946       tree op00 = TREE_OPERAND (op0, 0);
947 
948       if (handled_component_p (op00)
949 	  && TREE_CODE (op00) == ARRAY_REF)
950 	{
951 	  tree e = expand_scalar_variables_expr (TREE_TYPE (op00), op00,
952 						 TREE_CODE (op00),
953 						 NULL, bb, region, map, gsi);
954 	  return fold_build1 (code, TREE_TYPE (op0), e);
955 	}
956 
957       return op0;
958     }
959 
960   gcc_unreachable ();
961   return NULL;
962 }
963 
964 /* Copies at the beginning of BB all the scalar computations on which
965    STMT depends on in the SESE: these are all the scalar variables used
966    in STMT, defined outside BB and still defined in the SESE, i.e. not a
967    parameter of the SESE.  The expression that is returned contains
968    only induction variables from the generated code: MAP contains the
969    induction variables renaming mapping, and is used to translate the
970    names of induction variables.  */
971 
972 static void
973 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
974 			      htab_t map, gimple_stmt_iterator *gsi)
975 {
976   ssa_op_iter iter;
977   use_operand_p use_p;
978 
979   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
980     {
981       tree use = USE_FROM_PTR (use_p);
982       tree type = TREE_TYPE (use);
983       enum tree_code code = TREE_CODE (use);
984       tree use_expr;
985 
986       if (!is_gimple_reg (use))
987 	continue;
988 
989       /* Don't expand USE if we already have a rename for it.  */
990       use_expr = get_rename (map, use);
991       if (use_expr != use)
992 	continue;
993 
994       use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
995 					       region, map, gsi);
996       use_expr = fold_convert (type, use_expr);
997 
998       if (use_expr == use)
999 	continue;
1000 
1001       if (is_gimple_debug (stmt))
1002 	{
1003 	  if (gimple_debug_bind_p (stmt))
1004 	    gimple_debug_bind_reset_value (stmt);
1005 	  else
1006 	    gcc_unreachable ();
1007 
1008 	  break;
1009 	}
1010 
1011       if (TREE_CODE (use_expr) != SSA_NAME)
1012 	{
1013 	  tree var = create_tmp_var (type, "var");
1014 
1015 	  use_expr = build2 (MODIFY_EXPR, type, var, use_expr);
1016 	  use_expr = force_gimple_operand_gsi (gsi, use_expr, true, NULL,
1017 					       true, GSI_SAME_STMT);
1018 	}
1019 
1020       replace_exp (use_p, use_expr);
1021     }
1022 
1023   update_stmt (stmt);
1024 }
1025 
1026 /* Copies at the beginning of BB all the scalar computations on which
1027    BB depends on in the SESE: these are all the scalar variables used
1028    in BB, defined outside BB and still defined in the SESE, i.e. not a
1029    parameter of the SESE.  The expression that is returned contains
1030    only induction variables from the generated code: MAP contains the
1031    induction variables renaming mapping, and is used to translate the
1032    names of induction variables.  */
1033 
1034 static void
1035 expand_scalar_variables (basic_block bb, sese region, htab_t map)
1036 {
1037   gimple_stmt_iterator gsi;
1038 
1039   for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
1040     {
1041       gimple stmt = gsi_stmt (gsi);
1042       expand_scalar_variables_stmt (stmt, bb, region, map, &gsi);
1043       gsi_next (&gsi);
1044     }
1045 }
1046 
1047 /* Rename all the SSA_NAMEs from block BB according to the MAP.  */
1048 
1049 static void
1050 rename_variables (basic_block bb, htab_t map)
1051 {
1052   gimple_stmt_iterator gsi;
1053   gimple_stmt_iterator insert_gsi = gsi_start_bb (bb);
1054 
1055   for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1056     rename_variables_in_stmt (gsi_stmt (gsi), map, &insert_gsi);
1057 }
1058 
1059 /* Remove condition from BB.  */
1060 
1061 static void
1062 remove_condition (basic_block bb)
1063 {
1064   gimple last = last_stmt (bb);
1065 
1066   if (last && gimple_code (last) == GIMPLE_COND)
1067     {
1068       gimple_stmt_iterator gsi = gsi_last_bb (bb);
1069       gsi_remove (&gsi, true);
1070     }
1071 }
1072 
1073 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set.  */
1074 
1075 edge
1076 get_true_edge_from_guard_bb (basic_block bb)
1077 {
1078   edge e;
1079   edge_iterator ei;
1080 
1081   FOR_EACH_EDGE (e, ei, bb->succs)
1082     if (e->flags & EDGE_TRUE_VALUE)
1083       return e;
1084 
1085   gcc_unreachable ();
1086   return NULL;
1087 }
1088 
1089 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared.  */
1090 
1091 edge
1092 get_false_edge_from_guard_bb (basic_block bb)
1093 {
1094   edge e;
1095   edge_iterator ei;
1096 
1097   FOR_EACH_EDGE (e, ei, bb->succs)
1098     if (!(e->flags & EDGE_TRUE_VALUE))
1099       return e;
1100 
1101   gcc_unreachable ();
1102   return NULL;
1103 }
1104 
1105 /* Returns true when NAME is defined in LOOP.  */
1106 
1107 static bool
1108 name_defined_in_loop_p (tree name, loop_p loop)
1109 {
1110   return !SSA_NAME_IS_DEFAULT_DEF (name)
1111     && gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father == loop;
1112 }
1113 
1114 /* Returns true when EXPR contains SSA_NAMEs defined in LOOP.  */
1115 
1116 static bool
1117 expr_defined_in_loop_p (tree expr, loop_p loop)
1118 {
1119   switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
1120     {
1121     case 3:
1122       return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1123 	|| expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop)
1124 	|| expr_defined_in_loop_p (TREE_OPERAND (expr, 2), loop);
1125 
1126     case 2:
1127       return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1128 	|| expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop);
1129 
1130     case 1:
1131       return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop);
1132 
1133     case 0:
1134       return TREE_CODE (expr) == SSA_NAME
1135 	&& name_defined_in_loop_p (expr, loop);
1136 
1137     default:
1138       return false;
1139     }
1140 }
1141 
1142 /* Returns the gimple statement that uses NAME outside the loop it is
1143    defined in, returns NULL if there is no such loop close phi node.
1144    An invariant of the loop closed SSA form is that the only use of a
1145    variable, outside the loop it is defined in, is in the loop close
1146    phi node that just follows the loop.  */
1147 
1148 static gimple
1149 alive_after_loop (tree name)
1150 {
1151   use_operand_p use_p;
1152   imm_use_iterator imm_iter;
1153   loop_p loop = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father;
1154 
1155   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
1156     {
1157       gimple stmt = USE_STMT (use_p);
1158 
1159       if (gimple_code (stmt) == GIMPLE_PHI
1160 	  && gimple_bb (stmt)->loop_father != loop)
1161 	return stmt;
1162     }
1163 
1164   return NULL;
1165 }
1166 
1167 /* Return true if a close phi has not yet been inserted for the use of
1168    variable NAME on the single exit of LOOP.  */
1169 
1170 static bool
1171 close_phi_not_yet_inserted_p (loop_p loop, tree name)
1172 {
1173   gimple_stmt_iterator psi;
1174   basic_block bb = single_exit (loop)->dest;
1175 
1176   for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
1177     if (gimple_phi_arg_def (gsi_stmt (psi), 0) == name)
1178       return false;
1179 
1180   return true;
1181 }
1182 
1183 /* A structure for passing parameters to add_loop_exit_phis.  */
1184 
1185 typedef struct alep {
1186   loop_p loop;
1187   VEC (rename_map_elt, heap) *new_renames;
1188 } *alep_p;
1189 
1190 /* Helper function for htab_traverse in insert_loop_close_phis.  */
1191 
1192 static int
1193 add_loop_exit_phis (void **slot, void *data)
1194 {
1195   struct rename_map_elt_s *entry;
1196   alep_p a;
1197   loop_p loop;
1198   tree expr, new_name, old_name;
1199   bool def_in_loop_p, used_outside_p, need_close_phi_p;
1200   gimple old_close_phi;
1201 
1202   if (!slot || !*slot || !data)
1203     return 1;
1204 
1205   entry = (struct rename_map_elt_s *) *slot;
1206   a = (alep_p) data;
1207   loop = a->loop;
1208   new_name = expr = entry->expr;
1209   old_name = entry->old_name;
1210 
1211   def_in_loop_p = expr_defined_in_loop_p (expr, loop);
1212   if (!def_in_loop_p)
1213     return 1;
1214 
1215   /* Remove the old rename from the map when the expression is defined
1216      in the loop that we're closing.  */
1217   free (*slot);
1218   *slot = NULL;
1219 
1220   if (TREE_CODE (expr) != SSA_NAME)
1221     return 1;
1222 
1223   old_close_phi = alive_after_loop (old_name);
1224   used_outside_p = (old_close_phi != NULL);
1225   need_close_phi_p = (used_outside_p
1226 		      && close_phi_not_yet_inserted_p (loop, new_name));
1227 
1228   /* Insert a loop close phi node.  */
1229   if (need_close_phi_p)
1230     {
1231       basic_block bb = single_exit (loop)->dest;
1232       gimple phi = create_phi_node (new_name, bb);
1233       tree new_res = create_new_def_for (gimple_phi_result (phi), phi,
1234 					 gimple_phi_result_ptr (phi));
1235 
1236       add_phi_arg (phi, new_name, single_pred_edge (bb), UNKNOWN_LOCATION);
1237       VEC_safe_push (rename_map_elt, heap, a->new_renames,
1238 		     new_rename_map_elt (gimple_phi_result (old_close_phi),
1239 					 new_res));
1240     }
1241 
1242   return 1;
1243 }
1244 
1245 /* Traverses MAP and removes from it all the tuples (OLD, NEW) where
1246    NEW is defined in LOOP.  Inserts on the exit of LOOP the close phi
1247    node "RES = phi (NEW)" corresponding to "OLD_RES = phi (OLD)" in
1248    the original code.  Inserts in MAP the tuple (OLD_RES, RES).  */
1249 
1250 void
1251 insert_loop_close_phis (htab_t map, loop_p loop)
1252 {
1253   int i;
1254   struct alep a;
1255   rename_map_elt elt;
1256 
1257   a.loop = loop;
1258   a.new_renames = VEC_alloc (rename_map_elt, heap, 3);
1259   update_ssa (TODO_update_ssa);
1260   htab_traverse (map, add_loop_exit_phis, &a);
1261   update_ssa (TODO_update_ssa);
1262 
1263   for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++)
1264     {
1265       set_rename (map, elt->old_name, elt->expr);
1266       free (elt);
1267     }
1268 
1269   VEC_free (rename_map_elt, heap, a.new_renames);
1270 }
1271 
1272 /* Helper structure for htab_traverse in insert_guard_phis.  */
1273 
1274 struct igp {
1275   basic_block bb;
1276   edge true_edge, false_edge;
1277   htab_t before_guard;
1278 };
1279 
1280 /* Return the default name that is before the guard.  */
1281 
1282 static tree
1283 default_before_guard (htab_t before_guard, tree old_name)
1284 {
1285   tree res = get_rename (before_guard, old_name);
1286 
1287   if (res == old_name)
1288     {
1289       if (is_gimple_reg (res))
1290 	return fold_convert (TREE_TYPE (res), integer_zero_node);
1291       return gimple_default_def (cfun, SSA_NAME_VAR (res));
1292     }
1293 
1294   return res;
1295 }
1296 
1297 /* Prepares EXPR to be a good phi argument when the phi result is
1298    RES.  Insert needed statements on edge E.  */
1299 
1300 static tree
1301 convert_for_phi_arg (tree expr, tree res, edge e)
1302 {
1303   tree type = TREE_TYPE (res);
1304 
1305   if (TREE_TYPE (expr) != type)
1306     expr = fold_convert (type, expr);
1307 
1308   if (TREE_CODE (expr) != SSA_NAME
1309       && !is_gimple_min_invariant (expr))
1310     {
1311       tree var = create_tmp_var (type, "var");
1312       gimple_seq stmts;
1313 
1314       expr = build2 (MODIFY_EXPR, type, var, expr);
1315       expr = force_gimple_operand (expr, &stmts, true, NULL);
1316       gsi_insert_seq_on_edge_immediate (e, stmts);
1317     }
1318 
1319   return expr;
1320 }
1321 
1322 /* Helper function for htab_traverse in insert_guard_phis.  */
1323 
1324 static int
1325 add_guard_exit_phis (void **slot, void *s)
1326 {
1327   struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
1328   struct igp *i = (struct igp *) s;
1329   basic_block bb = i->bb;
1330   edge true_edge = i->true_edge;
1331   edge false_edge = i->false_edge;
1332   tree res = entry->old_name;
1333   tree name1 = entry->expr;
1334   tree name2 = default_before_guard (i->before_guard, res);
1335   gimple phi;
1336 
1337   /* Nothing to be merged if the name before the guard is the same as
1338      the one after.  */
1339   if (name1 == name2)
1340     return 1;
1341 
1342   name1 = convert_for_phi_arg (name1, res, true_edge);
1343   name2 = convert_for_phi_arg (name2, res, false_edge);
1344 
1345   phi = create_phi_node (res, bb);
1346   res = create_new_def_for (gimple_phi_result (phi), phi,
1347 			    gimple_phi_result_ptr (phi));
1348 
1349   add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION);
1350   add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION);
1351 
1352   entry->expr = res;
1353   *slot = entry;
1354   return 1;
1355 }
1356 
1357 /* Iterate over RENAME_MAP and get tuples of the form (OLD, NAME1).
1358    If there is a correspondent tuple (OLD, NAME2) in BEFORE_GUARD,
1359    with NAME1 different than NAME2, then insert in BB the phi node:
1360 
1361    | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
1362 
1363    if there is no tuple for OLD in BEFORE_GUARD, insert
1364 
1365    | RES = phi (NAME1 (on TRUE_EDGE),
1366    |            DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
1367 
1368    Finally register in RENAME_MAP the tuple (OLD, RES).  */
1369 
1370 void
1371 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge,
1372 		   htab_t before_guard, htab_t rename_map)
1373 {
1374   struct igp i;
1375   i.bb = bb;
1376   i.true_edge = true_edge;
1377   i.false_edge = false_edge;
1378   i.before_guard = before_guard;
1379 
1380   update_ssa (TODO_update_ssa);
1381   htab_traverse (rename_map, add_guard_exit_phis, &i);
1382   update_ssa (TODO_update_ssa);
1383 }
1384 
1385 /* Create a duplicate of the basic block BB.  NOTE: This does not
1386    preserve SSA form.  */
1387 
1388 static void
1389 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
1390 {
1391   gimple_stmt_iterator gsi, gsi_tgt;
1392 
1393   gsi_tgt = gsi_start_bb (new_bb);
1394   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1395     {
1396       def_operand_p def_p;
1397       ssa_op_iter op_iter;
1398       gimple stmt = gsi_stmt (gsi);
1399       gimple copy;
1400 
1401       if (gimple_code (stmt) == GIMPLE_LABEL)
1402 	continue;
1403 
1404       /* Create a new copy of STMT and duplicate STMT's virtual
1405 	 operands.  */
1406       copy = gimple_copy (stmt);
1407       gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
1408       mark_sym_for_renaming (gimple_vop (cfun));
1409 
1410       maybe_duplicate_eh_stmt (copy, stmt);
1411       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
1412 
1413       /* Create new names for all the definitions created by COPY and
1414 	 add replacement mappings for each new name.  */
1415       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
1416 	{
1417 	  tree old_name = DEF_FROM_PTR (def_p);
1418 	  tree new_name = create_new_def_for (old_name, copy, def_p);
1419 	  set_rename (map, old_name, new_name);
1420 	}
1421     }
1422 }
1423 
1424 /* Copies BB and includes in the copied BB all the statements that can
1425    be reached following the use-def chains from the memory accesses,
1426    and returns the next edge following this new block.  */
1427 
1428 edge
1429 copy_bb_and_scalar_dependences (basic_block bb, sese region,
1430 				edge next_e, htab_t map)
1431 {
1432   basic_block new_bb = split_edge (next_e);
1433 
1434   next_e = single_succ_edge (new_bb);
1435   graphite_copy_stmts_from_block (bb, new_bb, map);
1436   remove_condition (new_bb);
1437   remove_phi_nodes (new_bb);
1438   expand_scalar_variables (new_bb, region, map);
1439   rename_variables (new_bb, map);
1440 
1441   return next_e;
1442 }
1443 
1444 /* Returns the outermost loop in SCOP that contains BB.  */
1445 
1446 struct loop *
1447 outermost_loop_in_sese (sese region, basic_block bb)
1448 {
1449   struct loop *nest;
1450 
1451   nest = bb->loop_father;
1452   while (loop_outer (nest)
1453 	 && loop_in_sese_p (loop_outer (nest), region))
1454     nest = loop_outer (nest);
1455 
1456   return nest;
1457 }
1458 
1459 /* Sets the false region of an IF_REGION to REGION.  */
1460 
1461 void
1462 if_region_set_false_region (ifsese if_region, sese region)
1463 {
1464   basic_block condition = if_region_get_condition_block (if_region);
1465   edge false_edge = get_false_edge_from_guard_bb (condition);
1466   basic_block dummy = false_edge->dest;
1467   edge entry_region = SESE_ENTRY (region);
1468   edge exit_region = SESE_EXIT (region);
1469   basic_block before_region = entry_region->src;
1470   basic_block last_in_region = exit_region->src;
1471   void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
1472 					  htab_hash_pointer (exit_region),
1473 					  NO_INSERT);
1474 
1475   entry_region->flags = false_edge->flags;
1476   false_edge->flags = exit_region->flags;
1477 
1478   redirect_edge_pred (entry_region, condition);
1479   redirect_edge_pred (exit_region, before_region);
1480   redirect_edge_pred (false_edge, last_in_region);
1481   redirect_edge_succ (false_edge, single_succ (dummy));
1482   delete_basic_block (dummy);
1483 
1484   exit_region->flags = EDGE_FALLTHRU;
1485   recompute_all_dominators ();
1486 
1487   SESE_EXIT (region) = false_edge;
1488 
1489   if (if_region->false_region)
1490     free (if_region->false_region);
1491   if_region->false_region = region;
1492 
1493   if (slot)
1494     {
1495       struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit);
1496 
1497       memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
1498       htab_clear_slot (current_loops->exits, slot);
1499 
1500       slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
1501 				       htab_hash_pointer (false_edge),
1502 				       INSERT);
1503       loop_exit->e = false_edge;
1504       *slot = loop_exit;
1505       false_edge->src->loop_father->exits->next = loop_exit;
1506     }
1507 }
1508 
1509 /* Creates an IFSESE with CONDITION on edge ENTRY.  */
1510 
1511 ifsese
1512 create_if_region_on_edge (edge entry, tree condition)
1513 {
1514   edge e;
1515   edge_iterator ei;
1516   sese sese_region = XNEW (struct sese_s);
1517   sese true_region = XNEW (struct sese_s);
1518   sese false_region = XNEW (struct sese_s);
1519   ifsese if_region = XNEW (struct ifsese_s);
1520   edge exit = create_empty_if_region_on_edge (entry, condition);
1521 
1522   if_region->region = sese_region;
1523   if_region->region->entry = entry;
1524   if_region->region->exit = exit;
1525 
1526   FOR_EACH_EDGE (e, ei, entry->dest->succs)
1527     {
1528       if (e->flags & EDGE_TRUE_VALUE)
1529 	{
1530 	  true_region->entry = e;
1531 	  true_region->exit = single_succ_edge (e->dest);
1532 	  if_region->true_region = true_region;
1533 	}
1534       else if (e->flags & EDGE_FALSE_VALUE)
1535 	{
1536 	  false_region->entry = e;
1537 	  false_region->exit = single_succ_edge (e->dest);
1538 	  if_region->false_region = false_region;
1539 	}
1540     }
1541 
1542   return if_region;
1543 }
1544 
1545 /* Moves REGION in a condition expression:
1546    | if (1)
1547    |   ;
1548    | else
1549    |   REGION;
1550 */
1551 
1552 ifsese
1553 move_sese_in_condition (sese region)
1554 {
1555   basic_block pred_block = split_edge (SESE_ENTRY (region));
1556   ifsese if_region;
1557 
1558   SESE_ENTRY (region) = single_succ_edge (pred_block);
1559   if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
1560   if_region_set_false_region (if_region, region);
1561 
1562   return if_region;
1563 }
1564 
1565 /* Replaces the condition of the IF_REGION with CONDITION:
1566    | if (CONDITION)
1567    |   true_region;
1568    | else
1569    |   false_region;
1570 */
1571 
1572 void
1573 set_ifsese_condition (ifsese if_region, tree condition)
1574 {
1575   sese region = if_region->region;
1576   edge entry = region->entry;
1577   basic_block bb = entry->dest;
1578   gimple last = last_stmt (bb);
1579   gimple_stmt_iterator gsi = gsi_last_bb (bb);
1580   gimple cond_stmt;
1581 
1582   gcc_assert (gimple_code (last) == GIMPLE_COND);
1583 
1584   gsi_remove (&gsi, true);
1585   gsi = gsi_last_bb (bb);
1586   condition = force_gimple_operand_gsi (&gsi, condition, true, NULL,
1587 					false, GSI_NEW_STMT);
1588   cond_stmt = gimple_build_cond_from_tree (condition, NULL_TREE, NULL_TREE);
1589   gsi = gsi_last_bb (bb);
1590   gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
1591 }
1592 
1593 /* Returns the scalar evolution of T in REGION.  Every variable that
1594    is not defined in the REGION is considered a parameter.  */
1595 
1596 tree
1597 scalar_evolution_in_region (sese region, loop_p loop, tree t)
1598 {
1599   gimple def;
1600   struct loop *def_loop;
1601   basic_block before = block_before_sese (region);
1602 
1603   if (TREE_CODE (t) != SSA_NAME
1604       || loop_in_sese_p (loop, region))
1605     return instantiate_scev (before, loop,
1606 			     analyze_scalar_evolution (loop, t));
1607 
1608   if (!defined_in_sese_p (t, region))
1609     return t;
1610 
1611   def = SSA_NAME_DEF_STMT (t);
1612   def_loop = loop_containing_stmt (def);
1613 
1614   if (loop_in_sese_p (def_loop, region))
1615     {
1616       t = analyze_scalar_evolution (def_loop, t);
1617       def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1);
1618       t = compute_overall_effect_of_inner_loop (def_loop, t);
1619       return t;
1620     }
1621   else
1622     return instantiate_scev (before, loop, t);
1623 }
1624