OSDN Git Service

2005-07-21 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 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       orig_def_new_name = get_current_def (orig_def);
644       arg = NULL_TREE;
645
646       /** 1. Handle new-merge-point phis  **/
647
648       /* 1.1. Generate new phi node in NEW_MERGE_BB:  */
649       new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (orig_phi)),
650                                  new_merge_bb);
651
652       /* 1.2. NEW_MERGE_BB has two incoming edges: GUARD_EDGE and the exit-edge
653             of LOOP. Set the two PHI args in NEW_PHI for these edges:  */
654       new_name = orig_def;
655       new_name2 = NULL_TREE;
656       if (orig_def_new_name)
657         {
658           new_name = orig_def_new_name;
659           /* Some variables have both loop-entry-phis and loop-exit-phis.
660              Such variables were given yet newer names by phis placed in
661              guard_bb by slpeel_update_phi_nodes_for_guard1. I.e:
662              new_name2 = get_current_def (get_current_def (orig_name)).  */
663           new_name2 = get_current_def (new_name);
664         }
665   
666       if (is_new_loop)
667         {
668           guard_arg = orig_def;
669           loop_arg = new_name;
670         }
671       else
672         {
673           guard_arg = new_name;
674           loop_arg = orig_def;
675         }
676       if (new_name2)
677         guard_arg = new_name2;
678   
679       add_phi_arg (new_phi, loop_arg, new_exit_e);
680       add_phi_arg (new_phi, guard_arg, guard_edge);
681
682       /* 1.3. Update phi in successor block.  */
683       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi, e) == orig_def);
684       SET_PHI_ARG_DEF (update_phi, e->dest_idx, PHI_RESULT (new_phi));
685       update_phi2 = new_phi;
686
687
688       /** 2. Handle loop-closed-ssa-form phis  **/
689
690       /* 2.1. Generate new phi node in NEW_EXIT_BB:  */
691       new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (orig_phi)),
692                                  *new_exit_bb);
693
694       /* 2.2. NEW_EXIT_BB has one incoming edge: the exit-edge of the loop.  */
695       add_phi_arg (new_phi, loop_arg, loop->single_exit);
696
697       /* 2.3. Update phi in successor of NEW_EXIT_BB:  */
698       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, new_exit_e) == loop_arg);
699       SET_PHI_ARG_DEF (update_phi2, new_exit_e->dest_idx, PHI_RESULT (new_phi));
700
701
702       /** 3. Handle loop-closed-ssa-form phis for first loop  **/
703
704       /* 3.1. Find the relevant names that need an exit-phi in
705          GUARD_BB, i.e. names for which
706          slpeel_update_phi_nodes_for_guard1 had not already created a
707          phi node. This is the case for names that are used outside
708          the loop (and therefore need an exit phi) but are not updated
709          across loop iterations (and therefore don't have a
710          loop-header-phi).
711
712          slpeel_update_phi_nodes_for_guard1 is responsible for
713          creating loop-exit phis in GUARD_BB for names that have a
714          loop-header-phi.  When such a phi is created we also record
715          the new name in its current definition.  If this new name
716          exists, then guard_arg was set to this new name (see 1.2
717          above).  Therefore, if guard_arg is not this new name, this
718          is an indication that an exit-phi in GUARD_BB was not yet
719          created, so we take care of it here.  */
720       if (guard_arg == new_name2)
721         continue;
722       arg = guard_arg;
723
724       /* 3.2. Generate new phi node in GUARD_BB:  */
725       new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (orig_phi)),
726                                  guard_edge->src);
727
728       /* 3.3. GUARD_BB has one incoming edge:  */
729       gcc_assert (EDGE_COUNT (guard_edge->src->preds) == 1);
730       add_phi_arg (new_phi, arg, EDGE_PRED (guard_edge->src, 0));
731
732       /* 3.4. Update phi in successor of GUARD_BB:  */
733       gcc_assert (PHI_ARG_DEF_FROM_EDGE (update_phi2, guard_edge)
734                                                                 == guard_arg);
735       SET_PHI_ARG_DEF (update_phi2, guard_edge->dest_idx, PHI_RESULT (new_phi));
736     }
737
738   set_phi_nodes (new_merge_bb, phi_reverse (phi_nodes (new_merge_bb)));
739 }
740
741
742 /* Make the LOOP iterate NITERS times. This is done by adding a new IV
743    that starts at zero, increases by one and its limit is NITERS.
744
745    Assumption: the exit-condition of LOOP is the last stmt in the loop.  */
746
747 void
748 slpeel_make_loop_iterate_ntimes (struct loop *loop, tree niters)
749 {
750   tree indx_before_incr, indx_after_incr, cond_stmt, cond;
751   tree orig_cond;
752   edge exit_edge = loop->single_exit;
753   block_stmt_iterator loop_cond_bsi;
754   block_stmt_iterator incr_bsi;
755   bool insert_after;
756   tree begin_label = tree_block_label (loop->latch);
757   tree exit_label = tree_block_label (loop->single_exit->dest);
758   tree init = build_int_cst (TREE_TYPE (niters), 0);
759   tree step = build_int_cst (TREE_TYPE (niters), 1);
760   tree then_label;
761   tree else_label;
762   LOC loop_loc;
763
764   orig_cond = get_loop_exit_condition (loop);
765   gcc_assert (orig_cond);
766   loop_cond_bsi = bsi_for_stmt (orig_cond);
767
768   standard_iv_increment_position (loop, &incr_bsi, &insert_after);
769   create_iv (init, step, NULL_TREE, loop,
770              &incr_bsi, insert_after, &indx_before_incr, &indx_after_incr);
771
772   if (exit_edge->flags & EDGE_TRUE_VALUE) /* 'then' edge exits the loop.  */
773     {
774       cond = build2 (GE_EXPR, boolean_type_node, indx_after_incr, niters);
775       then_label = build1 (GOTO_EXPR, void_type_node, exit_label);
776       else_label = build1 (GOTO_EXPR, void_type_node, begin_label);
777     }
778   else /* 'then' edge loops back.  */
779     {
780       cond = build2 (LT_EXPR, boolean_type_node, indx_after_incr, niters);
781       then_label = build1 (GOTO_EXPR, void_type_node, begin_label);
782       else_label = build1 (GOTO_EXPR, void_type_node, exit_label);
783     }
784
785   cond_stmt = build3 (COND_EXPR, TREE_TYPE (orig_cond), cond,
786                      then_label, else_label);
787   bsi_insert_before (&loop_cond_bsi, cond_stmt, BSI_SAME_STMT);
788
789   /* Remove old loop exit test:  */
790   bsi_remove (&loop_cond_bsi);
791
792   loop_loc = find_loop_location (loop);
793   if (dump_file && (dump_flags & TDF_DETAILS))
794     {
795       if (loop_loc != UNKNOWN_LOC)
796         fprintf (dump_file, "\nloop at %s:%d: ",
797                  LOC_FILE (loop_loc), LOC_LINE (loop_loc));
798       print_generic_expr (dump_file, cond_stmt, TDF_SLIM);
799     }
800
801   loop->nb_iterations = niters;
802 }
803
804
805 /* Given LOOP this function generates a new copy of it and puts it 
806    on E which is either the entry or exit of LOOP.  */
807
808 static struct loop *
809 slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop, struct loops *loops, 
810                                         edge e)
811 {
812   struct loop *new_loop;
813   basic_block *new_bbs, *bbs;
814   bool at_exit;
815   bool was_imm_dom;
816   basic_block exit_dest; 
817   tree phi, phi_arg;
818
819   at_exit = (e == loop->single_exit); 
820   if (!at_exit && e != loop_preheader_edge (loop))
821     return NULL;
822
823   bbs = get_loop_body (loop);
824
825   /* Check whether duplication is possible.  */
826   if (!can_copy_bbs_p (bbs, loop->num_nodes))
827     {
828       free (bbs);
829       return NULL;
830     }
831
832   /* Generate new loop structure.  */
833   new_loop = duplicate_loop (loops, loop, loop->outer);
834   if (!new_loop)
835     {
836       free (bbs);
837       return NULL;
838     }
839
840   exit_dest = loop->single_exit->dest;
841   was_imm_dom = (get_immediate_dominator (CDI_DOMINATORS, 
842                                           exit_dest) == loop->header ? 
843                  true : false);
844
845   new_bbs = xmalloc (sizeof (basic_block) * loop->num_nodes);
846
847   copy_bbs (bbs, loop->num_nodes, new_bbs,
848             &loop->single_exit, 1, &new_loop->single_exit, NULL);
849
850   /* Duplicating phi args at exit bbs as coming 
851      also from exit of duplicated loop.  */
852   for (phi = phi_nodes (exit_dest); phi; phi = PHI_CHAIN (phi))
853     {
854       phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, loop->single_exit);
855       if (phi_arg)
856         {
857           edge new_loop_exit_edge;
858
859           if (EDGE_SUCC (new_loop->header, 0)->dest == new_loop->latch)
860             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 1);
861           else
862             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 0);
863   
864           add_phi_arg (phi, phi_arg, new_loop_exit_edge);       
865         }
866     }    
867    
868   if (at_exit) /* Add the loop copy at exit.  */
869     {
870       redirect_edge_and_branch_force (e, new_loop->header);
871       set_immediate_dominator (CDI_DOMINATORS, new_loop->header, e->src);
872       if (was_imm_dom)
873         set_immediate_dominator (CDI_DOMINATORS, exit_dest, new_loop->header);
874     }
875   else /* Add the copy at entry.  */
876     {
877       edge new_exit_e;
878       edge entry_e = loop_preheader_edge (loop);
879       basic_block preheader = entry_e->src;
880            
881       if (!flow_bb_inside_loop_p (new_loop, 
882                                   EDGE_SUCC (new_loop->header, 0)->dest))
883         new_exit_e = EDGE_SUCC (new_loop->header, 0);
884       else
885         new_exit_e = EDGE_SUCC (new_loop->header, 1); 
886
887       redirect_edge_and_branch_force (new_exit_e, loop->header);
888       set_immediate_dominator (CDI_DOMINATORS, loop->header,
889                                new_exit_e->src);
890
891       /* We have to add phi args to the loop->header here as coming 
892          from new_exit_e edge.  */
893       for (phi = phi_nodes (loop->header); phi; phi = PHI_CHAIN (phi))
894         {
895           phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, entry_e);
896           if (phi_arg)
897             add_phi_arg (phi, phi_arg, new_exit_e);     
898         }    
899
900       redirect_edge_and_branch_force (entry_e, new_loop->header);
901       set_immediate_dominator (CDI_DOMINATORS, new_loop->header, preheader);
902     }
903
904   free (new_bbs);
905   free (bbs);
906
907   return new_loop;
908 }
909
910
911 /* Given the condition statement COND, put it as the last statement
912    of GUARD_BB; EXIT_BB is the basic block to skip the loop;
913    Assumes that this is the single exit of the guarded loop.  
914    Returns the skip edge.  */
915
916 static edge
917 slpeel_add_loop_guard (basic_block guard_bb, tree cond, basic_block exit_bb,
918                         basic_block dom_bb)
919 {
920   block_stmt_iterator bsi;
921   edge new_e, enter_e;
922   tree cond_stmt, then_label, else_label;
923
924   enter_e = EDGE_SUCC (guard_bb, 0);
925   enter_e->flags &= ~EDGE_FALLTHRU;
926   enter_e->flags |= EDGE_FALSE_VALUE;
927   bsi = bsi_last (guard_bb);
928
929   then_label = build1 (GOTO_EXPR, void_type_node,
930                        tree_block_label (exit_bb));
931   else_label = build1 (GOTO_EXPR, void_type_node,
932                        tree_block_label (enter_e->dest));
933   cond_stmt = build3 (COND_EXPR, void_type_node, cond,
934                      then_label, else_label);
935   bsi_insert_after (&bsi, cond_stmt, BSI_NEW_STMT);
936   /* Add new edge to connect guard block to the merge/loop-exit block.  */
937   new_e = make_edge (guard_bb, exit_bb, EDGE_TRUE_VALUE);
938   set_immediate_dominator (CDI_DOMINATORS, exit_bb, dom_bb);
939   return new_e;
940 }
941
942
943 /* This function verifies that the following restrictions apply to LOOP:
944    (1) it is innermost
945    (2) it consists of exactly 2 basic blocks - header, and an empty latch.
946    (3) it is single entry, single exit
947    (4) its exit condition is the last stmt in the header
948    (5) E is the entry/exit edge of LOOP.
949  */
950
951 bool
952 slpeel_can_duplicate_loop_p (struct loop *loop, edge e)
953 {
954   edge exit_e = loop->single_exit;
955   edge entry_e = loop_preheader_edge (loop);
956   tree orig_cond = get_loop_exit_condition (loop);
957   block_stmt_iterator loop_exit_bsi = bsi_last (exit_e->src);
958
959   if (need_ssa_update_p ())
960     return false;
961
962   if (loop->inner
963       /* All loops have an outer scope; the only case loop->outer is NULL is for
964          the function itself.  */
965       || !loop->outer
966       || loop->num_nodes != 2
967       || !empty_block_p (loop->latch)
968       || !loop->single_exit
969       /* Verify that new loop exit condition can be trivially modified.  */
970       || (!orig_cond || orig_cond != bsi_stmt (loop_exit_bsi))
971       || (e != exit_e && e != entry_e))
972     return false;
973
974   return true;
975 }
976
977 #ifdef ENABLE_CHECKING
978 void
979 slpeel_verify_cfg_after_peeling (struct loop *first_loop,
980                                  struct loop *second_loop)
981 {
982   basic_block loop1_exit_bb = first_loop->single_exit->dest;
983   basic_block loop2_entry_bb = loop_preheader_edge (second_loop)->src;
984   basic_block loop1_entry_bb = loop_preheader_edge (first_loop)->src;
985
986   /* A guard that controls whether the second_loop is to be executed or skipped
987      is placed in first_loop->exit.  first_loopt->exit therefore has two
988      successors - one is the preheader of second_loop, and the other is a bb
989      after second_loop.
990    */
991   gcc_assert (EDGE_COUNT (loop1_exit_bb->succs) == 2);
992    
993   /* 1. Verify that one of the successors of first_loopt->exit is the preheader
994         of second_loop.  */
995    
996   /* The preheader of new_loop is expected to have two predecessors:
997      first_loop->exit and the block that precedes first_loop.  */
998
999   gcc_assert (EDGE_COUNT (loop2_entry_bb->preds) == 2 
1000               && ((EDGE_PRED (loop2_entry_bb, 0)->src == loop1_exit_bb
1001                    && EDGE_PRED (loop2_entry_bb, 1)->src == loop1_entry_bb)
1002                || (EDGE_PRED (loop2_entry_bb, 1)->src ==  loop1_exit_bb
1003                    && EDGE_PRED (loop2_entry_bb, 0)->src == loop1_entry_bb)));
1004   
1005   /* Verify that the other successor of first_loopt->exit is after the
1006      second_loop.  */
1007   /* TODO */
1008 }
1009 #endif
1010
1011 /* Function slpeel_tree_peel_loop_to_edge.
1012
1013    Peel the first (last) iterations of LOOP into a new prolog (epilog) loop
1014    that is placed on the entry (exit) edge E of LOOP. After this transformation
1015    we have two loops one after the other - first-loop iterates FIRST_NITERS
1016    times, and second-loop iterates the remainder NITERS - FIRST_NITERS times.
1017
1018    Input:
1019    - LOOP: the loop to be peeled.
1020    - E: the exit or entry edge of LOOP.
1021         If it is the entry edge, we peel the first iterations of LOOP. In this
1022         case first-loop is LOOP, and second-loop is the newly created loop.
1023         If it is the exit edge, we peel the last iterations of LOOP. In this
1024         case, first-loop is the newly created loop, and second-loop is LOOP.
1025    - NITERS: the number of iterations that LOOP iterates.
1026    - FIRST_NITERS: the number of iterations that the first-loop should iterate.
1027    - UPDATE_FIRST_LOOP_COUNT:  specified whether this function is responsible
1028         for updating the loop bound of the first-loop to FIRST_NITERS.  If it
1029         is false, the caller of this function may want to take care of this
1030         (this can be useful if we don't want new stmts added to first-loop).
1031
1032    Output:
1033    The function returns a pointer to the new loop-copy, or NULL if it failed
1034    to perform the transformation.
1035
1036    The function generates two if-then-else guards: one before the first loop,
1037    and the other before the second loop:
1038    The first guard is:
1039      if (FIRST_NITERS == 0) then skip the first loop,
1040      and go directly to the second loop.
1041    The second guard is:
1042      if (FIRST_NITERS == NITERS) then skip the second loop.
1043
1044    FORNOW only simple loops are supported (see slpeel_can_duplicate_loop_p).
1045    FORNOW the resulting code will not be in loop-closed-ssa form.
1046 */
1047
1048 struct loop*
1049 slpeel_tree_peel_loop_to_edge (struct loop *loop, struct loops *loops, 
1050                                edge e, tree first_niters, 
1051                                tree niters, bool update_first_loop_count)
1052 {
1053   struct loop *new_loop = NULL, *first_loop, *second_loop;
1054   edge skip_e;
1055   tree pre_condition;
1056   bitmap definitions;
1057   basic_block bb_before_second_loop, bb_after_second_loop;
1058   basic_block bb_before_first_loop;
1059   basic_block bb_between_loops;
1060   basic_block new_exit_bb;
1061   edge exit_e = loop->single_exit;
1062   LOC loop_loc;
1063   
1064   if (!slpeel_can_duplicate_loop_p (loop, e))
1065     return NULL;
1066   
1067   /* We have to initialize cfg_hooks. Then, when calling
1068    cfg_hooks->split_edge, the function tree_split_edge 
1069    is actually called and, when calling cfg_hooks->duplicate_block,
1070    the function tree_duplicate_bb is called.  */
1071   tree_register_cfg_hooks ();
1072
1073
1074   /* 1. Generate a copy of LOOP and put it on E (E is the entry/exit of LOOP).
1075         Resulting CFG would be:
1076
1077         first_loop:
1078         do {
1079         } while ...
1080
1081         second_loop:
1082         do {
1083         } while ...
1084
1085         orig_exit_bb:
1086    */
1087   
1088   if (!(new_loop = slpeel_tree_duplicate_loop_to_edge_cfg (loop, loops, e)))
1089     {
1090       loop_loc = find_loop_location (loop);
1091       if (dump_file && (dump_flags & TDF_DETAILS))
1092         {
1093           if (loop_loc != UNKNOWN_LOC)
1094             fprintf (dump_file, "\n%s:%d: note: ",
1095                      LOC_FILE (loop_loc), LOC_LINE (loop_loc));
1096           fprintf (dump_file, "tree_duplicate_loop_to_edge_cfg failed.\n");
1097         }
1098       return NULL;
1099     }
1100   
1101   if (e == exit_e)
1102     {
1103       /* NEW_LOOP was placed after LOOP.  */
1104       first_loop = loop;
1105       second_loop = new_loop;
1106     }
1107   else
1108     {
1109       /* NEW_LOOP was placed before LOOP.  */
1110       first_loop = new_loop;
1111       second_loop = loop;
1112     }
1113
1114   definitions = ssa_names_to_replace ();
1115   slpeel_update_phis_for_duplicate_loop (loop, new_loop, e == exit_e);
1116   rename_variables_in_loop (new_loop);
1117
1118
1119   /* 2. Add the guard that controls whether the first loop is executed.
1120         Resulting CFG would be:
1121
1122         bb_before_first_loop:
1123         if (FIRST_NITERS == 0) GOTO bb_before_second_loop
1124                                GOTO first-loop
1125
1126         first_loop:
1127         do {
1128         } while ...
1129
1130         bb_before_second_loop:
1131
1132         second_loop:
1133         do {
1134         } while ...
1135
1136         orig_exit_bb:
1137    */
1138
1139   bb_before_first_loop = split_edge (loop_preheader_edge (first_loop));
1140   add_bb_to_loop (bb_before_first_loop, first_loop->outer);
1141   bb_before_second_loop = split_edge (first_loop->single_exit);
1142   add_bb_to_loop (bb_before_second_loop, first_loop->outer);
1143
1144   pre_condition =
1145     fold_build2 (LE_EXPR, boolean_type_node, first_niters, integer_zero_node);
1146   skip_e = slpeel_add_loop_guard (bb_before_first_loop, pre_condition,
1147                                   bb_before_second_loop, bb_before_first_loop);
1148   slpeel_update_phi_nodes_for_guard1 (skip_e, first_loop,
1149                                       first_loop == new_loop,
1150                                       &new_exit_bb, &definitions);
1151
1152
1153   /* 3. Add the guard that controls whether the second loop is executed.
1154         Resulting CFG would be:
1155
1156         bb_before_first_loop:
1157         if (FIRST_NITERS == 0) GOTO bb_before_second_loop (skip first loop)
1158                                GOTO first-loop
1159
1160         first_loop:
1161         do {
1162         } while ...
1163
1164         bb_between_loops:
1165         if (FIRST_NITERS == NITERS) GOTO bb_after_second_loop (skip second loop)
1166                                     GOTO bb_before_second_loop
1167
1168         bb_before_second_loop:
1169
1170         second_loop:
1171         do {
1172         } while ...
1173
1174         bb_after_second_loop:
1175
1176         orig_exit_bb:
1177    */
1178
1179   bb_between_loops = new_exit_bb;
1180   bb_after_second_loop = split_edge (second_loop->single_exit);
1181   add_bb_to_loop (bb_after_second_loop, second_loop->outer);
1182
1183   pre_condition = 
1184         fold_build2 (EQ_EXPR, boolean_type_node, first_niters, niters);
1185   skip_e = slpeel_add_loop_guard (bb_between_loops, pre_condition,
1186                                   bb_after_second_loop, bb_before_first_loop);
1187   slpeel_update_phi_nodes_for_guard2 (skip_e, second_loop,
1188                                      second_loop == new_loop, &new_exit_bb);
1189
1190   /* 4. Make first-loop iterate FIRST_NITERS times, if requested.
1191    */
1192   if (update_first_loop_count)
1193     slpeel_make_loop_iterate_ntimes (first_loop, first_niters);
1194
1195   BITMAP_FREE (definitions);
1196   delete_update_ssa ();
1197
1198   return new_loop;
1199 }
1200
1201 /* Function vect_get_loop_location.
1202
1203    Extract the location of the loop in the source code.
1204    If the loop is not well formed for vectorization, an estimated
1205    location is calculated.
1206    Return the loop location if succeed and NULL if not.  */
1207
1208 LOC
1209 find_loop_location (struct loop *loop)
1210 {
1211   tree node = NULL_TREE;
1212   basic_block bb;
1213   block_stmt_iterator si;
1214
1215   if (!loop)
1216     return UNKNOWN_LOC;
1217
1218   node = get_loop_exit_condition (loop);
1219
1220   if (node && EXPR_P (node) && EXPR_HAS_LOCATION (node)
1221       && EXPR_FILENAME (node) && EXPR_LINENO (node))
1222     return EXPR_LOC (node);
1223
1224   /* If we got here the loop is probably not "well formed",
1225      try to estimate the loop location */
1226
1227   if (!loop->header)
1228     return UNKNOWN_LOC;
1229
1230   bb = loop->header;
1231
1232   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1233     {
1234       node = bsi_stmt (si);
1235       if (node && EXPR_P (node) && EXPR_HAS_LOCATION (node))
1236         return EXPR_LOC (node);
1237     }
1238
1239   return UNKNOWN_LOC;
1240 }
1241
1242
1243 /*************************************************************************
1244   Vectorization Debug Information.
1245  *************************************************************************/
1246
1247 /* Function vect_set_verbosity_level.
1248
1249    Called from toplev.c upon detection of the
1250    -ftree-vectorizer-verbose=N option.  */
1251
1252 void
1253 vect_set_verbosity_level (const char *val)
1254 {
1255    unsigned int vl;
1256
1257    vl = atoi (val);
1258    if (vl < MAX_VERBOSITY_LEVEL)
1259      vect_verbosity_level = vl;
1260    else
1261      vect_verbosity_level = MAX_VERBOSITY_LEVEL - 1;
1262 }
1263
1264
1265 /* Function vect_set_dump_settings.
1266
1267    Fix the verbosity level of the vectorizer if the
1268    requested level was not set explicitly using the flag
1269    -ftree-vectorizer-verbose=N.
1270    Decide where to print the debugging information (dump_file/stderr).
1271    If the user defined the verbosity level, but there is no dump file,
1272    print to stderr, otherwise print to the dump file.  */
1273
1274 static void
1275 vect_set_dump_settings (void)
1276 {
1277   vect_dump = dump_file;
1278
1279   /* Check if the verbosity level was defined by the user:  */
1280   if (vect_verbosity_level != MAX_VERBOSITY_LEVEL)
1281     {
1282       /* If there is no dump file, print to stderr.  */
1283       if (!dump_file)
1284         vect_dump = stderr;
1285       return;
1286     }
1287
1288   /* User didn't specify verbosity level:  */
1289   if (dump_file && (dump_flags & TDF_DETAILS))
1290     vect_verbosity_level = REPORT_DETAILS;
1291   else if (dump_file && (dump_flags & TDF_STATS))
1292     vect_verbosity_level = REPORT_UNVECTORIZED_LOOPS;
1293   else
1294     vect_verbosity_level = REPORT_NONE;
1295
1296   gcc_assert (dump_file || vect_verbosity_level == REPORT_NONE);
1297 }
1298
1299
1300 /* Function debug_loop_details.
1301
1302    For vectorization debug dumps.  */
1303
1304 bool
1305 vect_print_dump_info (enum verbosity_levels vl)
1306 {
1307   if (vl > vect_verbosity_level)
1308     return false;
1309
1310   if (vect_loop_location == UNKNOWN_LOC)
1311     fprintf (vect_dump, "\n%s:%d: note: ",
1312                  DECL_SOURCE_FILE (current_function_decl),
1313                  DECL_SOURCE_LINE (current_function_decl));
1314   else
1315     fprintf (vect_dump, "\n%s:%d: note: ", 
1316              LOC_FILE (vect_loop_location), LOC_LINE (vect_loop_location));
1317
1318
1319   return true;
1320 }
1321
1322
1323 /*************************************************************************
1324   Vectorization Utilities.
1325  *************************************************************************/
1326
1327 /* Function new_stmt_vec_info.
1328
1329    Create and initialize a new stmt_vec_info struct for STMT.  */
1330
1331 stmt_vec_info
1332 new_stmt_vec_info (tree stmt, loop_vec_info loop_vinfo)
1333 {
1334   stmt_vec_info res;
1335   res = (stmt_vec_info) xcalloc (1, sizeof (struct _stmt_vec_info));
1336
1337   STMT_VINFO_TYPE (res) = undef_vec_info_type;
1338   STMT_VINFO_STMT (res) = stmt;
1339   STMT_VINFO_LOOP_VINFO (res) = loop_vinfo;
1340   STMT_VINFO_RELEVANT_P (res) = 0;
1341   STMT_VINFO_LIVE_P (res) = 0;
1342   STMT_VINFO_VECTYPE (res) = NULL;
1343   STMT_VINFO_VEC_STMT (res) = NULL;
1344   STMT_VINFO_DATA_REF (res) = NULL;
1345   if (TREE_CODE (stmt) == PHI_NODE)
1346     STMT_VINFO_DEF_TYPE (res) = vect_unknown_def_type;
1347   else
1348     STMT_VINFO_DEF_TYPE (res) = vect_loop_def;
1349   STMT_VINFO_MEMTAG (res) = NULL;
1350   STMT_VINFO_PTR_INFO (res) = NULL;
1351   STMT_VINFO_SUBVARS (res) = NULL;
1352   STMT_VINFO_VECT_DR_BASE_ADDRESS (res) = NULL;
1353   STMT_VINFO_VECT_INIT_OFFSET (res) = NULL_TREE;
1354   STMT_VINFO_VECT_STEP (res) = NULL_TREE;
1355   STMT_VINFO_VECT_BASE_ALIGNED_P (res) = false;
1356   STMT_VINFO_VECT_MISALIGNMENT (res) = NULL_TREE;
1357   STMT_VINFO_SAME_ALIGN_REFS (res) = VEC_alloc (dr_p, heap, 5);
1358
1359   return res;
1360 }
1361
1362
1363 /* Function new_loop_vec_info.
1364
1365    Create and initialize a new loop_vec_info struct for LOOP, as well as
1366    stmt_vec_info structs for all the stmts in LOOP.  */
1367
1368 loop_vec_info
1369 new_loop_vec_info (struct loop *loop)
1370 {
1371   loop_vec_info res;
1372   basic_block *bbs;
1373   block_stmt_iterator si;
1374   unsigned int i;
1375
1376   res = (loop_vec_info) xcalloc (1, sizeof (struct _loop_vec_info));
1377
1378   bbs = get_loop_body (loop);
1379
1380   /* Create stmt_info for all stmts in the loop.  */
1381   for (i = 0; i < loop->num_nodes; i++)
1382     {
1383       basic_block bb = bbs[i];
1384       tree phi;
1385
1386       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1387         {
1388           tree_ann_t ann = get_tree_ann (phi);
1389           set_stmt_info (ann, new_stmt_vec_info (phi, res));
1390         }
1391
1392       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1393         {
1394           tree stmt = bsi_stmt (si);
1395           stmt_ann_t ann;
1396
1397           ann = stmt_ann (stmt);
1398           set_stmt_info ((tree_ann_t)ann, new_stmt_vec_info (stmt, res));
1399         }
1400     }
1401
1402   LOOP_VINFO_LOOP (res) = loop;
1403   LOOP_VINFO_BBS (res) = bbs;
1404   LOOP_VINFO_EXIT_COND (res) = NULL;
1405   LOOP_VINFO_NITERS (res) = NULL;
1406   LOOP_VINFO_VECTORIZABLE_P (res) = 0;
1407   LOOP_PEELING_FOR_ALIGNMENT (res) = 0;
1408   LOOP_VINFO_VECT_FACTOR (res) = 0;
1409   VARRAY_GENERIC_PTR_INIT (LOOP_VINFO_DATAREF_WRITES (res), 20,
1410                            "loop_write_datarefs");
1411   VARRAY_GENERIC_PTR_INIT (LOOP_VINFO_DATAREF_READS (res), 20,
1412                            "loop_read_datarefs");
1413   LOOP_VINFO_UNALIGNED_DR (res) = NULL;
1414
1415   return res;
1416 }
1417
1418
1419 /* Function destroy_loop_vec_info.
1420  
1421    Free LOOP_VINFO struct, as well as all the stmt_vec_info structs of all the 
1422    stmts in the loop.  */
1423
1424 void
1425 destroy_loop_vec_info (loop_vec_info loop_vinfo)
1426 {
1427   struct loop *loop;
1428   basic_block *bbs;
1429   int nbbs;
1430   block_stmt_iterator si;
1431   int j;
1432
1433   if (!loop_vinfo)
1434     return;
1435
1436   loop = LOOP_VINFO_LOOP (loop_vinfo);
1437
1438   bbs = LOOP_VINFO_BBS (loop_vinfo);
1439   nbbs = loop->num_nodes;
1440
1441   for (j = 0; j < nbbs; j++)
1442     {
1443       basic_block bb = bbs[j];
1444       tree phi;
1445       stmt_vec_info stmt_info;
1446
1447       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1448         {
1449           tree_ann_t ann = get_tree_ann (phi);
1450
1451           stmt_info = vinfo_for_stmt (phi);
1452           free (stmt_info);
1453           set_stmt_info (ann, NULL);
1454         }
1455
1456       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1457         {
1458           tree stmt = bsi_stmt (si);
1459           stmt_ann_t ann = stmt_ann (stmt);
1460           stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1461
1462           if (stmt_info)
1463             {
1464               VEC_free (dr_p, heap, STMT_VINFO_SAME_ALIGN_REFS (stmt_info));
1465               free (stmt_info);
1466               set_stmt_info ((tree_ann_t)ann, NULL);
1467             }
1468         }
1469     }
1470
1471   free (LOOP_VINFO_BBS (loop_vinfo));
1472   varray_clear (LOOP_VINFO_DATAREF_WRITES (loop_vinfo));
1473   varray_clear (LOOP_VINFO_DATAREF_READS (loop_vinfo));
1474
1475   free (loop_vinfo);
1476 }
1477
1478
1479 /* Function vect_strip_conversions
1480
1481    Strip conversions that don't narrow the mode.  */
1482
1483 tree 
1484 vect_strip_conversion (tree expr)
1485 {
1486   tree to, ti, oprnd0;
1487   
1488   while (TREE_CODE (expr) == NOP_EXPR || TREE_CODE (expr) == CONVERT_EXPR)
1489     {
1490       to = TREE_TYPE (expr);
1491       oprnd0 = TREE_OPERAND (expr, 0);
1492       ti = TREE_TYPE (oprnd0);
1493  
1494       if (!INTEGRAL_TYPE_P (to) || !INTEGRAL_TYPE_P (ti))
1495         return NULL_TREE;
1496       if (GET_MODE_SIZE (TYPE_MODE (to)) < GET_MODE_SIZE (TYPE_MODE (ti)))
1497         return NULL_TREE;
1498       
1499       expr = oprnd0;
1500     }
1501   return expr; 
1502 }
1503
1504
1505 /* Function vect_force_dr_alignment_p.
1506
1507    Returns whether the alignment of a DECL can be forced to be aligned
1508    on ALIGNMENT bit boundary.  */
1509
1510 bool 
1511 vect_can_force_dr_alignment_p (tree decl, unsigned int alignment)
1512 {
1513   if (TREE_CODE (decl) != VAR_DECL)
1514     return false;
1515
1516   if (DECL_EXTERNAL (decl))
1517     return false;
1518
1519   if (TREE_ASM_WRITTEN (decl))
1520     return false;
1521
1522   if (TREE_STATIC (decl))
1523     return (alignment <= MAX_OFILE_ALIGNMENT);
1524   else
1525     /* This is not 100% correct.  The absolute correct stack alignment
1526        is STACK_BOUNDARY.  We're supposed to hope, but not assume, that
1527        PREFERRED_STACK_BOUNDARY is honored by all translation units.
1528        However, until someone implements forced stack alignment, SSE
1529        isn't really usable without this.  */  
1530     return (alignment <= PREFERRED_STACK_BOUNDARY); 
1531 }
1532
1533
1534 /* Function get_vectype_for_scalar_type.
1535
1536    Returns the vector type corresponding to SCALAR_TYPE as supported
1537    by the target.  */
1538
1539 tree
1540 get_vectype_for_scalar_type (tree scalar_type)
1541 {
1542   enum machine_mode inner_mode = TYPE_MODE (scalar_type);
1543   int nbytes = GET_MODE_SIZE (inner_mode);
1544   int nunits;
1545   tree vectype;
1546
1547   if (nbytes == 0 || nbytes >= UNITS_PER_SIMD_WORD)
1548     return NULL_TREE;
1549
1550   /* FORNOW: Only a single vector size per target (UNITS_PER_SIMD_WORD)
1551      is expected.  */
1552   nunits = UNITS_PER_SIMD_WORD / nbytes;
1553
1554   vectype = build_vector_type (scalar_type, nunits);
1555   if (vect_print_dump_info (REPORT_DETAILS))
1556     {
1557       fprintf (vect_dump, "get vectype with %d units of type ", nunits);
1558       print_generic_expr (vect_dump, scalar_type, TDF_SLIM);
1559     }
1560
1561   if (!vectype)
1562     return NULL_TREE;
1563
1564   if (vect_print_dump_info (REPORT_DETAILS))
1565     {
1566       fprintf (vect_dump, "vectype: ");
1567       print_generic_expr (vect_dump, vectype, TDF_SLIM);
1568     }
1569
1570   if (!VECTOR_MODE_P (TYPE_MODE (vectype))
1571       && !INTEGRAL_MODE_P (TYPE_MODE (vectype)))
1572     {
1573       if (vect_print_dump_info (REPORT_DETAILS))
1574         fprintf (vect_dump, "mode not supported by target.");
1575       return NULL_TREE;
1576     }
1577
1578   return vectype;
1579 }
1580
1581
1582 /* Function vect_supportable_dr_alignment
1583
1584    Return whether the data reference DR is supported with respect to its
1585    alignment.  */
1586
1587 enum dr_alignment_support
1588 vect_supportable_dr_alignment (struct data_reference *dr)
1589 {
1590   tree vectype = STMT_VINFO_VECTYPE (vinfo_for_stmt (DR_STMT (dr)));
1591   enum machine_mode mode = (int) TYPE_MODE (vectype);
1592
1593   if (aligned_access_p (dr))
1594     return dr_aligned;
1595
1596   /* Possibly unaligned access.  */
1597   
1598   if (DR_IS_READ (dr))
1599     {
1600       if (vec_realign_load_optab->handlers[mode].insn_code != CODE_FOR_nothing
1601           && (!targetm.vectorize.builtin_mask_for_load
1602               || targetm.vectorize.builtin_mask_for_load ()))
1603         return dr_unaligned_software_pipeline;
1604
1605       if (movmisalign_optab->handlers[mode].insn_code != CODE_FOR_nothing)
1606         /* Can't software pipeline the loads, but can at least do them.  */
1607         return dr_unaligned_supported;
1608     }
1609
1610   /* Unsupported.  */
1611   return dr_unaligned_unsupported;
1612 }
1613
1614
1615 /* Function vect_is_simple_use.
1616
1617    Input:
1618    LOOP - the loop that is being vectorized.
1619    OPERAND - operand of a stmt in LOOP.
1620    DEF - the defining stmt in case OPERAND is an SSA_NAME.
1621
1622    Returns whether a stmt with OPERAND can be vectorized.
1623    Supportable operands are constants, loop invariants, and operands that are
1624    defined by the current iteration of the loop. Unsupportable operands are 
1625    those that are defined by a previous iteration of the loop (as is the case
1626    in reduction/induction computations).  */
1627
1628 bool
1629 vect_is_simple_use (tree operand, loop_vec_info loop_vinfo, tree *def_stmt,
1630                     tree *def, enum vect_def_type *dt)
1631
1632   basic_block bb;
1633   stmt_vec_info stmt_vinfo;
1634   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
1635
1636   *def_stmt = NULL_TREE;
1637   *def = NULL_TREE;
1638   
1639   if (vect_print_dump_info (REPORT_DETAILS))
1640     {
1641       fprintf (vect_dump, "vect_is_simple_use: operand ");
1642       print_generic_expr (vect_dump, operand, TDF_SLIM);
1643     }
1644     
1645   if (TREE_CODE (operand) == INTEGER_CST || TREE_CODE (operand) == REAL_CST)
1646     {
1647       *dt = vect_constant_def;
1648       return true;
1649     }
1650     
1651   if (TREE_CODE (operand) != SSA_NAME)
1652     {
1653       if (vect_print_dump_info (REPORT_DETAILS))
1654         fprintf (vect_dump, "not ssa-name.");
1655       return false;
1656     }
1657     
1658   *def_stmt = SSA_NAME_DEF_STMT (operand);
1659   if (*def_stmt == NULL_TREE )
1660     {
1661       if (vect_print_dump_info (REPORT_DETAILS))
1662         fprintf (vect_dump, "no def_stmt.");
1663       return false;
1664     }
1665
1666   if (vect_print_dump_info (REPORT_DETAILS))
1667     {
1668       fprintf (vect_dump, "def_stmt: ");
1669       print_generic_expr (vect_dump, *def_stmt, TDF_SLIM);
1670     }
1671
1672   /* empty stmt is expected only in case of a function argument.
1673      (Otherwise - we expect a phi_node or a modify_expr).  */
1674   if (IS_EMPTY_STMT (*def_stmt))
1675     {
1676       tree arg = TREE_OPERAND (*def_stmt, 0);
1677       if (TREE_CODE (arg) == INTEGER_CST || TREE_CODE (arg) == REAL_CST)
1678         {
1679           *def = operand;
1680           *dt = vect_invariant_def;
1681           return true;
1682         }
1683
1684       if (vect_print_dump_info (REPORT_DETAILS))
1685         fprintf (vect_dump, "Unexpected empty stmt.");
1686       return false;
1687     }
1688
1689   bb = bb_for_stmt (*def_stmt);
1690   if (!flow_bb_inside_loop_p (loop, bb))
1691     *dt = vect_invariant_def;
1692   else
1693     {
1694       stmt_vinfo = vinfo_for_stmt (*def_stmt);
1695       *dt = STMT_VINFO_DEF_TYPE (stmt_vinfo);
1696     }
1697
1698   if (*dt == vect_unknown_def_type)
1699     {
1700       if (vect_print_dump_info (REPORT_DETAILS))
1701         fprintf (vect_dump, "Unsupported pattern.");
1702       return false;
1703     }
1704
1705   /* stmts inside the loop that have been identified as performing
1706      a reduction operation cannot have uses in the loop.  */
1707   if (*dt == vect_reduction_def && TREE_CODE (*def_stmt) != PHI_NODE)
1708     {
1709       if (vect_print_dump_info (REPORT_DETAILS))
1710         fprintf (vect_dump, "reduction used in loop.");
1711       return false;
1712     }
1713
1714   if (vect_print_dump_info (REPORT_DETAILS))
1715     fprintf (vect_dump, "type of def: %d.",*dt);
1716
1717   switch (TREE_CODE (*def_stmt))
1718     {
1719     case PHI_NODE:
1720       *def = PHI_RESULT (*def_stmt);
1721       gcc_assert (*dt == vect_induction_def || *dt == vect_reduction_def
1722                   || *dt == vect_invariant_def);
1723       break;
1724
1725     case MODIFY_EXPR:
1726       *def = TREE_OPERAND (*def_stmt, 0);
1727       gcc_assert (*dt == vect_loop_def || *dt == vect_invariant_def);
1728       break;
1729
1730     default:
1731       if (vect_print_dump_info (REPORT_DETAILS))
1732         fprintf (vect_dump, "unsupported defining stmt: ");
1733       return false;
1734     }
1735
1736   if (*dt == vect_induction_def)
1737     {
1738       if (vect_print_dump_info (REPORT_DETAILS))
1739         fprintf (vect_dump, "induction not supported.");
1740       return false;
1741     }
1742
1743   return true;
1744 }
1745
1746
1747 /* Function reduction_code_for_scalar_code
1748
1749    Input:
1750    CODE - tree_code of a reduction operations.
1751
1752    Output:
1753    REDUC_CODE - the corresponding tree-code to be used to reduce the
1754       vector of partial results into a single scalar result (which
1755       will also reside in a vector).
1756
1757    Return TRUE if a corresponding REDUC_CODE was found, FALSE otherwise.  */
1758
1759 bool
1760 reduction_code_for_scalar_code (enum tree_code code,
1761                                 enum tree_code *reduc_code)
1762 {
1763   switch (code)
1764   {
1765   case MAX_EXPR:
1766     *reduc_code = REDUC_MAX_EXPR;
1767     return true;
1768
1769   case MIN_EXPR:
1770     *reduc_code = REDUC_MIN_EXPR;
1771     return true;
1772
1773   case PLUS_EXPR:
1774     *reduc_code = REDUC_PLUS_EXPR;
1775     return true;
1776
1777   default:
1778     return false;
1779   }
1780 }
1781
1782
1783 /* Function vect_is_simple_reduction
1784
1785    Detect a cross-iteration def-use cucle that represents a simple
1786    reduction computation. We look for the following pattern:
1787
1788    loop_header:
1789      a1 = phi < a0, a2 >
1790      a3 = ...
1791      a2 = operation (a3, a1)
1792   
1793    such that:
1794    1. operation is commutative and associative and it is safe to 
1795       change the order of the computation.
1796    2. no uses for a2 in the loop (a2 is used out of the loop)
1797    3. no uses of a1 in the loop besides the reduction operation.
1798
1799    Condition 1 is tested here.
1800    Conditions 2,3 are tested in vect_mark_stmts_to_be_vectorized.  */
1801
1802 tree
1803 vect_is_simple_reduction (struct loop *loop ATTRIBUTE_UNUSED, 
1804                           tree phi ATTRIBUTE_UNUSED)
1805 {
1806   edge latch_e = loop_latch_edge (loop);
1807   tree loop_arg = PHI_ARG_DEF_FROM_EDGE (phi, latch_e);
1808   tree def_stmt, def1, def2;
1809   enum tree_code code;
1810   int op_type;
1811   tree operation, op1, op2;
1812   tree type;
1813
1814   if (TREE_CODE (loop_arg) != SSA_NAME)
1815     {
1816       if (vect_print_dump_info (REPORT_DETAILS))
1817         {
1818           fprintf (vect_dump, "reduction: not ssa_name: ");
1819           print_generic_expr (vect_dump, loop_arg, TDF_SLIM);
1820         }
1821       return NULL_TREE;
1822     }
1823
1824   def_stmt = SSA_NAME_DEF_STMT (loop_arg);
1825   if (!def_stmt)
1826     {
1827       if (vect_print_dump_info (REPORT_DETAILS))
1828         fprintf (vect_dump, "reduction: no def_stmt.");
1829       return NULL_TREE;
1830     }
1831
1832   if (TREE_CODE (def_stmt) != MODIFY_EXPR)
1833     {
1834       if (vect_print_dump_info (REPORT_DETAILS))
1835         {
1836           print_generic_expr (vect_dump, def_stmt, TDF_SLIM);
1837         }
1838       return NULL_TREE;
1839     }
1840
1841   operation = TREE_OPERAND (def_stmt, 1);
1842   code = TREE_CODE (operation);
1843   if (!commutative_tree_code (code) || !associative_tree_code (code))
1844     {
1845       if (vect_print_dump_info (REPORT_DETAILS))
1846         {
1847           fprintf (vect_dump, "reduction: not commutative/associative: ");
1848           print_generic_expr (vect_dump, operation, TDF_SLIM);
1849         }
1850       return NULL_TREE;
1851     }
1852
1853   op_type = TREE_CODE_LENGTH (code);
1854   if (op_type != binary_op)
1855     {
1856       if (vect_print_dump_info (REPORT_DETAILS))
1857         {
1858           fprintf (vect_dump, "reduction: not binary operation: ");
1859           print_generic_expr (vect_dump, operation, TDF_SLIM);
1860         }
1861       return NULL_TREE;
1862     }
1863
1864   op1 = TREE_OPERAND (operation, 0);
1865   op2 = TREE_OPERAND (operation, 1);
1866   if (TREE_CODE (op1) != SSA_NAME || TREE_CODE (op2) != SSA_NAME)
1867     {
1868       if (vect_print_dump_info (REPORT_DETAILS))
1869         {
1870           fprintf (vect_dump, "reduction: uses not ssa_names: ");
1871           print_generic_expr (vect_dump, operation, TDF_SLIM);
1872         }
1873       return NULL_TREE;
1874     }
1875
1876   /* Check that it's ok to change the order of the computation.  */
1877   type = TREE_TYPE (operation);
1878   if (TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (TREE_TYPE (op1))
1879       || TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (TREE_TYPE (op2)))
1880     {
1881       if (vect_print_dump_info (REPORT_DETAILS))
1882         {
1883           fprintf (vect_dump, "reduction: multiple types: operation type: ");
1884           print_generic_expr (vect_dump, type, TDF_SLIM);
1885           fprintf (vect_dump, ", operands types: ");
1886           print_generic_expr (vect_dump, TREE_TYPE (op1), TDF_SLIM);
1887           fprintf (vect_dump, ",");
1888           print_generic_expr (vect_dump, TREE_TYPE (op2), TDF_SLIM);
1889         }
1890       return NULL_TREE;
1891     }
1892
1893   /* CHECKME: check for !flag_finite_math_only too?  */
1894   if (SCALAR_FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations)
1895     {
1896       /* Changing the order of operations changes the sematics.  */
1897       if (vect_print_dump_info (REPORT_DETAILS))
1898         {
1899           fprintf (vect_dump, "reduction: unsafe fp math optimization: ");
1900           print_generic_expr (vect_dump, operation, TDF_SLIM);
1901         }
1902       return NULL_TREE;
1903     }
1904   else if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type) && flag_trapv)
1905     {
1906       /* Changing the order of operations changes the sematics.  */
1907       if (vect_print_dump_info (REPORT_DETAILS))
1908         {
1909           fprintf (vect_dump, "reduction: unsafe int math optimization: ");
1910           print_generic_expr (vect_dump, operation, TDF_SLIM);
1911         }
1912       return NULL_TREE;
1913     }
1914
1915   /* reduction is safe. we're dealing with one of the following:
1916      1) integer arithmetic and no trapv
1917      2) floating point arithmetic, and special flags permit this optimization.
1918    */
1919   def1 = SSA_NAME_DEF_STMT (op1);
1920   def2 = SSA_NAME_DEF_STMT (op2);
1921   if (!def1 || !def2)
1922     {
1923       if (vect_print_dump_info (REPORT_DETAILS))
1924         {
1925           fprintf (vect_dump, "reduction: no defs for operands: ");
1926           print_generic_expr (vect_dump, operation, TDF_SLIM);
1927         }
1928       return NULL_TREE;
1929     }
1930
1931   if (TREE_CODE (def1) == MODIFY_EXPR
1932       && flow_bb_inside_loop_p (loop, bb_for_stmt (def1))
1933       && def2 == phi)
1934     {
1935       if (vect_print_dump_info (REPORT_DETAILS))
1936         {
1937           fprintf (vect_dump, "detected reduction:");
1938           print_generic_expr (vect_dump, operation, TDF_SLIM);
1939         }
1940       return def_stmt;
1941     }
1942   else if (TREE_CODE (def2) == MODIFY_EXPR
1943       && flow_bb_inside_loop_p (loop, bb_for_stmt (def2))
1944       && def1 == phi)
1945     {
1946       use_operand_p use;
1947       ssa_op_iter iter;
1948
1949       /* Swap operands (just for simplicity - so that the rest of the code
1950          can assume that the reduction variable is always the last (second)
1951          argument).  */
1952       if (vect_print_dump_info (REPORT_DETAILS))
1953         {
1954           fprintf (vect_dump, "detected reduction: need to swap operands:");
1955           print_generic_expr (vect_dump, operation, TDF_SLIM);
1956         }
1957
1958       /* CHECKME */
1959       FOR_EACH_SSA_USE_OPERAND (use, def_stmt, iter, SSA_OP_USE)
1960         {
1961           tree tuse = USE_FROM_PTR (use);
1962           if (tuse == op1)
1963             SET_USE (use, op2);
1964           else if (tuse == op2)
1965             SET_USE (use, op1);
1966         }
1967       return def_stmt;
1968     }
1969   else
1970     {
1971       if (vect_print_dump_info (REPORT_DETAILS))
1972         {
1973           fprintf (vect_dump, "reduction: unknown pattern.");
1974           print_generic_expr (vect_dump, operation, TDF_SLIM);
1975         }
1976       return NULL_TREE;
1977     }
1978 }
1979
1980
1981 /* Function vect_is_simple_iv_evolution.
1982
1983    FORNOW: A simple evolution of an induction variables in the loop is
1984    considered a polynomial evolution with constant step.  */
1985
1986 bool
1987 vect_is_simple_iv_evolution (unsigned loop_nb, tree access_fn, tree * init, 
1988                              tree * step)
1989 {
1990   tree init_expr;
1991   tree step_expr;
1992   
1993   tree evolution_part = evolution_part_in_loop_num (access_fn, loop_nb);
1994
1995   /* When there is no evolution in this loop, the evolution function
1996      is not "simple".  */  
1997   if (evolution_part == NULL_TREE)
1998     return false;
1999   
2000   /* When the evolution is a polynomial of degree >= 2
2001      the evolution function is not "simple".  */
2002   if (tree_is_chrec (evolution_part))
2003     return false;
2004   
2005   step_expr = evolution_part;
2006   init_expr = unshare_expr (initial_condition_in_loop_num (access_fn,
2007                                                            loop_nb));
2008
2009   if (vect_print_dump_info (REPORT_DETAILS))
2010     {
2011       fprintf (vect_dump, "step: ");
2012       print_generic_expr (vect_dump, step_expr, TDF_SLIM);
2013       fprintf (vect_dump, ",  init: ");
2014       print_generic_expr (vect_dump, init_expr, TDF_SLIM);
2015     }
2016
2017   *init = init_expr;
2018   *step = step_expr;
2019
2020   if (TREE_CODE (step_expr) != INTEGER_CST)
2021     {
2022       if (vect_print_dump_info (REPORT_DETAILS))
2023         fprintf (vect_dump, "step unknown.");
2024       return false;
2025     }
2026
2027   return true;
2028 }
2029
2030
2031 /* Function vectorize_loops.
2032    
2033    Entry Point to loop vectorization phase.  */
2034
2035 void
2036 vectorize_loops (struct loops *loops)
2037 {
2038   unsigned int i;
2039   unsigned int num_vectorized_loops = 0;
2040
2041   /* Fix the verbosity level if not defined explicitly by the user.  */
2042   vect_set_dump_settings ();
2043
2044   /*  ----------- Analyze loops. -----------  */
2045
2046   /* If some loop was duplicated, it gets bigger number 
2047      than all previously defined loops. This fact allows us to run 
2048      only over initial loops skipping newly generated ones.  */
2049   vect_loops_num = loops->num;
2050   for (i = 1; i < vect_loops_num; i++)
2051     {
2052       loop_vec_info loop_vinfo;
2053       struct loop *loop = loops->parray[i];
2054
2055       if (!loop)
2056         continue;
2057
2058       vect_loop_location = find_loop_location (loop);
2059       loop_vinfo = vect_analyze_loop (loop);
2060       loop->aux = loop_vinfo;
2061
2062       if (!loop_vinfo || !LOOP_VINFO_VECTORIZABLE_P (loop_vinfo))
2063         continue;
2064
2065       vect_transform_loop (loop_vinfo, loops); 
2066       num_vectorized_loops++;
2067     }
2068
2069   if (vect_print_dump_info (REPORT_VECTORIZED_LOOPS))
2070     fprintf (vect_dump, "vectorized %u loops in function.\n",
2071              num_vectorized_loops);
2072
2073   /*  ----------- Finalize. -----------  */
2074
2075   for (i = 1; i < vect_loops_num; i++)
2076     {
2077       struct loop *loop = loops->parray[i];
2078       loop_vec_info loop_vinfo;
2079
2080       if (!loop)
2081         continue;
2082       loop_vinfo = loop->aux;
2083       destroy_loop_vec_info (loop_vinfo);
2084       loop->aux = NULL;
2085     }
2086 }