OSDN Git Service

2010-01-25 Bob Duff <duff@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / sese.c
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>.
5
6 This file is part of GCC.
7
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.
12
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.
17
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/>.  */
21
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"
45
46 /* Print to stderr the element ELT.  */
47
48 static void
49 debug_rename_elt (rename_map_elt elt)
50 {
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");
56 }
57
58 /* Helper function for debug_rename_map.  */
59
60 static int
61 debug_rename_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
62 {
63   struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
64   debug_rename_elt (entry);
65   return 1;
66 }
67
68 /* Print to stderr all the elements of MAP.  */
69
70 void
71 debug_rename_map (htab_t map)
72 {
73   htab_traverse (map, debug_rename_map_1, NULL);
74 }
75
76 /* Computes a hash function for database element ELT.  */
77
78 hashval_t
79 rename_map_elt_info (const void *elt)
80 {
81   return SSA_NAME_VERSION (((const struct rename_map_elt_s *) elt)->old_name);
82 }
83
84 /* Compares database elements E1 and E2.  */
85
86 int
87 eq_rename_map_elts (const void *e1, const void *e2)
88 {
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;
91
92   return (elt1->old_name == elt2->old_name);
93 }
94
95 \f
96
97 /* Print to stderr the element ELT.  */
98
99 static void
100 debug_ivtype_elt (ivtype_map_elt elt)
101 {
102   fprintf (stderr, "(%s, ", elt->cloog_iv);
103   print_generic_expr (stderr, elt->type, 0);
104   fprintf (stderr, ")\n");
105 }
106
107 /* Helper function for debug_ivtype_map.  */
108
109 static int
110 debug_ivtype_map_1 (void **slot, void *s ATTRIBUTE_UNUSED)
111 {
112   struct ivtype_map_elt_s *entry = (struct ivtype_map_elt_s *) *slot;
113   debug_ivtype_elt (entry);
114   return 1;
115 }
116
117 /* Print to stderr all the elements of MAP.  */
118
119 void
120 debug_ivtype_map (htab_t map)
121 {
122   htab_traverse (map, debug_ivtype_map_1, NULL);
123 }
124
125 /* Computes a hash function for database element ELT.  */
126
127 hashval_t
128 ivtype_map_elt_info (const void *elt)
129 {
130   return htab_hash_pointer (((const struct ivtype_map_elt_s *) elt)->cloog_iv);
131 }
132
133 /* Compares database elements E1 and E2.  */
134
135 int
136 eq_ivtype_map_elts (const void *e1, const void *e2)
137 {
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;
140
141   return (elt1->cloog_iv == elt2->cloog_iv);
142 }
143
144 \f
145
146 /* Record LOOP as occuring in REGION.  */
147
148 static void
149 sese_record_loop (sese region, loop_p loop)
150 {
151   if (sese_contains_loop (region, loop))
152     return;
153
154   bitmap_set_bit (SESE_LOOPS (region), loop->num);
155   VEC_safe_push (loop_p, heap, SESE_LOOP_NEST (region), loop);
156 }
157
158 /* Build the loop nests contained in REGION.  Returns true when the
159    operation was successful.  */
160
161 void
162 build_sese_loop_nests (sese region)
163 {
164   unsigned i;
165   basic_block bb;
166   struct loop *loop0, *loop1;
167
168   FOR_EACH_BB (bb)
169     if (bb_in_sese_p (bb, region))
170       {
171         struct loop *loop = bb->loop_father;
172
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);
177       }
178
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++)
183     {
184       if (VEC_length (loop_p, SESE_LOOP_NEST (region)) == i + 1)
185         break;
186
187       loop1 = VEC_index (loop_p, SESE_LOOP_NEST (region), i + 1);
188       if (loop0->num > loop1->num)
189         {
190           VEC_replace (loop_p, SESE_LOOP_NEST (region), i, loop1);
191           VEC_replace (loop_p, SESE_LOOP_NEST (region), i + 1, loop0);
192         }
193     }
194 }
195
196 /* For a USE in BB, if BB is outside REGION, mark the USE in the
197    LIVEOUTS set.  */
198
199 static void
200 sese_build_liveouts_use (sese region, bitmap liveouts, basic_block bb,
201                          tree use)
202 {
203   unsigned ver;
204   basic_block def_bb;
205
206   if (TREE_CODE (use) != SSA_NAME)
207     return;
208
209   ver = SSA_NAME_VERSION (use);
210   def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
211
212   if (!def_bb
213       || !bb_in_sese_p (def_bb, region)
214       || bb_in_sese_p (bb, region))
215     return;
216
217   bitmap_set_bit (liveouts, ver);
218 }
219
220 /* Marks for rewrite all the SSA_NAMES defined in REGION and that are
221    used in BB that is outside of the REGION.  */
222
223 static void
224 sese_build_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
225 {
226   gimple_stmt_iterator bsi;
227   edge e;
228   edge_iterator ei;
229   ssa_op_iter iter;
230   use_operand_p use_p;
231
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));
236
237   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
238     {
239       gimple stmt = gsi_stmt (bsi);
240
241       if (is_gimple_debug (stmt))
242         continue;
243
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));
246     }
247 }
248
249 /* For a USE in BB, return true if BB is outside REGION and it's not
250    in the LIVEOUTS set.  */
251
252 static bool
253 sese_bad_liveouts_use (sese region, bitmap liveouts, basic_block bb,
254                        tree use)
255 {
256   unsigned ver;
257   basic_block def_bb;
258
259   if (TREE_CODE (use) != SSA_NAME)
260     return false;
261
262   ver = SSA_NAME_VERSION (use);
263
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;
268
269   def_bb = gimple_bb (SSA_NAME_DEF_STMT (use));
270
271   if (!def_bb
272       || !bb_in_sese_p (def_bb, region)
273       || bb_in_sese_p (bb, region))
274     return false;
275
276   return true;
277 }
278
279 /* Reset debug stmts that reference SSA_NAMES defined in REGION that
280    are not marked as liveouts.  */
281
282 static void
283 sese_reset_debug_liveouts_bb (sese region, bitmap liveouts, basic_block bb)
284 {
285   gimple_stmt_iterator bsi;
286   ssa_op_iter iter;
287   use_operand_p use_p;
288
289   for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
290     {
291       gimple stmt = gsi_stmt (bsi);
292
293       if (!is_gimple_debug (stmt))
294         continue;
295
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)))
299           {
300             gimple_debug_bind_reset_value (stmt);
301             update_stmt (stmt);
302             break;
303           }
304     }
305 }
306
307 /* Build the LIVEOUTS of REGION: the set of variables defined inside
308    and used outside the REGION.  */
309
310 static void
311 sese_build_liveouts (sese region, bitmap liveouts)
312 {
313   basic_block bb;
314
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);
320 }
321
322 /* Builds a new SESE region from edges ENTRY and EXIT.  */
323
324 sese
325 new_sese (edge entry, edge exit)
326 {
327   sese region = XNEW (struct sese_s);
328
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);
335
336   return region;
337 }
338
339 /* Deletes REGION.  */
340
341 void
342 free_sese (sese region)
343 {
344   if (SESE_LOOPS (region))
345     SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
346
347   VEC_free (tree, heap, SESE_PARAMS (region));
348   VEC_free (loop_p, heap, SESE_LOOP_NEST (region));
349
350   XDELETE (region);
351 }
352
353 /* Add exit phis for USE on EXIT.  */
354
355 static void
356 sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
357 {
358   gimple phi = create_phi_node (use, exit);
359
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);
364 }
365
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:
370
371    | if (1)
372    |   empty;
373    | else
374    |   REGION;
375 */
376
377 void
378 sese_insert_phis_for_liveouts (sese region, basic_block bb,
379                                edge false_e, edge true_e)
380 {
381   unsigned i;
382   bitmap_iterator bi;
383   bitmap liveouts = BITMAP_ALLOC (NULL);
384
385   update_ssa (TODO_update_ssa);
386
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);
391
392   update_ssa (TODO_update_ssa);
393 }
394
395 /* Get the definition of NAME before the SESE.  Keep track of the
396    basic blocks that have been VISITED in a bitmap.  */
397
398 static tree
399 get_vdef_before_sese (sese region, tree name, sbitmap visited)
400 {
401   unsigned i;
402   gimple stmt = SSA_NAME_DEF_STMT (name);
403   basic_block def_bb = gimple_bb (stmt);
404
405   if (!def_bb || !bb_in_sese_p (def_bb, region))
406     return name;
407
408   if (TEST_BIT (visited, def_bb->index))
409     return NULL_TREE;
410
411   SET_BIT (visited, def_bb->index);
412
413   switch (gimple_code (stmt))
414     {
415     case GIMPLE_PHI:
416       for (i = 0; i < gimple_phi_num_args (stmt); i++)
417         {
418           tree arg = gimple_phi_arg_def (stmt, i);
419           tree res;
420
421           if (gimple_bb (SSA_NAME_DEF_STMT (arg))
422               && def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (arg))->index)
423             continue;
424
425           res = get_vdef_before_sese (region, arg, visited);
426           if (res)
427             return res;
428         }
429       return NULL_TREE;
430
431     case GIMPLE_ASSIGN:
432     case GIMPLE_CALL:
433       {
434         use_operand_p use_p = gimple_vuse_op (stmt);
435         tree use = USE_FROM_PTR (use_p);
436
437         if (def_bb->index == gimple_bb (SSA_NAME_DEF_STMT (use))->index)
438           RESET_BIT (visited, def_bb->index);
439
440         return get_vdef_before_sese (region, use, visited);
441       }
442
443     default:
444       return NULL_TREE;
445     }
446 }
447
448 /* Adjust a virtual phi node PHI that is placed at the end of the
449    generated code for SCOP:
450
451    | if (1)
452    |   generated code from REGION;
453    | else
454    |   REGION;
455
456    The FALSE_E edge comes from the original code, TRUE_E edge comes
457    from the code generated for the SCOP.  */
458
459 static void
460 sese_adjust_vphi (sese region, gimple phi, edge true_e)
461 {
462   unsigned i;
463
464   gcc_assert (gimple_phi_num_args (phi) == 2);
465
466   for (i = 0; i < gimple_phi_num_args (phi); i++)
467     if (gimple_phi_arg_edge (phi, i) == true_e)
468       {
469         tree true_arg, false_arg, before_scop_arg;
470         sbitmap visited;
471
472         true_arg = gimple_phi_arg_def (phi, i);
473         if (!SSA_NAME_IS_DEFAULT_DEF (true_arg))
474           return;
475
476         false_arg = gimple_phi_arg_def (phi, i == 0 ? 1 : 0);
477         if (SSA_NAME_IS_DEFAULT_DEF (false_arg))
478           return;
479
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);
486       }
487 }
488
489 /* Returns the expression associated to OLD_NAME in MAP.  */
490
491 static tree
492 get_rename (htab_t map, tree old_name)
493 {
494   struct rename_map_elt_s tmp;
495   PTR *slot;
496
497   tmp.old_name = old_name;
498   slot = htab_find_slot (map, &tmp, NO_INSERT);
499
500   if (slot && *slot)
501     return ((rename_map_elt) *slot)->expr;
502
503   return old_name;
504 }
505
506 /* Register in MAP the rename tuple (OLD_NAME, EXPR).  */
507
508 void
509 set_rename (htab_t map, tree old_name, tree expr)
510 {
511   struct rename_map_elt_s tmp;
512   PTR *slot;
513
514   if (old_name == expr)
515     return;
516
517   tmp.old_name = old_name;
518   slot = htab_find_slot (map, &tmp, INSERT);
519
520   if (!slot)
521     return;
522
523   if (*slot)
524     free (*slot);
525
526   *slot = new_rename_map_elt (old_name, expr);
527 }
528
529 static void rename_variables_in_expr (htab_t, tree);
530
531 /* Renames the operand OP of expression T following the tuples
532    (OLD_NAME, EXPR) in RENAME_MAP.  */
533
534 static void
535 rename_variables_in_operand (htab_t rename_map, tree t, int op)
536 {
537   tree operand = TREE_OPERAND (t, op);
538
539   if (TREE_CODE (operand) == SSA_NAME)
540     {
541       tree new_name = get_rename (rename_map, operand);
542
543       if (new_name != operand)
544         TREE_OPERAND (t, op) = new_name;
545     }
546   else
547     rename_variables_in_expr (rename_map, operand);
548 }
549
550 /* Renames the expression T following the tuples (OLD_NAME, EXPR) in
551    RENAME_MAP.  */
552
553 static void
554 rename_variables_in_expr (htab_t rename_map, tree t)
555 {
556   if (!t)
557     return;
558
559   switch (TREE_CODE_LENGTH (TREE_CODE (t)))
560     {
561     case 3:
562       rename_variables_in_operand (rename_map, t, 2);
563
564     case 2:
565       rename_variables_in_operand (rename_map, t, 1);
566
567     case 1:
568       rename_variables_in_operand (rename_map, t, 0);
569
570     default:
571       return;
572     }
573 }
574
575 /* Renames all the loop->nb_iterations expressions following the
576    tuples (OLD_NAME, EXPR) in RENAME_MAP.  */
577
578 void
579 rename_nb_iterations (htab_t rename_map)
580 {
581   loop_iterator li;
582   struct loop *loop;
583
584   FOR_EACH_LOOP (li, loop, 0)
585     {
586       rename_variables_in_expr (rename_map, loop->nb_iterations);
587     }
588 }
589
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:
594
595    | if (1)
596    |   generated code from REGION;
597    | else
598    |   REGION;
599
600    To adjust the phi nodes after the condition, the RENAME_MAP is
601    used.  */
602
603 void
604 sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
605                           edge false_e, edge true_e)
606 {
607   gimple_stmt_iterator si;
608
609   for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
610     {
611       unsigned i;
612       unsigned false_i = 0;
613       gimple phi = gsi_stmt (si);
614       tree res = gimple_phi_result (phi);
615
616       if (!is_gimple_reg (res))
617         {
618           sese_adjust_vphi (region, phi, true_e);
619           continue;
620         }
621
622       for (i = 0; i < gimple_phi_num_args (phi); i++)
623         if (gimple_phi_arg_edge (phi, i) == false_e)
624           {
625             false_i = i;
626             break;
627           }
628
629       for (i = 0; i < gimple_phi_num_args (phi); i++)
630         if (gimple_phi_arg_edge (phi, i) == true_e)
631           {
632             tree old_name = gimple_phi_arg_def (phi, false_i);
633             tree expr = get_rename (rename_map, old_name);
634             gimple_seq stmts;
635
636             gcc_assert (old_name != expr);
637
638             if (TREE_CODE (expr) != SSA_NAME
639                 && is_gimple_reg (old_name))
640               {
641                 tree type = TREE_TYPE (old_name);
642                 tree var = create_tmp_var (type, "var");
643
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);
647               }
648
649             SET_PHI_ARG_DEF (phi, i, expr);
650             set_rename (rename_map, old_name, res);
651           }
652     }
653 }
654
655 /* Rename the SSA_NAMEs used in STMT and that appear in MAP.  */
656
657 static void
658 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi)
659 {
660   ssa_op_iter iter;
661   use_operand_p use_p;
662
663   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
664     {
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;
670
671       if (use == expr)
672         continue;
673
674       if (type_use != type_expr
675           || (TREE_CODE (expr) != SSA_NAME
676               && is_gimple_reg (use)))
677         {
678           tree var;
679
680           if (is_gimple_debug (stmt))
681             {
682               if (gimple_debug_bind_p (stmt))
683                 gimple_debug_bind_reset_value (stmt);
684               else
685                 gcc_unreachable ();
686
687               break;
688             }
689
690           var = create_tmp_var (type_use, "var");
691
692           if (type_use != type_expr)
693             expr = fold_convert (type_use, expr);
694
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);
698         }
699
700       replace_exp (use_p, expr);
701     }
702
703   update_stmt (stmt);
704 }
705
706 /* Returns true if NAME is a parameter of SESE.  */
707
708 static bool
709 is_parameter (sese region, tree name)
710 {
711   int i;
712   tree p;
713
714   for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
715     if (p == name)
716       return true;
717
718   return false;
719 }
720
721 /* Returns true if NAME is an induction variable.  */
722
723 static bool
724 is_iv (tree name)
725 {
726   return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
727 }
728
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 *);
734
735 static tree
736 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region,
737                               htab_t map, gimple_stmt_iterator *gsi)
738 {
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;
745
746   for (i = 0; i < nargs; i++)
747     {
748       tree arg = gimple_call_arg (stmt, i);
749       tree t = TREE_TYPE (arg);
750
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);
758     }
759
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);
767
768   return var;
769 }
770
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.  */
778
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)
783 {
784   gimple def_stmt;
785   tree new_op;
786
787   if (is_parameter (region, op0)
788       || is_iv (op0))
789     return get_rename (map, op0);
790
791   def_stmt = SSA_NAME_DEF_STMT (op0);
792
793   /* Check whether we already have a rename for OP0.  */
794   new_op = get_rename (map, op0);
795
796   if (new_op != op0
797       && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb)
798     return new_op;
799
800   if (gimple_bb (def_stmt) == bb)
801     {
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;
807     }
808   else
809     {
810       if (!gimple_bb (def_stmt)
811           || !bb_in_sese_p (gimple_bb (def_stmt), region))
812         return new_op;
813
814       switch (gimple_code (def_stmt))
815         {
816         case GIMPLE_ASSIGN:
817           {
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);
822
823             return expand_scalar_variables_expr (type, var0, subcode, var1, bb,
824                                                  region, map, gsi);
825           }
826
827         case GIMPLE_CALL:
828           return expand_scalar_variables_call (def_stmt, bb, region, map, gsi);
829
830         default:
831           gcc_unreachable ();
832           return new_op;
833         }
834     }
835 }
836
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.  */
844
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)
849 {
850   if (TREE_CODE_CLASS (code) == tcc_constant
851       || TREE_CODE_CLASS (code) == tcc_declaration)
852     return op0;
853
854   /* For data references we have to duplicate also its memory
855      indexing.  */
856   if (TREE_CODE_CLASS (code) == tcc_reference)
857     {
858       switch (code)
859         {
860         case REALPART_EXPR:
861         case IMAGPART_EXPR:
862           {
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);
867           }
868
869         case INDIRECT_REF:
870           {
871             tree old_name = TREE_OPERAND (op0, 0);
872             tree expr = expand_scalar_variables_ssa_name
873               (old_name, bb, region, map, gsi);
874
875             if (TREE_CODE (expr) != SSA_NAME
876                 && is_gimple_reg (old_name))
877               {
878                 tree type = TREE_TYPE (old_name);
879                 tree var = create_tmp_var (type, "var");
880
881                 expr = build2 (MODIFY_EXPR, type, var, expr);
882                 expr = force_gimple_operand_gsi (gsi, expr, true, NULL,
883                                                  true, GSI_SAME_STMT);
884               }
885
886             return fold_build1 (code, type, expr);
887           }
888
889         case ARRAY_REF:
890           {
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);
901
902             return build4 (ARRAY_REF, type, base, subscript, op02, op03);
903           }
904
905         default:
906           /* The above cases should catch everything.  */
907           gcc_unreachable ();
908         }
909     }
910
911   if (TREE_CODE_CLASS (code) == tcc_unary)
912     {
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);
917
918       return fold_build1 (code, type, op0_expr);
919     }
920
921   if (TREE_CODE_CLASS (code) == tcc_binary
922       || TREE_CODE_CLASS (code) == tcc_comparison)
923     {
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);
932
933       return fold_build2 (code, type, op0_expr, op1_expr);
934     }
935
936   if (code == SSA_NAME)
937     return expand_scalar_variables_ssa_name (op0, bb, region, map, gsi);
938
939   if (code == ADDR_EXPR)
940     {
941       tree op00 = TREE_OPERAND (op0, 0);
942
943       if (handled_component_p (op00)
944           && TREE_CODE (op00) == ARRAY_REF)
945         {
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);
950         }
951
952       return op0;
953     }
954
955   gcc_unreachable ();
956   return NULL;
957 }
958
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.  */
966
967 static void
968 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
969                               htab_t map, gimple_stmt_iterator *gsi)
970 {
971   ssa_op_iter iter;
972   use_operand_p use_p;
973
974   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
975     {
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;
980
981       if (!is_gimple_reg (use))
982         continue;
983
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;
988
989       use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
990                                                region, map, gsi);
991       use_expr = fold_convert (type, use_expr);
992
993       if (use_expr == use)
994         continue;
995
996       if (is_gimple_debug (stmt))
997         {
998           if (gimple_debug_bind_p (stmt))
999             gimple_debug_bind_reset_value (stmt);
1000           else
1001             gcc_unreachable ();
1002
1003           break;
1004         }
1005
1006       if (TREE_CODE (use_expr) != SSA_NAME)
1007         {
1008           tree var = create_tmp_var (type, "var");
1009
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);
1013         }
1014
1015       replace_exp (use_p, use_expr);
1016     }
1017
1018   update_stmt (stmt);
1019 }
1020
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.  */
1028
1029 static void
1030 expand_scalar_variables (basic_block bb, sese region, htab_t map)
1031 {
1032   gimple_stmt_iterator gsi;
1033
1034   for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
1035     {
1036       gimple stmt = gsi_stmt (gsi);
1037       expand_scalar_variables_stmt (stmt, bb, region, map, &gsi);
1038       gsi_next (&gsi);
1039     }
1040 }
1041
1042 /* Rename all the SSA_NAMEs from block BB according to the MAP.  */
1043
1044 static void
1045 rename_variables (basic_block bb, htab_t map)
1046 {
1047   gimple_stmt_iterator gsi;
1048   gimple_stmt_iterator insert_gsi = gsi_start_bb (bb);
1049
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);
1052 }
1053
1054 /* Remove condition from BB.  */
1055
1056 static void
1057 remove_condition (basic_block bb)
1058 {
1059   gimple last = last_stmt (bb);
1060
1061   if (last && gimple_code (last) == GIMPLE_COND)
1062     {
1063       gimple_stmt_iterator gsi = gsi_last_bb (bb);
1064       gsi_remove (&gsi, true);
1065     }
1066 }
1067
1068 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set.  */
1069
1070 edge
1071 get_true_edge_from_guard_bb (basic_block bb)
1072 {
1073   edge e;
1074   edge_iterator ei;
1075
1076   FOR_EACH_EDGE (e, ei, bb->succs)
1077     if (e->flags & EDGE_TRUE_VALUE)
1078       return e;
1079
1080   gcc_unreachable ();
1081   return NULL;
1082 }
1083
1084 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared.  */
1085
1086 edge
1087 get_false_edge_from_guard_bb (basic_block bb)
1088 {
1089   edge e;
1090   edge_iterator ei;
1091
1092   FOR_EACH_EDGE (e, ei, bb->succs)
1093     if (!(e->flags & EDGE_TRUE_VALUE))
1094       return e;
1095
1096   gcc_unreachable ();
1097   return NULL;
1098 }
1099
1100 /* Returns true when NAME is defined in LOOP.  */
1101
1102 static bool
1103 name_defined_in_loop_p (tree name, loop_p loop)
1104 {
1105   gimple stmt = SSA_NAME_DEF_STMT (name);
1106
1107   return (gimple_bb (stmt)->loop_father == loop);
1108 }
1109
1110 /* Returns true when EXPR contains SSA_NAMEs defined in LOOP.  */
1111
1112 static bool
1113 expr_defined_in_loop_p (tree expr, loop_p loop)
1114 {
1115   switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
1116     {
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);
1121
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);
1125
1126     case 1:
1127       return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop);
1128
1129     case 0:
1130       return TREE_CODE (expr) == SSA_NAME
1131         && name_defined_in_loop_p (expr, loop);
1132
1133     default:
1134       return false;
1135     }
1136 }
1137
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.  */
1143
1144 static gimple
1145 alive_after_loop (tree name)
1146 {
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;
1150
1151   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
1152     {
1153       gimple stmt = USE_STMT (use_p);
1154
1155       if (gimple_code (stmt) == GIMPLE_PHI
1156           && gimple_bb (stmt)->loop_father != loop)
1157         return stmt;
1158     }
1159
1160   return NULL;
1161 }
1162
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.  */
1165
1166 static bool
1167 close_phi_not_yet_inserted_p (loop_p loop, tree name)
1168 {
1169   gimple_stmt_iterator psi;
1170   basic_block bb = single_exit (loop)->dest;
1171
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;
1175
1176   return true;
1177 }
1178
1179 /* A structure for passing parameters to add_loop_exit_phis.  */
1180
1181 typedef struct alep {
1182   loop_p loop;
1183   VEC (rename_map_elt, heap) *new_renames;
1184 } *alep_p;
1185
1186 /* Helper function for htab_traverse in insert_loop_close_phis.  */
1187
1188 static int
1189 add_loop_exit_phis (void **slot, void *data)
1190 {
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;
1197
1198   if (!slot || !*slot || !data)
1199     return 1;
1200
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;
1206
1207   def_in_loop_p = expr_defined_in_loop_p (expr, loop);
1208   if (!def_in_loop_p)
1209     return 1;
1210
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;
1215
1216   if (TREE_CODE (expr) != SSA_NAME)
1217     return 1;
1218
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));
1223
1224   /* Insert a loop close phi node.  */
1225   if (need_close_phi_p)
1226     {
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));
1231
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));
1236     }
1237
1238   return 1;
1239 }
1240
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).  */
1245
1246 void
1247 insert_loop_close_phis (htab_t map, loop_p loop)
1248 {
1249   int i;
1250   struct alep a;
1251   rename_map_elt elt;
1252
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);
1258
1259   for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++)
1260     {
1261       set_rename (map, elt->old_name, elt->expr);
1262       free (elt);
1263     }
1264
1265   VEC_free (rename_map_elt, heap, a.new_renames);
1266 }
1267
1268 /* Helper structure for htab_traverse in insert_guard_phis.  */
1269
1270 struct igp {
1271   basic_block bb;
1272   edge true_edge, false_edge;
1273   htab_t before_guard;
1274 };
1275
1276 /* Return the default name that is before the guard.  */
1277
1278 static tree
1279 default_before_guard (htab_t before_guard, tree old_name)
1280 {
1281   tree res = get_rename (before_guard, old_name);
1282
1283   if (res == old_name)
1284     {
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));
1288     }
1289
1290   return res;
1291 }
1292
1293 /* Prepares EXPR to be a good phi argument when the phi result is
1294    RES.  Insert needed statements on edge E.  */
1295
1296 static tree
1297 convert_for_phi_arg (tree expr, tree res, edge e)
1298 {
1299   tree type = TREE_TYPE (res);
1300
1301   if (TREE_TYPE (expr) != type)
1302     expr = fold_convert (type, expr);
1303
1304   if (TREE_CODE (expr) != SSA_NAME
1305       && !is_gimple_min_invariant (expr))
1306     {
1307       tree var = create_tmp_var (type, "var");
1308       gimple_seq stmts;
1309
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);
1313     }
1314
1315   return expr;
1316 }
1317
1318 /* Helper function for htab_traverse in insert_guard_phis.  */
1319
1320 static int
1321 add_guard_exit_phis (void **slot, void *s)
1322 {
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;
1332
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;
1337
1338   name1 = convert_for_phi_arg (name1, res, true_edge);
1339   name2 = convert_for_phi_arg (name2, res, false_edge);
1340
1341   phi = create_phi_node (res, bb);
1342   res = create_new_def_for (gimple_phi_result (phi), phi,
1343                             gimple_phi_result_ptr (phi));
1344
1345   add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION);
1346   add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION);
1347
1348   entry->expr = res;
1349   *slot = entry;
1350   return 1;
1351 }
1352
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:
1356
1357    | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
1358
1359    if there is no tuple for OLD in BEFORE_GUARD, insert
1360
1361    | RES = phi (NAME1 (on TRUE_EDGE),
1362    |            DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
1363
1364    Finally register in RENAME_MAP the tuple (OLD, RES).  */
1365
1366 void
1367 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge,
1368                    htab_t before_guard, htab_t rename_map)
1369 {
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;
1375
1376   update_ssa (TODO_update_ssa);
1377   htab_traverse (rename_map, add_guard_exit_phis, &i);
1378   update_ssa (TODO_update_ssa);
1379 }
1380
1381 /* Create a duplicate of the basic block BB.  NOTE: This does not
1382    preserve SSA form.  */
1383
1384 static void
1385 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
1386 {
1387   gimple_stmt_iterator gsi, gsi_tgt;
1388
1389   gsi_tgt = gsi_start_bb (new_bb);
1390   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1391     {
1392       def_operand_p def_p;
1393       ssa_op_iter op_iter;
1394       gimple stmt = gsi_stmt (gsi);
1395       gimple copy;
1396
1397       if (gimple_code (stmt) == GIMPLE_LABEL)
1398         continue;
1399
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));
1405
1406       maybe_duplicate_eh_stmt (copy, stmt);
1407       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
1408
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)
1412         {
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);
1416         }
1417     }
1418 }
1419
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.  */
1423
1424 edge
1425 copy_bb_and_scalar_dependences (basic_block bb, sese region,
1426                                 edge next_e, htab_t map)
1427 {
1428   basic_block new_bb = split_edge (next_e);
1429
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);
1436
1437   return next_e;
1438 }
1439
1440 /* Returns the outermost loop in SCOP that contains BB.  */
1441
1442 struct loop *
1443 outermost_loop_in_sese (sese region, basic_block bb)
1444 {
1445   struct loop *nest;
1446
1447   nest = bb->loop_father;
1448   while (loop_outer (nest)
1449          && loop_in_sese_p (loop_outer (nest), region))
1450     nest = loop_outer (nest);
1451
1452   return nest;
1453 }
1454
1455 /* Sets the false region of an IF_REGION to REGION.  */
1456
1457 void
1458 if_region_set_false_region (ifsese if_region, sese region)
1459 {
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);
1470
1471   entry_region->flags = false_edge->flags;
1472   false_edge->flags = exit_region->flags;
1473
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);
1479
1480   exit_region->flags = EDGE_FALLTHRU;
1481   recompute_all_dominators ();
1482
1483   SESE_EXIT (region) = false_edge;
1484
1485   if (if_region->false_region)
1486     free (if_region->false_region);
1487   if_region->false_region = region;
1488
1489   if (slot)
1490     {
1491       struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit);
1492
1493       memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
1494       htab_clear_slot (current_loops->exits, slot);
1495
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;
1502     }
1503 }
1504
1505 /* Creates an IFSESE with CONDITION on edge ENTRY.  */
1506
1507 ifsese
1508 create_if_region_on_edge (edge entry, tree condition)
1509 {
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);
1517
1518   if_region->region = sese_region;
1519   if_region->region->entry = entry;
1520   if_region->region->exit = exit;
1521
1522   FOR_EACH_EDGE (e, ei, entry->dest->succs)
1523     {
1524       if (e->flags & EDGE_TRUE_VALUE)
1525         {
1526           true_region->entry = e;
1527           true_region->exit = single_succ_edge (e->dest);
1528           if_region->true_region = true_region;
1529         }
1530       else if (e->flags & EDGE_FALSE_VALUE)
1531         {
1532           false_region->entry = e;
1533           false_region->exit = single_succ_edge (e->dest);
1534           if_region->false_region = false_region;
1535         }
1536     }
1537
1538   return if_region;
1539 }
1540
1541 /* Moves REGION in a condition expression:
1542    | if (1)
1543    |   ;
1544    | else
1545    |   REGION;
1546 */
1547
1548 ifsese
1549 move_sese_in_condition (sese region)
1550 {
1551   basic_block pred_block = split_edge (SESE_ENTRY (region));
1552   ifsese if_region;
1553
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);
1557
1558   return if_region;
1559 }
1560
1561 /* Replaces the condition of the IF_REGION with CONDITION:
1562    | if (CONDITION)
1563    |   true_region;
1564    | else
1565    |   false_region;
1566 */
1567
1568 void
1569 set_ifsese_condition (ifsese if_region, tree condition)
1570 {
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;
1577
1578   gcc_assert (gimple_code (last) == GIMPLE_COND);
1579
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);
1587 }
1588
1589 /* Returns the scalar evolution of T in REGION.  Every variable that
1590    is not defined in the REGION is considered a parameter.  */
1591
1592 tree
1593 scalar_evolution_in_region (sese region, loop_p loop, tree t)
1594 {
1595   gimple def;
1596   struct loop *def_loop;
1597   basic_block before = block_before_sese (region);
1598
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));
1603
1604   if (!defined_in_sese_p (t, region))
1605     return t;
1606
1607   def = SSA_NAME_DEF_STMT (t);
1608   def_loop = loop_containing_stmt (def);
1609
1610   if (loop_in_sese_p (def_loop, region))
1611     {
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;
1616     }
1617   else
1618     return instantiate_scev (before, loop, t);
1619 }