OSDN Git Service

2009-08-20 Thomas Koenig <tkoenig@gcc.gnu.org>
[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 htab_hash_pointer (((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     FOR_EACH_SSA_USE_OPERAND (use_p, gsi_stmt (bsi), iter, SSA_OP_ALL_USES)
239       sese_build_liveouts_use (region, liveouts, bb, USE_FROM_PTR (use_p));
240 }
241
242 /* Build the LIVEOUTS of REGION: the set of variables defined inside
243    and used outside the REGION.  */
244
245 static void
246 sese_build_liveouts (sese region, bitmap liveouts)
247 {
248   basic_block bb;
249
250   FOR_EACH_BB (bb)
251     sese_build_liveouts_bb (region, liveouts, bb);
252 }
253
254 /* Builds a new SESE region from edges ENTRY and EXIT.  */
255
256 sese
257 new_sese (edge entry, edge exit)
258 {
259   sese region = XNEW (struct sese_s);
260
261   SESE_ENTRY (region) = entry;
262   SESE_EXIT (region) = exit;
263   SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
264   SESE_LOOP_NEST (region) = VEC_alloc (loop_p, heap, 3);
265   SESE_ADD_PARAMS (region) = true;
266   SESE_PARAMS (region) = VEC_alloc (tree, heap, 3);
267   SESE_PARAMS_INDEX (region) = htab_create (10, clast_name_index_elt_info,
268                                             eq_clast_name_indexes, free);
269   SESE_PARAMS_NAMES (region) = XNEWVEC (char *, num_ssa_names);
270
271   return region;
272 }
273
274 /* Deletes REGION.  */
275
276 void
277 free_sese (sese region)
278 {
279   if (SESE_LOOPS (region))
280     SESE_LOOPS (region) = BITMAP_ALLOC (NULL);
281
282   VEC_free (tree, heap, SESE_PARAMS (region));
283   VEC_free (loop_p, heap, SESE_LOOP_NEST (region)); 
284
285   if (SESE_PARAMS_INDEX (region))
286     htab_delete (SESE_PARAMS_INDEX (region));
287
288   /* Do not free SESE_PARAMS_NAMES: CLooG does that.  */
289
290   XDELETE (region);
291 }
292
293 /* Add exit phis for USE on EXIT.  */
294
295 static void
296 sese_add_exit_phis_edge (basic_block exit, tree use, edge false_e, edge true_e)
297 {
298   gimple phi = create_phi_node (use, exit);
299
300   create_new_def_for (gimple_phi_result (phi), phi,
301                       gimple_phi_result_ptr (phi));
302   add_phi_arg (phi, use, false_e, UNKNOWN_LOCATION);
303   add_phi_arg (phi, use, true_e, UNKNOWN_LOCATION);
304 }
305
306 /* Insert in the block BB phi nodes for variables defined in REGION
307    and used outside the REGION.  The code generation moves REGION in
308    the else clause of an "if (1)" and generates code in the then
309    clause that is at this point empty:
310
311    | if (1)
312    |   empty;
313    | else
314    |   REGION;
315 */
316
317 void
318 sese_insert_phis_for_liveouts (sese region, basic_block bb,
319                                edge false_e, edge true_e)
320 {
321   unsigned i;
322   bitmap_iterator bi;
323   bitmap liveouts = BITMAP_ALLOC (NULL);
324
325   update_ssa (TODO_update_ssa);
326
327   sese_build_liveouts (region, liveouts);
328   EXECUTE_IF_SET_IN_BITMAP (liveouts, 0, i, bi)
329     sese_add_exit_phis_edge (bb, ssa_name (i), false_e, true_e);
330   BITMAP_FREE (liveouts);
331
332   update_ssa (TODO_update_ssa);
333 }
334
335 /* Get the definition of NAME before the SESE.  Keep track of the
336    basic blocks that have been VISITED in a bitmap.  */
337
338 static tree
339 get_vdef_before_sese (sese region, tree name, sbitmap visited)
340 {
341   unsigned i;
342   gimple def_stmt = SSA_NAME_DEF_STMT (name);
343   basic_block def_bb = gimple_bb (def_stmt);
344
345   if (!def_bb || !bb_in_sese_p (def_bb, region))
346     return name;
347
348   if (TEST_BIT (visited, def_bb->index))
349     return NULL_TREE;
350
351   SET_BIT (visited, def_bb->index);
352
353   switch (gimple_code (def_stmt))
354     {
355     case GIMPLE_PHI:
356       for (i = 0; i < gimple_phi_num_args (def_stmt); i++)
357         {
358           tree arg = gimple_phi_arg_def (def_stmt, i);
359           tree res = get_vdef_before_sese (region, arg, visited);
360           if (res)
361             return res;
362         }
363       return NULL_TREE;
364
365     default:
366       return NULL_TREE;
367     }
368 }
369
370 /* Adjust a virtual phi node PHI that is placed at the end of the
371    generated code for SCOP:
372
373    | if (1)
374    |   generated code from REGION;
375    | else
376    |   REGION;
377
378    The FALSE_E edge comes from the original code, TRUE_E edge comes
379    from the code generated for the SCOP.  */
380
381 static void
382 sese_adjust_vphi (sese region, gimple phi, edge true_e)
383 {
384   unsigned i;
385
386   gcc_assert (gimple_phi_num_args (phi) == 2);
387
388   for (i = 0; i < gimple_phi_num_args (phi); i++)
389     if (gimple_phi_arg_edge (phi, i) == true_e)
390       {
391         tree true_arg, false_arg, before_scop_arg;
392         sbitmap visited;
393
394         true_arg = gimple_phi_arg_def (phi, i);
395         if (!SSA_NAME_IS_DEFAULT_DEF (true_arg))
396           return;
397
398         false_arg = gimple_phi_arg_def (phi, i == 0 ? 1 : 0);
399         if (SSA_NAME_IS_DEFAULT_DEF (false_arg))
400           return;
401
402         visited = sbitmap_alloc (last_basic_block);
403         sbitmap_zero (visited);
404         before_scop_arg = get_vdef_before_sese (region, false_arg, visited);
405         gcc_assert (before_scop_arg != NULL_TREE);
406         SET_PHI_ARG_DEF (phi, i, before_scop_arg);
407         sbitmap_free (visited);
408       }
409 }
410
411 /* Returns the name associated to OLD_NAME in MAP.  */
412
413 static tree
414 get_rename (htab_t map, tree old_name)
415 {
416   struct rename_map_elt_s tmp;
417   PTR *slot;
418
419   tmp.old_name = old_name;
420   slot = htab_find_slot (map, &tmp, NO_INSERT);
421
422   if (slot && *slot)
423     return ((rename_map_elt) *slot)->expr;
424
425   return old_name;
426 }
427
428 /* Register in MAP the rename tuple (old_name, expr).  */
429
430 void
431 set_rename (htab_t map, tree old_name, tree expr)
432 {
433   struct rename_map_elt_s tmp;
434   PTR *slot;
435
436   if (old_name == expr)
437     return;
438
439   tmp.old_name = old_name;
440   slot = htab_find_slot (map, &tmp, INSERT);
441
442   if (!slot)
443     return;
444
445   if (*slot)
446     free (*slot);
447
448   *slot = new_rename_map_elt (old_name, expr);
449 }
450
451 /* Adjusts the phi nodes in the block BB for variables defined in
452    SCOP_REGION and used outside the SCOP_REGION.  The code generation
453    moves SCOP_REGION in the else clause of an "if (1)" and generates
454    code in the then clause:
455
456    | if (1)
457    |   generated code from REGION;
458    | else
459    |   REGION;
460
461    To adjust the phi nodes after the condition, the RENAME_MAP is
462    used.  */
463
464 void
465 sese_adjust_liveout_phis (sese region, htab_t rename_map, basic_block bb,
466                           edge false_e, edge true_e)
467 {
468   gimple_stmt_iterator si;
469
470   for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
471     {
472       unsigned i;
473       unsigned false_i = 0;
474       gimple phi = gsi_stmt (si);
475
476       if (!is_gimple_reg (PHI_RESULT (phi)))
477         {
478           sese_adjust_vphi (region, phi, true_e);
479           continue;
480         }
481
482       for (i = 0; i < gimple_phi_num_args (phi); i++)
483         if (gimple_phi_arg_edge (phi, i) == false_e)
484           {
485             false_i = i;
486             break;
487           }
488
489       for (i = 0; i < gimple_phi_num_args (phi); i++)
490         if (gimple_phi_arg_edge (phi, i) == true_e)
491           {
492             tree old_name = gimple_phi_arg_def (phi, false_i);
493             tree expr = get_rename (rename_map, old_name);
494             gimple_seq stmts;
495
496             gcc_assert (old_name != expr);
497
498             if (TREE_CODE (expr) != SSA_NAME
499                 && is_gimple_reg (old_name))
500               {
501                 tree type = TREE_TYPE (old_name);
502                 tree var = create_tmp_var (type, "var");
503
504                 expr = build2 (MODIFY_EXPR, type, var, expr);
505                 expr = force_gimple_operand (expr, &stmts, true, NULL);
506                 gsi_insert_seq_on_edge_immediate (true_e, stmts);
507               }
508
509             SET_PHI_ARG_DEF (phi, i, expr);
510           }
511     }
512 }
513
514 /* Rename the SSA_NAMEs used in STMT and that appear in MAP.  */
515
516 static void 
517 rename_variables_in_stmt (gimple stmt, htab_t map, gimple_stmt_iterator *insert_gsi)
518 {
519   ssa_op_iter iter;
520   use_operand_p use_p;
521
522   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
523     {
524       tree use = USE_FROM_PTR (use_p);
525       tree expr = get_rename (map, use);
526       tree type_use = TREE_TYPE (use);
527       tree type_expr = TREE_TYPE (expr);
528       gimple_seq stmts;
529
530       if (use == expr)
531         continue;
532
533       if (type_use != type_expr
534           || (TREE_CODE (expr) != SSA_NAME
535               && is_gimple_reg (use)))
536         {
537           tree var = create_tmp_var (type_use, "var");
538
539           if (type_use != type_expr)
540             expr = fold_convert (type_use, expr);
541
542           expr = build2 (MODIFY_EXPR, type_use, var, expr);
543           expr = force_gimple_operand (expr, &stmts, true, NULL);
544           gsi_insert_seq_before (insert_gsi, stmts, GSI_SAME_STMT);
545         }
546
547       replace_exp (use_p, expr);
548     }
549
550   update_stmt (stmt);
551 }
552
553 /* Returns true if NAME is a parameter of SESE.  */
554
555 static bool
556 is_parameter (sese region, tree name)
557 {
558   int i;
559   tree p;
560
561   for (i = 0; VEC_iterate (tree, SESE_PARAMS (region), i, p); i++)
562     if (p == name)
563       return true;
564
565   return false;
566 }
567
568 /* Returns true if NAME is an induction variable.  */
569
570 static bool
571 is_iv (tree name)
572 {
573   return gimple_code (SSA_NAME_DEF_STMT (name)) == GIMPLE_PHI;
574 }
575
576 static void expand_scalar_variables_stmt (gimple, basic_block, sese,
577                                           htab_t, gimple_stmt_iterator *);
578 static tree
579 expand_scalar_variables_expr (tree, tree, enum tree_code, tree, basic_block,
580                               sese, htab_t, gimple_stmt_iterator *);
581
582 static tree
583 expand_scalar_variables_call (gimple stmt, basic_block bb, sese region,
584                               htab_t map, gimple_stmt_iterator *gsi)
585 {
586   int i, nargs = gimple_call_num_args (stmt);
587   VEC (tree, gc) *args = VEC_alloc (tree, gc, nargs);
588   tree fn_type = TREE_TYPE (gimple_call_fn (stmt));
589   tree fn = gimple_call_fndecl (stmt);
590   tree call_expr, var, lhs;
591   gimple call;
592
593   for (i = 0; i < nargs; i++)
594     {
595       tree arg = gimple_call_arg (stmt, i);
596       tree t = TREE_TYPE (arg);
597
598       var = create_tmp_var (t, "var");
599       arg = expand_scalar_variables_expr (t, arg, TREE_CODE (arg), NULL,
600                                           bb, region, map, gsi);
601       arg = build2 (MODIFY_EXPR, t, var, arg);
602       arg = force_gimple_operand_gsi (gsi, arg, true, NULL,
603                                       true, GSI_SAME_STMT);
604       VEC_quick_push (tree, args, arg);
605     }
606
607   lhs = gimple_call_lhs (stmt);
608   var = create_tmp_var (TREE_TYPE (lhs), "var");
609   call_expr = build_call_vec (fn_type, fn, args);
610   call = gimple_build_call_from_tree (call_expr);
611   var = make_ssa_name (var, call);
612   gimple_call_set_lhs (call, var);
613   gsi_insert_before (gsi, call, GSI_SAME_STMT);
614
615   return var;
616 }
617
618 /* Copies at GSI all the scalar computations on which the ssa_name OP0
619    depends on in the SESE: these are all the scalar variables used in
620    the definition of OP0, that are defined outside BB and still in the
621    SESE, i.e. not a parameter of the SESE.  The expression that is
622    returned contains only induction variables from the generated code:
623    MAP contains the induction variables renaming mapping, and is used
624    to translate the names of induction variables.  */
625
626 static tree
627 expand_scalar_variables_ssa_name (tree op0, basic_block bb,
628                                   sese region, htab_t map, 
629                                   gimple_stmt_iterator *gsi)
630 {
631   gimple def_stmt;
632   tree new_op;
633       
634   if (is_parameter (region, op0)
635       || is_iv (op0))
636     return get_rename (map, op0);
637       
638   def_stmt = SSA_NAME_DEF_STMT (op0);
639
640   /* Check whether we already have a rename for OP0.  */
641   new_op = get_rename (map, op0);
642
643   if (new_op != op0
644       && gimple_bb (SSA_NAME_DEF_STMT (new_op)) == bb)
645     return new_op;
646       
647   if (gimple_bb (def_stmt) == bb)
648     {
649       /* If the defining statement is in the basic block already
650          we do not need to create a new expression for it, we
651          only need to ensure its operands are expanded.  */
652       expand_scalar_variables_stmt (def_stmt, bb, region, map, gsi);
653       return new_op;
654     }
655   else
656     {
657       if (!gimple_bb (def_stmt)
658           || !bb_in_sese_p (gimple_bb (def_stmt), region))
659         return new_op;
660
661       switch (gimple_code (def_stmt))
662         {
663         case GIMPLE_ASSIGN:
664           {
665             tree var0 = gimple_assign_rhs1 (def_stmt);
666             enum tree_code subcode = gimple_assign_rhs_code (def_stmt);
667             tree var1 = gimple_assign_rhs2 (def_stmt);
668             tree type = gimple_expr_type (def_stmt);
669
670             return expand_scalar_variables_expr (type, var0, subcode, var1, bb,
671                                                  region, map, gsi);
672           }
673
674         case GIMPLE_CALL:
675           return expand_scalar_variables_call (def_stmt, bb, region, map, gsi);
676
677         default:
678           gcc_unreachable ();
679           return new_op;
680         }
681     }
682 }
683
684 /* Copies at GSI all the scalar computations on which the expression
685    OP0 CODE OP1 depends on in the SESE: these are all the scalar
686    variables used in OP0 and OP1, defined outside BB and still defined
687    in the SESE, i.e. not a parameter of the SESE.  The expression that
688    is returned contains only induction variables from the generated
689    code: MAP contains the induction variables renaming mapping, and is
690    used to translate the names of induction variables.  */
691
692 static tree
693 expand_scalar_variables_expr (tree type, tree op0, enum tree_code code, 
694                               tree op1, basic_block bb, sese region, 
695                               htab_t map, gimple_stmt_iterator *gsi)
696 {
697   if (TREE_CODE_CLASS (code) == tcc_constant
698       || TREE_CODE_CLASS (code) == tcc_declaration)
699     return op0;
700
701   /* For data references we have to duplicate also its memory
702      indexing.  */
703   if (TREE_CODE_CLASS (code) == tcc_reference)
704     {
705       switch (code)
706         {
707         case REALPART_EXPR:
708         case IMAGPART_EXPR:
709           {
710             tree op = TREE_OPERAND (op0, 0);
711             tree res = expand_scalar_variables_expr
712               (type, op, TREE_CODE (op), NULL, bb, region, map, gsi);
713             return build1 (code, type, res);
714           }
715
716         case INDIRECT_REF:
717           {
718             tree old_name = TREE_OPERAND (op0, 0);
719             tree expr = expand_scalar_variables_ssa_name
720               (old_name, bb, region, map, gsi);
721
722             if (TREE_CODE (expr) != SSA_NAME
723                 && is_gimple_reg (old_name))
724               {
725                 tree type = TREE_TYPE (old_name);
726                 tree var = create_tmp_var (type, "var");
727
728                 expr = build2 (MODIFY_EXPR, type, var, expr);
729                 expr = force_gimple_operand_gsi (gsi, expr, true, NULL,
730                                                  true, GSI_SAME_STMT);
731               }
732
733             return fold_build1 (code, type, expr);
734           }
735
736         case ARRAY_REF:
737           {
738             tree op00 = TREE_OPERAND (op0, 0);
739             tree op01 = TREE_OPERAND (op0, 1);
740             tree op02 = TREE_OPERAND (op0, 2);
741             tree op03 = TREE_OPERAND (op0, 3);
742             tree base = expand_scalar_variables_expr
743               (TREE_TYPE (op00), op00, TREE_CODE (op00), NULL, bb, region,
744                map, gsi);
745             tree subscript = expand_scalar_variables_expr
746               (TREE_TYPE (op01), op01, TREE_CODE (op01), NULL, bb, region,
747                map, gsi);
748
749             return build4 (ARRAY_REF, type, base, subscript, op02, op03);
750           }
751
752         default:
753           /* The above cases should catch everything.  */
754           gcc_unreachable ();
755         }
756     }
757
758   if (TREE_CODE_CLASS (code) == tcc_unary)
759     {
760       tree op0_type = TREE_TYPE (op0);
761       enum tree_code op0_code = TREE_CODE (op0);
762       tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
763                                                     NULL, bb, region, map, gsi);
764   
765       return fold_build1 (code, type, op0_expr);
766     }
767
768   if (TREE_CODE_CLASS (code) == tcc_binary
769       || TREE_CODE_CLASS (code) == tcc_comparison)
770     {
771       tree op0_type = TREE_TYPE (op0);
772       enum tree_code op0_code = TREE_CODE (op0);
773       tree op0_expr = expand_scalar_variables_expr (op0_type, op0, op0_code,
774                                                     NULL, bb, region, map, gsi);
775       tree op1_type = TREE_TYPE (op1);
776       enum tree_code op1_code = TREE_CODE (op1);
777       tree op1_expr = expand_scalar_variables_expr (op1_type, op1, op1_code,
778                                                     NULL, bb, region, map, gsi);
779
780       return fold_build2 (code, type, op0_expr, op1_expr);
781     }
782
783   if (code == SSA_NAME)
784     return expand_scalar_variables_ssa_name (op0, bb, region, map, gsi);
785
786   if (code == ADDR_EXPR)
787     return op0;
788
789   gcc_unreachable ();
790   return NULL;
791 }
792
793 /* Copies at the beginning of BB all the scalar computations on which
794    STMT depends on in the SESE: these are all the scalar variables used
795    in STMT, defined outside BB and still defined in the SESE, i.e. not a
796    parameter of the SESE.  The expression that is returned contains
797    only induction variables from the generated code: MAP contains the
798    induction variables renaming mapping, and is used to translate the
799    names of induction variables.  */
800  
801 static void
802 expand_scalar_variables_stmt (gimple stmt, basic_block bb, sese region,
803                               htab_t map, gimple_stmt_iterator *gsi)
804 {
805   ssa_op_iter iter;
806   use_operand_p use_p;
807
808   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
809     {
810       tree use = USE_FROM_PTR (use_p);
811       tree type = TREE_TYPE (use);
812       enum tree_code code = TREE_CODE (use);
813       tree use_expr;
814
815       if (!is_gimple_reg (use))
816         continue;
817
818       /* Don't expand USE if we already have a rename for it.  */
819       use_expr = get_rename (map, use);
820       if (use_expr != use)
821         continue;
822
823       use_expr = expand_scalar_variables_expr (type, use, code, NULL, bb,
824                                                region, map, gsi);
825       use_expr = fold_convert (type, use_expr);
826
827       if (use_expr == use)
828         continue;
829
830       if (TREE_CODE (use_expr) != SSA_NAME)
831         {
832           tree var = create_tmp_var (type, "var");
833
834           use_expr = build2 (MODIFY_EXPR, type, var, use_expr);
835           use_expr = force_gimple_operand_gsi (gsi, use_expr, true, NULL,
836                                                true, GSI_SAME_STMT);
837         }
838
839       replace_exp (use_p, use_expr);
840     }
841
842   update_stmt (stmt);
843 }
844
845 /* Copies at the beginning of BB all the scalar computations on which
846    BB depends on in the SESE: these are all the scalar variables used
847    in BB, defined outside BB and still defined in the SESE, i.e. not a
848    parameter of the SESE.  The expression that is returned contains
849    only induction variables from the generated code: MAP contains the
850    induction variables renaming mapping, and is used to translate the
851    names of induction variables.  */
852
853 static void 
854 expand_scalar_variables (basic_block bb, sese region, htab_t map)
855 {
856   gimple_stmt_iterator gsi;
857   
858   for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi);)
859     {
860       gimple stmt = gsi_stmt (gsi);
861       expand_scalar_variables_stmt (stmt, bb, region, map, &gsi);
862       gsi_next (&gsi);
863     }
864 }
865
866 /* Rename all the SSA_NAMEs from block BB according to the MAP.  */
867
868 static void 
869 rename_variables (basic_block bb, htab_t map)
870 {
871   gimple_stmt_iterator gsi;
872   gimple_stmt_iterator insert_gsi = gsi_start_bb (bb);
873   
874   for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
875     rename_variables_in_stmt (gsi_stmt (gsi), map, &insert_gsi);
876 }
877
878 /* Remove condition from BB.  */
879
880 static void
881 remove_condition (basic_block bb)
882 {
883   gimple last = last_stmt (bb);
884
885   if (last && gimple_code (last) == GIMPLE_COND)
886     {
887       gimple_stmt_iterator gsi = gsi_last_bb (bb);
888       gsi_remove (&gsi, true);
889     }
890 }
891
892 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag set.  */
893
894 edge
895 get_true_edge_from_guard_bb (basic_block bb)
896 {
897   edge e;
898   edge_iterator ei;
899
900   FOR_EACH_EDGE (e, ei, bb->succs)
901     if (e->flags & EDGE_TRUE_VALUE) 
902       return e;
903
904   gcc_unreachable ();
905   return NULL;
906 }
907
908 /* Returns the first successor edge of BB with EDGE_TRUE_VALUE flag cleared.  */
909
910 edge
911 get_false_edge_from_guard_bb (basic_block bb)
912 {
913   edge e;
914   edge_iterator ei;
915
916   FOR_EACH_EDGE (e, ei, bb->succs)
917     if (!(e->flags & EDGE_TRUE_VALUE)) 
918       return e;
919
920   gcc_unreachable ();
921   return NULL;
922 }
923
924 /* Returns true when NAME is defined in LOOP.  */
925
926 static bool
927 defined_in_loop_p (tree name, loop_p loop)
928 {
929   gimple stmt = SSA_NAME_DEF_STMT (name);
930
931   return (gimple_bb (stmt)->loop_father == loop);
932 }
933
934 /* Returns the gimple statement that uses NAME outside the loop it is
935    defined in, returns NULL if there is no such loop close phi node.
936    An invariant of the loop closed SSA form is that the only use of a
937    variable, outside the loop it is defined in, is in the loop close
938    phi node that just follows the loop.  */
939
940 static gimple
941 alive_after_loop (tree name)
942 {
943   use_operand_p use_p;
944   imm_use_iterator imm_iter;
945   loop_p loop = gimple_bb (SSA_NAME_DEF_STMT (name))->loop_father;
946
947   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
948     {
949       gimple stmt = USE_STMT (use_p);
950
951       if (gimple_code (stmt) == GIMPLE_PHI
952           && gimple_bb (stmt)->loop_father != loop)
953         return stmt;
954     }
955
956   return NULL;
957 }
958
959 /* Return true if a close phi has not yet been inserted for the use of
960    variable NAME on the single exit of LOOP.  */
961
962 static bool
963 close_phi_not_yet_inserted_p (loop_p loop, tree name)
964 {
965   gimple_stmt_iterator psi;
966   basic_block bb = single_exit (loop)->dest;
967
968   for (psi = gsi_start_phis (bb); !gsi_end_p (psi); gsi_next (&psi))
969     if (gimple_phi_arg_def (gsi_stmt (psi), 0) == name)
970       return false;
971
972   return true;
973 }
974
975 /* A structure for passing parameters to add_loop_exit_phis.  */
976
977 typedef struct alep {
978   loop_p loop;
979   VEC (rename_map_elt, heap) *new_renames;
980 } *alep_p;
981
982 /* Helper function for htab_traverse in insert_loop_close_phis.  */
983
984 static int
985 add_loop_exit_phis (void **slot, void *data)
986 {
987   struct rename_map_elt_s *entry;
988   alep_p a;
989   loop_p loop;
990   tree expr, new_name;
991   bool def_in_loop_p, used_outside_p, need_close_phi_p;
992   gimple old_close_phi;
993
994   if (!slot || !data)
995     return 1;
996
997   entry = (struct rename_map_elt_s *) *slot;
998   a = (alep_p) data;
999   loop = a->loop;
1000   expr = entry->expr;
1001
1002   if (TREE_CODE (expr) != SSA_NAME)
1003     return 1;
1004
1005   new_name = expr;
1006   def_in_loop_p = defined_in_loop_p (new_name, loop);
1007   old_close_phi = alive_after_loop (entry->old_name);
1008   used_outside_p = (old_close_phi != NULL);
1009   need_close_phi_p = (def_in_loop_p && used_outside_p
1010                       && close_phi_not_yet_inserted_p (loop, new_name));
1011
1012   /* Insert a loop close phi node.  */
1013   if (need_close_phi_p)
1014     {
1015       basic_block bb = single_exit (loop)->dest;
1016       gimple phi = create_phi_node (new_name, bb);
1017       tree new_res = create_new_def_for (gimple_phi_result (phi), phi,
1018                                          gimple_phi_result_ptr (phi));
1019
1020       add_phi_arg (phi, new_name, single_pred_edge (bb), UNKNOWN_LOCATION);
1021       VEC_safe_push (rename_map_elt, heap, a->new_renames,
1022                      new_rename_map_elt (gimple_phi_result (old_close_phi),
1023                                          new_res));
1024     }
1025
1026   /* Remove the old rename from the map.  */
1027   if (def_in_loop_p && *slot)
1028     {
1029       free (*slot);
1030       *slot = NULL;
1031     }
1032
1033   return 1;
1034 }
1035
1036 /* Traverses MAP and removes from it all the tuples (OLD, NEW) where
1037    NEW is defined in LOOP.  Inserts on the exit of LOOP the close phi
1038    node "RES = phi (NEW)" corresponding to "OLD_RES = phi (OLD)" in
1039    the original code.  Inserts in MAP the tuple (OLD_RES, RES).  */
1040
1041 void
1042 insert_loop_close_phis (htab_t map, loop_p loop)
1043 {
1044   int i;
1045   struct alep a;
1046   rename_map_elt elt;
1047
1048   a.loop = loop;
1049   a.new_renames = VEC_alloc (rename_map_elt, heap, 3);
1050   update_ssa (TODO_update_ssa);
1051   htab_traverse (map, add_loop_exit_phis, &a);
1052   update_ssa (TODO_update_ssa);
1053
1054   for (i = 0; VEC_iterate (rename_map_elt, a.new_renames, i, elt); i++)
1055     {
1056       set_rename (map, elt->old_name, elt->expr);
1057       free (elt);
1058     }
1059
1060   VEC_free (rename_map_elt, heap, a.new_renames);
1061 }
1062
1063 /* Helper structure for htab_traverse in insert_guard_phis.  */
1064
1065 struct igp {
1066   basic_block bb;
1067   edge true_edge, false_edge;
1068   htab_t before_guard;
1069 };
1070
1071 /* Return the default name that is before the guard.  */
1072
1073 static tree
1074 default_before_guard (htab_t before_guard, tree old_name)
1075 {
1076   tree res = get_rename (before_guard, old_name);
1077
1078   if (res == old_name)
1079     {
1080       if (is_gimple_reg (res))
1081         return fold_convert (TREE_TYPE (res), integer_zero_node);
1082       return gimple_default_def (cfun, SSA_NAME_VAR (res));
1083     }
1084
1085   return res;
1086 }
1087
1088 /* Prepares EXPR to be a good phi argument when the phi result is
1089    RES.  Insert needed statements on edge E.  */
1090
1091 static tree
1092 convert_for_phi_arg (tree expr, tree res, edge e)
1093 {
1094   tree type = TREE_TYPE (res);
1095
1096   if (TREE_TYPE (expr) != type)
1097     expr = fold_convert (type, expr);
1098
1099   if (TREE_CODE (expr) != SSA_NAME
1100       && !is_gimple_min_invariant (expr))
1101     {
1102       tree var = create_tmp_var (type, "var");
1103       gimple_seq stmts;
1104
1105       expr = build2 (MODIFY_EXPR, type, var, expr);
1106       expr = force_gimple_operand (expr, &stmts, true, NULL);
1107       gsi_insert_seq_on_edge_immediate (e, stmts);
1108     }
1109
1110   return expr;
1111 }
1112
1113 /* Helper function for htab_traverse in insert_guard_phis.  */
1114
1115 static int
1116 add_guard_exit_phis (void **slot, void *s)
1117 {
1118   struct rename_map_elt_s *entry = (struct rename_map_elt_s *) *slot;
1119   struct igp *i = (struct igp *) s;
1120   basic_block bb = i->bb;
1121   edge true_edge = i->true_edge;
1122   edge false_edge = i->false_edge;
1123   tree res = entry->old_name;
1124   tree name1 = entry->expr;
1125   tree name2 = default_before_guard (i->before_guard, res);
1126   gimple phi;
1127
1128   /* Nothing to be merged if the name before the guard is the same as
1129      the one after.  */
1130   if (name1 == name2)
1131     return 1;
1132
1133   name1 = convert_for_phi_arg (name1, res, true_edge);
1134   name2 = convert_for_phi_arg (name2, res, false_edge);
1135
1136   phi = create_phi_node (res, bb);
1137   res = create_new_def_for (gimple_phi_result (phi), phi,
1138                             gimple_phi_result_ptr (phi));
1139
1140   add_phi_arg (phi, name1, true_edge, UNKNOWN_LOCATION);
1141   add_phi_arg (phi, name2, false_edge, UNKNOWN_LOCATION);
1142
1143   entry->expr = res;
1144   *slot = entry;
1145   return 1;
1146 }
1147
1148 /* Iterate over RENAME_MAP and get tuples of the form (OLD, NAME1).
1149    If there is a correspondent tuple (OLD, NAME2) in BEFORE_GUARD,
1150    with NAME1 different than NAME2, then insert in BB the phi node:
1151
1152    | RES = phi (NAME1 (on TRUE_EDGE), NAME2 (on FALSE_EDGE))"
1153
1154    if there is no tuple for OLD in BEFORE_GUARD, insert
1155
1156    | RES = phi (NAME1 (on TRUE_EDGE),
1157    |            DEFAULT_DEFINITION of NAME1 (on FALSE_EDGE))".
1158
1159    Finally register in RENAME_MAP the tuple (OLD, RES).  */
1160
1161 void
1162 insert_guard_phis (basic_block bb, edge true_edge, edge false_edge,
1163                    htab_t before_guard, htab_t rename_map)
1164 {
1165   struct igp i;
1166   i.bb = bb;
1167   i.true_edge = true_edge;
1168   i.false_edge = false_edge;
1169   i.before_guard = before_guard;
1170
1171   update_ssa (TODO_update_ssa);
1172   htab_traverse (rename_map, add_guard_exit_phis, &i);
1173   update_ssa (TODO_update_ssa);
1174 }
1175
1176 /* Create a duplicate of the basic block BB.  NOTE: This does not
1177    preserve SSA form.  */
1178
1179 static void
1180 graphite_copy_stmts_from_block (basic_block bb, basic_block new_bb, htab_t map)
1181 {
1182   gimple_stmt_iterator gsi, gsi_tgt;
1183
1184   gsi_tgt = gsi_start_bb (new_bb);
1185   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1186     {
1187       def_operand_p def_p;
1188       ssa_op_iter op_iter;
1189       int region;
1190       gimple stmt = gsi_stmt (gsi);
1191       gimple copy;
1192
1193       if (gimple_code (stmt) == GIMPLE_LABEL)
1194         continue;
1195
1196       /* Create a new copy of STMT and duplicate STMT's virtual
1197          operands.  */
1198       copy = gimple_copy (stmt);
1199       gsi_insert_after (&gsi_tgt, copy, GSI_NEW_STMT);
1200       mark_sym_for_renaming (gimple_vop (cfun));
1201
1202       region = lookup_stmt_eh_region (stmt);
1203       if (region >= 0)
1204         add_stmt_to_eh_region (copy, region);
1205       gimple_duplicate_stmt_histograms (cfun, copy, cfun, stmt);
1206
1207       /* Create new names for all the definitions created by COPY and
1208          add replacement mappings for each new name.  */
1209       FOR_EACH_SSA_DEF_OPERAND (def_p, copy, op_iter, SSA_OP_ALL_DEFS)
1210         {
1211           tree old_name = DEF_FROM_PTR (def_p);
1212           tree new_name = create_new_def_for (old_name, copy, def_p);
1213           set_rename (map, old_name, new_name);
1214         }
1215     }
1216 }
1217
1218 /* Copies BB and includes in the copied BB all the statements that can
1219    be reached following the use-def chains from the memory accesses,
1220    and returns the next edge following this new block.  */
1221  
1222 edge
1223 copy_bb_and_scalar_dependences (basic_block bb, sese region,
1224                                 edge next_e, htab_t map)
1225 {
1226   basic_block new_bb = split_edge (next_e);
1227
1228   next_e = single_succ_edge (new_bb);
1229   graphite_copy_stmts_from_block (bb, new_bb, map);
1230   remove_condition (new_bb);
1231   remove_phi_nodes (new_bb);
1232   expand_scalar_variables (new_bb, region, map);
1233   rename_variables (new_bb, map);
1234
1235   return next_e;
1236 }
1237
1238 /* Returns the outermost loop in SCOP that contains BB.  */
1239
1240 struct loop *
1241 outermost_loop_in_sese (sese region, basic_block bb)
1242 {
1243   struct loop *nest;
1244
1245   nest = bb->loop_father;
1246   while (loop_outer (nest)
1247          && loop_in_sese_p (loop_outer (nest), region))
1248     nest = loop_outer (nest);
1249
1250   return nest;
1251 }
1252
1253 /* Sets the false region of an IF_REGION to REGION.  */
1254
1255 void
1256 if_region_set_false_region (ifsese if_region, sese region)
1257 {
1258   basic_block condition = if_region_get_condition_block (if_region);
1259   edge false_edge = get_false_edge_from_guard_bb (condition);
1260   basic_block dummy = false_edge->dest;
1261   edge entry_region = SESE_ENTRY (region);
1262   edge exit_region = SESE_EXIT (region);
1263   basic_block before_region = entry_region->src;
1264   basic_block last_in_region = exit_region->src;
1265   void **slot = htab_find_slot_with_hash (current_loops->exits, exit_region,
1266                                           htab_hash_pointer (exit_region),
1267                                           NO_INSERT);
1268
1269   entry_region->flags = false_edge->flags;
1270   false_edge->flags = exit_region->flags;
1271
1272   redirect_edge_pred (entry_region, condition);
1273   redirect_edge_pred (exit_region, before_region);
1274   redirect_edge_pred (false_edge, last_in_region);
1275   redirect_edge_succ (false_edge, single_succ (dummy));
1276   delete_basic_block (dummy);
1277
1278   exit_region->flags = EDGE_FALLTHRU;
1279   recompute_all_dominators ();
1280
1281   SESE_EXIT (region) = false_edge;
1282   if_region->false_region = region;
1283
1284   if (slot)
1285     {
1286       struct loop_exit *loop_exit = GGC_CNEW (struct loop_exit);
1287
1288       memcpy (loop_exit, *((struct loop_exit **) slot), sizeof (struct loop_exit));
1289       htab_clear_slot (current_loops->exits, slot);
1290
1291       slot = htab_find_slot_with_hash (current_loops->exits, false_edge,
1292                                        htab_hash_pointer (false_edge),
1293                                        INSERT);
1294       loop_exit->e = false_edge;
1295       *slot = loop_exit;
1296       false_edge->src->loop_father->exits->next = loop_exit;
1297     }
1298 }
1299
1300 /* Creates an IFSESE with CONDITION on edge ENTRY.  */
1301
1302 ifsese
1303 create_if_region_on_edge (edge entry, tree condition)
1304 {
1305   edge e;
1306   edge_iterator ei;
1307   sese sese_region = GGC_NEW (struct sese_s);
1308   sese true_region = GGC_NEW (struct sese_s);
1309   sese false_region = GGC_NEW (struct sese_s);
1310   ifsese if_region = GGC_NEW (struct ifsese_s);
1311   edge exit = create_empty_if_region_on_edge (entry, condition);
1312
1313   if_region->region = sese_region;
1314   if_region->region->entry = entry;
1315   if_region->region->exit = exit;
1316
1317   FOR_EACH_EDGE (e, ei, entry->dest->succs)
1318     {
1319       if (e->flags & EDGE_TRUE_VALUE)
1320         {
1321           true_region->entry = e;
1322           true_region->exit = single_succ_edge (e->dest);
1323           if_region->true_region = true_region;
1324         }
1325       else if (e->flags & EDGE_FALSE_VALUE)
1326         {
1327           false_region->entry = e;
1328           false_region->exit = single_succ_edge (e->dest);
1329           if_region->false_region = false_region;
1330         }
1331     }
1332
1333   return if_region;
1334 }
1335
1336 /* Moves REGION in a condition expression:
1337    | if (1)
1338    |   ;
1339    | else
1340    |   REGION;
1341 */
1342
1343 ifsese
1344 move_sese_in_condition (sese region)
1345 {
1346   basic_block pred_block = split_edge (SESE_ENTRY (region));
1347   ifsese if_region = NULL;
1348
1349   SESE_ENTRY (region) = single_succ_edge (pred_block);
1350   if_region = create_if_region_on_edge (single_pred_edge (pred_block), integer_one_node);
1351   if_region_set_false_region (if_region, region);
1352
1353   return if_region;
1354 }
1355
1356 /* Reset the loop->aux pointer for all loops in REGION.  */
1357
1358 void
1359 sese_reset_aux_in_loops (sese region)
1360 {
1361   int i;
1362   loop_p loop;
1363
1364   for (i = 0; VEC_iterate (loop_p, SESE_LOOP_NEST (region), i, loop); i++)
1365     loop->aux = NULL;
1366 }
1367
1368 /* Returns the scalar evolution of T in REGION.  Every variable that
1369    is not defined in the REGION is considered a parameter.  */
1370
1371 tree
1372 scalar_evolution_in_region (sese region, loop_p loop, tree t)
1373 {
1374   gimple def;
1375   struct loop *def_loop;
1376   basic_block before = block_before_sese (region);
1377
1378   if (TREE_CODE (t) != SSA_NAME
1379       || loop_in_sese_p (loop, region))
1380     return instantiate_scev (before, loop,
1381                              analyze_scalar_evolution (loop, t));
1382
1383   if (!defined_in_sese_p (t, region))
1384     return t;
1385
1386   def = SSA_NAME_DEF_STMT (t);
1387   def_loop = loop_containing_stmt (def);
1388
1389   if (loop_in_sese_p (def_loop, region))
1390     {
1391       t = analyze_scalar_evolution (def_loop, t);
1392       def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1);
1393       t = compute_overall_effect_of_inner_loop (def_loop, t);
1394       return t;
1395     }
1396   else
1397     return instantiate_scev (before, loop, t);
1398 }