OSDN Git Service

ChangeLog:
[pf3gnuchains/gcc-fork.git] / gcc / tree-parloops.c
1 /* Loop autoparallelization.
2    Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
3    Contributed by Sebastian Pop <pop@cri.ensmp.fr> and
4    Zdenek Dvorak <dvorakz@suse.cz>.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 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 "tree.h"
27 #include "rtl.h"
28 #include "tree-flow.h"
29 #include "cfgloop.h"
30 #include "ggc.h"
31 #include "tree-data-ref.h"
32 #include "diagnostic.h"
33 #include "tree-pass.h"
34 #include "tree-scalar-evolution.h"
35 #include "hashtab.h"
36 #include "langhooks.h"
37 #include "tree-vectorizer.h"
38
39 /* This pass tries to distribute iterations of loops into several threads.
40    The implementation is straightforward -- for each loop we test whether its
41    iterations are independent, and if it is the case (and some additional
42    conditions regarding profitability and correctness are satisfied), we
43    add GIMPLE_OMP_PARALLEL and GIMPLE_OMP_FOR codes and let omp expansion
44    machinery do its job.
45    
46    The most of the complexity is in bringing the code into shape expected
47    by the omp expanders:
48    -- for GIMPLE_OMP_FOR, ensuring that the loop has only one induction
49       variable and that the exit test is at the start of the loop body
50    -- for GIMPLE_OMP_PARALLEL, replacing the references to local addressable
51       variables by accesses through pointers, and breaking up ssa chains
52       by storing the values incoming to the parallelized loop to a structure
53       passed to the new function as an argument (something similar is done
54       in omp gimplification, unfortunately only a small part of the code
55       can be shared).
56
57    TODO:
58    -- if there are several parallelizable loops in a function, it may be
59       possible to generate the threads just once (using synchronization to
60       ensure that cross-loop dependences are obeyed).
61    -- handling of common scalar dependence patterns (accumulation, ...)
62    -- handling of non-innermost loops  */
63
64 /*  
65   Reduction handling:
66   currently we use vect_is_simple_reduction() to detect reduction patterns.
67   The code transformation will be introduced by an example.
68   
69     
70 parloop
71 {
72   int sum=1;
73
74   for (i = 0; i < N; i++)
75    {
76     x[i] = i + 3;
77     sum+=x[i];
78    }
79 }
80
81 gimple-like code:
82 header_bb:
83
84   # sum_29 = PHI <sum_11(5), 1(3)>
85   # i_28 = PHI <i_12(5), 0(3)>
86   D.1795_8 = i_28 + 3;
87   x[i_28] = D.1795_8;
88   sum_11 = D.1795_8 + sum_29;
89   i_12 = i_28 + 1;
90   if (N_6(D) > i_12)
91     goto header_bb;
92
93
94 exit_bb:
95
96   # sum_21 = PHI <sum_11(4)>
97   printf (&"%d"[0], sum_21);
98
99
100 after reduction transformation (only relevant parts):
101
102 parloop
103 {
104
105 ....
106
107
108   # Storing the initial value given by the user.  #
109
110   .paral_data_store.32.sum.27 = 1;
111  
112   #pragma omp parallel num_threads(4) 
113
114   #pragma omp for schedule(static)
115
116   # The neutral element corresponding to the particular
117   reduction's operation, e.g. 0 for PLUS_EXPR,
118   1 for MULT_EXPR, etc. replaces the user's initial value.  #
119
120   # sum.27_29 = PHI <sum.27_11, 0>
121
122   sum.27_11 = D.1827_8 + sum.27_29;
123
124   GIMPLE_OMP_CONTINUE
125
126   # Adding this reduction phi is done at create_phi_for_local_result() #
127   # sum.27_56 = PHI <sum.27_11, 0>
128   GIMPLE_OMP_RETURN
129   
130   # Creating the atomic operation is done at 
131   create_call_for_reduction_1()  #
132
133   #pragma omp atomic_load
134   D.1839_59 = *&.paral_data_load.33_51->reduction.23;
135   D.1840_60 = sum.27_56 + D.1839_59;
136   #pragma omp atomic_store (D.1840_60);
137   
138   GIMPLE_OMP_RETURN
139   
140  # collecting the result after the join of the threads is done at
141   create_loads_for_reductions().
142   The value computed by the threads is loaded from the
143   shared struct.  #
144
145  
146   .paral_data_load.33_52 = &.paral_data_store.32;
147   sum_37 =  .paral_data_load.33_52->sum.27;
148   sum_43 = D.1795_41 + sum_37;
149
150   exit bb:
151   # sum_21 = PHI <sum_43, sum_26>
152   printf (&"%d"[0], sum_21);
153
154 ...
155
156 }
157
158 */
159
160 /* Minimal number of iterations of a loop that should be executed in each
161    thread.  */
162 #define MIN_PER_THREAD 100
163
164 /* Element of the hashtable, representing a 
165    reduction in the current loop.  */
166 struct reduction_info
167 {
168   gimple reduc_stmt;            /* reduction statement.  */
169   gimple reduc_phi;             /* The phi node defining the reduction.  */
170   enum tree_code reduction_code;/* code for the reduction operation.  */
171   gimple keep_res;              /* The PHI_RESULT of this phi is the resulting value 
172                                    of the reduction variable when existing the loop. */
173   tree initial_value;           /* The initial value of the reduction var before entering the loop.  */
174   tree field;                   /*  the name of the field in the parloop data structure intended for reduction.  */
175   tree init;                    /* reduction initialization value.  */
176   gimple new_phi;               /* (helper field) Newly created phi node whose result 
177                                    will be passed to the atomic operation.  Represents
178                                    the local result each thread computed for the reduction
179                                    operation.  */
180 };
181
182 /* Equality and hash functions for hashtab code.  */
183
184 static int
185 reduction_info_eq (const void *aa, const void *bb)
186 {
187   const struct reduction_info *a = (const struct reduction_info *) aa;
188   const struct reduction_info *b = (const struct reduction_info *) bb;
189
190   return (a->reduc_phi == b->reduc_phi);
191 }
192
193 static hashval_t
194 reduction_info_hash (const void *aa)
195 {
196   const struct reduction_info *a = (const struct reduction_info *) aa;
197
198   return htab_hash_pointer (a->reduc_phi);
199 }
200
201 static struct reduction_info *
202 reduction_phi (htab_t reduction_list, gimple phi)
203 {
204   struct reduction_info tmpred, *red;
205
206   if (htab_elements (reduction_list) == 0)
207     return NULL;
208
209   tmpred.reduc_phi = phi;
210   red = (struct reduction_info *) htab_find (reduction_list, &tmpred);
211
212   return red;
213 }
214
215 /* Element of hashtable of names to copy.  */
216
217 struct name_to_copy_elt
218 {
219   unsigned version;     /* The version of the name to copy.  */
220   tree new_name;        /* The new name used in the copy.  */
221   tree field;           /* The field of the structure used to pass the
222                            value.  */
223 };
224
225 /* Equality and hash functions for hashtab code.  */
226
227 static int
228 name_to_copy_elt_eq (const void *aa, const void *bb)
229 {
230   const struct name_to_copy_elt *a = (const struct name_to_copy_elt *) aa;
231   const struct name_to_copy_elt *b = (const struct name_to_copy_elt *) bb;
232
233   return a->version == b->version;
234 }
235
236 static hashval_t
237 name_to_copy_elt_hash (const void *aa)
238 {
239   const struct name_to_copy_elt *a = (const struct name_to_copy_elt *) aa;
240
241   return (hashval_t) a->version;
242 }
243
244
245 /* Data dependency analysis. Returns true if the iterations of LOOP
246    are independent on each other (that is, if we can execute them
247    in parallel).  */
248
249 static bool
250 loop_parallel_p (struct loop *loop)
251 {
252   VEC (ddr_p, heap) * dependence_relations;
253   VEC (data_reference_p, heap) *datarefs;
254   lambda_trans_matrix trans;
255   bool ret = false;
256
257   if (dump_file && (dump_flags & TDF_DETAILS))
258     fprintf (dump_file, "\nConsidering loop %d\n", loop->num);
259
260   /* Check for problems with dependences.  If the loop can be reversed,
261      the iterations are independent.  */
262   datarefs = VEC_alloc (data_reference_p, heap, 10);
263   dependence_relations = VEC_alloc (ddr_p, heap, 10 * 10);
264   compute_data_dependences_for_loop (loop, true, &datarefs,
265                                      &dependence_relations);
266   if (dump_file && (dump_flags & TDF_DETAILS))
267     dump_data_dependence_relations (dump_file, dependence_relations);
268
269   trans = lambda_trans_matrix_new (1, 1);
270   LTM_MATRIX (trans)[0][0] = -1;
271
272   if (lambda_transform_legal_p (trans, 1, dependence_relations))
273     {
274       ret = true;
275       if (dump_file && (dump_flags & TDF_DETAILS))
276         fprintf (dump_file, "  SUCCESS: may be parallelized\n");
277     }
278   else if (dump_file && (dump_flags & TDF_DETAILS))
279     fprintf (dump_file,
280              "  FAILED: data dependencies exist across iterations\n");
281
282   free_dependence_relations (dependence_relations);
283   free_data_refs (datarefs);
284
285   return ret;
286 }
287
288 /* Return true when LOOP contains basic blocks marked with the
289    BB_IRREDUCIBLE_LOOP flag.  */
290
291 static inline bool
292 loop_has_blocks_with_irreducible_flag (struct loop *loop)
293 {
294   unsigned i;
295   basic_block *bbs = get_loop_body_in_dom_order (loop);
296   bool res = true;
297
298   for (i = 0; i < loop->num_nodes; i++)
299     if (bbs[i]->flags & BB_IRREDUCIBLE_LOOP)
300       goto end;
301
302   res = false;
303  end:
304   free (bbs);
305   return res;
306 }
307
308 /* Assigns the address of OBJ in TYPE to an ssa name, and returns this name.
309    The assignment statement is placed on edge ENTRY.  DECL_ADDRESS maps decls
310    to their addresses that can be reused.  The address of OBJ is known to
311    be invariant in the whole function.  */
312
313 static tree
314 take_address_of (tree obj, tree type, edge entry, htab_t decl_address)
315 {
316   int uid;
317   void **dslot;
318   struct int_tree_map ielt, *nielt;
319   tree *var_p, name, bvar, addr;
320   gimple stmt;
321   gimple_seq stmts;
322
323   /* Since the address of OBJ is invariant, the trees may be shared.
324      Avoid rewriting unrelated parts of the code.  */
325   obj = unshare_expr (obj);
326   for (var_p = &obj;
327        handled_component_p (*var_p);
328        var_p = &TREE_OPERAND (*var_p, 0))
329     continue;
330   uid = DECL_UID (*var_p);
331
332   ielt.uid = uid;
333   dslot = htab_find_slot_with_hash (decl_address, &ielt, uid, INSERT);
334   if (!*dslot)
335     {
336       addr = build_addr (*var_p, current_function_decl);
337       bvar = create_tmp_var (TREE_TYPE (addr), get_name (*var_p));
338       add_referenced_var (bvar);
339       stmt = gimple_build_assign (bvar, addr);
340       name = make_ssa_name (bvar, stmt);
341       gimple_assign_set_lhs (stmt, name);
342       gsi_insert_on_edge_immediate (entry, stmt);
343
344       nielt = XNEW (struct int_tree_map);
345       nielt->uid = uid;
346       nielt->to = name;
347       *dslot = nielt;
348     }
349   else
350     name = ((struct int_tree_map *) *dslot)->to;
351
352   if (var_p != &obj)
353     {
354       *var_p = build1 (INDIRECT_REF, TREE_TYPE (*var_p), name);
355       name = force_gimple_operand (build_addr (obj, current_function_decl),
356                                    &stmts, true, NULL_TREE);
357       if (!gimple_seq_empty_p (stmts))
358         gsi_insert_seq_on_edge_immediate (entry, stmts);
359     }
360
361   if (TREE_TYPE (name) != type)
362     {
363       name = force_gimple_operand (fold_convert (type, name), &stmts, true,
364                                    NULL_TREE);
365       if (!gimple_seq_empty_p (stmts))
366         gsi_insert_seq_on_edge_immediate (entry, stmts);
367     }
368
369   return name;
370 }
371
372 /* Callback for htab_traverse.  Create the initialization statement
373    for reduction described in SLOT, and place it at the preheader of 
374    the loop described in DATA.  */
375
376 static int
377 initialize_reductions (void **slot, void *data)
378 {
379   tree init, c;
380   tree bvar, type, arg;
381   edge e;
382
383   struct reduction_info *const reduc = (struct reduction_info *) *slot;
384   struct loop *loop = (struct loop *) data;
385
386   /* Create initialization in preheader: 
387      reduction_variable = initialization value of reduction.  */
388
389   /* In the phi node at the header, replace the argument coming 
390      from the preheader with the reduction initialization value.  */
391
392   /* Create a new variable to initialize the reduction.  */
393   type = TREE_TYPE (PHI_RESULT (reduc->reduc_phi));
394   bvar = create_tmp_var (type, "reduction");
395   add_referenced_var (bvar);
396
397   c = build_omp_clause (gimple_location (reduc->reduc_stmt),
398                         OMP_CLAUSE_REDUCTION);
399   OMP_CLAUSE_REDUCTION_CODE (c) = reduc->reduction_code;
400   OMP_CLAUSE_DECL (c) = SSA_NAME_VAR (gimple_assign_lhs (reduc->reduc_stmt));
401
402   init = omp_reduction_init (c, TREE_TYPE (bvar));
403   reduc->init = init;
404
405   /* Replace the argument representing the initialization value 
406      with the initialization value for the reduction (neutral 
407      element for the particular operation, e.g. 0 for PLUS_EXPR, 
408      1 for MULT_EXPR, etc).  
409      Keep the old value in a new variable "reduction_initial", 
410      that will be taken in consideration after the parallel 
411      computing is done.  */
412
413   e = loop_preheader_edge (loop);
414   arg = PHI_ARG_DEF_FROM_EDGE (reduc->reduc_phi, e);
415   /* Create new variable to hold the initial value.  */
416
417   SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE
418            (reduc->reduc_phi, loop_preheader_edge (loop)), init);
419   reduc->initial_value = arg;
420   return 1;
421 }
422
423 struct elv_data
424 {
425   struct walk_stmt_info info;
426   edge entry;
427   htab_t decl_address;
428   bool changed;
429 };
430
431 /* Eliminates references to local variables in *TP out of the single
432    entry single exit region starting at DTA->ENTRY.
433    DECL_ADDRESS contains addresses of the references that had their
434    address taken already.  If the expression is changed, CHANGED is
435    set to true.  Callback for walk_tree.  */
436
437 static tree
438 eliminate_local_variables_1 (tree *tp, int *walk_subtrees, void *data)
439 {
440   struct elv_data *const dta = (struct elv_data *) data;
441   tree t = *tp, var, addr, addr_type, type, obj;
442
443   if (DECL_P (t))
444     {
445       *walk_subtrees = 0;
446
447       if (!SSA_VAR_P (t) || DECL_EXTERNAL (t))
448         return NULL_TREE;
449
450       type = TREE_TYPE (t);
451       addr_type = build_pointer_type (type);
452       addr = take_address_of (t, addr_type, dta->entry, dta->decl_address);
453       *tp = build1 (INDIRECT_REF, TREE_TYPE (*tp), addr);
454
455       dta->changed = true;
456       return NULL_TREE;
457     }
458
459   if (TREE_CODE (t) == ADDR_EXPR)
460     {
461       /* ADDR_EXPR may appear in two contexts:
462          -- as a gimple operand, when the address taken is a function invariant
463          -- as gimple rhs, when the resulting address in not a function
464             invariant
465          We do not need to do anything special in the latter case (the base of
466          the memory reference whose address is taken may be replaced in the
467          DECL_P case).  The former case is more complicated, as we need to
468          ensure that the new address is still a gimple operand.  Thus, it
469          is not sufficient to replace just the base of the memory reference --
470          we need to move the whole computation of the address out of the
471          loop.  */
472       if (!is_gimple_val (t))
473         return NULL_TREE;
474
475       *walk_subtrees = 0;
476       obj = TREE_OPERAND (t, 0);
477       var = get_base_address (obj);
478       if (!var || !SSA_VAR_P (var) || DECL_EXTERNAL (var))
479         return NULL_TREE;
480
481       addr_type = TREE_TYPE (t);
482       addr = take_address_of (obj, addr_type, dta->entry, dta->decl_address);
483       *tp = addr;
484
485       dta->changed = true;
486       return NULL_TREE;
487     }
488
489   if (!EXPR_P (t))
490     *walk_subtrees = 0;
491
492   return NULL_TREE;
493 }
494
495 /* Moves the references to local variables in STMT out of the single
496    entry single exit region starting at ENTRY.  DECL_ADDRESS contains
497    addresses of the references that had their address taken
498    already.  */
499
500 static void
501 eliminate_local_variables_stmt (edge entry, gimple stmt,
502                                 htab_t decl_address)
503 {
504   struct elv_data dta;
505
506   memset (&dta.info, '\0', sizeof (dta.info));
507   dta.entry = entry;
508   dta.decl_address = decl_address;
509   dta.changed = false;
510
511   if (gimple_debug_bind_p (stmt))
512     walk_tree (gimple_debug_bind_get_value_ptr (stmt),
513                eliminate_local_variables_1, &dta.info, NULL);
514   else
515     walk_gimple_op (stmt, eliminate_local_variables_1, &dta.info);
516
517   if (dta.changed)
518     update_stmt (stmt);
519 }
520
521 /* Eliminates the references to local variables from the single entry
522    single exit region between the ENTRY and EXIT edges.
523   
524    This includes:
525    1) Taking address of a local variable -- these are moved out of the 
526    region (and temporary variable is created to hold the address if 
527    necessary).
528
529    2) Dereferencing a local variable -- these are replaced with indirect
530    references.  */
531
532 static void
533 eliminate_local_variables (edge entry, edge exit)
534 {
535   basic_block bb;
536   VEC (basic_block, heap) *body = VEC_alloc (basic_block, heap, 3);
537   unsigned i;
538   gimple_stmt_iterator gsi;
539   htab_t decl_address = htab_create (10, int_tree_map_hash, int_tree_map_eq,
540                                      free);
541   basic_block entry_bb = entry->src;
542   basic_block exit_bb = exit->dest;
543
544   gather_blocks_in_sese_region (entry_bb, exit_bb, &body);
545
546   for (i = 0; VEC_iterate (basic_block, body, i, bb); i++)
547     if (bb != entry_bb && bb != exit_bb)
548       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
549         eliminate_local_variables_stmt (entry, gsi_stmt (gsi),
550                                         decl_address);
551
552   htab_delete (decl_address);
553   VEC_free (basic_block, heap, body);
554 }
555
556 /* Returns true if expression EXPR is not defined between ENTRY and
557    EXIT, i.e. if all its operands are defined outside of the region.  */
558
559 static bool
560 expr_invariant_in_region_p (edge entry, edge exit, tree expr)
561 {
562   basic_block entry_bb = entry->src;
563   basic_block exit_bb = exit->dest;
564   basic_block def_bb;
565
566   if (is_gimple_min_invariant (expr))
567     return true;
568
569   if (TREE_CODE (expr) == SSA_NAME)
570     {
571       def_bb = gimple_bb (SSA_NAME_DEF_STMT (expr));
572       if (def_bb
573           && dominated_by_p (CDI_DOMINATORS, def_bb, entry_bb)
574           && !dominated_by_p (CDI_DOMINATORS, def_bb, exit_bb))
575         return false;
576
577       return true;
578     }
579
580   return false;
581 }
582
583 /* If COPY_NAME_P is true, creates and returns a duplicate of NAME.
584    The copies are stored to NAME_COPIES, if NAME was already duplicated,
585    its duplicate stored in NAME_COPIES is returned.
586    
587    Regardless of COPY_NAME_P, the decl used as a base of the ssa name is also
588    duplicated, storing the copies in DECL_COPIES.  */
589
590 static tree
591 separate_decls_in_region_name (tree name,
592                                htab_t name_copies, htab_t decl_copies,
593                                bool copy_name_p)
594 {
595   tree copy, var, var_copy;
596   unsigned idx, uid, nuid;
597   struct int_tree_map ielt, *nielt;
598   struct name_to_copy_elt elt, *nelt;
599   void **slot, **dslot;
600
601   if (TREE_CODE (name) != SSA_NAME)
602     return name;
603
604   idx = SSA_NAME_VERSION (name);
605   elt.version = idx;
606   slot = htab_find_slot_with_hash (name_copies, &elt, idx,
607                                    copy_name_p ? INSERT : NO_INSERT);
608   if (slot && *slot)
609     return ((struct name_to_copy_elt *) *slot)->new_name;
610
611   var = SSA_NAME_VAR (name);
612   uid = DECL_UID (var);
613   ielt.uid = uid;
614   dslot = htab_find_slot_with_hash (decl_copies, &ielt, uid, INSERT);
615   if (!*dslot)
616     {
617       var_copy = create_tmp_var (TREE_TYPE (var), get_name (var));
618       DECL_GIMPLE_REG_P (var_copy) = DECL_GIMPLE_REG_P (var);
619       add_referenced_var (var_copy);
620       nielt = XNEW (struct int_tree_map);
621       nielt->uid = uid;
622       nielt->to = var_copy;
623       *dslot = nielt;
624
625       /* Ensure that when we meet this decl next time, we won't duplicate
626          it again.  */
627       nuid = DECL_UID (var_copy);
628       ielt.uid = nuid;
629       dslot = htab_find_slot_with_hash (decl_copies, &ielt, nuid, INSERT);
630       gcc_assert (!*dslot);
631       nielt = XNEW (struct int_tree_map);
632       nielt->uid = nuid;
633       nielt->to = var_copy;
634       *dslot = nielt;
635     }
636   else
637     var_copy = ((struct int_tree_map *) *dslot)->to;
638
639   if (copy_name_p)
640     {
641       copy = duplicate_ssa_name (name, NULL);
642       nelt = XNEW (struct name_to_copy_elt);
643       nelt->version = idx;
644       nelt->new_name = copy;
645       nelt->field = NULL_TREE;
646       *slot = nelt;
647     }
648   else
649     {
650       gcc_assert (!slot);
651       copy = name;
652     }
653
654   SSA_NAME_VAR (copy) = var_copy;
655   return copy;
656 }
657
658 /* Finds the ssa names used in STMT that are defined outside the
659    region between ENTRY and EXIT and replaces such ssa names with
660    their duplicates.  The duplicates are stored to NAME_COPIES.  Base
661    decls of all ssa names used in STMT (including those defined in
662    LOOP) are replaced with the new temporary variables; the
663    replacement decls are stored in DECL_COPIES.  */
664
665 static void
666 separate_decls_in_region_stmt (edge entry, edge exit, gimple stmt,
667                                htab_t name_copies, htab_t decl_copies)
668 {
669   use_operand_p use;
670   def_operand_p def;
671   ssa_op_iter oi;
672   tree name, copy;
673   bool copy_name_p;
674
675   mark_virtual_ops_for_renaming (stmt);
676
677   FOR_EACH_PHI_OR_STMT_DEF (def, stmt, oi, SSA_OP_DEF)
678   {
679     name = DEF_FROM_PTR (def);
680     gcc_assert (TREE_CODE (name) == SSA_NAME);
681     copy = separate_decls_in_region_name (name, name_copies, decl_copies,
682                                           false);
683     gcc_assert (copy == name);
684   }
685
686   FOR_EACH_PHI_OR_STMT_USE (use, stmt, oi, SSA_OP_USE)
687   {
688     name = USE_FROM_PTR (use);
689     if (TREE_CODE (name) != SSA_NAME)
690       continue;
691
692     copy_name_p = expr_invariant_in_region_p (entry, exit, name);
693     copy = separate_decls_in_region_name (name, name_copies, decl_copies,
694                                           copy_name_p);
695     SET_USE (use, copy);
696   }
697 }
698
699 /* Finds the ssa names used in STMT that are defined outside the
700    region between ENTRY and EXIT and replaces such ssa names with
701    their duplicates.  The duplicates are stored to NAME_COPIES.  Base
702    decls of all ssa names used in STMT (including those defined in
703    LOOP) are replaced with the new temporary variables; the
704    replacement decls are stored in DECL_COPIES.  */
705
706 static bool
707 separate_decls_in_region_debug_bind (gimple stmt,
708                                      htab_t name_copies, htab_t decl_copies)
709 {
710   use_operand_p use;
711   ssa_op_iter oi;
712   tree var, name;
713   struct int_tree_map ielt;
714   struct name_to_copy_elt elt;
715   void **slot, **dslot;
716
717   var = gimple_debug_bind_get_var (stmt);
718   gcc_assert (DECL_P (var) && SSA_VAR_P (var));
719   ielt.uid = DECL_UID (var);
720   dslot = htab_find_slot_with_hash (decl_copies, &ielt, ielt.uid, NO_INSERT);
721   if (!dslot)
722     return true;
723   gimple_debug_bind_set_var (stmt, ((struct int_tree_map *) *dslot)->to);
724
725   FOR_EACH_PHI_OR_STMT_USE (use, stmt, oi, SSA_OP_USE)
726   {
727     name = USE_FROM_PTR (use);
728     if (TREE_CODE (name) != SSA_NAME)
729       continue;
730
731     elt.version = SSA_NAME_VERSION (name);
732     slot = htab_find_slot_with_hash (name_copies, &elt, elt.version, NO_INSERT);
733     if (!slot)
734       {
735         gimple_debug_bind_reset_value (stmt);
736         update_stmt (stmt);
737         break;
738       }
739
740     SET_USE (use, ((struct name_to_copy_elt *) *slot)->new_name);
741   }
742
743   return false;
744 }
745
746 /* Callback for htab_traverse.  Adds a field corresponding to the reduction
747    specified in SLOT. The type is passed in DATA.  */
748
749 static int
750 add_field_for_reduction (void **slot, void *data)
751 {
752   
753   struct reduction_info *const red = (struct reduction_info *) *slot;
754   tree const type = (tree) data;
755   tree var = SSA_NAME_VAR (gimple_assign_lhs (red->reduc_stmt));
756   tree field = build_decl (gimple_location (red->reduc_stmt),
757                            FIELD_DECL, DECL_NAME (var), TREE_TYPE (var));
758
759   insert_field_into_struct (type, field);
760
761   red->field = field;
762
763   return 1;
764 }
765
766 /* Callback for htab_traverse.  Adds a field corresponding to a ssa name
767    described in SLOT. The type is passed in DATA.  */ 
768
769 static int
770 add_field_for_name (void **slot, void *data)
771 {
772   struct name_to_copy_elt *const elt = (struct name_to_copy_elt *) *slot;
773   tree type = (tree) data;
774   tree name = ssa_name (elt->version);
775   tree var = SSA_NAME_VAR (name);
776   tree field = build_decl (DECL_SOURCE_LOCATION (var),
777                            FIELD_DECL, DECL_NAME (var), TREE_TYPE (var));
778
779   insert_field_into_struct (type, field);
780   elt->field = field;
781
782   return 1;
783 }
784
785 /* Callback for htab_traverse.  A local result is the intermediate result 
786    computed by a single 
787    thread, or the initial value in case no iteration was executed.
788    This function creates a phi node reflecting these values.  
789    The phi's result will be stored in NEW_PHI field of the 
790    reduction's data structure.  */ 
791
792 static int
793 create_phi_for_local_result (void **slot, void *data)
794 {
795   struct reduction_info *const reduc = (struct reduction_info *) *slot;
796   const struct loop *const loop = (const struct loop *) data;
797   edge e;
798   gimple new_phi;
799   basic_block store_bb;
800   tree local_res;
801   source_location locus;
802
803   /* STORE_BB is the block where the phi 
804      should be stored.  It is the destination of the loop exit.  
805      (Find the fallthru edge from GIMPLE_OMP_CONTINUE).  */
806   store_bb = FALLTHRU_EDGE (loop->latch)->dest;
807
808   /* STORE_BB has two predecessors.  One coming from  the loop
809      (the reduction's result is computed at the loop),
810      and another coming from a block preceding the loop, 
811      when no iterations 
812      are executed (the initial value should be taken).  */ 
813   if (EDGE_PRED (store_bb, 0) == FALLTHRU_EDGE (loop->latch))
814     e = EDGE_PRED (store_bb, 1);
815   else
816     e = EDGE_PRED (store_bb, 0);
817   local_res
818     = make_ssa_name (SSA_NAME_VAR (gimple_assign_lhs (reduc->reduc_stmt)),
819                      NULL);
820   locus = gimple_location (reduc->reduc_stmt);
821   new_phi = create_phi_node (local_res, store_bb);
822   SSA_NAME_DEF_STMT (local_res) = new_phi;
823   add_phi_arg (new_phi, reduc->init, e, locus);
824   add_phi_arg (new_phi, gimple_assign_lhs (reduc->reduc_stmt),
825                FALLTHRU_EDGE (loop->latch), locus);
826   reduc->new_phi = new_phi;
827
828   return 1;
829 }
830
831 struct clsn_data
832 {
833   tree store;
834   tree load;
835
836   basic_block store_bb;
837   basic_block load_bb;
838 };
839
840 /* Callback for htab_traverse.  Create an atomic instruction for the
841    reduction described in SLOT.  
842    DATA annotates the place in memory the atomic operation relates to,
843    and the basic block it needs to be generated in.  */
844
845 static int
846 create_call_for_reduction_1 (void **slot, void *data)
847 {
848   struct reduction_info *const reduc = (struct reduction_info *) *slot;
849   struct clsn_data *const clsn_data = (struct clsn_data *) data;
850   gimple_stmt_iterator gsi;
851   tree type = TREE_TYPE (PHI_RESULT (reduc->reduc_phi));
852   tree struct_type = TREE_TYPE (TREE_TYPE (clsn_data->load));
853   tree load_struct;
854   basic_block bb;
855   basic_block new_bb;
856   edge e;
857   tree t, addr, addr_type, ref, x;
858   tree tmp_load, name;
859   gimple load;
860
861   load_struct = fold_build1 (INDIRECT_REF, struct_type, clsn_data->load);
862   t = build3 (COMPONENT_REF, type, load_struct, reduc->field, NULL_TREE);
863   addr_type = build_pointer_type (type);
864
865   addr = build_addr (t, current_function_decl);
866
867   /* Create phi node.  */
868   bb = clsn_data->load_bb;
869
870   e = split_block (bb, t);
871   new_bb = e->dest;
872
873   tmp_load = create_tmp_var (TREE_TYPE (TREE_TYPE (addr)), NULL);
874   add_referenced_var (tmp_load);
875   tmp_load = make_ssa_name (tmp_load, NULL);
876   load = gimple_build_omp_atomic_load (tmp_load, addr);
877   SSA_NAME_DEF_STMT (tmp_load) = load;
878   gsi = gsi_start_bb (new_bb);
879   gsi_insert_after (&gsi, load, GSI_NEW_STMT);
880
881   e = split_block (new_bb, load);
882   new_bb = e->dest;
883   gsi = gsi_start_bb (new_bb);
884   ref = tmp_load;
885   x = fold_build2 (reduc->reduction_code,
886                    TREE_TYPE (PHI_RESULT (reduc->new_phi)), ref,
887                    PHI_RESULT (reduc->new_phi));
888
889   name = force_gimple_operand_gsi (&gsi, x, true, NULL_TREE, true,
890                                    GSI_CONTINUE_LINKING);
891
892   gsi_insert_after (&gsi, gimple_build_omp_atomic_store (name), GSI_NEW_STMT);
893   return 1;
894 }
895
896 /* Create the atomic operation at the join point of the threads.  
897    REDUCTION_LIST describes the reductions in the LOOP.  
898    LD_ST_DATA describes the shared data structure where 
899    shared data is stored in and loaded from.  */
900 static void
901 create_call_for_reduction (struct loop *loop, htab_t reduction_list, 
902                            struct clsn_data *ld_st_data)
903 {
904   htab_traverse (reduction_list, create_phi_for_local_result, loop);
905   /* Find the fallthru edge from GIMPLE_OMP_CONTINUE.  */
906   ld_st_data->load_bb = FALLTHRU_EDGE (loop->latch)->dest;
907   htab_traverse (reduction_list, create_call_for_reduction_1, ld_st_data);
908 }
909
910 /* Callback for htab_traverse.  Loads the final reduction value at the
911    join point of all threads, and inserts it in the right place.  */
912
913 static int
914 create_loads_for_reductions (void **slot, void *data)
915 {
916   struct reduction_info *const red = (struct reduction_info *) *slot;
917   struct clsn_data *const clsn_data = (struct clsn_data *) data;
918   gimple stmt;
919   gimple_stmt_iterator gsi;
920   tree type = TREE_TYPE (gimple_assign_lhs (red->reduc_stmt));
921   tree struct_type = TREE_TYPE (TREE_TYPE (clsn_data->load));
922   tree load_struct;
923   tree name;
924   tree x;
925
926   gsi = gsi_after_labels (clsn_data->load_bb);
927   load_struct = fold_build1 (INDIRECT_REF, struct_type, clsn_data->load);
928   load_struct = build3 (COMPONENT_REF, type, load_struct, red->field,
929                         NULL_TREE);
930
931   x = load_struct;
932   name = PHI_RESULT (red->keep_res);
933   stmt = gimple_build_assign (name, x);
934   SSA_NAME_DEF_STMT (name) = stmt;
935
936   gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
937
938   for (gsi = gsi_start_phis (gimple_bb (red->keep_res));
939        !gsi_end_p (gsi); gsi_next (&gsi))
940     if (gsi_stmt (gsi) == red->keep_res)
941       {
942         remove_phi_node (&gsi, false);
943         return 1;
944       }
945   gcc_unreachable ();
946 }
947
948 /* Load the reduction result that was stored in LD_ST_DATA.  
949    REDUCTION_LIST describes the list of reductions that the
950    loads should be generated for.  */
951 static void
952 create_final_loads_for_reduction (htab_t reduction_list, 
953                                   struct clsn_data *ld_st_data)
954 {
955   gimple_stmt_iterator gsi;
956   tree t;
957   gimple stmt;
958
959   gsi = gsi_after_labels (ld_st_data->load_bb);
960   t = build_fold_addr_expr (ld_st_data->store);
961   stmt = gimple_build_assign (ld_st_data->load, t);
962
963   gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
964   SSA_NAME_DEF_STMT (ld_st_data->load) = stmt;
965
966   htab_traverse (reduction_list, create_loads_for_reductions, ld_st_data);
967
968 }
969
970 /* Callback for htab_traverse.  Store the neutral value for the
971   particular reduction's operation, e.g. 0 for PLUS_EXPR,
972   1 for MULT_EXPR, etc. into the reduction field.
973   The reduction is specified in SLOT. The store information is 
974   passed in DATA.  */  
975
976 static int
977 create_stores_for_reduction (void **slot, void *data)
978 {
979   struct reduction_info *const red = (struct reduction_info *) *slot;
980   struct clsn_data *const clsn_data = (struct clsn_data *) data;
981   tree t;
982   gimple stmt;
983   gimple_stmt_iterator gsi;
984   tree type = TREE_TYPE (gimple_assign_lhs (red->reduc_stmt));
985
986   gsi = gsi_last_bb (clsn_data->store_bb);
987   t = build3 (COMPONENT_REF, type, clsn_data->store, red->field, NULL_TREE);
988   stmt = gimple_build_assign (t, red->initial_value);
989   mark_virtual_ops_for_renaming (stmt);
990   gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
991
992   return 1;
993 }
994
995 /* Callback for htab_traverse.  Creates loads to a field of LOAD in LOAD_BB and
996    store to a field of STORE in STORE_BB for the ssa name and its duplicate
997    specified in SLOT.  */
998
999 static int
1000 create_loads_and_stores_for_name (void **slot, void *data)
1001 {
1002   struct name_to_copy_elt *const elt = (struct name_to_copy_elt *) *slot;
1003   struct clsn_data *const clsn_data = (struct clsn_data *) data;
1004   tree t;
1005   gimple stmt;
1006   gimple_stmt_iterator gsi;
1007   tree type = TREE_TYPE (elt->new_name);
1008   tree struct_type = TREE_TYPE (TREE_TYPE (clsn_data->load));
1009   tree load_struct;
1010
1011   gsi = gsi_last_bb (clsn_data->store_bb);
1012   t = build3 (COMPONENT_REF, type, clsn_data->store, elt->field, NULL_TREE);
1013   stmt = gimple_build_assign (t, ssa_name (elt->version));
1014   mark_virtual_ops_for_renaming (stmt);
1015   gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
1016
1017   gsi = gsi_last_bb (clsn_data->load_bb);
1018   load_struct = fold_build1 (INDIRECT_REF, struct_type, clsn_data->load);
1019   t = build3 (COMPONENT_REF, type, load_struct, elt->field, NULL_TREE);
1020   stmt = gimple_build_assign (elt->new_name, t);
1021   SSA_NAME_DEF_STMT (elt->new_name) = stmt;
1022   gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
1023
1024   return 1;
1025 }
1026
1027 /* Moves all the variables used in LOOP and defined outside of it (including
1028    the initial values of loop phi nodes, and *PER_THREAD if it is a ssa
1029    name) to a structure created for this purpose.  The code
1030  
1031    while (1)
1032      {
1033        use (a);
1034        use (b);
1035      }
1036
1037    is transformed this way:
1038
1039    bb0:
1040    old.a = a;
1041    old.b = b;
1042
1043    bb1:
1044    a' = new->a;
1045    b' = new->b;
1046    while (1)
1047      {
1048        use (a');
1049        use (b');
1050      }
1051
1052    `old' is stored to *ARG_STRUCT and `new' is stored to NEW_ARG_STRUCT.  The
1053    pointer `new' is intentionally not initialized (the loop will be split to a
1054    separate function later, and `new' will be initialized from its arguments).
1055    LD_ST_DATA holds information about the shared data structure used to pass
1056    information among the threads.  It is initialized here, and 
1057    gen_parallel_loop will pass it to create_call_for_reduction that 
1058    needs this information.  REDUCTION_LIST describes the reductions 
1059    in LOOP.  */
1060
1061 static void
1062 separate_decls_in_region (edge entry, edge exit, htab_t reduction_list,
1063                           tree *arg_struct, tree *new_arg_struct, 
1064                           struct clsn_data *ld_st_data)
1065
1066 {
1067   basic_block bb1 = split_edge (entry);
1068   basic_block bb0 = single_pred (bb1);
1069   htab_t name_copies = htab_create (10, name_to_copy_elt_hash,
1070                                     name_to_copy_elt_eq, free);
1071   htab_t decl_copies = htab_create (10, int_tree_map_hash, int_tree_map_eq,
1072                                     free);
1073   unsigned i;
1074   tree type, type_name, nvar;
1075   gimple_stmt_iterator gsi;
1076   struct clsn_data clsn_data;
1077   VEC (basic_block, heap) *body = VEC_alloc (basic_block, heap, 3);
1078   basic_block bb;
1079   basic_block entry_bb = bb1;
1080   basic_block exit_bb = exit->dest;
1081   bool has_debug_stmt = false;
1082
1083   entry = single_succ_edge (entry_bb);
1084   gather_blocks_in_sese_region (entry_bb, exit_bb, &body);
1085
1086   for (i = 0; VEC_iterate (basic_block, body, i, bb); i++)
1087     {
1088       if (bb != entry_bb && bb != exit_bb) 
1089         {
1090           for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1091             separate_decls_in_region_stmt (entry, exit, gsi_stmt (gsi),
1092                                            name_copies, decl_copies);
1093
1094           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1095             {
1096               gimple stmt = gsi_stmt (gsi);
1097
1098               if (is_gimple_debug (stmt))
1099                 has_debug_stmt = true;
1100               else
1101                 separate_decls_in_region_stmt (entry, exit, stmt,
1102                                                name_copies, decl_copies);
1103             }
1104         }
1105     }
1106
1107   /* Now process debug bind stmts.  We must not create decls while
1108      processing debug stmts, so we defer their processing so as to
1109      make sure we will have debug info for as many variables as
1110      possible (all of those that were dealt with in the loop above),
1111      and discard those for which we know there's nothing we can
1112      do.  */
1113   if (has_debug_stmt)
1114     for (i = 0; VEC_iterate (basic_block, body, i, bb); i++)
1115       if (bb != entry_bb && bb != exit_bb)
1116         {
1117           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
1118             {
1119               gimple stmt = gsi_stmt (gsi);
1120
1121               if (gimple_debug_bind_p (stmt))
1122                 {
1123                   if (separate_decls_in_region_debug_bind (stmt,
1124                                                            name_copies,
1125                                                            decl_copies))
1126                     {
1127                       gsi_remove (&gsi, true);
1128                       continue;
1129                     }
1130                 }
1131
1132               gsi_next (&gsi);
1133             }
1134         }
1135
1136   VEC_free (basic_block, heap, body);
1137
1138   if (htab_elements (name_copies) == 0 && htab_elements (reduction_list) == 0) 
1139     {
1140       /* It may happen that there is nothing to copy (if there are only
1141          loop carried and external variables in the loop).  */
1142       *arg_struct = NULL;
1143       *new_arg_struct = NULL;
1144     }
1145   else
1146     {
1147       /* Create the type for the structure to store the ssa names to.  */
1148       type = lang_hooks.types.make_type (RECORD_TYPE);
1149       type_name = build_decl (BUILTINS_LOCATION,
1150                               TYPE_DECL, create_tmp_var_name (".paral_data"),
1151                               type);
1152       TYPE_NAME (type) = type_name;
1153
1154       htab_traverse (name_copies, add_field_for_name, type);
1155       if (reduction_list && htab_elements (reduction_list) > 0)
1156         {
1157           /* Create the fields for reductions.  */
1158           htab_traverse (reduction_list, add_field_for_reduction,
1159                          type);
1160         }
1161       layout_type (type);
1162  
1163       /* Create the loads and stores.  */
1164       *arg_struct = create_tmp_var (type, ".paral_data_store");
1165       add_referenced_var (*arg_struct);
1166       nvar = create_tmp_var (build_pointer_type (type), ".paral_data_load");
1167       add_referenced_var (nvar);
1168       *new_arg_struct = make_ssa_name (nvar, NULL);
1169
1170       ld_st_data->store = *arg_struct;
1171       ld_st_data->load = *new_arg_struct;
1172       ld_st_data->store_bb = bb0;
1173       ld_st_data->load_bb = bb1;
1174
1175       htab_traverse (name_copies, create_loads_and_stores_for_name,
1176                      ld_st_data);
1177
1178       /* Load the calculation from memory (after the join of the threads).  */
1179
1180       if (reduction_list && htab_elements (reduction_list) > 0)
1181         {
1182           htab_traverse (reduction_list, create_stores_for_reduction,
1183                         ld_st_data); 
1184           clsn_data.load = make_ssa_name (nvar, NULL);
1185           clsn_data.load_bb = exit->dest;
1186           clsn_data.store = ld_st_data->store;
1187           create_final_loads_for_reduction (reduction_list, &clsn_data);
1188         }
1189     }
1190
1191   htab_delete (decl_copies);
1192   htab_delete (name_copies);
1193 }
1194
1195 /* Bitmap containing uids of functions created by parallelization.  We cannot
1196    allocate it from the default obstack, as it must live across compilation
1197    of several functions; we make it gc allocated instead.  */
1198
1199 static GTY(()) bitmap parallelized_functions;
1200
1201 /* Returns true if FN was created by create_loop_fn.  */
1202
1203 static bool
1204 parallelized_function_p (tree fn)
1205 {
1206   if (!parallelized_functions || !DECL_ARTIFICIAL (fn))
1207     return false;
1208
1209   return bitmap_bit_p (parallelized_functions, DECL_UID (fn));
1210 }
1211
1212 /* Creates and returns an empty function that will receive the body of
1213    a parallelized loop.  */
1214
1215 static tree
1216 create_loop_fn (void)
1217 {
1218   char buf[100];
1219   char *tname;
1220   tree decl, type, name, t;
1221   struct function *act_cfun = cfun;
1222   static unsigned loopfn_num;
1223
1224   snprintf (buf, 100, "%s.$loopfn", current_function_name ());
1225   ASM_FORMAT_PRIVATE_NAME (tname, buf, loopfn_num++);
1226   clean_symbol_name (tname);
1227   name = get_identifier (tname);
1228   type = build_function_type_list (void_type_node, ptr_type_node, NULL_TREE);
1229
1230   decl = build_decl (BUILTINS_LOCATION,
1231                      FUNCTION_DECL, name, type);
1232   if (!parallelized_functions)
1233     parallelized_functions = BITMAP_GGC_ALLOC ();
1234   bitmap_set_bit (parallelized_functions, DECL_UID (decl));
1235
1236   TREE_STATIC (decl) = 1;
1237   TREE_USED (decl) = 1;
1238   DECL_ARTIFICIAL (decl) = 1;
1239   DECL_IGNORED_P (decl) = 0;
1240   TREE_PUBLIC (decl) = 0;
1241   DECL_UNINLINABLE (decl) = 1;
1242   DECL_EXTERNAL (decl) = 0;
1243   DECL_CONTEXT (decl) = NULL_TREE;
1244   DECL_INITIAL (decl) = make_node (BLOCK);
1245
1246   t = build_decl (BUILTINS_LOCATION,
1247                   RESULT_DECL, NULL_TREE, void_type_node);
1248   DECL_ARTIFICIAL (t) = 1;
1249   DECL_IGNORED_P (t) = 1;
1250   DECL_RESULT (decl) = t;
1251
1252   t = build_decl (BUILTINS_LOCATION,
1253                   PARM_DECL, get_identifier (".paral_data_param"),
1254                   ptr_type_node);
1255   DECL_ARTIFICIAL (t) = 1;
1256   DECL_ARG_TYPE (t) = ptr_type_node;
1257   DECL_CONTEXT (t) = decl;
1258   TREE_USED (t) = 1;
1259   DECL_ARGUMENTS (decl) = t;
1260
1261   allocate_struct_function (decl, false);
1262
1263   /* The call to allocate_struct_function clobbers CFUN, so we need to restore
1264      it.  */
1265   set_cfun (act_cfun);
1266
1267   return decl;
1268 }
1269
1270 /* Moves the exit condition of LOOP to the beginning of its header, and
1271    duplicates the part of the last iteration that gets disabled to the
1272    exit of the loop.  NIT is the number of iterations of the loop
1273    (used to initialize the variables in the duplicated part).
1274  
1275    TODO: the common case is that latch of the loop is empty and immediately
1276    follows the loop exit.  In this case, it would be better not to copy the
1277    body of the loop, but only move the entry of the loop directly before the
1278    exit check and increase the number of iterations of the loop by one.
1279    This may need some additional preconditioning in case NIT = ~0.  
1280    REDUCTION_LIST describes the reductions in LOOP.  */
1281
1282 static void
1283 transform_to_exit_first_loop (struct loop *loop, htab_t reduction_list, tree nit)
1284 {
1285   basic_block *bbs, *nbbs, ex_bb, orig_header;
1286   unsigned n;
1287   bool ok;
1288   edge exit = single_dom_exit (loop), hpred;
1289   tree control, control_name, res, t;
1290   gimple phi, nphi, cond_stmt, stmt;
1291   gimple_stmt_iterator gsi;
1292
1293   split_block_after_labels (loop->header);
1294   orig_header = single_succ (loop->header);
1295   hpred = single_succ_edge (loop->header);
1296
1297   cond_stmt = last_stmt (exit->src);
1298   control = gimple_cond_lhs (cond_stmt);
1299   gcc_assert (gimple_cond_rhs (cond_stmt) == nit);
1300
1301   /* Make sure that we have phi nodes on exit for all loop header phis
1302      (create_parallel_loop requires that).  */
1303   for (gsi = gsi_start_phis (loop->header); !gsi_end_p (gsi); gsi_next (&gsi))
1304     {
1305       phi = gsi_stmt (gsi);
1306       res = PHI_RESULT (phi);
1307       t = make_ssa_name (SSA_NAME_VAR (res), phi);
1308       SET_PHI_RESULT (phi, t);
1309
1310       nphi = create_phi_node (res, orig_header);
1311       SSA_NAME_DEF_STMT (res) = nphi;
1312       add_phi_arg (nphi, t, hpred, UNKNOWN_LOCATION);
1313
1314       if (res == control)
1315         {
1316           gimple_cond_set_lhs (cond_stmt, t);
1317           update_stmt (cond_stmt);
1318           control = t;
1319         }
1320     }
1321
1322   bbs = get_loop_body_in_dom_order (loop);
1323   for (n = 0; bbs[n] != exit->src; n++)
1324     continue;
1325   nbbs = XNEWVEC (basic_block, n);
1326   ok = gimple_duplicate_sese_tail (single_succ_edge (loop->header), exit,
1327                                    bbs + 1, n, nbbs);
1328   gcc_assert (ok);
1329   free (bbs);
1330   ex_bb = nbbs[0];
1331   free (nbbs);
1332
1333   /* Other than reductions, the only gimple reg that should be copied 
1334      out of the loop is the control variable.  */
1335
1336   control_name = NULL_TREE;
1337   for (gsi = gsi_start_phis (ex_bb); !gsi_end_p (gsi); )
1338     {
1339       phi = gsi_stmt (gsi);
1340       res = PHI_RESULT (phi);
1341       if (!is_gimple_reg (res))
1342         {
1343           gsi_next (&gsi);
1344           continue;
1345         }
1346
1347       /* Check if it is a part of reduction.  If it is,
1348          keep the phi at the reduction's keep_res field.  The  
1349          PHI_RESULT of this phi is the resulting value of the reduction 
1350          variable when exiting the loop.  */
1351
1352       exit = single_dom_exit (loop);
1353
1354       if (htab_elements (reduction_list) > 0) 
1355         {
1356           struct reduction_info *red;
1357
1358           tree val = PHI_ARG_DEF_FROM_EDGE (phi, exit);
1359
1360           red = reduction_phi (reduction_list, SSA_NAME_DEF_STMT (val));
1361           if (red)
1362             {
1363               red->keep_res = phi;
1364               gsi_next (&gsi);
1365               continue;
1366             }
1367         }
1368       gcc_assert (control_name == NULL_TREE
1369                   && SSA_NAME_VAR (res) == SSA_NAME_VAR (control));
1370       control_name = res;
1371       remove_phi_node (&gsi, false);
1372     }
1373   gcc_assert (control_name != NULL_TREE);
1374
1375   /* Initialize the control variable to NIT.  */
1376   gsi = gsi_after_labels (ex_bb);
1377   nit = force_gimple_operand_gsi (&gsi,
1378                                   fold_convert (TREE_TYPE (control_name), nit),
1379                                   false, NULL_TREE, false, GSI_SAME_STMT);
1380   stmt = gimple_build_assign (control_name, nit);
1381   gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
1382   SSA_NAME_DEF_STMT (control_name) = stmt;
1383 }
1384
1385 /* Create the parallel constructs for LOOP as described in gen_parallel_loop.
1386    LOOP_FN and DATA are the arguments of GIMPLE_OMP_PARALLEL.
1387    NEW_DATA is the variable that should be initialized from the argument
1388    of LOOP_FN.  N_THREADS is the requested number of threads.  Returns the
1389    basic block containing GIMPLE_OMP_PARALLEL tree.  */
1390
1391 static basic_block
1392 create_parallel_loop (struct loop *loop, tree loop_fn, tree data,
1393                       tree new_data, unsigned n_threads)
1394 {
1395   gimple_stmt_iterator gsi;
1396   basic_block bb, paral_bb, for_bb, ex_bb;
1397   tree t, param, res;
1398   gimple stmt, for_stmt, phi, cond_stmt;
1399   tree cvar, cvar_init, initvar, cvar_next, cvar_base, type;
1400   edge exit, nexit, guard, end, e;
1401
1402   /* Prepare the GIMPLE_OMP_PARALLEL statement.  */
1403   bb = loop_preheader_edge (loop)->src;
1404   paral_bb = single_pred (bb);
1405   gsi = gsi_last_bb (paral_bb);
1406
1407   t = build_omp_clause (BUILTINS_LOCATION, OMP_CLAUSE_NUM_THREADS);
1408   OMP_CLAUSE_NUM_THREADS_EXPR (t)
1409     = build_int_cst (integer_type_node, n_threads);
1410   stmt = gimple_build_omp_parallel (NULL, t, loop_fn, data);
1411
1412   gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
1413
1414   /* Initialize NEW_DATA.  */
1415   if (data)
1416     {
1417       gsi = gsi_after_labels (bb);
1418
1419       param = make_ssa_name (DECL_ARGUMENTS (loop_fn), NULL);
1420       stmt = gimple_build_assign (param, build_fold_addr_expr (data));
1421       gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1422       SSA_NAME_DEF_STMT (param) = stmt;
1423
1424       stmt = gimple_build_assign (new_data,
1425                                   fold_convert (TREE_TYPE (new_data), param));
1426       gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
1427       SSA_NAME_DEF_STMT (new_data) = stmt;
1428     }
1429
1430   /* Emit GIMPLE_OMP_RETURN for GIMPLE_OMP_PARALLEL.  */
1431   bb = split_loop_exit_edge (single_dom_exit (loop));
1432   gsi = gsi_last_bb (bb);
1433   gsi_insert_after (&gsi, gimple_build_omp_return (false), GSI_NEW_STMT);
1434
1435   /* Extract data for GIMPLE_OMP_FOR.  */
1436   gcc_assert (loop->header == single_dom_exit (loop)->src);
1437   cond_stmt = last_stmt (loop->header);
1438
1439   cvar = gimple_cond_lhs (cond_stmt);
1440   cvar_base = SSA_NAME_VAR (cvar);
1441   phi = SSA_NAME_DEF_STMT (cvar);
1442   cvar_init = PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop));
1443   initvar = make_ssa_name (cvar_base, NULL);
1444   SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, loop_preheader_edge (loop)),
1445            initvar);
1446   cvar_next = PHI_ARG_DEF_FROM_EDGE (phi, loop_latch_edge (loop));
1447
1448   gsi = gsi_last_bb (loop->latch);
1449   gcc_assert (gsi_stmt (gsi) == SSA_NAME_DEF_STMT (cvar_next));
1450   gsi_remove (&gsi, true);
1451
1452   /* Prepare cfg.  */
1453   for_bb = split_edge (loop_preheader_edge (loop));
1454   ex_bb = split_loop_exit_edge (single_dom_exit (loop));
1455   extract_true_false_edges_from_block (loop->header, &nexit, &exit);
1456   gcc_assert (exit == single_dom_exit (loop));
1457
1458   guard = make_edge (for_bb, ex_bb, 0);
1459   single_succ_edge (loop->latch)->flags = 0;
1460   end = make_edge (loop->latch, ex_bb, EDGE_FALLTHRU);
1461   for (gsi = gsi_start_phis (ex_bb); !gsi_end_p (gsi); gsi_next (&gsi))
1462     {
1463       source_location locus;
1464       tree def;
1465       phi = gsi_stmt (gsi);
1466       res = PHI_RESULT (phi);
1467       stmt = SSA_NAME_DEF_STMT (PHI_ARG_DEF_FROM_EDGE (phi, exit));
1468
1469       def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_preheader_edge (loop));
1470       locus = gimple_phi_arg_location_from_edge (stmt, 
1471                                                  loop_preheader_edge (loop));
1472       add_phi_arg (phi, def, guard, locus);
1473
1474       def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_latch_edge (loop));
1475       locus = gimple_phi_arg_location_from_edge (stmt, loop_latch_edge (loop));
1476       add_phi_arg (phi, def, end, locus);
1477     }
1478   e = redirect_edge_and_branch (exit, nexit->dest);
1479   PENDING_STMT (e) = NULL;
1480
1481   /* Emit GIMPLE_OMP_FOR.  */
1482   gimple_cond_set_lhs (cond_stmt, cvar_base);
1483   type = TREE_TYPE (cvar);
1484   t = build_omp_clause (BUILTINS_LOCATION, OMP_CLAUSE_SCHEDULE);
1485   OMP_CLAUSE_SCHEDULE_KIND (t) = OMP_CLAUSE_SCHEDULE_STATIC;
1486
1487   for_stmt = gimple_build_omp_for (NULL, t, 1, NULL);
1488   gimple_omp_for_set_index (for_stmt, 0, initvar);
1489   gimple_omp_for_set_initial (for_stmt, 0, cvar_init);
1490   gimple_omp_for_set_final (for_stmt, 0, gimple_cond_rhs (cond_stmt));
1491   gimple_omp_for_set_cond (for_stmt, 0, gimple_cond_code (cond_stmt));
1492   gimple_omp_for_set_incr (for_stmt, 0, build2 (PLUS_EXPR, type,
1493                                                 cvar_base,
1494                                                 build_int_cst (type, 1)));
1495
1496   gsi = gsi_last_bb (for_bb);
1497   gsi_insert_after (&gsi, for_stmt, GSI_NEW_STMT);
1498   SSA_NAME_DEF_STMT (initvar) = for_stmt;
1499
1500   /* Emit GIMPLE_OMP_CONTINUE.  */
1501   gsi = gsi_last_bb (loop->latch);
1502   stmt = gimple_build_omp_continue (cvar_next, cvar);
1503   gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
1504   SSA_NAME_DEF_STMT (cvar_next) = stmt;
1505
1506   /* Emit GIMPLE_OMP_RETURN for GIMPLE_OMP_FOR.  */
1507   gsi = gsi_last_bb (ex_bb);
1508   gsi_insert_after (&gsi, gimple_build_omp_return (true), GSI_NEW_STMT);
1509
1510   return paral_bb;
1511 }
1512
1513 /* Generates code to execute the iterations of LOOP in N_THREADS
1514    threads in parallel.
1515
1516    NITER describes number of iterations of LOOP.
1517    REDUCTION_LIST describes the reductions existent in the LOOP.  */
1518
1519 static void
1520 gen_parallel_loop (struct loop *loop, htab_t reduction_list,
1521                    unsigned n_threads, struct tree_niter_desc *niter)
1522 {
1523   struct loop *nloop;
1524   loop_iterator li;
1525   tree many_iterations_cond, type, nit;
1526   tree arg_struct, new_arg_struct;
1527   gimple_seq stmts;
1528   basic_block parallel_head;
1529   edge entry, exit;
1530   struct clsn_data clsn_data;
1531   unsigned prob;
1532
1533   /* From
1534
1535      ---------------------------------------------------------------------
1536      loop
1537        {
1538          IV = phi (INIT, IV + STEP)
1539          BODY1;
1540          if (COND)
1541            break;
1542          BODY2;
1543        }
1544      ---------------------------------------------------------------------
1545
1546      with # of iterations NITER (possibly with MAY_BE_ZERO assumption),
1547      we generate the following code:
1548
1549      ---------------------------------------------------------------------
1550
1551      if (MAY_BE_ZERO
1552      || NITER < MIN_PER_THREAD * N_THREADS)
1553      goto original;
1554
1555      BODY1;
1556      store all local loop-invariant variables used in body of the loop to DATA.
1557      GIMPLE_OMP_PARALLEL (OMP_CLAUSE_NUM_THREADS (N_THREADS), LOOPFN, DATA);
1558      load the variables from DATA.
1559      GIMPLE_OMP_FOR (IV = INIT; COND; IV += STEP) (OMP_CLAUSE_SCHEDULE (static))
1560      BODY2;
1561      BODY1;
1562      GIMPLE_OMP_CONTINUE;
1563      GIMPLE_OMP_RETURN         -- GIMPLE_OMP_FOR
1564      GIMPLE_OMP_RETURN         -- GIMPLE_OMP_PARALLEL
1565      goto end;
1566
1567      original:
1568      loop
1569        {
1570          IV = phi (INIT, IV + STEP)
1571          BODY1;
1572          if (COND)
1573            break;
1574          BODY2;
1575        }
1576
1577      end:
1578
1579    */
1580
1581   /* Create two versions of the loop -- in the old one, we know that the
1582      number of iterations is large enough, and we will transform it into the
1583      loop that will be split to loop_fn, the new one will be used for the
1584      remaining iterations.  */
1585
1586   type = TREE_TYPE (niter->niter);
1587   nit = force_gimple_operand (unshare_expr (niter->niter), &stmts, true,
1588                               NULL_TREE);
1589   if (stmts)
1590     gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
1591
1592   many_iterations_cond =
1593     fold_build2 (GE_EXPR, boolean_type_node,
1594                  nit, build_int_cst (type, MIN_PER_THREAD * n_threads));
1595   many_iterations_cond
1596     = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
1597                    invert_truthvalue (unshare_expr (niter->may_be_zero)),
1598                    many_iterations_cond);
1599   many_iterations_cond
1600     = force_gimple_operand (many_iterations_cond, &stmts, false, NULL_TREE);
1601   if (stmts)
1602     gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
1603   if (!is_gimple_condexpr (many_iterations_cond))
1604     {
1605       many_iterations_cond
1606         = force_gimple_operand (many_iterations_cond, &stmts,
1607                                 true, NULL_TREE);
1608       if (stmts)
1609         gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts);
1610     }
1611
1612   initialize_original_copy_tables ();
1613
1614   /* We assume that the loop usually iterates a lot.  */
1615   prob = 4 * REG_BR_PROB_BASE / 5;
1616   nloop = loop_version (loop, many_iterations_cond, NULL,
1617                         prob, prob, REG_BR_PROB_BASE - prob, true);
1618   update_ssa (TODO_update_ssa);
1619   free_original_copy_tables ();
1620
1621   /* Base all the induction variables in LOOP on a single control one.  */
1622   canonicalize_loop_ivs (loop, &nit);
1623
1624   /* Ensure that the exit condition is the first statement in the loop.  */
1625   transform_to_exit_first_loop (loop, reduction_list, nit);
1626
1627   /* Generate initializations for reductions.  */
1628   if (htab_elements (reduction_list) > 0)  
1629     htab_traverse (reduction_list, initialize_reductions, loop);
1630
1631   /* Eliminate the references to local variables from the loop.  */
1632   gcc_assert (single_exit (loop));
1633   entry = loop_preheader_edge (loop);
1634   exit = single_dom_exit (loop);
1635
1636   eliminate_local_variables (entry, exit);
1637   /* In the old loop, move all variables non-local to the loop to a structure
1638      and back, and create separate decls for the variables used in loop.  */
1639   separate_decls_in_region (entry, exit, reduction_list, &arg_struct, 
1640                             &new_arg_struct, &clsn_data);
1641
1642   /* Create the parallel constructs.  */
1643   parallel_head = create_parallel_loop (loop, create_loop_fn (), arg_struct,
1644                                         new_arg_struct, n_threads);
1645   if (htab_elements (reduction_list) > 0)   
1646     create_call_for_reduction (loop, reduction_list, &clsn_data);
1647
1648   scev_reset ();
1649
1650   /* Cancel the loop (it is simpler to do it here rather than to teach the
1651      expander to do it).  */
1652   cancel_loop_tree (loop);
1653
1654   /* Free loop bound estimations that could contain references to
1655      removed statements.  */
1656   FOR_EACH_LOOP (li, loop, 0)
1657     free_numbers_of_iterations_estimates_loop (loop);
1658
1659   /* Expand the parallel constructs.  We do it directly here instead of running
1660      a separate expand_omp pass, since it is more efficient, and less likely to
1661      cause troubles with further analyses not being able to deal with the
1662      OMP trees.  */
1663
1664   omp_expand_local (parallel_head);
1665 }
1666
1667 /* Returns true when LOOP contains vector phi nodes.  */
1668
1669 static bool
1670 loop_has_vector_phi_nodes (struct loop *loop ATTRIBUTE_UNUSED)
1671 {
1672   unsigned i;
1673   basic_block *bbs = get_loop_body_in_dom_order (loop);
1674   gimple_stmt_iterator gsi;
1675   bool res = true;
1676
1677   for (i = 0; i < loop->num_nodes; i++)
1678     for (gsi = gsi_start_phis (bbs[i]); !gsi_end_p (gsi); gsi_next (&gsi))
1679       if (TREE_CODE (TREE_TYPE (PHI_RESULT (gsi_stmt (gsi)))) == VECTOR_TYPE)
1680         goto end;
1681
1682   res = false;
1683  end:
1684   free (bbs);
1685   return res;
1686 }
1687
1688 /* Create a reduction_info struct, initialize it with REDUC_STMT
1689    and PHI, insert it to the REDUCTION_LIST.  */
1690
1691 static void
1692 build_new_reduction (htab_t reduction_list, gimple reduc_stmt, gimple phi)
1693 {
1694   PTR *slot;
1695   struct reduction_info *new_reduction;
1696
1697   gcc_assert (reduc_stmt);
1698   
1699   if (dump_file && (dump_flags & TDF_DETAILS))
1700     {
1701       fprintf (dump_file,
1702                "Detected reduction. reduction stmt is: \n");
1703       print_gimple_stmt (dump_file, reduc_stmt, 0, 0);
1704       fprintf (dump_file, "\n");
1705     }
1706   
1707   new_reduction = XCNEW (struct reduction_info);
1708   
1709   new_reduction->reduc_stmt = reduc_stmt;
1710   new_reduction->reduc_phi = phi;
1711   new_reduction->reduction_code = gimple_assign_rhs_code (reduc_stmt);
1712   slot = htab_find_slot (reduction_list, new_reduction, INSERT);
1713   *slot = new_reduction;
1714 }
1715
1716 /* Detect all reductions in the LOOP, insert them into REDUCTION_LIST.  */
1717
1718 static void
1719 gather_scalar_reductions (loop_p loop, htab_t reduction_list)
1720 {
1721   gimple_stmt_iterator gsi;
1722   loop_vec_info simple_loop_info;
1723
1724   vect_dump = NULL;
1725   simple_loop_info = vect_analyze_loop_form (loop);
1726
1727   for (gsi = gsi_start_phis (loop->header); !gsi_end_p (gsi); gsi_next (&gsi))
1728     {
1729       gimple phi = gsi_stmt (gsi);
1730       affine_iv iv;
1731       tree res = PHI_RESULT (phi);
1732       bool double_reduc;
1733
1734       if (!is_gimple_reg (res))
1735         continue;
1736
1737       if (!simple_iv (loop, loop, res, &iv, true)
1738         && simple_loop_info)
1739         {
1740            gimple reduc_stmt = vect_is_simple_reduction (simple_loop_info, phi, true, &double_reduc);
1741            if (reduc_stmt)
1742               build_new_reduction (reduction_list, reduc_stmt, phi);
1743         }
1744     }
1745     destroy_loop_vec_info (simple_loop_info, true);
1746 }
1747
1748 /* Try to initialize NITER for code generation part.  */
1749
1750 static bool
1751 try_get_loop_niter (loop_p loop, struct tree_niter_desc *niter)
1752 {
1753   edge exit = single_dom_exit (loop);
1754
1755   gcc_assert (exit);
1756
1757   /* We need to know # of iterations, and there should be no uses of values
1758      defined inside loop outside of it, unless the values are invariants of
1759      the loop.  */
1760   if (!number_of_iterations_exit (loop, exit, niter, false))
1761     {
1762       if (dump_file && (dump_flags & TDF_DETAILS))
1763         fprintf (dump_file, "  FAILED: number of iterations not known\n");
1764       return false;
1765     }
1766
1767   return true;
1768 }
1769
1770 /* Try to initialize REDUCTION_LIST for code generation part.
1771    REDUCTION_LIST describes the reductions.  */
1772
1773 static bool
1774 try_create_reduction_list (loop_p loop, htab_t reduction_list)
1775 {
1776   edge exit = single_dom_exit (loop);
1777   gimple_stmt_iterator gsi;
1778
1779   gcc_assert (exit);
1780
1781   gather_scalar_reductions (loop, reduction_list);
1782
1783         
1784   for (gsi = gsi_start_phis (exit->dest); !gsi_end_p (gsi); gsi_next (&gsi))
1785     {
1786       gimple phi = gsi_stmt (gsi);
1787       struct reduction_info *red;
1788       imm_use_iterator imm_iter;
1789       use_operand_p use_p;
1790       gimple reduc_phi;
1791       tree val = PHI_ARG_DEF_FROM_EDGE (phi, exit);
1792
1793       if (is_gimple_reg (val))
1794         {
1795           if (dump_file && (dump_flags & TDF_DETAILS))
1796             {
1797               fprintf (dump_file, "phi is ");
1798               print_gimple_stmt (dump_file, phi, 0, 0);
1799               fprintf (dump_file, "arg of phi to exit:   value ");
1800               print_generic_expr (dump_file, val, 0);
1801               fprintf (dump_file, " used outside loop\n");
1802               fprintf (dump_file,
1803                        "  checking if it a part of reduction pattern:  \n");
1804             }
1805           if (htab_elements (reduction_list) == 0)
1806             {
1807               if (dump_file && (dump_flags & TDF_DETAILS))
1808                 fprintf (dump_file,
1809                          "  FAILED: it is not a part of reduction.\n");
1810               return false;
1811             }
1812           reduc_phi = NULL;
1813           FOR_EACH_IMM_USE_FAST (use_p, imm_iter, val)
1814             {
1815               if (flow_bb_inside_loop_p (loop, gimple_bb (USE_STMT (use_p))))
1816                 {
1817                   reduc_phi = USE_STMT (use_p);
1818                   break;
1819                 }
1820             }
1821           red = reduction_phi (reduction_list, reduc_phi);
1822           if (red == NULL)
1823             {
1824               if (dump_file && (dump_flags & TDF_DETAILS))
1825                 fprintf (dump_file,
1826                          "  FAILED: it is not a part of reduction.\n");
1827               return false;
1828             }
1829           if (dump_file && (dump_flags & TDF_DETAILS))
1830             {
1831               fprintf (dump_file, "reduction phi is  ");
1832               print_gimple_stmt (dump_file, red->reduc_phi, 0, 0);
1833               fprintf (dump_file, "reduction stmt is  ");
1834               print_gimple_stmt (dump_file, red->reduc_stmt, 0, 0);
1835             }
1836         }
1837     }
1838
1839   /* The iterations of the loop may communicate only through bivs whose
1840      iteration space can be distributed efficiently.  */
1841   for (gsi = gsi_start_phis (loop->header); !gsi_end_p (gsi); gsi_next (&gsi))
1842     {
1843       gimple phi = gsi_stmt (gsi);
1844       tree def = PHI_RESULT (phi);
1845       affine_iv iv;
1846
1847       if (is_gimple_reg (def) && !simple_iv (loop, loop, def, &iv, true))
1848         {
1849           struct reduction_info *red;
1850
1851           red = reduction_phi (reduction_list, phi);
1852           if (red == NULL)
1853             {
1854               if (dump_file && (dump_flags & TDF_DETAILS))
1855                 fprintf (dump_file,
1856                          "  FAILED: scalar dependency between iterations\n");
1857               return false;
1858             }
1859         }
1860     }
1861
1862
1863   return true;
1864 }
1865
1866 /* Detect parallel loops and generate parallel code using libgomp
1867    primitives.  Returns true if some loop was parallelized, false
1868    otherwise.  */
1869
1870 bool
1871 parallelize_loops (void)
1872 {
1873   unsigned n_threads = flag_tree_parallelize_loops;
1874   bool changed = false;
1875   struct loop *loop;
1876   struct tree_niter_desc niter_desc;
1877   loop_iterator li;
1878   htab_t reduction_list;
1879
1880   /* Do not parallelize loops in the functions created by parallelization.  */
1881   if (parallelized_function_p (cfun->decl))
1882     return false;
1883
1884   reduction_list = htab_create (10, reduction_info_hash,
1885                                      reduction_info_eq, free);
1886   init_stmt_vec_info_vec ();
1887
1888   FOR_EACH_LOOP (li, loop, 0)
1889     {
1890       htab_empty (reduction_list);
1891
1892       /* If we use autopar in graphite pass, we use it's marked dependency
1893       checking results.  */
1894       if (flag_loop_parallelize_all && !loop->can_be_parallel)
1895         continue;
1896
1897       /* FIXME: Only consider innermost loops with just one exit.  */
1898       if (loop->inner || !single_dom_exit (loop))
1899         continue;
1900
1901       if (/* And of course, the loop must be parallelizable.  */
1902           !can_duplicate_loop_p (loop)
1903           || loop_has_blocks_with_irreducible_flag (loop)
1904           /* FIXME: the check for vector phi nodes could be removed.  */
1905           || loop_has_vector_phi_nodes (loop))
1906         continue;
1907
1908       /* FIXME: Bypass this check as graphite doesn't update the
1909       count and frequency correctly now.  */
1910       if (!flag_loop_parallelize_all
1911           && ((estimated_loop_iterations_int (loop, false)
1912                <= (HOST_WIDE_INT) n_threads * MIN_PER_THREAD)
1913               /* Do not bother with loops in cold areas.  */
1914               || optimize_loop_nest_for_size_p (loop)))
1915         continue;
1916
1917       if (!try_get_loop_niter (loop, &niter_desc))
1918         continue;
1919
1920       if (!try_create_reduction_list (loop, reduction_list))
1921         continue;
1922
1923       if (!flag_loop_parallelize_all && !loop_parallel_p (loop))
1924         continue;
1925
1926       changed = true;
1927       gen_parallel_loop (loop, reduction_list, 
1928                          n_threads, &niter_desc);
1929       verify_flow_info ();
1930       verify_dominators (CDI_DOMINATORS);
1931       verify_loop_structure ();
1932       verify_loop_closed_ssa ();
1933     }
1934
1935   free_stmt_vec_info_vec ();
1936   htab_delete (reduction_list);
1937
1938   /* Parallelization will cause new function calls to be inserted through
1939      which local variables will escape.  Reset the points-to solutions
1940      for ESCAPED and CALLUSED.  */
1941   if (changed)
1942     {
1943       pt_solution_reset (&cfun->gimple_df->escaped);
1944       pt_solution_reset (&cfun->gimple_df->callused);
1945     }
1946
1947   return changed;
1948 }
1949
1950 #include "gt-tree-parloops.h"