OSDN Git Service

2005-08-03 Andrew Pinski <pinskia@physics.uc.edu>
[pf3gnuchains/gcc-fork.git] / gcc / tree-vectorizer.c
1 /* Loop Vectorization
2    Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3    Contributed by Dorit Naishlos <dorit@il.ibm.com>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA.  */
21
22 /* Loop Vectorization Pass.
23
24    This pass tries to vectorize loops. This first implementation focuses on
25    simple inner-most loops, with no conditional control flow, and a set of
26    simple operations which vector form can be expressed using existing
27    tree codes (PLUS, MULT etc).
28
29    For example, the vectorizer transforms the following simple loop:
30
31         short a[N]; short b[N]; short c[N]; int i;
32
33         for (i=0; i<N; i++){
34           a[i] = b[i] + c[i];
35         }
36
37    as if it was manually vectorized by rewriting the source code into:
38
39         typedef int __attribute__((mode(V8HI))) v8hi;
40         short a[N];  short b[N]; short c[N];   int i;
41         v8hi *pa = (v8hi*)a, *pb = (v8hi*)b, *pc = (v8hi*)c;
42         v8hi va, vb, vc;
43
44         for (i=0; i<N/8; i++){
45           vb = pb[i];
46           vc = pc[i];
47           va = vb + vc;
48           pa[i] = va;
49         }
50
51         The main entry to this pass is vectorize_loops(), in which
52    the vectorizer applies a set of analyses on a given set of loops,
53    followed by the actual vectorization transformation for the loops that
54    had successfully passed the analysis phase.
55
56         Throughout this pass we make a distinction between two types of
57    data: scalars (which are represented by SSA_NAMES), and memory references
58    ("data-refs"). These two types of data require different handling both 
59    during analysis and transformation. The types of data-refs that the 
60    vectorizer currently supports are ARRAY_REFS which base is an array DECL 
61    (not a pointer), and INDIRECT_REFS through pointers; both array and pointer
62    accesses are required to have a  simple (consecutive) access pattern.
63
64    Analysis phase:
65    ===============
66         The driver for the analysis phase is vect_analyze_loop_nest().
67    It applies a set of analyses, some of which rely on the scalar evolution 
68    analyzer (scev) developed by Sebastian Pop.
69
70         During the analysis phase the vectorizer records some information
71    per stmt in a "stmt_vec_info" struct which is attached to each stmt in the 
72    loop, as well as general information about the loop as a whole, which is
73    recorded in a "loop_vec_info" struct attached to each loop.
74
75    Transformation phase:
76    =====================
77         The loop transformation phase scans all the stmts in the loop, and
78    creates a vector stmt (or a sequence of stmts) for each scalar stmt S in
79    the loop that needs to be vectorized. It insert the vector code sequence
80    just before the scalar stmt S, and records a pointer to the vector code
81    in STMT_VINFO_VEC_STMT (stmt_info) (stmt_info is the stmt_vec_info struct 
82    attached to S). This pointer will be used for the vectorization of following
83    stmts which use the def of stmt S. Stmt S is removed if it writes to memory;
84    otherwise, we rely on dead code elimination for removing it.
85
86         For example, say stmt S1 was vectorized into stmt VS1:
87
88    VS1: vb = px[i];
89    S1:  b = x[i];    STMT_VINFO_VEC_STMT (stmt_info (S1)) = VS1
90    S2:  a = b;
91
92    To vectorize stmt S2, the vectorizer first finds the stmt that defines
93    the operand 'b' (S1), and gets the relevant vector def 'vb' from the
94    vector stmt VS1 pointed to by STMT_VINFO_VEC_STMT (stmt_info (S1)). The
95    resulting sequence would be:
96
97    VS1: vb = px[i];
98    S1:  b = x[i];       STMT_VINFO_VEC_STMT (stmt_info (S1)) = VS1
99    VS2: va = vb;
100    S2:  a = b;          STMT_VINFO_VEC_STMT (stmt_info (S2)) = VS2
101
102         Operands that are not SSA_NAMEs, are data-refs that appear in 
103    load/store operations (like 'x[i]' in S1), and are handled differently.
104
105    Target modeling:
106    =================
107         Currently the only target specific information that is used is the
108    size of the vector (in bytes) - "UNITS_PER_SIMD_WORD". Targets that can 
109    support different sizes of vectors, for now will need to specify one value 
110    for "UNITS_PER_SIMD_WORD". More flexibility will be added in the future.
111
112         Since we only vectorize operations which vector form can be
113    expressed using existing tree codes, to verify that an operation is
114    supported, the vectorizer checks the relevant optab at the relevant
115    machine_mode (e.g, add_optab->handlers[(int) V8HImode].insn_code). If
116    the value found is CODE_FOR_nothing, then there's no target support, and
117    we can't vectorize the stmt.
118
119    For additional information on this project see:
120    http://gcc.gnu.org/projects/tree-ssa/vectorization.html
121 */
122
123 #include "config.h"
124 #include "system.h"
125 #include "coretypes.h"
126 #include "tm.h"
127 #include "ggc.h"
128 #include "tree.h"
129 #include "target.h"
130 #include "rtl.h"
131 #include "basic-block.h"
132 #include "diagnostic.h"
133 #include "tree-flow.h"
134 #include "tree-dump.h"
135 #include "timevar.h"
136 #include "cfgloop.h"
137 #include "cfglayout.h"
138 #include "expr.h"
139 #include "optabs.h"
140 #include "toplev.h"
141 #include "tree-chrec.h"
142 #include "tree-data-ref.h"
143 #include "tree-scalar-evolution.h"
144 #include "input.h"
145 #include "tree-vectorizer.h"
146 #include "tree-pass.h"
147
148 /*************************************************************************
149   Simple Loop Peeling Utilities
150  *************************************************************************/
151 static struct loop *slpeel_tree_duplicate_loop_to_edge_cfg 
152   (struct loop *, struct loops *, edge);
153 static void slpeel_update_phis_for_duplicate_loop 
154   (struct loop *, struct loop *, bool after);
155 static void slpeel_update_phi_nodes_for_guard1 
156   (edge, struct loop *, bool, basic_block *, bitmap *); 
157 static void slpeel_update_phi_nodes_for_guard2 
158   (edge, struct loop *, bool, basic_block *);
159 static edge slpeel_add_loop_guard (basic_block, tree, basic_block, basic_block);
160
161 static void rename_use_op (use_operand_p);
162 static void rename_variables_in_bb (basic_block);
163 static void rename_variables_in_loop (struct loop *);
164
165 /*************************************************************************
166   General Vectorization Utilities
167  *************************************************************************/
168 static void vect_set_dump_settings (void);
169
170 /* vect_dump will be set to stderr or dump_file if exist.  */
171 FILE *vect_dump;
172
173 /* vect_verbosity_level set to an invalid value 
174    to mark that it's uninitialized.  */
175 enum verbosity_levels vect_verbosity_level = MAX_VERBOSITY_LEVEL;
176
177 /* Number of loops, at the beginning of vectorization.  */
178 unsigned int vect_loops_num;
179
180 /* Loop location.  */
181 static LOC vect_loop_location;
182 \f
183 /*************************************************************************
184   Simple Loop Peeling Utilities
185
186   Utilities to support loop peeling for vectorization purposes.
187  *************************************************************************/
188
189
190 /* Renames the use *OP_P.  */
191
192 static void
193 rename_use_op (use_operand_p op_p)
194 {
195   tree new_name;
196
197   if (TREE_CODE (USE_FROM_PTR (op_p)) != SSA_NAME)
198     return;
199
200   new_name = get_current_def (USE_FROM_PTR (op_p));
201
202   /* Something defined outside of the loop.  */
203   if (!new_name)
204     return;
205
206   /* An ordinary ssa name defined in the loop.  */
207
208   SET_USE (op_p, new_name);
209 }
210
211
212 /* Renames the variables in basic block BB.  */
213
214 static void
215 rename_variables_in_bb (basic_block bb)
216 {
217   tree phi;
218   block_stmt_iterator bsi;
219   tree stmt;
220   use_operand_p use_p;
221   ssa_op_iter iter;
222   edge e;
223   edge_iterator ei;
224   struct loop *loop = bb->loop_father;
225
226   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
227     {
228       stmt = bsi_stmt (bsi);
229       FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, 
230                                  (SSA_OP_ALL_USES | SSA_OP_ALL_KILLS))
231         rename_use_op (use_p);
232     }
233
234   FOR_EACH_EDGE (e, ei, bb->succs)
235     {
236       if (!flow_bb_inside_loop_p (loop, e->dest))
237         continue;
238       for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
239         rename_use_op (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e));
240     }
241 }
242
243
244 /* Renames variables in new generated LOOP.  */
245
246 static void
247 rename_variables_in_loop (struct loop *loop)
248 {
249   unsigned i;
250   basic_block *bbs;
251
252   bbs = get_loop_body (loop);
253
254   for (i = 0; i < loop->num_nodes; i++)
255     rename_variables_in_bb (bbs[i]);
256
257   free (bbs);
258 }
259
260
261 /* Update the PHI nodes of NEW_LOOP.
262
263    NEW_LOOP is a duplicate of ORIG_LOOP.
264    AFTER indicates whether NEW_LOOP executes before or after ORIG_LOOP:
265    AFTER is true if NEW_LOOP executes after ORIG_LOOP, and false if it
266    executes before it.  */
267
268 static void
269 slpeel_update_phis_for_duplicate_loop (struct loop *orig_loop,
270                                        struct loop *new_loop, bool after)
271 {
272   tree new_ssa_name;
273   tree phi_new, phi_orig;
274   tree def;
275   edge orig_loop_latch = loop_latch_edge (orig_loop);
276   edge orig_entry_e = loop_preheader_edge (orig_loop);
277   edge new_loop_exit_e = new_loop->single_exit;
278   edge new_loop_entry_e = loop_preheader_edge (new_loop);
279   edge entry_arg_e = (after ? orig_loop_latch : orig_entry_e);
280
281   /*
282      step 1. For each loop-header-phi:
283              Add the first phi argument for the phi in NEW_LOOP
284             (the one associated with the entry of NEW_LOOP)
285
286      step 2. For each loop-header-phi:
287              Add the second phi argument for the phi in NEW_LOOP
288             (the one associated with the latch of NEW_LOOP)
289
290      step 3. Update the phis in the successor block of NEW_LOOP.
291
292         case 1: NEW_LOOP was placed before ORIG_LOOP:
293                 The successor block of NEW_LOOP is the header of ORIG_LOOP.
294                 Updating the phis in the successor block can therefore be done
295                 along with the scanning of the loop header phis, because the
296                 header blocks of ORIG_LOOP and NEW_LOOP have exactly the same
297                 phi nodes, organized in the same order.
298
299         case 2: NEW_LOOP was placed after ORIG_LOOP:
300                 The successor block of NEW_LOOP is the original exit block of 
301                 ORIG_LOOP - the phis to be updated are the loop-closed-ssa phis.
302                 We postpone updating these phis to a later stage (when
303                 loop guards are added).
304    */
305
306
307   /* Scan the phis in the headers of the old and new loops
308      (they are organized in exactly the same order).  */
309
310   for (phi_new = phi_nodes (new_loop->header),
311        phi_orig = phi_nodes (orig_loop->header);
312        phi_new && phi_orig;
313        phi_new = PHI_CHAIN (phi_new), phi_orig = PHI_CHAIN (phi_orig))
314     {
315       /* step 1.  */
316       def = PHI_ARG_DEF_FROM_EDGE (phi_orig, entry_arg_e);
317       add_phi_arg (phi_new, def, new_loop_entry_e);
318
319       /* step 2.  */
320       def = PHI_ARG_DEF_FROM_EDGE (phi_orig, orig_loop_latch);
321       if (TREE_CODE (def) != SSA_NAME)
322         continue;
323
324       new_ssa_name = get_current_def (def);
325       if (!new_ssa_name)
326         {
327           /* This only happens if there are no definitions
328              inside the loop. use the phi_result in this case.  */
329           new_ssa_name = PHI_RESULT (phi_new);
330         }
331
332       /* An ordinary ssa name defined in the loop.  */
333       add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop));
334
335       /* step 3 (case 1).  */
336       if (!after)
337         {
338           gcc_assert (new_loop_exit_e == orig_entry_e);
339           SET_PHI_ARG_DEF (phi_orig,
340                            new_loop_exit_e->dest_idx,
341                            new_ssa_name);
342         }
343     }
344 }
345
346
347 /* Update PHI nodes for a guard of the LOOP.
348
349    Input:
350    - LOOP, GUARD_EDGE: LOOP is a loop for which we added guard code that
351         controls whether LOOP is to be executed.  GUARD_EDGE is the edge that
352         originates from the guard-bb, skips LOOP and reaches the (unique) exit
353         bb of LOOP.  This loop-exit-bb is an empty bb with one successor.
354         We denote this bb NEW_MERGE_BB because before the guard code was added
355         it had a single predecessor (the LOOP header), and now it became a merge
356         point of two paths - the path that ends with the LOOP exit-edge, and
357         the path that ends with GUARD_EDGE.
358    - NEW_EXIT_BB: New basic block that is added by this function between LOOP
359         and NEW_MERGE_BB. It is used to place loop-closed-ssa-form exit-phis.
360
361    ===> The CFG before the guard-code was added:
362         LOOP_header_bb:
363           loop_body
364           if (exit_loop) goto update_bb
365           else           goto LOOP_header_bb
366         update_bb:
367
368    ==> The CFG after the guard-code was added:
369         guard_bb:
370           if (LOOP_guard_condition) goto new_merge_bb
371           else                      goto LOOP_header_bb
372         LOOP_header_bb:
373           loop_body
374           if (exit_loop_condition) goto new_merge_bb
375           else                     goto LOOP_header_bb
376         new_merge_bb:
377           goto update_bb
378         update_bb:
379
380    ==> The CFG after this function:
381         guard_bb:
382           if (LOOP_guard_condition) goto new_merge_bb
383           else                      goto LOOP_header_bb
384         LOOP_header_bb:
385           loop_body
386           if (exit_loop_condition) goto new_exit_bb
387           else                     goto LOOP_header_bb
388         new_exit_bb:
389         new_merge_bb:
390           goto update_bb
391         update_bb:
392
393    This function:
394    1. creates and updates the relevant phi nodes to account for the new
395       incoming edge (GUARD_EDGE) into NEW_MERGE_BB. This involves:
396       1.1. Create phi nodes at NEW_MERGE_BB.
397       1.2. Update the phi nodes at the successor of NEW_MERGE_BB (denoted
398            UPDATE_BB).  UPDATE_BB was the exit-bb of LOOP before NEW_MERGE_BB
399    2. preserves loop-closed-ssa-form by creating the required phi nodes
400       at the exit of LOOP (i.e, in NEW_EXIT_BB).
401
402    There are two flavors to this function:
403
404    slpeel_update_phi_nodes_for_guard1:
405      Here the guard controls whether we enter or skip LOOP, where LOOP is a
406      prolog_loop (loop1 below), and the new phis created in NEW_MERGE_BB are
407      for variables that have phis in the loop header.
408
409    slpeel_update_phi_nodes_for_guard2:
410      Here the guard controls whether we enter or skip LOOP, where LOOP is an
411      epilog_loop (loop2 below), and the new phis created in NEW_MERGE_BB are
412      for variables that have phis in the loop exit.
413
414    I.E., the overall structure is:
415
416         loop1_preheader_bb:
417                 guard1 (goto loop1/merg1_bb)
418         loop1
419         loop1_exit_bb:
420                 guard2 (goto merge1_bb/merge2_bb)
421         merge1_bb
422         loop2
423         loop2_exit_bb
424         merge2_bb
425         next_bb
426
427    slpeel_update_phi_nodes_for_guard1 takes care of creating phis in
428    loop1_exit_bb and merge1_bb. These are entry phis (phis for the vars
429    that have phis in loop1->header).
430
431    slpeel_update_phi_nodes_for_guard2 takes care of creating phis in
432    loop2_exit_bb and merge2_bb. These are exit phis (phis for the vars
433    that have phis in next_bb). It also adds some of these phis to
434    loop1_exit_bb.
435
436    slpeel_update_phi_nodes_for_guard1 is always called before
437    slpeel_update_phi_nodes_for_guard2. They are both needed in order
438    to create correct data-flow and loop-closed-ssa-form.
439
440    Generally slpeel_update_phi_nodes_for_guard1 creates phis for variables
441    that change between iterations of a loop (and therefore have a phi-node
442    at the loop entry), whereas slpeel_update_phi_nodes_for_guard2 creates
443    phis for variables that are used out of the loop (and therefore have 
444    loop-closed exit phis). Some variables may be both updated between 
445    iterations and used after the loop. This is why in loop1_exit_bb we
446    may need both entry_phis (created by slpeel_update_phi_nodes_for_guard1)
447    and exit phis (created by slpeel_update_phi_nodes_for_guard2).
448
449    - IS_NEW_LOOP: if IS_NEW_LOOP is true, then LOOP is a newly created copy of
450      an original loop. i.e., we have:
451
452            orig_loop
453            guard_bb (goto LOOP/new_merge)
454            new_loop <-- LOOP
455            new_exit
456            new_merge
457            next_bb
458
459      If IS_NEW_LOOP is false, then LOOP is an original loop, in which case we
460      have:
461
462            new_loop
463            guard_bb (goto LOOP/new_merge)
464            orig_loop <-- LOOP
465            new_exit
466            new_merge
467            next_bb
468
469      The SSA names defined in the original loop have a current
470      reaching definition that that records the corresponding new
471      ssa-name used in the new duplicated loop copy.
472   */
473
474 /* Function slpeel_update_phi_nodes_for_guard1
475    
476    Input:
477    - GUARD_EDGE, LOOP, IS_NEW_LOOP, NEW_EXIT_BB - as explained above.
478    - DEFS - a bitmap of ssa names to mark new names for which we recorded
479             information. 
480    
481    In the context of the overall structure, we have:
482
483         loop1_preheader_bb: 
484                 guard1 (goto loop1/merg1_bb)
485 LOOP->  loop1
486         loop1_exit_bb:
487                 guard2 (goto merge1_bb/merge2_bb)
488         merge1_bb
489         loop2
490         loop2_exit_bb
491         merge2_bb
492         next_bb
493
494    For each name updated between loop iterations (i.e - for each name that has
495    an entry (loop-header) phi in LOOP) we create a new phi in:
496    1. merge1_bb (to account for the edge from guard1)
497    2. loop1_exit_bb (an exit-phi to keep LOOP in loop-closed form)
498 */
499
500 static void
501 slpeel_update_phi_nodes_for_guard1 (edge guard_edge, struct loop *loop,
502                                     bool is_new_loop, basic_block *new_exit_bb,
503                                     bitmap *defs)
504 {
505   tree orig_phi, new_phi;
506   tree update_phi, update_phi2;
507   tree guard_arg, loop_arg;
508   basic_block new_merge_bb = guard_edge->dest;
509   edge e = EDGE_SUCC (new_merge_bb, 0);
510   basic_block update_bb = e->dest;
511   basic_block orig_bb = loop->header;
512   edge new_exit_e;
513   tree current_new_name;
514
515   /* Create new bb between loop and new_merge_bb.  */
516   *new_exit_bb = split_edge (loop->single_exit);
517   add_bb_to_loop (*new_exit_bb, loop->outer);
518
519   new_exit_e = EDGE_SUCC (*new_exit_bb, 0);
520
521   for (orig_phi = phi_nodes (orig_bb), update_phi = phi_nodes (update_bb);
522        orig_phi && update_phi;
523        orig_phi = PHI_CHAIN (orig_phi), update_phi = PHI_CHAIN (update_phi))
524     {
525       /** 1. Handle new-merge-point phis  **/
526
527       /* 1.1. Generate new phi node in NEW_MERGE_BB:  */
528       new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (orig_phi)),
529                                  new_merge_bb);
530
531       /* 1.2. NEW_MERGE_BB has two incoming edges: GUARD_EDGE and the exit-edge
532             of LOOP. Set the two phi args in NEW_PHI for these edges:  */
533       loop_arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, EDGE_SUCC (loop->latch, 0));
534       guard_arg = PHI_ARG_DEF_FROM_EDGE (orig_phi, loop_preheader_edge (loop));
535
536       add_phi_arg (new_phi, loop_arg, new_exit_e);
537       add_phi_arg (new_phi, guard_arg, guard_edge);
538
539       /* 1.3. Update phi in successor block.  */
540       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == loop_arg
541                   || PHI_ARG_DEF_FROM_EDGE (update_phi, e) == guard_arg);
542       SET_PHI_ARG_DEF (update_phi, e->dest_idx, PHI_RESULT (new_phi));
543       update_phi2 = new_phi;
544
545
546       /** 2. Handle loop-closed-ssa-form phis  **/
547
548       /* 2.1. Generate new phi node in NEW_EXIT_BB:  */
549       new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (orig_phi)),
550                                  *new_exit_bb);
551
552       /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
553       add_phi_arg (new_phi, loop_arg, loop->single_exit);
554
555       /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
556       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
557       SET_PHI_ARG_DEF (update_phi2, new_exit_e->dest_idx, PHI_RESULT (new_phi));
558
559       /* 2.4. Record the newly created name with set_current_def.
560          We want to find a name such that
561                 name = get_current_def (orig_loop_name)
562          and to set its current definition as follows:
563                 set_current_def (name, new_phi_name)
564
565          If LOOP is a new loop then loop_arg is already the name we're
566          looking for. If LOOP is the original loop, then loop_arg is
567          the orig_loop_name and the relevant name is recorded in its
568          current reaching definition.  */
569       if (is_new_loop)
570         current_new_name = loop_arg;
571       else
572         {
573           current_new_name = get_current_def (loop_arg);
574           /* current_def is not available only if the variable does not
575              change inside the loop, in which case we also don't care
576              about recording a current_def for it because we won't be
577              trying to create loop-exit-phis for it.  */
578           if (!current_new_name)
579             continue;
580         }
581       gcc_assert (get_current_def (current_new_name) == NULL_TREE);
582
583       set_current_def (current_new_name, PHI_RESULT (new_phi));
584       bitmap_set_bit (*defs, SSA_NAME_VERSION (current_new_name));
585     }
586
587   set_phi_nodes (new_merge_bb, phi_reverse (phi_nodes (new_merge_bb)));
588 }
589
590
591 /* Function slpeel_update_phi_nodes_for_guard2
592
593    Input:
594    - GUARD_EDGE, LOOP, IS_NEW_LOOP, NEW_EXIT_BB - as explained above.
595
596    In the context of the overall structure, we have:
597
598         loop1_preheader_bb: 
599                 guard1 (goto loop1/merg1_bb)
600         loop1
601         loop1_exit_bb: 
602                 guard2 (goto merge1_bb/merge2_bb)
603         merge1_bb
604 LOOP->  loop2
605         loop2_exit_bb
606         merge2_bb
607         next_bb
608
609    For each name used out side the loop (i.e - for each name that has an exit
610    phi in next_bb) we create a new phi in:
611    1. merge2_bb (to account for the edge from guard_bb) 
612    2. loop2_exit_bb (an exit-phi to keep LOOP in loop-closed form)
613    3. guard2 bb (an exit phi to keep the preceding loop in loop-closed form),
614       if needed (if it wasn't handled by slpeel_update_phis_nodes_for_phi1).
615 */
616
617 static void
618 slpeel_update_phi_nodes_for_guard2 (edge guard_edge, struct loop *loop,
619                                     bool is_new_loop, basic_block *new_exit_bb)
620 {
621   tree orig_phi, new_phi;
622   tree update_phi, update_phi2;
623   tree guard_arg, loop_arg;
624   basic_block new_merge_bb = guard_edge->dest;
625   edge e = EDGE_SUCC (new_merge_bb, 0);
626   basic_block update_bb = e->dest;
627   edge new_exit_e;
628   tree orig_def, orig_def_new_name;
629   tree new_name, new_name2;
630   tree arg;
631
632   /* Create new bb between loop and new_merge_bb.  */
633   *new_exit_bb = split_edge (loop->single_exit);
634   add_bb_to_loop (*new_exit_bb, loop->outer);
635
636   new_exit_e = EDGE_SUCC (*new_exit_bb, 0);
637
638   for (update_phi = phi_nodes (update_bb); update_phi; 
639        update_phi = PHI_CHAIN (update_phi))
640     {
641       orig_phi = update_phi;
642       orig_def = PHI_ARG_DEF_FROM_EDGE (orig_phi, e);
643       /* This loop-closed-phi actually doesn't represent a use
644          out of the loop - the phi arg is a constant.  */ 
645       if (TREE_CODE (orig_def) != SSA_NAME)
646         continue;
647       orig_def_new_name = get_current_def (orig_def);
648       arg = NULL_TREE;
649
650       /** 1. Handle new-merge-point phis  **/
651
652       /* 1.1. Generate new phi node in NEW_MERGE_BB:  */
653       new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (orig_phi)),
654                                  new_merge_bb);
655
656       /* 1.2. NEW_MERGE_BB has two incoming edges: GUARD_EDGE and the exit-edge
657             of LOOP. Set the two PHI args in NEW_PHI for these edges:  */
658       new_name = orig_def;
659       new_name2 = NULL_TREE;
660       if (orig_def_new_name)
661         {
662           new_name = orig_def_new_name;
663           /* Some variables have both loop-entry-phis and loop-exit-phis.
664              Such variables were given yet newer names by phis placed in
665              guard_bb by slpeel_update_phi_nodes_for_guard1. I.e:
666              new_name2 = get_current_def (get_current_def (orig_name)).  */
667           new_name2 = get_current_def (new_name);
668         }
669   
670       if (is_new_loop)
671         {
672           guard_arg = orig_def;
673           loop_arg = new_name;
674         }
675       else
676         {
677           guard_arg = new_name;
678           loop_arg = orig_def;
679         }
680       if (new_name2)
681         guard_arg = new_name2;
682   
683       add_phi_arg (new_phi, loop_arg, new_exit_e);
684       add_phi_arg (new_phi, guard_arg, guard_edge);
685
686       /* 1.3. Update phi in successor block.  */
687       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == orig_def);
688       SET_PHI_ARG_DEF (update_phi, e->dest_idx, PHI_RESULT (new_phi));
689       update_phi2 = new_phi;
690
691
692       /** 2. Handle loop-closed-ssa-form phis  **/
693
694       /* 2.1. Generate new phi node in NEW_EXIT_BB:  */
695       new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (orig_phi)),
696                                  *new_exit_bb);
697
698       /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
699       add_phi_arg (new_phi, loop_arg, loop->single_exit);
700
701       /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
702       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
703       SET_PHI_ARG_DEF (update_phi2, new_exit_e->dest_idx, PHI_RESULT (new_phi));
704
705
706       /** 3. Handle loop-closed-ssa-form phis for first loop  **/
707
708       /* 3.1. Find the relevant names that need an exit-phi in
709          GUARD_BB, i.e. names for which
710          slpeel_update_phi_nodes_for_guard1 had not already created a
711          phi node. This is the case for names that are used outside
712          the loop (and therefore need an exit phi) but are not updated
713          across loop iterations (and therefore don't have a
714          loop-header-phi).
715
716          slpeel_update_phi_nodes_for_guard1 is responsible for
717          creating loop-exit phis in GUARD_BB for names that have a
718          loop-header-phi.  When such a phi is created we also record
719          the new name in its current definition.  If this new name
720          exists, then guard_arg was set to this new name (see 1.2
721          above).  Therefore, if guard_arg is not this new name, this
722          is an indication that an exit-phi in GUARD_BB was not yet
723          created, so we take care of it here.  */
724       if (guard_arg == new_name2)
725         continue;
726       arg = guard_arg;
727
728       /* 3.2. Generate new phi node in GUARD_BB:  */
729       new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (orig_phi)),
730                                  guard_edge->src);
731
732       /* 3.3. GUARD_BB has one incoming edge:  */
733       gcc_assert (EDGE_COUNT (guard_edge->src->preds) == 1);
734       add_phi_arg (new_phi, arg, EDGE_PRED (guard_edge->src, 0));
735
736       /* 3.4. Update phi in successor of GUARD_BB:  */
737       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, guard_edge)
738                                                                 == guard_arg);
739       SET_PHI_ARG_DEF (update_phi2, guard_edge->dest_idx, PHI_RESULT (new_phi));
740     }
741
742   set_phi_nodes (new_merge_bb, phi_reverse (phi_nodes (new_merge_bb)));
743 }
744
745
746 /* Make the LOOP iterate NITERS times. This is done by adding a new IV
747    that starts at zero, increases by one and its limit is NITERS.
748
749    Assumption: the exit-condition of LOOP is the last stmt in the loop.  */
750
751 void
752 slpeel_make_loop_iterate_ntimes (struct loop *loop, tree niters)
753 {
754   tree indx_before_incr, indx_after_incr, cond_stmt, cond;
755   tree orig_cond;
756   edge exit_edge = loop->single_exit;
757   block_stmt_iterator loop_cond_bsi;
758   block_stmt_iterator incr_bsi;
759   bool insert_after;
760   tree begin_label = tree_block_label (loop->latch);
761   tree exit_label = tree_block_label (loop->single_exit->dest);
762   tree init = build_int_cst (TREE_TYPE (niters), 0);
763   tree step = build_int_cst (TREE_TYPE (niters), 1);
764   tree then_label;
765   tree else_label;
766   LOC loop_loc;
767
768   orig_cond = get_loop_exit_condition (loop);
769   gcc_assert (orig_cond);
770   loop_cond_bsi = bsi_for_stmt (orig_cond);
771
772   standard_iv_increment_position (loop, &incr_bsi, &insert_after);
773   create_iv (init, step, NULL_TREE, loop,
774              &incr_bsi, insert_after, &indx_before_incr, &indx_after_incr);
775
776   if (exit_edge->flags & EDGE_TRUE_VALUE) /* 'then' edge exits the loop.  */
777     {
778       cond = build2 (GE_EXPR, boolean_type_node, indx_after_incr, niters);
779       then_label = build1 (GOTO_EXPR, void_type_node, exit_label);
780       else_label = build1 (GOTO_EXPR, void_type_node, begin_label);
781     }
782   else /* 'then' edge loops back.  */
783     {
784       cond = build2 (LT_EXPR, boolean_type_node, indx_after_incr, niters);
785       then_label = build1 (GOTO_EXPR, void_type_node, begin_label);
786       else_label = build1 (GOTO_EXPR, void_type_node, exit_label);
787     }
788
789   cond_stmt = build3 (COND_EXPR, TREE_TYPE (orig_cond), cond,
790                      then_label, else_label);
791   bsi_insert_before (&loop_cond_bsi, cond_stmt, BSI_SAME_STMT);
792
793   /* Remove old loop exit test:  */
794   bsi_remove (&loop_cond_bsi);
795
796   loop_loc = find_loop_location (loop);
797   if (dump_file && (dump_flags & TDF_DETAILS))
798     {
799       if (loop_loc != UNKNOWN_LOC)
800         fprintf (dump_file, "\nloop at %s:%d: ",
801                  LOC_FILE (loop_loc), LOC_LINE (loop_loc));
802       print_generic_expr (dump_file, cond_stmt, TDF_SLIM);
803     }
804
805   loop->nb_iterations = niters;
806 }
807
808
809 /* Given LOOP this function generates a new copy of it and puts it 
810    on E which is either the entry or exit of LOOP.  */
811
812 static struct loop *
813 slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop, struct loops *loops, 
814                                         edge e)
815 {
816   struct loop *new_loop;
817   basic_block *new_bbs, *bbs;
818   bool at_exit;
819   bool was_imm_dom;
820   basic_block exit_dest; 
821   tree phi, phi_arg;
822
823   at_exit = (e == loop->single_exit); 
824   if (!at_exit && e != loop_preheader_edge (loop))
825     return NULL;
826
827   bbs = get_loop_body (loop);
828
829   /* Check whether duplication is possible.  */
830   if (!can_copy_bbs_p (bbs, loop->num_nodes))
831     {
832       free (bbs);
833       return NULL;
834     }
835
836   /* Generate new loop structure.  */
837   new_loop = duplicate_loop (loops, loop, loop->outer);
838   if (!new_loop)
839     {
840       free (bbs);
841       return NULL;
842     }
843
844   exit_dest = loop->single_exit->dest;
845   was_imm_dom = (get_immediate_dominator (CDI_DOMINATORS, 
846                                           exit_dest) == loop->header ? 
847                  true : false);
848
849   new_bbs = xmalloc (sizeof (basic_block) * loop->num_nodes);
850
851   copy_bbs (bbs, loop->num_nodes, new_bbs,
852             &loop->single_exit, 1, &new_loop->single_exit, NULL);
853
854   /* Duplicating phi args at exit bbs as coming 
855      also from exit of duplicated loop.  */
856   for (phi = phi_nodes (exit_dest); phi; phi = PHI_CHAIN (phi))
857     {
858       phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, loop->single_exit);
859       if (phi_arg)
860         {
861           edge new_loop_exit_edge;
862
863           if (EDGE_SUCC (new_loop->header, 0)->dest == new_loop->latch)
864             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 1);
865           else
866             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 0);
867   
868           add_phi_arg (phi, phi_arg, new_loop_exit_edge);       
869         }
870     }    
871    
872   if (at_exit) /* Add the loop copy at exit.  */
873     {
874       redirect_edge_and_branch_force (e, new_loop->header);
875       set_immediate_dominator (CDI_DOMINATORS, new_loop->header, e->src);
876       if (was_imm_dom)
877         set_immediate_dominator (CDI_DOMINATORS, exit_dest, new_loop->header);
878     }
879   else /* Add the copy at entry.  */
880     {
881       edge new_exit_e;
882       edge entry_e = loop_preheader_edge (loop);
883       basic_block preheader = entry_e->src;
884            
885       if (!flow_bb_inside_loop_p (new_loop, 
886                                   EDGE_SUCC (new_loop->header, 0)->dest))
887         new_exit_e = EDGE_SUCC (new_loop->header, 0);
888       else
889         new_exit_e = EDGE_SUCC (new_loop->header, 1); 
890
891       redirect_edge_and_branch_force (new_exit_e, loop->header);
892       set_immediate_dominator (CDI_DOMINATORS, loop->header,
893                                new_exit_e->src);
894
895       /* We have to add phi args to the loop->header here as coming 
896          from new_exit_e edge.  */
897       for (phi = phi_nodes (loop->header); phi; phi = PHI_CHAIN (phi))
898         {
899           phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, entry_e);
900           if (phi_arg)
901             add_phi_arg (phi, phi_arg, new_exit_e);     
902         }    
903
904       redirect_edge_and_branch_force (entry_e, new_loop->header);
905       set_immediate_dominator (CDI_DOMINATORS, new_loop->header, preheader);
906     }
907
908   free (new_bbs);
909   free (bbs);
910
911   return new_loop;
912 }
913
914
915 /* Given the condition statement COND, put it as the last statement
916    of GUARD_BB; EXIT_BB is the basic block to skip the loop;
917    Assumes that this is the single exit of the guarded loop.  
918    Returns the skip edge.  */
919
920 static edge
921 slpeel_add_loop_guard (basic_block guard_bb, tree cond, basic_block exit_bb,
922                         basic_block dom_bb)
923 {
924   block_stmt_iterator bsi;
925   edge new_e, enter_e;
926   tree cond_stmt, then_label, else_label;
927
928   enter_e = EDGE_SUCC (guard_bb, 0);
929   enter_e->flags &= ~EDGE_FALLTHRU;
930   enter_e->flags |= EDGE_FALSE_VALUE;
931   bsi = bsi_last (guard_bb);
932
933   then_label = build1 (GOTO_EXPR, void_type_node,
934                        tree_block_label (exit_bb));
935   else_label = build1 (GOTO_EXPR, void_type_node,
936                        tree_block_label (enter_e->dest));
937   cond_stmt = build3 (COND_EXPR, void_type_node, cond,
938                      then_label, else_label);
939   bsi_insert_after (&bsi, cond_stmt, BSI_NEW_STMT);
940   /* Add new edge to connect guard block to the merge/loop-exit block.  */
941   new_e = make_edge (guard_bb, exit_bb, EDGE_TRUE_VALUE);
942   set_immediate_dominator (CDI_DOMINATORS, exit_bb, dom_bb);
943   return new_e;
944 }
945
946
947 /* This function verifies that the following restrictions apply to LOOP:
948    (1) it is innermost
949    (2) it consists of exactly 2 basic blocks - header, and an empty latch.
950    (3) it is single entry, single exit
951    (4) its exit condition is the last stmt in the header
952    (5) E is the entry/exit edge of LOOP.
953  */
954
955 bool
956 slpeel_can_duplicate_loop_p (struct loop *loop, edge e)
957 {
958   edge exit_e = loop->single_exit;
959   edge entry_e = loop_preheader_edge (loop);
960   tree orig_cond = get_loop_exit_condition (loop);
961   block_stmt_iterator loop_exit_bsi = bsi_last (exit_e->src);
962
963   if (need_ssa_update_p ())
964     return false;
965
966   if (loop->inner
967       /* All loops have an outer scope; the only case loop->outer is NULL is for
968          the function itself.  */
969       || !loop->outer
970       || loop->num_nodes != 2
971       || !empty_block_p (loop->latch)
972       || !loop->single_exit
973       /* Verify that new loop exit condition can be trivially modified.  */
974       || (!orig_cond || orig_cond != bsi_stmt (loop_exit_bsi))
975       || (e != exit_e && e != entry_e))
976     return false;
977
978   return true;
979 }
980
981 #ifdef ENABLE_CHECKING
982 void
983 slpeel_verify_cfg_after_peeling (struct loop *first_loop,
984                                  struct loop *second_loop)
985 {
986   basic_block loop1_exit_bb = first_loop->single_exit->dest;
987   basic_block loop2_entry_bb = loop_preheader_edge (second_loop)->src;
988   basic_block loop1_entry_bb = loop_preheader_edge (first_loop)->src;
989
990   /* A guard that controls whether the second_loop is to be executed or skipped
991      is placed in first_loop->exit.  first_loopt->exit therefore has two
992      successors - one is the preheader of second_loop, and the other is a bb
993      after second_loop.
994    */
995   gcc_assert (EDGE_COUNT (loop1_exit_bb->succs) == 2);
996    
997   /* 1. Verify that one of the successors of first_loopt->exit is the preheader
998         of second_loop.  */
999    
1000   /* The preheader of new_loop is expected to have two predecessors:
1001      first_loop->exit and the block that precedes first_loop.  */
1002
1003   gcc_assert (EDGE_COUNT (loop2_entry_bb->preds) == 2 
1004               && ((EDGE_PRED (loop2_entry_bb, 0)->src == loop1_exit_bb
1005                    && EDGE_PRED (loop2_entry_bb, 1)->src == loop1_entry_bb)
1006                || (EDGE_PRED (loop2_entry_bb, 1)->src ==  loop1_exit_bb
1007                    && EDGE_PRED (loop2_entry_bb, 0)->src == loop1_entry_bb)));
1008   
1009   /* Verify that the other successor of first_loopt->exit is after the
1010      second_loop.  */
1011   /* TODO */
1012 }
1013 #endif
1014
1015 /* Function slpeel_tree_peel_loop_to_edge.
1016
1017    Peel the first (last) iterations of LOOP into a new prolog (epilog) loop
1018    that is placed on the entry (exit) edge E of LOOP. After this transformation
1019    we have two loops one after the other - first-loop iterates FIRST_NITERS
1020    times, and second-loop iterates the remainder NITERS - FIRST_NITERS times.
1021
1022    Input:
1023    - LOOP: the loop to be peeled.
1024    - E: the exit or entry edge of LOOP.
1025         If it is the entry edge, we peel the first iterations of LOOP. In this
1026         case first-loop is LOOP, and second-loop is the newly created loop.
1027         If it is the exit edge, we peel the last iterations of LOOP. In this
1028         case, first-loop is the newly created loop, and second-loop is LOOP.
1029    - NITERS: the number of iterations that LOOP iterates.
1030    - FIRST_NITERS: the number of iterations that the first-loop should iterate.
1031    - UPDATE_FIRST_LOOP_COUNT:  specified whether this function is responsible
1032         for updating the loop bound of the first-loop to FIRST_NITERS.  If it
1033         is false, the caller of this function may want to take care of this
1034         (this can be useful if we don't want new stmts added to first-loop).
1035
1036    Output:
1037    The function returns a pointer to the new loop-copy, or NULL if it failed
1038    to perform the transformation.
1039
1040    The function generates two if-then-else guards: one before the first loop,
1041    and the other before the second loop:
1042    The first guard is:
1043      if (FIRST_NITERS == 0) then skip the first loop,
1044      and go directly to the second loop.
1045    The second guard is:
1046      if (FIRST_NITERS == NITERS) then skip the second loop.
1047
1048    FORNOW only simple loops are supported (see slpeel_can_duplicate_loop_p).
1049    FORNOW the resulting code will not be in loop-closed-ssa form.
1050 */
1051
1052 struct loop*
1053 slpeel_tree_peel_loop_to_edge (struct loop *loop, struct loops *loops, 
1054                                edge e, tree first_niters, 
1055                                tree niters, bool update_first_loop_count)
1056 {
1057   struct loop *new_loop = NULL, *first_loop, *second_loop;
1058   edge skip_e;
1059   tree pre_condition;
1060   bitmap definitions;
1061   basic_block bb_before_second_loop, bb_after_second_loop;
1062   basic_block bb_before_first_loop;
1063   basic_block bb_between_loops;
1064   basic_block new_exit_bb;
1065   edge exit_e = loop->single_exit;
1066   LOC loop_loc;
1067   
1068   if (!slpeel_can_duplicate_loop_p (loop, e))
1069     return NULL;
1070   
1071   /* We have to initialize cfg_hooks. Then, when calling
1072    cfg_hooks->split_edge, the function tree_split_edge 
1073    is actually called and, when calling cfg_hooks->duplicate_block,
1074    the function tree_duplicate_bb is called.  */
1075   tree_register_cfg_hooks ();
1076
1077
1078   /* 1. Generate a copy of LOOP and put it on E (E is the entry/exit of LOOP).
1079         Resulting CFG would be:
1080
1081         first_loop:
1082         do {
1083         } while ...
1084
1085         second_loop:
1086         do {
1087         } while ...
1088
1089         orig_exit_bb:
1090    */
1091   
1092   if (!(new_loop = slpeel_tree_duplicate_loop_to_edge_cfg (loop, loops, e)))
1093     {
1094       loop_loc = find_loop_location (loop);
1095       if (dump_file && (dump_flags & TDF_DETAILS))
1096         {
1097           if (loop_loc != UNKNOWN_LOC)
1098             fprintf (dump_file, "\n%s:%d: note: ",
1099                      LOC_FILE (loop_loc), LOC_LINE (loop_loc));
1100           fprintf (dump_file, "tree_duplicate_loop_to_edge_cfg failed.\n");
1101         }
1102       return NULL;
1103     }
1104   
1105   if (e == exit_e)
1106     {
1107       /* NEW_LOOP was placed after LOOP.  */
1108       first_loop = loop;
1109       second_loop = new_loop;
1110     }
1111   else
1112     {
1113       /* NEW_LOOP was placed before LOOP.  */
1114       first_loop = new_loop;
1115       second_loop = loop;
1116     }
1117
1118   definitions = ssa_names_to_replace ();
1119   slpeel_update_phis_for_duplicate_loop (loop, new_loop, e == exit_e);
1120   rename_variables_in_loop (new_loop);
1121
1122
1123   /* 2. Add the guard that controls whether the first loop is executed.
1124         Resulting CFG would be:
1125
1126         bb_before_first_loop:
1127         if (FIRST_NITERS == 0) GOTO bb_before_second_loop
1128                                GOTO first-loop
1129
1130         first_loop:
1131         do {
1132         } while ...
1133
1134         bb_before_second_loop:
1135
1136         second_loop:
1137         do {
1138         } while ...
1139
1140         orig_exit_bb:
1141    */
1142
1143   bb_before_first_loop = split_edge (loop_preheader_edge (first_loop));
1144   add_bb_to_loop (bb_before_first_loop, first_loop->outer);
1145   bb_before_second_loop = split_edge (first_loop->single_exit);
1146   add_bb_to_loop (bb_before_second_loop, first_loop->outer);
1147
1148   pre_condition =
1149     fold_build2 (LE_EXPR, boolean_type_node, first_niters, 
1150                  build_int_cst (TREE_TYPE (first_niters), 0));
1151   skip_e = slpeel_add_loop_guard (bb_before_first_loop, pre_condition,
1152                                   bb_before_second_loop, bb_before_first_loop);
1153   slpeel_update_phi_nodes_for_guard1 (skip_e, first_loop,
1154                                       first_loop == new_loop,
1155                                       &new_exit_bb, &definitions);
1156
1157
1158   /* 3. Add the guard that controls whether the second loop is executed.
1159         Resulting CFG would be:
1160
1161         bb_before_first_loop:
1162         if (FIRST_NITERS == 0) GOTO bb_before_second_loop (skip first loop)
1163                                GOTO first-loop
1164
1165         first_loop:
1166         do {
1167         } while ...
1168
1169         bb_between_loops:
1170         if (FIRST_NITERS == NITERS) GOTO bb_after_second_loop (skip second loop)
1171                                     GOTO bb_before_second_loop
1172
1173         bb_before_second_loop:
1174
1175         second_loop:
1176         do {
1177         } while ...
1178
1179         bb_after_second_loop:
1180
1181         orig_exit_bb:
1182    */
1183
1184   bb_between_loops = new_exit_bb;
1185   bb_after_second_loop = split_edge (second_loop->single_exit);
1186   add_bb_to_loop (bb_after_second_loop, second_loop->outer);
1187
1188   pre_condition = 
1189         fold_build2 (EQ_EXPR, boolean_type_node, first_niters, niters);
1190   skip_e = slpeel_add_loop_guard (bb_between_loops, pre_condition,
1191                                   bb_after_second_loop, bb_before_first_loop);
1192   slpeel_update_phi_nodes_for_guard2 (skip_e, second_loop,
1193                                      second_loop == new_loop, &new_exit_bb);
1194
1195   /* 4. Make first-loop iterate FIRST_NITERS times, if requested.
1196    */
1197   if (update_first_loop_count)
1198     slpeel_make_loop_iterate_ntimes (first_loop, first_niters);
1199
1200   BITMAP_FREE (definitions);
1201   delete_update_ssa ();
1202
1203   return new_loop;
1204 }
1205
1206 /* Function vect_get_loop_location.
1207
1208    Extract the location of the loop in the source code.
1209    If the loop is not well formed for vectorization, an estimated
1210    location is calculated.
1211    Return the loop location if succeed and NULL if not.  */
1212
1213 LOC
1214 find_loop_location (struct loop *loop)
1215 {
1216   tree node = NULL_TREE;
1217   basic_block bb;
1218   block_stmt_iterator si;
1219
1220   if (!loop)
1221     return UNKNOWN_LOC;
1222
1223   node = get_loop_exit_condition (loop);
1224
1225   if (node && EXPR_P (node) && EXPR_HAS_LOCATION (node)
1226       && EXPR_FILENAME (node) && EXPR_LINENO (node))
1227     return EXPR_LOC (node);
1228
1229   /* If we got here the loop is probably not "well formed",
1230      try to estimate the loop location */
1231
1232   if (!loop->header)
1233     return UNKNOWN_LOC;
1234
1235   bb = loop->header;
1236
1237   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1238     {
1239       node = bsi_stmt (si);
1240       if (node && EXPR_P (node) && EXPR_HAS_LOCATION (node))
1241         return EXPR_LOC (node);
1242     }
1243
1244   return UNKNOWN_LOC;
1245 }
1246
1247
1248 /*************************************************************************
1249   Vectorization Debug Information.
1250  *************************************************************************/
1251
1252 /* Function vect_set_verbosity_level.
1253
1254    Called from toplev.c upon detection of the
1255    -ftree-vectorizer-verbose=N option.  */
1256
1257 void
1258 vect_set_verbosity_level (const char *val)
1259 {
1260    unsigned int vl;
1261
1262    vl = atoi (val);
1263    if (vl < MAX_VERBOSITY_LEVEL)
1264      vect_verbosity_level = vl;
1265    else
1266      vect_verbosity_level = MAX_VERBOSITY_LEVEL - 1;
1267 }
1268
1269
1270 /* Function vect_set_dump_settings.
1271
1272    Fix the verbosity level of the vectorizer if the
1273    requested level was not set explicitly using the flag
1274    -ftree-vectorizer-verbose=N.
1275    Decide where to print the debugging information (dump_file/stderr).
1276    If the user defined the verbosity level, but there is no dump file,
1277    print to stderr, otherwise print to the dump file.  */
1278
1279 static void
1280 vect_set_dump_settings (void)
1281 {
1282   vect_dump = dump_file;
1283
1284   /* Check if the verbosity level was defined by the user:  */
1285   if (vect_verbosity_level != MAX_VERBOSITY_LEVEL)
1286     {
1287       /* If there is no dump file, print to stderr.  */
1288       if (!dump_file)
1289         vect_dump = stderr;
1290       return;
1291     }
1292
1293   /* User didn't specify verbosity level:  */
1294   if (dump_file && (dump_flags & TDF_DETAILS))
1295     vect_verbosity_level = REPORT_DETAILS;
1296   else if (dump_file && (dump_flags & TDF_STATS))
1297     vect_verbosity_level = REPORT_UNVECTORIZED_LOOPS;
1298   else
1299     vect_verbosity_level = REPORT_NONE;
1300
1301   gcc_assert (dump_file || vect_verbosity_level == REPORT_NONE);
1302 }
1303
1304
1305 /* Function debug_loop_details.
1306
1307    For vectorization debug dumps.  */
1308
1309 bool
1310 vect_print_dump_info (enum verbosity_levels vl)
1311 {
1312   if (vl > vect_verbosity_level)
1313     return false;
1314
1315   if (vect_loop_location == UNKNOWN_LOC)
1316     fprintf (vect_dump, "\n%s:%d: note: ",
1317                  DECL_SOURCE_FILE (current_function_decl),
1318                  DECL_SOURCE_LINE (current_function_decl));
1319   else
1320     fprintf (vect_dump, "\n%s:%d: note: ", 
1321              LOC_FILE (vect_loop_location), LOC_LINE (vect_loop_location));
1322
1323
1324   return true;
1325 }
1326
1327
1328 /*************************************************************************
1329   Vectorization Utilities.
1330  *************************************************************************/
1331
1332 /* Function new_stmt_vec_info.
1333
1334    Create and initialize a new stmt_vec_info struct for STMT.  */
1335
1336 stmt_vec_info
1337 new_stmt_vec_info (tree stmt, loop_vec_info loop_vinfo)
1338 {
1339   stmt_vec_info res;
1340   res = (stmt_vec_info) xcalloc (1, sizeof (struct _stmt_vec_info));
1341
1342   STMT_VINFO_TYPE (res) = undef_vec_info_type;
1343   STMT_VINFO_STMT (res) = stmt;
1344   STMT_VINFO_LOOP_VINFO (res) = loop_vinfo;
1345   STMT_VINFO_RELEVANT_P (res) = 0;
1346   STMT_VINFO_LIVE_P (res) = 0;
1347   STMT_VINFO_VECTYPE (res) = NULL;
1348   STMT_VINFO_VEC_STMT (res) = NULL;
1349   STMT_VINFO_DATA_REF (res) = NULL;
1350   if (TREE_CODE (stmt) == PHI_NODE)
1351     STMT_VINFO_DEF_TYPE (res) = vect_unknown_def_type;
1352   else
1353     STMT_VINFO_DEF_TYPE (res) = vect_loop_def;
1354   STMT_VINFO_SAME_ALIGN_REFS (res) = VEC_alloc (dr_p, heap, 5);
1355
1356   return res;
1357 }
1358
1359
1360 /* Function new_loop_vec_info.
1361
1362    Create and initialize a new loop_vec_info struct for LOOP, as well as
1363    stmt_vec_info structs for all the stmts in LOOP.  */
1364
1365 loop_vec_info
1366 new_loop_vec_info (struct loop *loop)
1367 {
1368   loop_vec_info res;
1369   basic_block *bbs;
1370   block_stmt_iterator si;
1371   unsigned int i;
1372
1373   res = (loop_vec_info) xcalloc (1, sizeof (struct _loop_vec_info));
1374
1375   bbs = get_loop_body (loop);
1376
1377   /* Create stmt_info for all stmts in the loop.  */
1378   for (i = 0; i < loop->num_nodes; i++)
1379     {
1380       basic_block bb = bbs[i];
1381       tree phi;
1382
1383       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1384         {
1385           tree_ann_t ann = get_tree_ann (phi);
1386           set_stmt_info (ann, new_stmt_vec_info (phi, res));
1387         }
1388
1389       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1390         {
1391           tree stmt = bsi_stmt (si);
1392           stmt_ann_t ann;
1393
1394           ann = stmt_ann (stmt);
1395           set_stmt_info ((tree_ann_t)ann, new_stmt_vec_info (stmt, res));
1396         }
1397     }
1398
1399   LOOP_VINFO_LOOP (res) = loop;
1400   LOOP_VINFO_BBS (res) = bbs;
1401   LOOP_VINFO_EXIT_COND (res) = NULL;
1402   LOOP_VINFO_NITERS (res) = NULL;
1403   LOOP_VINFO_VECTORIZABLE_P (res) = 0;
1404   LOOP_PEELING_FOR_ALIGNMENT (res) = 0;
1405   LOOP_VINFO_VECT_FACTOR (res) = 0;
1406   VARRAY_GENERIC_PTR_INIT (LOOP_VINFO_DATAREFS (res), 20, "loop_datarefs");
1407   VARRAY_GENERIC_PTR_INIT (LOOP_VINFO_DDRS (res), 20, "loop_ddrs");
1408   LOOP_VINFO_UNALIGNED_DR (res) = NULL;
1409
1410   return res;
1411 }
1412
1413
1414 /* Function destroy_loop_vec_info.
1415  
1416    Free LOOP_VINFO struct, as well as all the stmt_vec_info structs of all the 
1417    stmts in the loop.  */
1418
1419 void
1420 destroy_loop_vec_info (loop_vec_info loop_vinfo)
1421 {
1422   struct loop *loop;
1423   basic_block *bbs;
1424   int nbbs;
1425   block_stmt_iterator si;
1426   int j;
1427
1428   if (!loop_vinfo)
1429     return;
1430
1431   loop = LOOP_VINFO_LOOP (loop_vinfo);
1432
1433   bbs = LOOP_VINFO_BBS (loop_vinfo);
1434   nbbs = loop->num_nodes;
1435
1436   for (j = 0; j < nbbs; j++)
1437     {
1438       basic_block bb = bbs[j];
1439       tree phi;
1440       stmt_vec_info stmt_info;
1441
1442       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1443         {
1444           tree_ann_t ann = get_tree_ann (phi);
1445
1446           stmt_info = vinfo_for_stmt (phi);
1447           free (stmt_info);
1448           set_stmt_info (ann, NULL);
1449         }
1450
1451       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1452         {
1453           tree stmt = bsi_stmt (si);
1454           stmt_ann_t ann = stmt_ann (stmt);
1455           stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1456
1457           if (stmt_info)
1458             {
1459               VEC_free (dr_p, heap, STMT_VINFO_SAME_ALIGN_REFS (stmt_info));
1460               free (stmt_info);
1461               set_stmt_info ((tree_ann_t)ann, NULL);
1462             }
1463         }
1464     }
1465
1466   free (LOOP_VINFO_BBS (loop_vinfo));
1467   varray_clear (LOOP_VINFO_DATAREFS (loop_vinfo));
1468   varray_clear (LOOP_VINFO_DDRS (loop_vinfo));
1469
1470   free (loop_vinfo);
1471 }
1472
1473
1474 /* Function vect_force_dr_alignment_p.
1475
1476    Returns whether the alignment of a DECL can be forced to be aligned
1477    on ALIGNMENT bit boundary.  */
1478
1479 bool 
1480 vect_can_force_dr_alignment_p (tree decl, unsigned int alignment)
1481 {
1482   if (TREE_CODE (decl) != VAR_DECL)
1483     return false;
1484
1485   if (DECL_EXTERNAL (decl))
1486     return false;
1487
1488   if (TREE_ASM_WRITTEN (decl))
1489     return false;
1490
1491   if (TREE_STATIC (decl))
1492     return (alignment <= MAX_OFILE_ALIGNMENT);
1493   else
1494     /* This is not 100% correct.  The absolute correct stack alignment
1495        is STACK_BOUNDARY.  We're supposed to hope, but not assume, that
1496        PREFERRED_STACK_BOUNDARY is honored by all translation units.
1497        However, until someone implements forced stack alignment, SSE
1498        isn't really usable without this.  */  
1499     return (alignment <= PREFERRED_STACK_BOUNDARY); 
1500 }
1501
1502
1503 /* Function get_vectype_for_scalar_type.
1504
1505    Returns the vector type corresponding to SCALAR_TYPE as supported
1506    by the target.  */
1507
1508 tree
1509 get_vectype_for_scalar_type (tree scalar_type)
1510 {
1511   enum machine_mode inner_mode = TYPE_MODE (scalar_type);
1512   int nbytes = GET_MODE_SIZE (inner_mode);
1513   int nunits;
1514   tree vectype;
1515
1516   if (nbytes == 0 || nbytes >= UNITS_PER_SIMD_WORD)
1517     return NULL_TREE;
1518
1519   /* FORNOW: Only a single vector size per target (UNITS_PER_SIMD_WORD)
1520      is expected.  */
1521   nunits = UNITS_PER_SIMD_WORD / nbytes;
1522
1523   vectype = build_vector_type (scalar_type, nunits);
1524   if (vect_print_dump_info (REPORT_DETAILS))
1525     {
1526       fprintf (vect_dump, "get vectype with %d units of type ", nunits);
1527       print_generic_expr (vect_dump, scalar_type, TDF_SLIM);
1528     }
1529
1530   if (!vectype)
1531     return NULL_TREE;
1532
1533   if (vect_print_dump_info (REPORT_DETAILS))
1534     {
1535       fprintf (vect_dump, "vectype: ");
1536       print_generic_expr (vect_dump, vectype, TDF_SLIM);
1537     }
1538
1539   if (!VECTOR_MODE_P (TYPE_MODE (vectype))
1540       && !INTEGRAL_MODE_P (TYPE_MODE (vectype)))
1541     {
1542       if (vect_print_dump_info (REPORT_DETAILS))
1543         fprintf (vect_dump, "mode not supported by target.");
1544       return NULL_TREE;
1545     }
1546
1547   return vectype;
1548 }
1549
1550
1551 /* Function vect_supportable_dr_alignment
1552
1553    Return whether the data reference DR is supported with respect to its
1554    alignment.  */
1555
1556 enum dr_alignment_support
1557 vect_supportable_dr_alignment (struct data_reference *dr)
1558 {
1559   tree vectype = STMT_VINFO_VECTYPE (vinfo_for_stmt (DR_STMT (dr)));
1560   enum machine_mode mode = (int) TYPE_MODE (vectype);
1561
1562   if (aligned_access_p (dr))
1563     return dr_aligned;
1564
1565   /* Possibly unaligned access.  */
1566   
1567   if (DR_IS_READ (dr))
1568     {
1569       if (vec_realign_load_optab->handlers[mode].insn_code != CODE_FOR_nothing
1570           && (!targetm.vectorize.builtin_mask_for_load
1571               || targetm.vectorize.builtin_mask_for_load ()))
1572         return dr_unaligned_software_pipeline;
1573
1574       if (movmisalign_optab->handlers[mode].insn_code != CODE_FOR_nothing)
1575         /* Can't software pipeline the loads, but can at least do them.  */
1576         return dr_unaligned_supported;
1577     }
1578
1579   /* Unsupported.  */
1580   return dr_unaligned_unsupported;
1581 }
1582
1583
1584 /* Function vect_is_simple_use.
1585
1586    Input:
1587    LOOP - the loop that is being vectorized.
1588    OPERAND - operand of a stmt in LOOP.
1589    DEF - the defining stmt in case OPERAND is an SSA_NAME.
1590
1591    Returns whether a stmt with OPERAND can be vectorized.
1592    Supportable operands are constants, loop invariants, and operands that are
1593    defined by the current iteration of the loop. Unsupportable operands are 
1594    those that are defined by a previous iteration of the loop (as is the case
1595    in reduction/induction computations).  */
1596
1597 bool
1598 vect_is_simple_use (tree operand, loop_vec_info loop_vinfo, tree *def_stmt,
1599                     tree *def, enum vect_def_type *dt)
1600
1601   basic_block bb;
1602   stmt_vec_info stmt_vinfo;
1603   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
1604
1605   *def_stmt = NULL_TREE;
1606   *def = NULL_TREE;
1607   
1608   if (vect_print_dump_info (REPORT_DETAILS))
1609     {
1610       fprintf (vect_dump, "vect_is_simple_use: operand ");
1611       print_generic_expr (vect_dump, operand, TDF_SLIM);
1612     }
1613     
1614   if (TREE_CODE (operand) == INTEGER_CST || TREE_CODE (operand) == REAL_CST)
1615     {
1616       *dt = vect_constant_def;
1617       return true;
1618     }
1619     
1620   if (TREE_CODE (operand) != SSA_NAME)
1621     {
1622       if (vect_print_dump_info (REPORT_DETAILS))
1623         fprintf (vect_dump, "not ssa-name.");
1624       return false;
1625     }
1626     
1627   *def_stmt = SSA_NAME_DEF_STMT (operand);
1628   if (*def_stmt == NULL_TREE )
1629     {
1630       if (vect_print_dump_info (REPORT_DETAILS))
1631         fprintf (vect_dump, "no def_stmt.");
1632       return false;
1633     }
1634
1635   if (vect_print_dump_info (REPORT_DETAILS))
1636     {
1637       fprintf (vect_dump, "def_stmt: ");
1638       print_generic_expr (vect_dump, *def_stmt, TDF_SLIM);
1639     }
1640
1641   /* empty stmt is expected only in case of a function argument.
1642      (Otherwise - we expect a phi_node or a modify_expr).  */
1643   if (IS_EMPTY_STMT (*def_stmt))
1644     {
1645       tree arg = TREE_OPERAND (*def_stmt, 0);
1646       if (TREE_CODE (arg) == INTEGER_CST || TREE_CODE (arg) == REAL_CST)
1647         {
1648           *def = operand;
1649           *dt = vect_invariant_def;
1650           return true;
1651         }
1652
1653       if (vect_print_dump_info (REPORT_DETAILS))
1654         fprintf (vect_dump, "Unexpected empty stmt.");
1655       return false;
1656     }
1657
1658   bb = bb_for_stmt (*def_stmt);
1659   if (!flow_bb_inside_loop_p (loop, bb))
1660     *dt = vect_invariant_def;
1661   else
1662     {
1663       stmt_vinfo = vinfo_for_stmt (*def_stmt);
1664       *dt = STMT_VINFO_DEF_TYPE (stmt_vinfo);
1665     }
1666
1667   if (*dt == vect_unknown_def_type)
1668     {
1669       if (vect_print_dump_info (REPORT_DETAILS))
1670         fprintf (vect_dump, "Unsupported pattern.");
1671       return false;
1672     }
1673
1674   /* stmts inside the loop that have been identified as performing
1675      a reduction operation cannot have uses in the loop.  */
1676   if (*dt == vect_reduction_def && TREE_CODE (*def_stmt) != PHI_NODE)
1677     {
1678       if (vect_print_dump_info (REPORT_DETAILS))
1679         fprintf (vect_dump, "reduction used in loop.");
1680       return false;
1681     }
1682
1683   if (vect_print_dump_info (REPORT_DETAILS))
1684     fprintf (vect_dump, "type of def: %d.",*dt);
1685
1686   switch (TREE_CODE (*def_stmt))
1687     {
1688     case PHI_NODE:
1689       *def = PHI_RESULT (*def_stmt);
1690       gcc_assert (*dt == vect_induction_def || *dt == vect_reduction_def
1691                   || *dt == vect_invariant_def);
1692       break;
1693
1694     case MODIFY_EXPR:
1695       *def = TREE_OPERAND (*def_stmt, 0);
1696       gcc_assert (*dt == vect_loop_def || *dt == vect_invariant_def);
1697       break;
1698
1699     default:
1700       if (vect_print_dump_info (REPORT_DETAILS))
1701         fprintf (vect_dump, "unsupported defining stmt: ");
1702       return false;
1703     }
1704
1705   if (*dt == vect_induction_def)
1706     {
1707       if (vect_print_dump_info (REPORT_DETAILS))
1708         fprintf (vect_dump, "induction not supported.");
1709       return false;
1710     }
1711
1712   return true;
1713 }
1714
1715
1716 /* Function reduction_code_for_scalar_code
1717
1718    Input:
1719    CODE - tree_code of a reduction operations.
1720
1721    Output:
1722    REDUC_CODE - the corresponding tree-code to be used to reduce the
1723       vector of partial results into a single scalar result (which
1724       will also reside in a vector).
1725
1726    Return TRUE if a corresponding REDUC_CODE was found, FALSE otherwise.  */
1727
1728 bool
1729 reduction_code_for_scalar_code (enum tree_code code,
1730                                 enum tree_code *reduc_code)
1731 {
1732   switch (code)
1733   {
1734   case MAX_EXPR:
1735     *reduc_code = REDUC_MAX_EXPR;
1736     return true;
1737
1738   case MIN_EXPR:
1739     *reduc_code = REDUC_MIN_EXPR;
1740     return true;
1741
1742   case PLUS_EXPR:
1743     *reduc_code = REDUC_PLUS_EXPR;
1744     return true;
1745
1746   default:
1747     return false;
1748   }
1749 }
1750
1751
1752 /* Function vect_is_simple_reduction
1753
1754    Detect a cross-iteration def-use cucle that represents a simple
1755    reduction computation. We look for the following pattern:
1756
1757    loop_header:
1758      a1 = phi < a0, a2 >
1759      a3 = ...
1760      a2 = operation (a3, a1)
1761   
1762    such that:
1763    1. operation is commutative and associative and it is safe to 
1764       change the order of the computation.
1765    2. no uses for a2 in the loop (a2 is used out of the loop)
1766    3. no uses of a1 in the loop besides the reduction operation.
1767
1768    Condition 1 is tested here.
1769    Conditions 2,3 are tested in vect_mark_stmts_to_be_vectorized.  */
1770
1771 tree
1772 vect_is_simple_reduction (struct loop *loop ATTRIBUTE_UNUSED, 
1773                           tree phi ATTRIBUTE_UNUSED)
1774 {
1775   edge latch_e = loop_latch_edge (loop);
1776   tree loop_arg = PHI_ARG_DEF_FROM_EDGE (phi, latch_e);
1777   tree def_stmt, def1, def2;
1778   enum tree_code code;
1779   int op_type;
1780   tree operation, op1, op2;
1781   tree type;
1782
1783   if (TREE_CODE (loop_arg) != SSA_NAME)
1784     {
1785       if (vect_print_dump_info (REPORT_DETAILS))
1786         {
1787           fprintf (vect_dump, "reduction: not ssa_name: ");
1788           print_generic_expr (vect_dump, loop_arg, TDF_SLIM);
1789         }
1790       return NULL_TREE;
1791     }
1792
1793   def_stmt = SSA_NAME_DEF_STMT (loop_arg);
1794   if (!def_stmt)
1795     {
1796       if (vect_print_dump_info (REPORT_DETAILS))
1797         fprintf (vect_dump, "reduction: no def_stmt.");
1798       return NULL_TREE;
1799     }
1800
1801   if (TREE_CODE (def_stmt) != MODIFY_EXPR)
1802     {
1803       if (vect_print_dump_info (REPORT_DETAILS))
1804         {
1805           print_generic_expr (vect_dump, def_stmt, TDF_SLIM);
1806         }
1807       return NULL_TREE;
1808     }
1809
1810   operation = TREE_OPERAND (def_stmt, 1);
1811   code = TREE_CODE (operation);
1812   if (!commutative_tree_code (code) || !associative_tree_code (code))
1813     {
1814       if (vect_print_dump_info (REPORT_DETAILS))
1815         {
1816           fprintf (vect_dump, "reduction: not commutative/associative: ");
1817           print_generic_expr (vect_dump, operation, TDF_SLIM);
1818         }
1819       return NULL_TREE;
1820     }
1821
1822   op_type = TREE_CODE_LENGTH (code);
1823   if (op_type != binary_op)
1824     {
1825       if (vect_print_dump_info (REPORT_DETAILS))
1826         {
1827           fprintf (vect_dump, "reduction: not binary operation: ");
1828           print_generic_expr (vect_dump, operation, TDF_SLIM);
1829         }
1830       return NULL_TREE;
1831     }
1832
1833   op1 = TREE_OPERAND (operation, 0);
1834   op2 = TREE_OPERAND (operation, 1);
1835   if (TREE_CODE (op1) != SSA_NAME || TREE_CODE (op2) != SSA_NAME)
1836     {
1837       if (vect_print_dump_info (REPORT_DETAILS))
1838         {
1839           fprintf (vect_dump, "reduction: uses not ssa_names: ");
1840           print_generic_expr (vect_dump, operation, TDF_SLIM);
1841         }
1842       return NULL_TREE;
1843     }
1844
1845   /* Check that it's ok to change the order of the computation.  */
1846   type = TREE_TYPE (operation);
1847   if (TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (TREE_TYPE (op1))
1848       || TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (TREE_TYPE (op2)))
1849     {
1850       if (vect_print_dump_info (REPORT_DETAILS))
1851         {
1852           fprintf (vect_dump, "reduction: multiple types: operation type: ");
1853           print_generic_expr (vect_dump, type, TDF_SLIM);
1854           fprintf (vect_dump, ", operands types: ");
1855           print_generic_expr (vect_dump, TREE_TYPE (op1), TDF_SLIM);
1856           fprintf (vect_dump, ",");
1857           print_generic_expr (vect_dump, TREE_TYPE (op2), TDF_SLIM);
1858         }
1859       return NULL_TREE;
1860     }
1861
1862   /* CHECKME: check for !flag_finite_math_only too?  */
1863   if (SCALAR_FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
1864     {
1865       /* Changing the order of operations changes the sematics.  */
1866       if (vect_print_dump_info (REPORT_DETAILS))
1867         {
1868           fprintf (vect_dump, "reduction: unsafe fp math optimization: ");
1869           print_generic_expr (vect_dump, operation, TDF_SLIM);
1870         }
1871       return NULL_TREE;
1872     }
1873   else if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type) && flag_trapv)
1874     {
1875       /* Changing the order of operations changes the sematics.  */
1876       if (vect_print_dump_info (REPORT_DETAILS))
1877         {
1878           fprintf (vect_dump, "reduction: unsafe int math optimization: ");
1879           print_generic_expr (vect_dump, operation, TDF_SLIM);
1880         }
1881       return NULL_TREE;
1882     }
1883
1884   /* reduction is safe. we're dealing with one of the following:
1885      1) integer arithmetic and no trapv
1886      2) floating point arithmetic, and special flags permit this optimization.
1887    */
1888   def1 = SSA_NAME_DEF_STMT (op1);
1889   def2 = SSA_NAME_DEF_STMT (op2);
1890   if (!def1 || !def2)
1891     {
1892       if (vect_print_dump_info (REPORT_DETAILS))
1893         {
1894           fprintf (vect_dump, "reduction: no defs for operands: ");
1895           print_generic_expr (vect_dump, operation, TDF_SLIM);
1896         }
1897       return NULL_TREE;
1898     }
1899
1900   if (TREE_CODE (def1) == MODIFY_EXPR
1901       && flow_bb_inside_loop_p (loop, bb_for_stmt (def1))
1902       && def2 == phi)
1903     {
1904       if (vect_print_dump_info (REPORT_DETAILS))
1905         {
1906           fprintf (vect_dump, "detected reduction:");
1907           print_generic_expr (vect_dump, operation, TDF_SLIM);
1908         }
1909       return def_stmt;
1910     }
1911   else if (TREE_CODE (def2) == MODIFY_EXPR
1912       && flow_bb_inside_loop_p (loop, bb_for_stmt (def2))
1913       && def1 == phi)
1914     {
1915       use_operand_p use;
1916       ssa_op_iter iter;
1917
1918       /* Swap operands (just for simplicity - so that the rest of the code
1919          can assume that the reduction variable is always the last (second)
1920          argument).  */
1921       if (vect_print_dump_info (REPORT_DETAILS))
1922         {
1923           fprintf (vect_dump, "detected reduction: need to swap operands:");
1924           print_generic_expr (vect_dump, operation, TDF_SLIM);
1925         }
1926
1927       /* CHECKME */
1928       FOR_EACH_SSA_USE_OPERAND (use, def_stmt, iter, SSA_OP_USE)
1929         {
1930           tree tuse = USE_FROM_PTR (use);
1931           if (tuse == op1)
1932             SET_USE (use, op2);
1933           else if (tuse == op2)
1934             SET_USE (use, op1);
1935         }
1936       return def_stmt;
1937     }
1938   else
1939     {
1940       if (vect_print_dump_info (REPORT_DETAILS))
1941         {
1942           fprintf (vect_dump, "reduction: unknown pattern.");
1943           print_generic_expr (vect_dump, operation, TDF_SLIM);
1944         }
1945       return NULL_TREE;
1946     }
1947 }
1948
1949
1950 /* Function vect_is_simple_iv_evolution.
1951
1952    FORNOW: A simple evolution of an induction variables in the loop is
1953    considered a polynomial evolution with constant step.  */
1954
1955 bool
1956 vect_is_simple_iv_evolution (unsigned loop_nb, tree access_fn, tree * init, 
1957                              tree * step)
1958 {
1959   tree init_expr;
1960   tree step_expr;
1961   
1962   tree evolution_part = evolution_part_in_loop_num (access_fn, loop_nb);
1963
1964   /* When there is no evolution in this loop, the evolution function
1965      is not "simple".  */  
1966   if (evolution_part == NULL_TREE)
1967     return false;
1968   
1969   /* When the evolution is a polynomial of degree >= 2
1970      the evolution function is not "simple".  */
1971   if (tree_is_chrec (evolution_part))
1972     return false;
1973   
1974   step_expr = evolution_part;
1975   init_expr = unshare_expr (initial_condition_in_loop_num (access_fn,
1976                                                            loop_nb));
1977
1978   if (vect_print_dump_info (REPORT_DETAILS))
1979     {
1980       fprintf (vect_dump, "step: ");
1981       print_generic_expr (vect_dump, step_expr, TDF_SLIM);
1982       fprintf (vect_dump, ",  init: ");
1983       print_generic_expr (vect_dump, init_expr, TDF_SLIM);
1984     }
1985
1986   *init = init_expr;
1987   *step = step_expr;
1988
1989   if (TREE_CODE (step_expr) != INTEGER_CST)
1990     {
1991       if (vect_print_dump_info (REPORT_DETAILS))
1992         fprintf (vect_dump, "step unknown.");
1993       return false;
1994     }
1995
1996   return true;
1997 }
1998
1999
2000 /* Function vectorize_loops.
2001    
2002    Entry Point to loop vectorization phase.  */
2003
2004 void
2005 vectorize_loops (struct loops *loops)
2006 {
2007   unsigned int i;
2008   unsigned int num_vectorized_loops = 0;
2009
2010   /* Fix the verbosity level if not defined explicitly by the user.  */
2011   vect_set_dump_settings ();
2012
2013   /*  ----------- Analyze loops. -----------  */
2014
2015   /* If some loop was duplicated, it gets bigger number 
2016      than all previously defined loops. This fact allows us to run 
2017      only over initial loops skipping newly generated ones.  */
2018   vect_loops_num = loops->num;
2019   for (i = 1; i < vect_loops_num; i++)
2020     {
2021       loop_vec_info loop_vinfo;
2022       struct loop *loop = loops->parray[i];
2023
2024       if (!loop)
2025         continue;
2026
2027       vect_loop_location = find_loop_location (loop);
2028       loop_vinfo = vect_analyze_loop (loop);
2029       loop->aux = loop_vinfo;
2030
2031       if (!loop_vinfo || !LOOP_VINFO_VECTORIZABLE_P (loop_vinfo))
2032         continue;
2033
2034       vect_transform_loop (loop_vinfo, loops); 
2035       num_vectorized_loops++;
2036     }
2037
2038   if (vect_print_dump_info (REPORT_VECTORIZED_LOOPS))
2039     fprintf (vect_dump, "vectorized %u loops in function.\n",
2040              num_vectorized_loops);
2041
2042   /*  ----------- Finalize. -----------  */
2043
2044   for (i = 1; i < vect_loops_num; i++)
2045     {
2046       struct loop *loop = loops->parray[i];
2047       loop_vec_info loop_vinfo;
2048
2049       if (!loop)
2050         continue;
2051       loop_vinfo = loop->aux;
2052       destroy_loop_vec_info (loop_vinfo);
2053       loop->aux = NULL;
2054     }
2055 }