OSDN Git Service

Fix for PR debug/43325
[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   gcc_assert (TREE_CODE (old_name) == SSA_NAME);
498   tmp.old_name = old_name;
499   slot = htab_find_slot (map, &tmp, NO_INSERT);
500
501   if (slot && *slot)
502     return ((rename_map_elt) *slot)->expr;
503
504   return old_name;
505 }
506
507 /* Register in MAP the rename tuple (OLD_NAME, EXPR).  */
508
509 void
510 set_rename (htab_t map, tree old_name, tree expr)
511 {
512   struct rename_map_elt_s tmp;
513   PTR *slot;
514
515   if (old_name == expr)
516     return;
517
518   tmp.old_name = old_name;
519   slot = htab_find_slot (map, &tmp, INSERT);
520
521   if (!slot)
522     return;
523
524   if (*slot)
525     free (*slot);
526
527   *slot = new_rename_map_elt (old_name, expr);
528 }
529
530 /* Renames the expression T following the tuples (OLD_NAME, EXPR) in
531    the rename map M.  Returns the expression T after renaming.  */
532
533 static tree
534 rename_variables_in_expr (htab_t m, tree t)
535 {
536   if (!t)
537     return t;
538
539  if (TREE_CODE (t) == SSA_NAME)
540    return get_rename (m, t);
541
542   switch (TREE_CODE_LENGTH (TREE_CODE (t)))
543     {
544     case 3:
545       TREE_OPERAND (t, 2) = rename_variables_in_expr (m, TREE_OPERAND (t, 2));
546
547     case 2:
548       TREE_OPERAND (t, 1) = rename_variables_in_expr (m, TREE_OPERAND (t, 1));
549
550     case 1:
551       TREE_OPERAND (t, 0) = rename_variables_in_expr (m, TREE_OPERAND (t, 0));
552
553     default:
554       return t;
555     }
556 }
557
558 /* Renames all the loop->nb_iterations expressions following the
559    tuples (OLD_NAME, EXPR) in RENAME_MAP.  */
560
561 void
562 rename_nb_iterations (htab_t rename_map)
563 {
564   loop_iterator li;
565   struct loop *loop;
566
567   FOR_EACH_LOOP (li, loop, 0)
568     loop->nb_iterations = rename_variables_in_expr (rename_map,
569                                                     loop->nb_iterations);
570 }
571
572 /* Renames all the parameters of SESE following the tuples (OLD_NAME,
573    EXPR) in RENAME_MAP.  */
574
575 void
576 rename_sese_parameters (htab_t rename_map, sese region)
577 {
578   int i;
579   tree p;
580
581   for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
582     VEC_replace (tree, SESE_PARAMS (region), i,
583                  rename_variables_in_expr (rename_map, p));
584 }
585
586 /* Adjusts the phi nodes in the block BB for variables defined in
587    SCOP_REGION and used outside the SCOP_REGION.  The code generation
588    moves SCOP_REGION in the else clause of an "if (1)" and generates
589    code in the then clause:
590
591    | if (1)
592    |   generated code from REGION;
593    | else
594    |   REGION;
595
596    To adjust the phi nodes after the condition, the RENAME_MAP is
597    used.  */
598
599 void
600 sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
601                           edge false_e, edge true_e)
602 {
603   gimple_stmt_iterator si;
604
605   for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
606     {
607       unsigned i;
608       unsigned false_i = 0;
609       gimple phi = gsi_stmt (si);
610       tree res = gimple_phi_result (phi);
611
612       if (!is_gimple_reg (res))
613         {
614           sese_adjust_vphi (region, phi, true_e);
615           continue;
616         }
617
618       for (i = 0; i < gimple_phi_num_args (phi); i++)
619         if (gimple_phi_arg_edge (phi, i) == false_e)
620           {
621             false_i = i;
622             break;
623           }
624
625       for (i = 0; i < gimple_phi_num_args (phi); i++)
626         if (gimple_phi_arg_edge (phi, i) == true_e)
627           {
628             tree old_name = gimple_phi_arg_def (phi, false_i);
629             tree expr = get_rename (rename_map, old_name);
630             gimple_seq stmts;
631
632             gcc_assert (old_name != expr);
633
634             if (TREE_CODE (expr) != SSA_NAME
635                 && is_gimple_reg (old_name))
636               {
637                 tree type = TREE_TYPE (old_name);
638                 tree var = create_tmp_var (type, "var");
639
640                 expr = build2 (MODIFY_EXPR, type, var, expr);
641                 expr = force_gimple_operand (expr, &stmts, true, NULL);
642                 gsi_insert_seq_on_edge_immediate (true_e, stmts);
643               }
644
645             SET_PHI_ARG_DEF (phi, i, expr);
646             set_rename (rename_map, old_name, res);
647           }
648     }
649 }
650
651 /* Rename the SSA_NAMEs used in STMT and that appear in MAP.  */
652
653 static void
654 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi)
655 {
656   ssa_op_iter iter;
657   use_operand_p use_p;
658
659   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
660     {
661       tree use = USE_FROM_PTR (use_p);
662       tree expr, type_use, type_expr;
663       gimple_seq stmts;
664
665       if (TREE_CODE (use) != SSA_NAME)
666         continue;
667
668       expr = get_rename (map, use);
669       if (use == expr)
670         continue;
671
672       type_use = TREE_TYPE (use);
673       type_expr = TREE_TYPE (expr);
674
675       if (type_use != type_expr
676           || (TREE_CODE (expr) != SSA_NAME
677               && is_gimple_reg (use)))
678         {
679           tree var;
680
681           if (is_gimple_debug (stmt))
682             {
683               if (gimple_debug_bind_p (stmt))
684                 gimple_debug_bind_reset_value (stmt);
685               else
686                 gcc_unreachable ();
687
688               break;
689             }
690
691           var = create_tmp_var (type_use, "var");
692
693           if (type_use != type_expr)
694             expr = fold_convert (type_use, expr);
695
696           expr = build2 (MODIFY_EXPR, type_use, var, expr);
697           expr = force_gimple_operand (expr, &stmts, true, NULL);
698           gsi_insert_seq_before (insert_gsi, stmts, GSI_SAME_STMT);
699         }
700
701       replace_exp (use_p, expr);
702     }
703
704   update_stmt (stmt);
705 }
706
707 /* Returns true if NAME is a parameter of SESE.  */
708
709 static bool
710 is_parameter (sese region, tree name)
711 {
712   int i;
713   tree p;
714
715   for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
716     if (p == name)
717       return true;
718
719   return false;
720 }
721
722 /* Returns true if NAME is an induction variable.  */
723
724 static bool
725 is_iv (tree name)
726 {
727   return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
728 }
729
730 static void expand_scalar_variables_stmt (gimple, basic_block, sese,
731                                           htab_t, gimple_stmt_iterator *);
732 static tree
733 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block,
734                               sese, htab_t, gimple_stmt_iterator *);
735
736 static tree
737 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region,
738                               htab_t map, gimple_stmt_iterator *gsi)
739 {
740   int i, nargs = gimple_call_num_args (stmt);
741   VEC (tree, gc) *args = VEC_alloc (tree, gc, nargs);
742   tree fn_type = TREE_TYPE (gimple_call_fn (stmt));
743   tree fn = gimple_call_fndecl (stmt);
744   tree call_expr, var, lhs;
745   gimple call;
746
747   for (i = 0; i < nargs; i++)
748     {
749       tree arg = gimple_call_arg (stmt, i);
750       tree t = TREE_TYPE (arg);
751
752       var = create_tmp_var (t, "var");
753       arg = expand_scalar_variables_expr (t, arg, TREE_CODE (arg), NULL,
754                                           bb, region, map, gsi);
755       arg = build2 (MODIFY_EXPR, t, var, arg);
756       arg = force_gimple_operand_gsi (gsi, arg, true, NULL,
757                                       true, GSI_SAME_STMT);
758       VEC_quick_push (tree, args, arg);
759     }
760
761   lhs = gimple_call_lhs (stmt);
762   var = create_tmp_var (TREE_TYPE (lhs), "var");
763   call_expr = build_call_vec (fn_type, fn, args);
764   call = gimple_build_call_from_tree (call_expr);
765   var = make_ssa_name (var, call);
766   gimple_call_set_lhs (call, var);
767   gsi_insert_before (gsi, call, GSI_SAME_STMT);
768
769   return var;
770 }
771
772 /* Copies at GSI all the scalar computations on which the ssa_name OP0
773    depends on in the SESE: these are all the scalar variables used in
774    the definition of OP0, that are defined outside BB and still in the
775    SESE, i.e. not a parameter of the SESE.  The expression that is
776    returned contains only induction variables from the generated code:
777    MAP contains the induction variables renaming mapping, and is used
778    to translate the names of induction variables.  */
779
780 static tree
781 expand_scalar_variables_ssa_name (tree type, tree op0, basic_block bb,
782                                   sese region, htab_t map,
783                                   gimple_stmt_iterator *gsi)
784 {
785   gimple def_stmt;
786   tree new_op;
787
788   if (is_parameter (region, op0)
789       || is_iv (op0))
790     return fold_convert (type, get_rename (map, op0));
791
792   def_stmt = SSA_NAME_DEF_STMT (op0);
793
794   /* Check whether we already have a rename for OP0.  */
795   new_op = get_rename (map, op0);
796
797   if (new_op != op0
798       && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb)
799     return fold_convert (type, new_op);
800
801   if (gimple_bb (def_stmt) == bb)
802     {
803       /* If the defining statement is in the basic block already
804          we do not need to create a new expression for it, we
805          only need to ensure its operands are expanded.  */
806       expand_scalar_variables_stmt (def_stmt, bb, region, map, gsi);
807       return fold_convert (type, new_op);
808     }
809   else
810     {
811       if (!gimple_bb (def_stmt)
812           || !bb_in_sese_p (gimple_bb (def_stmt), region))
813         return fold_convert (type, new_op);
814
815       switch (gimple_code (def_stmt))
816         {
817         case GIMPLE_ASSIGN:
818           {
819             tree var0 = gimple_assign_rhs1 (def_stmt);
820             enum tree_code subcode = gimple_assign_rhs_code (def_stmt);
821             tree var1 = gimple_assign_rhs2 (def_stmt);
822             tree type = gimple_expr_type (def_stmt);
823
824             return expand_scalar_variables_expr (type, var0, subcode, var1, bb,
825                                                  region, map, gsi);
826           }
827
828         case GIMPLE_CALL:
829           return expand_scalar_variables_call (def_stmt, bb, region, map, gsi);
830
831         default:
832           gcc_unreachable ();
833           return new_op;
834         }
835     }
836 }
837
838 /* Copies at GSI all the scalar computations on which the expression
839    OP0 CODE OP1 depends on in the SESE: these are all the scalar
840    variables used in OP0 and OP1, defined outside BB and still defined
841    in the SESE, i.e. not a parameter of the SESE.  The expression that
842    is returned contains only induction variables from the generated
843    code: MAP contains the induction variables renaming mapping, and is
844    used to translate the names of induction variables.  */
845
846 static tree
847 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code,
848                               tree op1, basic_block bb, sese region,
849                               htab_t map, gimple_stmt_iterator *gsi)
850 {
851   if (TREE_CODE_CLASS (code) == tcc_constant
852       || TREE_CODE_CLASS (code) == tcc_declaration)
853     return op0;
854
855   /* For data references we have to duplicate also its memory
856      indexing.  */
857   if (TREE_CODE_CLASS (code) == tcc_reference)
858     {
859       switch (code)
860         {
861         case REALPART_EXPR:
862         case IMAGPART_EXPR:
863           {
864             tree op = TREE_OPERAND (op0, 0);
865             tree res = expand_scalar_variables_expr
866               (type, op, TREE_CODE (op), NULL, bb, region, map, gsi);
867             return build1 (code, type, res);
868           }
869
870         case INDIRECT_REF:
871           {
872             tree old_name = TREE_OPERAND (op0, 0);
873             tree expr = expand_scalar_variables_ssa_name
874               (type, old_name, bb, region, map, gsi);
875
876             if (TREE_CODE (expr) != SSA_NAME
877                 && is_gimple_reg (old_name))
878               {
879                 tree type = TREE_TYPE (old_name);
880                 tree var = create_tmp_var (type, "var");
881
882                 expr = build2 (MODIFY_EXPR, type, var, expr);
883                 expr = force_gimple_operand_gsi (gsi, expr, true, NULL,
884                                                  true, GSI_SAME_STMT);
885               }
886
887             return fold_build1 (code, type, expr);
888           }
889
890         case ARRAY_REF:
891           {
892             tree op00 = TREE_OPERAND (op0, 0);
893             tree op01 = TREE_OPERAND (op0, 1);
894             tree op02 = TREE_OPERAND (op0, 2);
895             tree op03 = TREE_OPERAND (op0, 3);
896             tree base = expand_scalar_variables_expr
897               (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, region,
898                map, gsi);
899             tree subscript = expand_scalar_variables_expr
900               (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, region,
901                map, gsi);
902
903             return build4 (ARRAY_REF, type, base, subscript, op02, op03);
904           }
905
906         case COMPONENT_REF:
907           return op0;
908
909         default:
910           /* The above cases should catch everything.  */
911           gcc_unreachable ();
912         }
913     }
914
915   if (TREE_CODE_CLASS (code) == tcc_unary)
916     {
917       tree op0_type = TREE_TYPE (op0);
918       enum tree_code op0_code = TREE_CODE (op0);
919       tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
920                                                     NULL, bb, region, map, gsi);
921
922       return fold_build1 (code, type, op0_expr);
923     }
924
925   if (TREE_CODE_CLASS (code) == tcc_binary
926       || TREE_CODE_CLASS (code) == tcc_comparison)
927     {
928       tree op0_type = TREE_TYPE (op0);
929       enum tree_code op0_code = TREE_CODE (op0);
930       tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
931                                                     NULL, bb, region, map, gsi);
932       tree op1_type = TREE_TYPE (op1);
933       enum tree_code op1_code = TREE_CODE (op1);
934       tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code,
935                                                     NULL, bb, region, map, gsi);
936
937       return fold_build2 (code, type, op0_expr, op1_expr);
938     }
939
940   if (code == SSA_NAME)
941     return expand_scalar_variables_ssa_name (type, op0, bb, region, map, gsi);
942
943   if (code == ADDR_EXPR)
944     {
945       tree op00 = TREE_OPERAND (op0, 0);
946
947       if (handled_component_p (op00)
948           && TREE_CODE (op00) == ARRAY_REF)
949         {
950           tree e = expand_scalar_variables_expr (TREE_TYPE (op00), op00,
951                                                  TREE_CODE (op00),
952                                                  NULL, bb, region, map, gsi);
953           return fold_build1 (code, TREE_TYPE (op0), e);
954         }
955
956       return op0;
957     }
958
959   gcc_unreachable ();
960   return NULL;
961 }
962
963 /* Copies at the beginning of BB all the scalar computations on which
964    STMT depends on in the SESE: these are all the scalar variables used
965    in STMT, defined outside BB and still defined in the SESE, i.e. not a
966    parameter of the SESE.  The expression that is returned contains
967    only induction variables from the generated code: MAP contains the
968    induction variables renaming mapping, and is used to translate the
969    names of induction variables.  */
970
971 static void
972 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
973                               htab_t map, gimple_stmt_iterator *gsi)
974 {
975   ssa_op_iter iter;
976   use_operand_p use_p;
977
978   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
979     {
980       tree use = USE_FROM_PTR (use_p);
981       tree type = TREE_TYPE (use);
982       enum tree_code code = TREE_CODE (use);
983       tree use_expr;
984
985       if (!is_gimple_reg (use))
986         continue;
987
988       /* Don't expand USE if we already have a rename for it.  */
989       use_expr = get_rename (map, use);
990       if (use_expr != use)
991         continue;
992
993       use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
994                                                region, map, gsi);
995       use_expr = fold_convert (type, use_expr);
996
997       if (use_expr == use)
998         continue;
999
1000       if (is_gimple_debug (stmt))
1001         {
1002           if (gimple_debug_bind_p (stmt))
1003             gimple_debug_bind_reset_value (stmt);
1004           else
1005             gcc_unreachable ();
1006
1007           break;
1008         }
1009
1010       if (TREE_CODE (use_expr) != SSA_NAME)
1011         {
1012           tree var = create_tmp_var (type, "var");
1013
1014           use_expr = build2 (MODIFY_EXPR, type, var, use_expr);
1015           use_expr = force_gimple_operand_gsi (gsi, use_expr, true, NULL,
1016                                                true, GSI_SAME_STMT);
1017         }
1018
1019       replace_exp (use_p, use_expr);
1020     }
1021
1022   update_stmt (stmt);
1023 }
1024
1025 /* Copies at the beginning of BB all the scalar computations on which
1026    BB depends on in the SESE: these are all the scalar variables used
1027    in BB, defined outside BB and still defined in the SESE, i.e. not a
1028    parameter of the SESE.  The expression that is returned contains
1029    only induction variables from the generated code: MAP contains the
1030    induction variables renaming mapping, and is used to translate the
1031    names of induction variables.  */
1032
1033 static void
1034 expand_scalar_variables (basic_block bb, sese region, htab_t map)
1035 {
1036   gimple_stmt_iterator gsi;
1037
1038   for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
1039     {
1040       gimple stmt = gsi_stmt (gsi);
1041       expand_scalar_variables_stmt (stmt, bb, region, map, &gsi);
1042       gsi_next (&gsi);
1043     }
1044 }
1045
1046 /* Rename all the SSA_NAMEs from block BB according to the MAP.  */
1047
1048 static void
1049 rename_variables (basic_block bb, htab_t map)
1050 {
1051   gimple_stmt_iterator gsi;
1052   gimple_stmt_iterator insert_gsi = gsi_start_bb (bb);
1053
1054   for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1055     rename_variables_in_stmt (gsi_stmt (gsi), map, &insert_gsi);
1056 }
1057
1058 /* Remove condition from BB.  */
1059
1060 static void
1061 remove_condition (basic_block bb)
1062 {
1063   gimple last = last_stmt (bb);
1064
1065   if (last && gimple_code (last) == GIMPLE_COND)
1066     {
1067       gimple_stmt_iterator gsi = gsi_last_bb (bb);
1068       gsi_remove (&gsi, true);
1069     }
1070 }
1071
1072 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set.  */
1073
1074 edge
1075 get_true_edge_from_guard_bb (basic_block bb)
1076 {
1077   edge e;
1078   edge_iterator ei;
1079
1080   FOR_EACH_EDGE (e, ei, bb->succs)
1081     if (e->flags & EDGE_TRUE_VALUE)
1082       return e;
1083
1084   gcc_unreachable ();
1085   return NULL;
1086 }
1087
1088 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared.  */
1089
1090 edge
1091 get_false_edge_from_guard_bb (basic_block bb)
1092 {
1093   edge e;
1094   edge_iterator ei;
1095
1096   FOR_EACH_EDGE (e, ei, bb->succs)
1097     if (!(e->flags & EDGE_TRUE_VALUE))
1098       return e;
1099
1100   gcc_unreachable ();
1101   return NULL;
1102 }
1103
1104 /* Returns true when NAME is defined in LOOP.  */
1105
1106 static bool
1107 name_defined_in_loop_p (tree name, loop_p loop)
1108 {
1109   return !SSA_NAME_IS_DEFAULT_DEF (name)
1110     && gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father == loop;
1111 }
1112
1113 /* Returns true when EXPR contains SSA_NAMEs defined in LOOP.  */
1114
1115 static bool
1116 expr_defined_in_loop_p (tree expr, loop_p loop)
1117 {
1118   switch (TREE_CODE_LENGTH (TREE_CODE (expr)))
1119     {
1120     case 3:
1121       return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1122         || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop)
1123         || expr_defined_in_loop_p (TREE_OPERAND (expr, 2), loop);
1124
1125     case 2:
1126       return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop)
1127         || expr_defined_in_loop_p (TREE_OPERAND (expr, 1), loop);
1128
1129     case 1:
1130       return expr_defined_in_loop_p (TREE_OPERAND (expr, 0), loop);
1131
1132     case 0:
1133       return TREE_CODE (expr) == SSA_NAME
1134         && name_defined_in_loop_p (expr, loop);
1135
1136     default:
1137       return false;
1138     }
1139 }
1140
1141 /* Returns the gimple statement that uses NAME outside the loop it is
1142    defined in, returns NULL if there is no such loop close phi node.
1143    An invariant of the loop closed SSA form is that the only use of a
1144    variable, outside the loop it is defined in, is in the loop close
1145    phi node that just follows the loop.  */
1146
1147 static gimple
1148 alive_after_loop (tree name)
1149 {
1150   use_operand_p use_p;
1151   imm_use_iterator imm_iter;
1152   loop_p loop = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father;
1153
1154   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
1155     {
1156       gimple stmt = USE_STMT (use_p);
1157
1158       if (gimple_code (stmt) == GIMPLE_PHI
1159           && gimple_bb (stmt)->loop_father != loop)
1160         return stmt;
1161     }
1162
1163   return NULL;
1164 }
1165
1166 /* Return true if a close phi has not yet been inserted for the use of
1167    variable NAME on the single exit of LOOP.  */
1168
1169 static bool
1170 close_phi_not_yet_inserted_p (loop_p loop, tree name)
1171 {
1172   gimple_stmt_iterator psi;
1173   basic_block bb = single_exit (loop)->dest;
1174
1175   for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
1176     if (gimple_phi_arg_def (gsi_stmt (psi), 0) == name)
1177       return false;
1178
1179   return true;
1180 }
1181
1182 /* A structure for passing parameters to add_loop_exit_phis.  */
1183
1184 typedef struct alep {
1185   loop_p loop;
1186   VEC (rename_map_elt, heap) *new_renames;
1187 } *alep_p;
1188
1189 /* Helper function for htab_traverse in insert_loop_close_phis.  */
1190
1191 static int
1192 add_loop_exit_phis (void **slot, void *data)
1193 {
1194   struct rename_map_elt_s *entry;
1195   alep_p a;
1196   loop_p loop;
1197   tree expr, new_name, old_name;
1198   bool def_in_loop_p, used_outside_p, need_close_phi_p;
1199   gimple old_close_phi;
1200
1201   if (!slot || !*slot || !data)
1202     return 1;
1203
1204   entry = (struct rename_map_elt_s *) *slot;
1205   a = (alep_p) data;
1206   loop = a->loop;
1207   new_name = expr = entry->expr;
1208   old_name = entry->old_name;
1209
1210   def_in_loop_p = expr_defined_in_loop_p (expr, loop);
1211   if (!def_in_loop_p)
1212     return 1;
1213
1214   /* Remove the old rename from the map when the expression is defined
1215      in the loop that we're closing.  */
1216   free (*slot);
1217   *slot = NULL;
1218
1219   if (TREE_CODE (expr) != SSA_NAME)
1220     return 1;
1221
1222   old_close_phi = alive_after_loop (old_name);
1223   used_outside_p = (old_close_phi != NULL);
1224   need_close_phi_p = (used_outside_p
1225                       && close_phi_not_yet_inserted_p (loop, new_name));
1226
1227   /* Insert a loop close phi node.  */
1228   if (need_close_phi_p)
1229     {
1230       basic_block bb = single_exit (loop)->dest;
1231       gimple phi = create_phi_node (new_name, bb);
1232       tree new_res = create_new_def_for (gimple_phi_result (phi), phi,
1233                                          gimple_phi_result_ptr (phi));
1234
1235       add_phi_arg (phi, new_name, single_pred_edge (bb), UNKNOWN_LOCATION);
1236       VEC_safe_push (rename_map_elt, heap, a->new_renames,
1237                      new_rename_map_elt (gimple_phi_result (old_close_phi),
1238                                          new_res));
1239     }
1240
1241   return 1;
1242 }
1243
1244 /* Traverses MAP and removes from it all the tuples (OLD, NEW) where
1245    NEW is defined in LOOP.  Inserts on the exit of LOOP the close phi
1246    node "RES = phi (NEW)" corresponding to "OLD_RES = phi (OLD)" in
1247    the original code.  Inserts in MAP the tuple (OLD_RES, RES).  */
1248
1249 void
1250 insert_loop_close_phis (htab_t map, loop_p loop)
1251 {
1252   int i;
1253   struct alep a;
1254   rename_map_elt elt;
1255
1256   a.loop = loop;
1257   a.new_renames = VEC_alloc (rename_map_elt, heap, 3);
1258   update_ssa (TODO_update_ssa);
1259   htab_traverse (map, add_loop_exit_phis, &a);
1260   update_ssa (TODO_update_ssa);
1261
1262   for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++)
1263     {
1264       set_rename (map, elt->old_name, elt->expr);
1265       free (elt);
1266     }
1267
1268   VEC_free (rename_map_elt, heap, a.new_renames);
1269 }
1270
1271 /* Helper structure for htab_traverse in insert_guard_phis.  */
1272
1273 struct igp {
1274   basic_block bb;
1275   edge true_edge, false_edge;
1276   htab_t before_guard;
1277 };
1278
1279 /* Return the default name that is before the guard.  */
1280
1281 static tree
1282 default_before_guard (htab_t before_guard, tree old_name)
1283 {
1284   tree res = get_rename (before_guard, old_name);
1285
1286   if (res == old_name)
1287     {
1288       if (is_gimple_reg (res))
1289         return fold_convert (TREE_TYPE (res), integer_zero_node);
1290       return gimple_default_def (cfun, SSA_NAME_VAR (res));
1291     }
1292
1293   return res;
1294 }
1295
1296 /* Prepares EXPR to be a good phi argument when the phi result is
1297    RES.  Insert needed statements on edge E.  */
1298
1299 static tree
1300 convert_for_phi_arg (tree expr, tree res, edge e)
1301 {
1302   tree type = TREE_TYPE (res);
1303
1304   if (TREE_TYPE (expr) != type)
1305     expr = fold_convert (type, expr);
1306
1307   if (TREE_CODE (expr) != SSA_NAME
1308       && !is_gimple_min_invariant (expr))
1309     {
1310       tree var = create_tmp_var (type, "var");
1311       gimple_seq stmts;
1312
1313       expr = build2 (MODIFY_EXPR, type, var, expr);
1314       expr = force_gimple_operand (expr, &stmts, true, NULL);
1315       gsi_insert_seq_on_edge_immediate (e, stmts);
1316     }
1317
1318   return expr;
1319 }
1320
1321 /* Helper function for htab_traverse in insert_guard_phis.  */
1322
1323 static int
1324 add_guard_exit_phis (void **slot, void *s)
1325 {
1326   struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
1327   struct igp *i = (struct igp *) s;
1328   basic_block bb = i->bb;
1329   edge true_edge = i->true_edge;
1330   edge false_edge = i->false_edge;
1331   tree res = entry->old_name;
1332   tree name1 = entry->expr;
1333   tree name2 = default_before_guard (i->before_guard, res);
1334   gimple phi;
1335
1336   /* Nothing to be merged if the name before the guard is the same as
1337      the one after.  */
1338   if (name1 == name2)
1339     return 1;
1340
1341   name1 = convert_for_phi_arg (name1, res, true_edge);
1342   name2 = convert_for_phi_arg (name2, res, false_edge);
1343
1344   phi = create_phi_node (res, bb);
1345   res = create_new_def_for (gimple_phi_result (phi), phi,
1346                             gimple_phi_result_ptr (phi));
1347
1348   add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION);
1349   add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION);
1350
1351   entry->expr = res;
1352   *slot = entry;
1353   return 1;
1354 }
1355
1356 /* Iterate over RENAME_MAP and get tuples of the form (OLD, NAME1).
1357    If there is a correspondent tuple (OLD, NAME2) in BEFORE_GUARD,
1358    with NAME1 different than NAME2, then insert in BB the phi node:
1359
1360    | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
1361
1362    if there is no tuple for OLD in BEFORE_GUARD, insert
1363
1364    | RES = phi (NAME1 (on TRUE_EDGE),
1365    |            DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
1366
1367    Finally register in RENAME_MAP the tuple (OLD, RES).  */
1368
1369 void
1370 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge,
1371                    htab_t before_guard, htab_t rename_map)
1372 {
1373   struct igp i;
1374   i.bb = bb;
1375   i.true_edge = true_edge;
1376   i.false_edge = false_edge;
1377   i.before_guard = before_guard;
1378
1379   update_ssa (TODO_update_ssa);
1380   htab_traverse (rename_map, add_guard_exit_phis, &i);
1381   update_ssa (TODO_update_ssa);
1382 }
1383
1384 /* Create a duplicate of the basic block BB.  NOTE: This does not
1385    preserve SSA form.  */
1386
1387 static void
1388 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
1389 {
1390   gimple_stmt_iterator gsi, gsi_tgt;
1391
1392   gsi_tgt = gsi_start_bb (new_bb);
1393   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1394     {
1395       def_operand_p def_p;
1396       ssa_op_iter op_iter;
1397       gimple stmt = gsi_stmt (gsi);
1398       gimple copy;
1399
1400       if (gimple_code (stmt) == GIMPLE_LABEL)
1401         continue;
1402
1403       /* Create a new copy of STMT and duplicate STMT's virtual
1404          operands.  */
1405       copy = gimple_copy (stmt);
1406       gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
1407       mark_sym_for_renaming (gimple_vop (cfun));
1408
1409       maybe_duplicate_eh_stmt (copy, stmt);
1410       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
1411
1412       /* Create new names for all the definitions created by COPY and
1413          add replacement mappings for each new name.  */
1414       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
1415         {
1416           tree old_name = DEF_FROM_PTR (def_p);
1417           tree new_name = create_new_def_for (old_name, copy, def_p);
1418           set_rename (map, old_name, new_name);
1419         }
1420     }
1421 }
1422
1423 /* Copies BB and includes in the copied BB all the statements that can
1424    be reached following the use-def chains from the memory accesses,
1425    and returns the next edge following this new block.  */
1426
1427 edge
1428 copy_bb_and_scalar_dependences (basic_block bb, sese region,
1429                                 edge next_e, htab_t map)
1430 {
1431   basic_block new_bb = split_edge (next_e);
1432
1433   next_e = single_succ_edge (new_bb);
1434   graphite_copy_stmts_from_block (bb, new_bb, map);
1435   remove_condition (new_bb);
1436   remove_phi_nodes (new_bb);
1437   expand_scalar_variables (new_bb, region, map);
1438   rename_variables (new_bb, map);
1439
1440   return next_e;
1441 }
1442
1443 /* Returns the outermost loop in SCOP that contains BB.  */
1444
1445 struct loop *
1446 outermost_loop_in_sese (sese region, basic_block bb)
1447 {
1448   struct loop *nest;
1449
1450   nest = bb->loop_father;
1451   while (loop_outer (nest)
1452          && loop_in_sese_p (loop_outer (nest), region))
1453     nest = loop_outer (nest);
1454
1455   return nest;
1456 }
1457
1458 /* Sets the false region of an IF_REGION to REGION.  */
1459
1460 void
1461 if_region_set_false_region (ifsese if_region, sese region)
1462 {
1463   basic_block condition = if_region_get_condition_block (if_region);
1464   edge false_edge = get_false_edge_from_guard_bb (condition);
1465   basic_block dummy = false_edge->dest;
1466   edge entry_region = SESE_ENTRY (region);
1467   edge exit_region = SESE_EXIT (region);
1468   basic_block before_region = entry_region->src;
1469   basic_block last_in_region = exit_region->src;
1470   void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
1471                                           htab_hash_pointer (exit_region),
1472                                           NO_INSERT);
1473
1474   entry_region->flags = false_edge->flags;
1475   false_edge->flags = exit_region->flags;
1476
1477   redirect_edge_pred (entry_region, condition);
1478   redirect_edge_pred (exit_region, before_region);
1479   redirect_edge_pred (false_edge, last_in_region);
1480   redirect_edge_succ (false_edge, single_succ (dummy));
1481   delete_basic_block (dummy);
1482
1483   exit_region->flags = EDGE_FALLTHRU;
1484   recompute_all_dominators ();
1485
1486   SESE_EXIT (region) = false_edge;
1487
1488   if (if_region->false_region)
1489     free (if_region->false_region);
1490   if_region->false_region = region;
1491
1492   if (slot)
1493     {
1494       struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit);
1495
1496       memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
1497       htab_clear_slot (current_loops->exits, slot);
1498
1499       slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
1500                                        htab_hash_pointer (false_edge),
1501                                        INSERT);
1502       loop_exit->e = false_edge;
1503       *slot = loop_exit;
1504       false_edge->src->loop_father->exits->next = loop_exit;
1505     }
1506 }
1507
1508 /* Creates an IFSESE with CONDITION on edge ENTRY.  */
1509
1510 ifsese
1511 create_if_region_on_edge (edge entry, tree condition)
1512 {
1513   edge e;
1514   edge_iterator ei;
1515   sese sese_region = XNEW (struct sese_s);
1516   sese true_region = XNEW (struct sese_s);
1517   sese false_region = XNEW (struct sese_s);
1518   ifsese if_region = XNEW (struct ifsese_s);
1519   edge exit = create_empty_if_region_on_edge (entry, condition);
1520
1521   if_region->region = sese_region;
1522   if_region->region->entry = entry;
1523   if_region->region->exit = exit;
1524
1525   FOR_EACH_EDGE (e, ei, entry->dest->succs)
1526     {
1527       if (e->flags & EDGE_TRUE_VALUE)
1528         {
1529           true_region->entry = e;
1530           true_region->exit = single_succ_edge (e->dest);
1531           if_region->true_region = true_region;
1532         }
1533       else if (e->flags & EDGE_FALSE_VALUE)
1534         {
1535           false_region->entry = e;
1536           false_region->exit = single_succ_edge (e->dest);
1537           if_region->false_region = false_region;
1538         }
1539     }
1540
1541   return if_region;
1542 }
1543
1544 /* Moves REGION in a condition expression:
1545    | if (1)
1546    |   ;
1547    | else
1548    |   REGION;
1549 */
1550
1551 ifsese
1552 move_sese_in_condition (sese region)
1553 {
1554   basic_block pred_block = split_edge (SESE_ENTRY (region));
1555   ifsese if_region;
1556
1557   SESE_ENTRY (region) = single_succ_edge (pred_block);
1558   if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
1559   if_region_set_false_region (if_region, region);
1560
1561   return if_region;
1562 }
1563
1564 /* Replaces the condition of the IF_REGION with CONDITION:
1565    | if (CONDITION)
1566    |   true_region;
1567    | else
1568    |   false_region;
1569 */
1570
1571 void
1572 set_ifsese_condition (ifsese if_region, tree condition)
1573 {
1574   sese region = if_region->region;
1575   edge entry = region->entry;
1576   basic_block bb = entry->dest;
1577   gimple last = last_stmt (bb);
1578   gimple_stmt_iterator gsi = gsi_last_bb (bb);
1579   gimple cond_stmt;
1580
1581   gcc_assert (gimple_code (last) == GIMPLE_COND);
1582
1583   gsi_remove (&gsi, true);
1584   gsi = gsi_last_bb (bb);
1585   condition = force_gimple_operand_gsi (&gsi, condition, true, NULL,
1586                                         false, GSI_NEW_STMT);
1587   cond_stmt = gimple_build_cond_from_tree (condition, NULL_TREE, NULL_TREE);
1588   gsi = gsi_last_bb (bb);
1589   gsi_insert_after (&gsi, cond_stmt, GSI_NEW_STMT);
1590 }
1591
1592 /* Returns the scalar evolution of T in REGION.  Every variable that
1593    is not defined in the REGION is considered a parameter.  */
1594
1595 tree
1596 scalar_evolution_in_region (sese region, loop_p loop, tree t)
1597 {
1598   gimple def;
1599   struct loop *def_loop;
1600   basic_block before = block_before_sese (region);
1601
1602   if (TREE_CODE (t) != SSA_NAME
1603       || loop_in_sese_p (loop, region))
1604     return instantiate_scev (before, loop,
1605                              analyze_scalar_evolution (loop, t));
1606
1607   if (!defined_in_sese_p (t, region))
1608     return t;
1609
1610   def = SSA_NAME_DEF_STMT (t);
1611   def_loop = loop_containing_stmt (def);
1612
1613   if (loop_in_sese_p (def_loop, region))
1614     {
1615       t = analyze_scalar_evolution (def_loop, t);
1616       def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1);
1617       t = compute_overall_effect_of_inner_loop (def_loop, t);
1618       return t;
1619     }
1620   else
1621     return instantiate_scev (before, loop, t);
1622 }