OSDN Git Service

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