OSDN Git Service

2004-11-14 Dorit Naishlos <dorit@il.ibm.com>
[pf3gnuchains/gcc-fork.git] / gcc / tree-vectorizer.c
1 /* Loop Vectorization
2    Copyright (C) 2003, 2004 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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, 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 "errors.h"
128 #include "ggc.h"
129 #include "tree.h"
130 #include "target.h"
131
132 #include "rtl.h"
133 #include "basic-block.h"
134 #include "diagnostic.h"
135 #include "tree-flow.h"
136 #include "tree-dump.h"
137 #include "timevar.h"
138 #include "cfgloop.h"
139 #include "cfglayout.h"
140 #include "expr.h"
141 #include "optabs.h"
142 #include "toplev.h"
143 #include "tree-chrec.h"
144 #include "tree-data-ref.h"
145 #include "tree-scalar-evolution.h"
146 #include "tree-vectorizer.h"
147 #include "tree-pass.h"
148
149 /* Main analysis functions.  */
150 static loop_vec_info vect_analyze_loop (struct loop *);
151 static loop_vec_info vect_analyze_loop_form (struct loop *);
152 static bool vect_analyze_data_refs (loop_vec_info);
153 static bool vect_mark_stmts_to_be_vectorized (loop_vec_info);
154 static bool vect_analyze_scalar_cycles (loop_vec_info);
155 static bool vect_analyze_data_ref_accesses (loop_vec_info);
156 static bool vect_analyze_data_refs_alignment (loop_vec_info);
157 static bool vect_compute_data_refs_alignment (loop_vec_info);
158 static bool vect_analyze_operations (loop_vec_info);
159
160 /* Main code transformation functions.  */
161 static void vect_transform_loop (loop_vec_info, struct loops *);
162 static void vect_transform_loop_bound (loop_vec_info, tree niters);
163 static bool vect_transform_stmt (tree, block_stmt_iterator *);
164 static bool vectorizable_load (tree, block_stmt_iterator *, tree *);
165 static bool vectorizable_store (tree, block_stmt_iterator *, tree *);
166 static bool vectorizable_operation (tree, block_stmt_iterator *, tree *);
167 static bool vectorizable_assignment (tree, block_stmt_iterator *, tree *);
168 static enum dr_alignment_support vect_supportable_dr_alignment
169   (struct data_reference *);
170 static void vect_align_data_ref (tree);
171 static void vect_enhance_data_refs_alignment (loop_vec_info);
172
173 /* Utility functions for the analyses.  */
174 static bool vect_is_simple_use (tree , struct loop *, tree *);
175 static bool exist_non_indexing_operands_for_use_p (tree, tree);
176 static bool vect_is_simple_iv_evolution (unsigned, tree, tree *, tree *, bool);
177 static void vect_mark_relevant (varray_type, tree);
178 static bool vect_stmt_relevant_p (tree, loop_vec_info);
179 static tree vect_get_loop_niters (struct loop *, tree *);
180 static bool vect_compute_data_ref_alignment 
181   (struct data_reference *, loop_vec_info);
182 static bool vect_analyze_data_ref_access (struct data_reference *);
183 static bool vect_get_first_index (tree, tree *);
184 static bool vect_can_force_dr_alignment_p (tree, unsigned int);
185 static struct data_reference * vect_analyze_pointer_ref_access 
186   (tree, tree, bool);
187 static bool vect_analyze_loop_with_symbolic_num_of_iters (tree niters, 
188                                                           struct loop *loop);
189 static tree vect_get_base_and_bit_offset
190   (struct data_reference *, tree, tree, loop_vec_info, tree *, bool*);
191 static struct data_reference * vect_analyze_pointer_ref_access
192   (tree, tree, bool);
193 static tree vect_compute_array_base_alignment (tree, tree, tree *, tree *);
194 static tree vect_compute_array_ref_alignment
195   (struct data_reference *, loop_vec_info, tree, tree *);
196 static tree vect_get_ptr_offset (tree, tree, tree *);
197 static tree vect_get_symbl_and_dr
198   (tree, tree, bool, loop_vec_info, struct data_reference **);
199
200 /* Utility functions for the code transformation.  */
201 static tree vect_create_destination_var (tree, tree);
202 static tree vect_create_data_ref_ptr 
203   (tree, block_stmt_iterator *, tree, tree *, bool); 
204 static tree vect_create_index_for_vector_ref 
205   (struct loop *, block_stmt_iterator *);
206 static tree vect_create_addr_base_for_vector_ref (tree, tree *, tree);
207 static tree get_vectype_for_scalar_type (tree);
208 static tree vect_get_new_vect_var (tree, enum vect_var_kind, const char *);
209 static tree vect_get_vec_def_for_operand (tree, tree);
210 static tree vect_init_vector (tree, tree);
211 static tree vect_build_symbol_bound (tree, int, struct loop *);
212 static void vect_finish_stmt_generation 
213   (tree stmt, tree vec_stmt, block_stmt_iterator *bsi);
214
215 static void vect_generate_tmps_on_preheader (loop_vec_info, 
216                                              tree *, tree *, 
217                                              tree *);
218 static tree vect_build_loop_niters (loop_vec_info);
219 static void vect_update_ivs_after_vectorizer (struct loop *, tree); 
220
221 /* Loop transformations prior to vectorization.  */
222
223 /* Loop transformations entry point function. 
224    It can be used outside of the vectorizer 
225    in case the loop to be manipulated answers conditions specified
226    in function documentation.  */
227 struct loop *tree_duplicate_loop_to_edge (struct loop *, 
228                                           struct loops *, edge, 
229                                           tree, tree, bool);
230
231 static void allocate_new_names (bitmap);
232 static void rename_use_op (use_operand_p);
233 static void rename_def_op (def_operand_p, tree);
234 static void rename_variables_in_bb (basic_block);
235 static void free_new_names (bitmap);
236 static void rename_variables_in_loop (struct loop *);
237 static void copy_phi_nodes (struct loop *, struct loop *, bool);
238 static void update_phis_for_duplicate_loop (struct loop *,
239                                             struct loop *, 
240                                             bool after);
241 static void update_phi_nodes_for_guard (edge, struct loop *);  
242 static void make_loop_iterate_ntimes (struct loop *, tree, tree, tree);
243 static struct loop *tree_duplicate_loop_to_edge_cfg (struct loop *, 
244                                                      struct loops *, 
245                                                      edge);
246 static edge add_loop_guard (basic_block, tree, basic_block);
247 static bool verify_loop_for_duplication (struct loop *, bool, edge);
248
249 /* Utilities dealing with loop peeling (not peeling itself).  */
250 static tree vect_gen_niters_for_prolog_loop (loop_vec_info, tree);
251 static void vect_update_niters_after_peeling (loop_vec_info, tree);
252 static void vect_update_inits_of_dr (struct data_reference *, struct loop *, 
253                                      tree niters);
254 static void vect_update_inits_of_drs (loop_vec_info, tree);
255 static void vect_do_peeling_for_alignment (loop_vec_info, struct loops *);
256
257 /* Utilities for creation and deletion of vec_info structs.  */
258 loop_vec_info new_loop_vec_info (struct loop *loop);
259 void destroy_loop_vec_info (loop_vec_info);
260 stmt_vec_info new_stmt_vec_info (tree stmt, struct loop *loop);
261
262 static bool vect_debug_stats (struct loop *loop);
263 static bool vect_debug_details (struct loop *loop);
264
265 \f
266 /* Utilities to support loop peeling for vectorization purposes.  */
267
268
269 /* For each definition in DEFINITIONS this function allocates 
270    new ssa name.  */
271
272 static void
273 allocate_new_names (bitmap definitions)
274 {
275   unsigned ver;
276   bitmap_iterator bi;
277
278   EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
279     {
280       tree def = ssa_name (ver);
281       tree *new_name_ptr = xmalloc (sizeof (tree));
282
283       bool abnormal = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def);
284
285       *new_name_ptr = duplicate_ssa_name (def, SSA_NAME_DEF_STMT (def));
286       SSA_NAME_OCCURS_IN_ABNORMAL_PHI (*new_name_ptr) = abnormal;
287
288       SSA_NAME_AUX (def) = new_name_ptr;
289     }
290 }
291
292
293 /* Renames the use *OP_P.  */
294
295 static void
296 rename_use_op (use_operand_p op_p)
297 {
298   tree *new_name_ptr;
299
300   if (TREE_CODE (USE_FROM_PTR (op_p)) != SSA_NAME)
301     return;
302
303   new_name_ptr = SSA_NAME_AUX (USE_FROM_PTR (op_p));
304
305   /* Something defined outside of the loop.  */
306   if (!new_name_ptr)
307     return;
308
309   /* An ordinary ssa name defined in the loop.  */
310
311   SET_USE (op_p, *new_name_ptr);
312 }
313
314
315 /* Renames the def *OP_P in statement STMT.  */
316
317 static void
318 rename_def_op (def_operand_p op_p, tree stmt)
319 {
320   tree *new_name_ptr;
321
322   if (TREE_CODE (DEF_FROM_PTR (op_p)) != SSA_NAME)
323     return;
324
325   new_name_ptr = SSA_NAME_AUX (DEF_FROM_PTR (op_p));
326
327   /* Something defined outside of the loop.  */
328   if (!new_name_ptr)
329     return;
330
331   /* An ordinary ssa name defined in the loop.  */
332
333   SET_DEF (op_p, *new_name_ptr);
334   SSA_NAME_DEF_STMT (DEF_FROM_PTR (op_p)) = stmt;
335 }
336
337
338 /* Renames the variables in basic block BB.  */
339
340 static void
341 rename_variables_in_bb (basic_block bb)
342 {
343   tree phi;
344   block_stmt_iterator bsi;
345   tree stmt;
346   stmt_ann_t ann;
347   use_optype uses;
348   vuse_optype vuses;
349   def_optype defs;
350   v_may_def_optype v_may_defs;
351   v_must_def_optype v_must_defs;
352   unsigned i;
353   edge e;
354   edge_iterator ei;
355
356   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
357     rename_def_op (PHI_RESULT_PTR (phi), phi);
358
359   for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
360     {
361       stmt = bsi_stmt (bsi);
362       get_stmt_operands (stmt);
363       ann = stmt_ann (stmt);
364
365       uses = USE_OPS (ann);
366       for (i = 0; i < NUM_USES (uses); i++)
367         rename_use_op (USE_OP_PTR (uses, i));
368
369       defs = DEF_OPS (ann);
370       for (i = 0; i < NUM_DEFS (defs); i++)
371         rename_def_op (DEF_OP_PTR (defs, i), stmt);
372
373       vuses = VUSE_OPS (ann);
374       for (i = 0; i < NUM_VUSES (vuses); i++)
375         rename_use_op (VUSE_OP_PTR (vuses, i));
376
377       v_may_defs = V_MAY_DEF_OPS (ann);
378       for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
379         {
380           rename_use_op (V_MAY_DEF_OP_PTR (v_may_defs, i));
381           rename_def_op (V_MAY_DEF_RESULT_PTR (v_may_defs, i), stmt);
382         }
383
384       v_must_defs = V_MUST_DEF_OPS (ann);
385       for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
386         {
387           rename_use_op (V_MUST_DEF_KILL_PTR (v_must_defs, i));
388           rename_def_op (V_MUST_DEF_RESULT_PTR (v_must_defs, i), stmt);
389         }
390     }
391
392   FOR_EACH_EDGE (e, ei, bb->succs)
393     for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
394       rename_use_op (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e));
395 }
396
397
398 /* Releases the structures holding the new ssa names.  */
399
400 static void
401 free_new_names (bitmap definitions)
402 {
403   unsigned ver;
404   bitmap_iterator bi;
405
406   EXECUTE_IF_SET_IN_BITMAP (definitions, 0, ver, bi)
407     {
408       tree def = ssa_name (ver);
409
410       if (SSA_NAME_AUX (def))
411         {
412           free (SSA_NAME_AUX (def));
413           SSA_NAME_AUX (def) = NULL;
414         }
415     }
416 }
417
418
419 /* Renames variables in new generated LOOP.  */
420
421 static void
422 rename_variables_in_loop (struct loop *loop)
423 {
424   unsigned i;
425   basic_block *bbs;
426
427   bbs = get_loop_body (loop);
428
429   for (i = 0; i < loop->num_nodes; i++)
430     rename_variables_in_bb (bbs[i]);
431
432   free (bbs);
433 }
434
435
436 /* This function copies phis from LOOP header to
437    NEW_LOOP header. AFTER is as
438    in update_phis_for_duplicate_loop function.  */
439
440 static void
441 copy_phi_nodes (struct loop *loop, struct loop *new_loop,
442                       bool after)
443 {
444   tree phi, new_phi, def;
445   edge new_e;
446   edge e = (after ? loop_latch_edge (loop) : loop_preheader_edge (loop));
447
448   /* Second add arguments to newly created phi nodes.  */
449   for (phi = phi_nodes (loop->header),
450          new_phi = phi_nodes (new_loop->header);
451        phi;
452        phi = PHI_CHAIN (phi),
453          new_phi = PHI_CHAIN (new_phi))
454     {
455       new_e = loop_preheader_edge (new_loop);
456       def = PHI_ARG_DEF_FROM_EDGE (phi, e);
457       add_phi_arg (&new_phi, def, new_e);
458     }
459 }
460
461
462 /* Update the PHI nodes of the NEW_LOOP. AFTER is true if the NEW_LOOP
463    executes after LOOP, and false if it executes before it.  */
464
465 static void
466 update_phis_for_duplicate_loop (struct loop *loop,
467                                 struct loop *new_loop, bool after)
468 {
469   edge old_latch;
470   tree *new_name_ptr, new_ssa_name;
471   tree phi_new, phi_old, def;
472   edge orig_entry_e = loop_preheader_edge (loop);
473
474   /* Copy phis from loop->header to new_loop->header.  */
475   copy_phi_nodes (loop, new_loop, after);
476
477   old_latch = loop_latch_edge (loop);
478
479   /* Update PHI args for the new loop latch edge, and
480      the old loop preheader edge, we know that the PHI nodes
481      are ordered appropriately in copy_phi_nodes.  */
482   for (phi_new = phi_nodes (new_loop->header),
483        phi_old = phi_nodes (loop->header);
484        phi_new && phi_old;
485        phi_new = PHI_CHAIN (phi_new), phi_old = PHI_CHAIN (phi_old))
486     {
487       def = PHI_ARG_DEF_FROM_EDGE (phi_old, old_latch);
488
489       if (TREE_CODE (def) != SSA_NAME)
490         continue;
491
492       new_name_ptr = SSA_NAME_AUX (def);
493
494       /* Something defined outside of the loop.  */
495       if (!new_name_ptr)
496         continue;
497
498       /* An ordinary ssa name defined in the loop.  */
499       new_ssa_name = *new_name_ptr;
500
501       add_phi_arg (&phi_new, new_ssa_name, loop_latch_edge(new_loop));
502
503       /* Update PHI args for the original loop pre-header edge.  */
504       if (! after)
505         SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi_old, orig_entry_e),
506                  new_ssa_name);
507     }
508 }
509
510
511 /* Update PHI nodes for a guard of the LOOP.
512
513    LOOP is supposed to have a preheader bb at which a guard condition is 
514    located.  The true edge of this condition skips the LOOP and ends
515    at the destination of the (unique) LOOP exit.  The loop exit bb is supposed 
516    to be an empty bb (created by this transformation) with one successor.
517
518    This function creates phi nodes at the LOOP exit bb.  These phis need to be
519    created as a result of adding true edge coming from guard.
520
521    FORNOW: Only phis which have corresponding phi nodes at the header of the
522    LOOP are created.  Here we use the assumption that after the LOOP there
523    are no uses of defs generated in LOOP.
524
525    After the phis creation, the function updates the values of phi nodes at
526    the LOOP exit successor bb:
527
528    Original loop:
529
530    bb0: loop preheader
531         goto bb1
532    bb1: loop header
533         if (exit_cond) goto bb3 else goto bb2
534    bb2: loop latch
535         goto bb1
536    bb3:
537
538
539    After guard creation (the loop before this function):
540
541    bb0: loop preheader
542         if (guard_condition) goto bb4 else goto bb1
543    bb1: loop header
544         if (exit_cond) goto bb4 else goto bb2
545    bb2: loop latch
546         goto bb1
547    bb4: loop exit       
548         (new empty bb)
549         goto bb3
550    bb3:
551
552    This function updates the phi nodes in bb4 and in bb3, to account for the 
553    new edge from bb0 to bb4.  */
554
555 static void
556 update_phi_nodes_for_guard (edge guard_true_edge, struct loop * loop)
557 {
558   tree phi, phi1;
559   basic_block bb = loop->exit_edges[0]->dest;
560
561   for (phi = phi_nodes (loop->header); phi; phi = PHI_CHAIN (phi))
562       {
563         tree new_phi;
564         tree phi_arg;
565
566         /* Generate new phi node.  */
567         new_phi = create_phi_node (SSA_NAME_VAR (PHI_RESULT (phi)), bb);
568
569         /* Add argument coming from guard true edge.  */
570         phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, loop->entry_edges[0]);
571         add_phi_arg (&new_phi, phi_arg, guard_true_edge);
572
573         /* Add argument coming from loop exit edge.  */
574         phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, EDGE_SUCC (loop->latch, 0));                                 
575         add_phi_arg (&new_phi, phi_arg, loop->exit_edges[0]);
576       
577         /* Update all phi nodes at the loop exit successor.  */
578         for (phi1 = phi_nodes (EDGE_SUCC (bb, 0)->dest); 
579              phi1; 
580              phi1 = PHI_CHAIN (phi1))
581           {
582             tree old_arg = PHI_ARG_DEF_FROM_EDGE (phi1, EDGE_SUCC (bb, 0));
583             if (old_arg == phi_arg)
584               { 
585                 edge e = EDGE_SUCC (bb, 0);
586
587                 SET_PHI_ARG_DEF (phi1, 
588                                  phi_arg_from_edge (phi1, e),
589                                  PHI_RESULT (new_phi)); 
590               }
591           }
592       }       
593
594   set_phi_nodes (bb, phi_reverse (phi_nodes (bb)));
595 }
596
597
598 /* Make the LOOP iterate NITERS times. This is done by adding a new IV
599    that starts at zero, increases by one and its limit is NITERS.  */
600
601 static void
602 make_loop_iterate_ntimes (struct loop *loop, tree niters,
603                           tree begin_label, tree exit_label)
604 {
605   tree indx_before_incr, indx_after_incr, cond_stmt, cond;
606   tree orig_cond;
607   edge exit_edge = loop->exit_edges[0];
608   block_stmt_iterator loop_exit_bsi = bsi_last (exit_edge->src);
609
610   /* Flow loop scan does not update loop->single_exit field.  */
611   loop->single_exit = loop->exit_edges[0];
612   orig_cond = get_loop_exit_condition (loop);
613   gcc_assert (orig_cond);
614   create_iv (integer_zero_node, integer_one_node, NULL_TREE, loop,
615              &loop_exit_bsi, false, &indx_before_incr, &indx_after_incr);
616   
617   /* CREATE_IV uses BSI_INSERT with TSI_NEW_STMT, so we want to get
618      back to the exit condition statement.  */
619   bsi_next (&loop_exit_bsi);
620   gcc_assert (bsi_stmt (loop_exit_bsi) == orig_cond);
621
622
623   if (exit_edge->flags & EDGE_TRUE_VALUE) /* 'then' edge exits the loop.  */
624     cond = build2 (GE_EXPR, boolean_type_node, indx_after_incr, niters);
625   else /* 'then' edge loops back.  */
626     cond = build2 (LT_EXPR, boolean_type_node, indx_after_incr, niters);
627
628   begin_label = build1 (GOTO_EXPR, void_type_node, begin_label);
629   exit_label = build1 (GOTO_EXPR, void_type_node, exit_label);
630   cond_stmt = build (COND_EXPR, TREE_TYPE (orig_cond), cond,
631                      begin_label, exit_label);
632   bsi_insert_before (&loop_exit_bsi, cond_stmt, BSI_SAME_STMT);
633
634   /* Remove old loop exit test:  */
635   bsi_remove (&loop_exit_bsi);
636
637   if (vect_debug_stats (loop) || vect_debug_details (loop))
638     print_generic_expr (dump_file, cond_stmt, TDF_SLIM);
639 }
640
641
642 /* Given LOOP this function generates a new copy of it and puts it 
643    on E which is either the entry or exit of LOOP.  */
644
645 static struct loop *
646 tree_duplicate_loop_to_edge_cfg (struct loop *loop, struct loops *loops, 
647                                  edge e)
648 {
649   struct loop *new_loop;
650   basic_block *new_bbs, *bbs;
651   bool at_exit;
652   bool was_imm_dom;
653   basic_block exit_dest; 
654   tree phi, phi_arg;
655
656   at_exit = (e == loop->exit_edges[0]); 
657   if (!at_exit && e != loop_preheader_edge (loop))
658     {
659       if (dump_file && (dump_flags & TDF_DETAILS))
660           fprintf (dump_file,
661                    "Edge is not an entry nor an exit edge.\n");
662       return NULL;
663     }
664
665   bbs = get_loop_body (loop);
666
667   /* Check whether duplication is possible.  */
668   if (!can_copy_bbs_p (bbs, loop->num_nodes))
669     {
670       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
671           fprintf (dump_file,
672                    "Cannot copy basic blocks.\n");
673       free (bbs);
674       return NULL;
675     }
676
677   /* Generate new loop structure.  */
678   new_loop = duplicate_loop (loops, loop, loop->outer);
679   if (!new_loop)
680     {
681       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
682           fprintf (dump_file,
683                    "The duplicate_loop returns NULL.\n");
684       free (bbs);
685       return NULL;
686     }
687
688   exit_dest = loop->exit_edges[0]->dest;
689   was_imm_dom = (get_immediate_dominator (CDI_DOMINATORS, 
690                                           exit_dest) == loop->header ? 
691                  true : false);
692
693   new_bbs = xmalloc (sizeof (basic_block) * loop->num_nodes);
694
695   copy_bbs (bbs, loop->num_nodes, new_bbs, NULL, 0, NULL, NULL);
696
697   /* Duplicating phi args at exit bbs as coming 
698      also from exit of duplicated loop.  */
699   for (phi = phi_nodes (exit_dest); phi; phi = PHI_CHAIN (phi))
700     {
701       phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, loop->exit_edges[0]);
702       if (phi_arg)
703         {
704           edge new_loop_exit_edge;
705
706           if (EDGE_SUCC (new_loop->header, 0)->dest == new_loop->latch)
707             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 1);
708           else
709             new_loop_exit_edge = EDGE_SUCC (new_loop->header, 0);
710   
711           add_phi_arg (&phi, phi_arg, new_loop_exit_edge);      
712         }
713     }    
714    
715   if (at_exit) /* Add the loop copy at exit.  */
716     {
717       redirect_edge_and_branch_force (e, new_loop->header);
718       set_immediate_dominator (CDI_DOMINATORS, new_loop->header, e->src);
719       if (was_imm_dom)
720         set_immediate_dominator (CDI_DOMINATORS, exit_dest, new_loop->header);
721     }
722   else /* Add the copy at entry.  */
723     {
724       edge new_exit_e;
725       edge entry_e = loop_preheader_edge (loop);
726       basic_block preheader = entry_e->src;
727            
728       if (!flow_bb_inside_loop_p (new_loop, 
729                                   EDGE_SUCC (new_loop->header, 0)->dest))
730         new_exit_e = EDGE_SUCC (new_loop->header, 0);
731       else
732         new_exit_e = EDGE_SUCC (new_loop->header, 1); 
733
734       redirect_edge_and_branch_force (new_exit_e, loop->header);
735       set_immediate_dominator (CDI_DOMINATORS, loop->header,
736                                new_exit_e->src);
737
738       /* We have to add phi args to the loop->header here as coming 
739          from new_exit_e edge.  */
740       for (phi = phi_nodes (loop->header); phi; phi = PHI_CHAIN (phi))
741         {
742           phi_arg = PHI_ARG_DEF_FROM_EDGE (phi, entry_e);
743           if (phi_arg)
744             add_phi_arg (&phi, phi_arg, new_exit_e);    
745         }    
746
747       redirect_edge_and_branch_force (entry_e, new_loop->header);
748       set_immediate_dominator (CDI_DOMINATORS, new_loop->header, preheader);
749     }
750
751   flow_loop_scan (new_loop, LOOP_ALL);
752   flow_loop_scan (loop, LOOP_ALL);  
753   free (new_bbs);
754   free (bbs);
755
756   return new_loop;
757 }
758
759
760 /* Given the condition statement COND, put it as the last statement
761    of GUARD_BB; EXIT_BB is the basic block to skip the loop;
762    Assumes that this is the single exit of the guarded loop.  
763    Returns the skip edge.  */
764
765 static edge
766 add_loop_guard (basic_block guard_bb, tree cond, basic_block exit_bb)
767 {
768   block_stmt_iterator bsi;
769   edge new_e, enter_e;
770   tree cond_stmt, then_label, else_label;
771
772   enter_e = EDGE_SUCC (guard_bb, 0);
773   enter_e->flags &= ~EDGE_FALLTHRU;
774   enter_e->flags |= EDGE_FALSE_VALUE;
775   bsi = bsi_last (guard_bb);
776
777   then_label = build1 (GOTO_EXPR, void_type_node,
778                        tree_block_label (exit_bb));
779   else_label = build1 (GOTO_EXPR, void_type_node,
780                        tree_block_label (enter_e->dest));
781   cond_stmt = build (COND_EXPR, void_type_node, cond,
782                      then_label, else_label);
783   bsi_insert_after (&bsi, cond_stmt, BSI_NEW_STMT);
784   /* Add new edge to connect entry block to the second loop.  */
785   new_e = make_edge (guard_bb, exit_bb, EDGE_TRUE_VALUE);
786   set_immediate_dominator (CDI_DOMINATORS, exit_bb, guard_bb);
787   return new_e;
788 }
789
790
791 /* This function verifies that certain restrictions apply to LOOP.  */
792
793 static bool
794 verify_loop_for_duplication (struct loop *loop,
795                              bool update_first_loop_count, edge e)
796 {
797   edge exit_e = loop->exit_edges [0];
798   edge entry_e = loop_preheader_edge (loop);
799
800   /* We duplicate only innermost loops.  */
801   if (loop->inner)
802     {
803       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
804           fprintf (dump_file,
805                    "Loop duplication failed. Loop is not innermost.\n");
806       return false;
807     }
808
809   /* Only loops with 1 exit.  */
810   if (loop->num_exits != 1)
811     {
812       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
813           fprintf (dump_file,
814                    "More than one exit from loop.\n");
815       return false;
816     }
817
818   /* Only loops with 1 entry.  */
819   if (loop->num_entries != 1)
820     {
821       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
822           fprintf (dump_file,
823                    "More than one exit from loop.\n");
824       return false;
825     }
826
827   /* All loops has outers, the only case loop->outer is NULL is for
828      the function itself.  */
829   if (!loop->outer)
830     {
831       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
832           fprintf (dump_file,
833                    "Loop is outer-most loop.\n");
834       return false;
835     }
836   
837   /* Verify that new IV can be created and loop condition 
838      can be changed to make first loop iterate first_niters times.  */
839   if (!update_first_loop_count)
840     {
841       tree orig_cond = get_loop_exit_condition (loop);
842       block_stmt_iterator loop_exit_bsi = bsi_last (exit_e->src);
843       
844       if (!orig_cond)
845         {
846           if (vect_debug_stats (loop) || vect_debug_details (loop))     
847             fprintf (dump_file,
848                      "Loop has no exit condition.\n");
849           return false;
850         }
851       if (orig_cond != bsi_stmt (loop_exit_bsi))
852         {
853           if (vect_debug_stats (loop) || vect_debug_details (loop))     
854             fprintf (dump_file,
855                      "Loop exit condition is not loop header last stmt.\n");
856           return false;
857         }
858     }
859
860   /* Make sure E is either an entry or an exit edge.  */
861   if (e != exit_e && e != entry_e)
862     {
863       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
864         fprintf (dump_file,
865                  "E is not loop entry or exit edge.\n");
866       return false;
867     }
868
869   return true;
870 }
871
872
873 /* Given LOOP this function duplicates it to the edge E. 
874
875    This transformation takes place before the loop is vectorized. 
876    For now, there are two main cases when it's used 
877    by the vectorizer: to support loops with unknown loop bounds 
878    (or loop bounds indivisible by vectorization factor) and to force the 
879    alignment of data references in the loop. In the first case, LOOP is 
880    duplicated to the exit edge, producing epilog loop. In the second case, LOOP 
881    is duplicated to the preheader edge thus generating prolog loop. In both 
882    cases, the original loop will be vectorized after the transformation. 
883
884    The edge E is supposed to be either preheader edge of the LOOP or  
885    its exit edge. If preheader edge is specified, the LOOP copy 
886    will precede the original one. Otherwise the copy will be located 
887    at the exit of the LOOP.
888    
889    FIRST_NITERS (SSA_NAME) parameter specifies how many times to iterate 
890    the first loop. If UPDATE_FIRST_LOOP_COUNT parameter is false, the first 
891    loop will be iterated FIRST_NITERS times by introducing additional 
892    induction variable and replacing loop exit condition. If 
893    UPDATE_FIRST_LOOP_COUNT is true no change to the first loop is made and 
894    the caller to tree_duplicate_loop_to_edge is responsible for updating 
895    the first loop count.
896    
897    NITERS (also SSA_NAME) parameter defines the number of iteration the
898    original loop iterated. The function generates two if-then guards: 
899    one prior to the first loop and the other prior to the second loop. 
900    The first guard will be:
901
902    if (FIRST_NITERS == 0) then skip the first loop
903    
904    The second guard will be:
905
906    if (FIRST_NITERS == NITERS) then skip the second loop
907
908    Thus the equivalence to the original code is guaranteed by correct values 
909    of NITERS and FIRST_NITERS and generation of if-then loop guards.
910
911    For now this function supports only loop forms that are candidate for 
912    vectorization. Such types are the following: 
913
914    (1) only innermost loops 
915    (2) loops built from 2 basic blocks 
916    (3) loops with one entry and one exit
917    (4) loops without function calls
918    (5) loops without defs that are used after the loop 
919
920    (1), (3) are checked in this function; (2) - in function 
921    vect_analyze_loop_form; (4) - in function vect_analyze_data_refs;
922    (5) is checked as part of the function vect_mark_stmts_to_be_vectorized, 
923    when excluding induction/reduction support.   
924
925    The function returns NULL in case one of these checks or 
926    transformations failed.  */
927    
928 struct loop*
929 tree_duplicate_loop_to_edge (struct loop *loop, struct loops *loops, 
930                              edge e, tree first_niters, 
931                              tree niters, bool update_first_loop_count)
932 {
933   struct loop *new_loop = NULL, *first_loop, *second_loop;
934   edge skip_e;
935   tree pre_condition;
936   bitmap definitions;
937   basic_block first_exit_bb, second_exit_bb;
938   basic_block pre_header_bb;
939   edge exit_e = loop->exit_edges [0];
940
941   gcc_assert (!any_marked_for_rewrite_p ());
942
943   if (!verify_loop_for_duplication (loop, update_first_loop_count, e))
944       return NULL;
945
946   /* We have to initialize cfg_hooks. Then, when calling 
947    cfg_hooks->split_edge, the function tree_split_edge 
948    is actually called and, when calling cfg_hooks->duplicate_block, 
949    the function tree_duplicate_bb is called.  */
950   tree_register_cfg_hooks ();
951
952   /* 1. Generate a copy of LOOP and put it on E (entry or exit).  */
953   if (!(new_loop = tree_duplicate_loop_to_edge_cfg (loop, loops, e)))
954     {
955       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
956         fprintf (dump_file,
957                  "The tree_duplicate_loop_to_edge_cfg failed.\n");
958       return NULL;
959     }
960
961   definitions = marked_ssa_names ();
962   allocate_new_names (definitions);
963   update_phis_for_duplicate_loop (loop, new_loop, e == exit_e);
964   /* Here, using assumption (5), we do not propagate new names further 
965      than on phis of the exit from the second loop.  */
966   rename_variables_in_loop (new_loop);
967   free_new_names (definitions);
968
969   if (e == exit_e)
970     {
971       first_loop = loop;
972       second_loop = new_loop;
973     }
974   else 
975     {
976       first_loop = new_loop;
977       second_loop = loop;
978     }
979
980   /* 2. Generate bb between the loops.  */
981   first_exit_bb = split_edge (first_loop->exit_edges[0]);
982   add_bb_to_loop (first_exit_bb, first_loop->outer);
983
984   /* We need to update here first loop exit edge 
985      and second loop preheader edge.  */
986   flow_loop_scan (first_loop, LOOP_ALL);
987   flow_loop_scan (second_loop, LOOP_ALL);  
988
989   /* 3. Make first loop iterate FIRST_NITERS times, if needed.  */
990   if (!update_first_loop_count)
991     {
992       tree first_loop_latch_lbl = tree_block_label (first_loop->latch);
993       tree first_loop_exit_lbl = tree_block_label (first_exit_bb);
994
995       make_loop_iterate_ntimes (first_loop, first_niters,
996                                 first_loop_latch_lbl,
997                                 first_loop_exit_lbl);
998     }
999   
1000   /* 4. Add the guard before first loop:
1001
1002      if FIRST_NITERS == 0 
1003        skip first loop
1004      else 
1005        enter first loop  */
1006
1007   /* 4a. Generate bb before first loop.  */
1008   pre_header_bb = split_edge (loop_preheader_edge (first_loop));
1009   add_bb_to_loop (pre_header_bb, first_loop->outer);
1010
1011   /* First loop preheader edge is changed.  */
1012   flow_loop_scan (first_loop, LOOP_ALL);
1013
1014   /* 4b. Generate guard condition.  */
1015   pre_condition = build (LE_EXPR, boolean_type_node,
1016                            first_niters, integer_zero_node);
1017
1018   /* 4c. Add condition at the end of preheader bb.  */
1019   skip_e = add_loop_guard (pre_header_bb, pre_condition, first_exit_bb);
1020
1021   /* 4d. Update phis at first loop exit and propagate changes 
1022      to the phis of second loop.  */
1023   update_phi_nodes_for_guard (skip_e, first_loop);
1024
1025   /* 5. Add the guard before second loop:
1026
1027      if FIRST_NITERS == NITERS SKIP
1028        skip second loop
1029      else 
1030        enter second loop  */
1031
1032   /* 5a. Generate empty bb at the exit from the second loop.  */
1033   second_exit_bb = split_edge (second_loop->exit_edges[0]);
1034   add_bb_to_loop (second_exit_bb, second_loop->outer);
1035
1036   /* Second loop preheader edge is changed.  */
1037   flow_loop_scan (second_loop, LOOP_ALL);
1038
1039   /* 5b. Generate guard condition.  */
1040   pre_condition = build (EQ_EXPR, boolean_type_node,
1041                            first_niters, niters);
1042
1043   /* 5c. Add condition at the end of preheader bb.  */
1044   skip_e = add_loop_guard (first_exit_bb, pre_condition, second_exit_bb);
1045   update_phi_nodes_for_guard (skip_e, second_loop);
1046
1047   BITMAP_XFREE (definitions);
1048   unmark_all_for_rewrite ();
1049   
1050   return new_loop;
1051 }
1052
1053
1054 \f
1055 /* Here the proper Vectorizer starts.  */
1056
1057 /* Function new_stmt_vec_info.
1058
1059    Create and initialize a new stmt_vec_info struct for STMT.  */
1060
1061 stmt_vec_info
1062 new_stmt_vec_info (tree stmt, struct loop *loop)
1063 {
1064   stmt_vec_info res;
1065   res = (stmt_vec_info) xcalloc (1, sizeof (struct _stmt_vec_info));
1066
1067   STMT_VINFO_TYPE (res) = undef_vec_info_type;
1068   STMT_VINFO_STMT (res) = stmt;
1069   STMT_VINFO_LOOP (res) = loop;
1070   STMT_VINFO_RELEVANT_P (res) = 0;
1071   STMT_VINFO_VECTYPE (res) = NULL;
1072   STMT_VINFO_VEC_STMT (res) = NULL;
1073   STMT_VINFO_DATA_REF (res) = NULL;
1074   STMT_VINFO_MEMTAG (res) = NULL;
1075   STMT_VINFO_VECT_DR_BASE (res) = NULL;
1076
1077   return res;
1078 }
1079
1080
1081 /* Function new_loop_vec_info.
1082
1083    Create and initialize a new loop_vec_info struct for LOOP, as well as
1084    stmt_vec_info structs for all the stmts in LOOP.  */
1085
1086 loop_vec_info
1087 new_loop_vec_info (struct loop *loop)
1088 {
1089   loop_vec_info res;
1090   basic_block *bbs;
1091   block_stmt_iterator si;
1092   unsigned int i;
1093
1094   res = (loop_vec_info) xcalloc (1, sizeof (struct _loop_vec_info));
1095
1096   bbs = get_loop_body (loop);
1097
1098   /* Create stmt_info for all stmts in the loop.  */
1099   for (i = 0; i < loop->num_nodes; i++)
1100     {
1101       basic_block bb = bbs[i];
1102       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1103         {
1104           tree stmt = bsi_stmt (si);
1105           stmt_ann_t ann;
1106
1107           get_stmt_operands (stmt);
1108           ann = stmt_ann (stmt);
1109           set_stmt_info (ann, new_stmt_vec_info (stmt, loop));
1110         }
1111     }
1112
1113   LOOP_VINFO_LOOP (res) = loop;
1114   LOOP_VINFO_BBS (res) = bbs;
1115   LOOP_VINFO_EXIT_COND (res) = NULL;
1116   LOOP_VINFO_NITERS (res) = NULL;
1117   LOOP_VINFO_VECTORIZABLE_P (res) = 0;
1118   LOOP_DO_PEELING_FOR_ALIGNMENT (res) = false;
1119   LOOP_VINFO_VECT_FACTOR (res) = 0;
1120   VARRAY_GENERIC_PTR_INIT (LOOP_VINFO_DATAREF_WRITES (res), 20,
1121                            "loop_write_datarefs");
1122   VARRAY_GENERIC_PTR_INIT (LOOP_VINFO_DATAREF_READS (res), 20,
1123                            "loop_read_datarefs");
1124   LOOP_VINFO_UNALIGNED_DR (res) = NULL;
1125
1126   return res;
1127 }
1128
1129
1130 /* Function destroy_loop_vec_info.
1131  
1132    Free LOOP_VINFO struct, as well as all the stmt_vec_info structs of all the 
1133    stmts in the loop.  */
1134
1135 void
1136 destroy_loop_vec_info (loop_vec_info loop_vinfo)
1137 {
1138   struct loop *loop;
1139   basic_block *bbs;
1140   int nbbs;
1141   block_stmt_iterator si;
1142   int j;
1143
1144   if (!loop_vinfo)
1145     return;
1146
1147   loop = LOOP_VINFO_LOOP (loop_vinfo);
1148
1149   bbs = LOOP_VINFO_BBS (loop_vinfo);
1150   nbbs = loop->num_nodes;
1151
1152   for (j = 0; j < nbbs; j++)
1153     {
1154       basic_block bb = bbs[j];
1155       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1156         {
1157           tree stmt = bsi_stmt (si);
1158           stmt_ann_t ann = stmt_ann (stmt);
1159           stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1160           free (stmt_info);
1161           set_stmt_info (ann, NULL);
1162         }
1163     }
1164
1165   free (LOOP_VINFO_BBS (loop_vinfo));
1166   varray_clear (LOOP_VINFO_DATAREF_WRITES (loop_vinfo));
1167   varray_clear (LOOP_VINFO_DATAREF_READS (loop_vinfo));
1168
1169   free (loop_vinfo);
1170 }
1171
1172
1173 /* Function debug_loop_stats.
1174
1175    For vectorization statistics dumps.  */
1176
1177 static bool
1178 vect_debug_stats (struct loop *loop)
1179 {
1180   basic_block bb;
1181   block_stmt_iterator si;
1182   tree node = NULL_TREE;
1183
1184   if (!dump_file || !(dump_flags & TDF_STATS))
1185     return false;
1186
1187   if (!loop)
1188     {
1189       fprintf (dump_file, "\n");
1190       return true;
1191     }
1192
1193   if (!loop->header)
1194     return false;
1195
1196   bb = loop->header;
1197
1198   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1199     {
1200       node = bsi_stmt (si);
1201       if (node && EXPR_P (node) && EXPR_LOCUS (node))
1202         break;
1203     }
1204
1205   if (node && EXPR_P (node) && EXPR_LOCUS (node) 
1206       && EXPR_FILENAME (node) && EXPR_LINENO (node))
1207     {
1208       fprintf (dump_file, "\nloop at %s:%d: ", 
1209         EXPR_FILENAME (node), EXPR_LINENO (node));
1210       return true;
1211     }
1212
1213   return false;
1214 }
1215
1216
1217 /* Function debug_loop_details.
1218
1219    For vectorization debug dumps.  */
1220
1221 static bool
1222 vect_debug_details (struct loop *loop)
1223 {
1224    basic_block bb;
1225    block_stmt_iterator si;
1226    tree node = NULL_TREE;
1227
1228   if (!dump_file || !(dump_flags & TDF_DETAILS))
1229     return false;
1230
1231   if (!loop)
1232     {
1233       fprintf (dump_file, "\n");
1234       return true;
1235     }
1236
1237   if (!loop->header)
1238     return false;
1239
1240   bb = loop->header;
1241
1242   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
1243     {
1244       node = bsi_stmt (si);
1245       if (node && EXPR_P (node) && EXPR_LOCUS (node))
1246         break;
1247     }
1248
1249   if (node && EXPR_P (node) && EXPR_LOCUS (node)
1250       && EXPR_FILENAME (node) && EXPR_LINENO (node))
1251     {
1252       fprintf (dump_file, "\nloop at %s:%d: ", 
1253                EXPR_FILENAME (node), EXPR_LINENO (node));
1254       return true;
1255     }
1256
1257   return false;
1258 }
1259
1260
1261 /* Function vect_get_ptr_offset
1262
1263    Compute the OFFSET modulo vector-type alignment of pointer REF in bits.  */
1264
1265 static tree 
1266 vect_get_ptr_offset (tree ref ATTRIBUTE_UNUSED, 
1267                      tree vectype ATTRIBUTE_UNUSED, 
1268                      tree *offset ATTRIBUTE_UNUSED)
1269 {
1270   /* TODO: Use alignment information.  */
1271   return NULL_TREE; 
1272 }
1273
1274
1275 /* Function vect_get_base_and_bit_offset
1276
1277    Return the BASE of the data reference EXPR.
1278    If VECTYPE is given, also compute the OFFSET from BASE in bits.
1279    E.g., for EXPR a.b[i] + 4B, BASE is a, and OFFSET is the overall offset in 
1280    bits of 'a.b[i] + 4B' from a.
1281
1282    Input:
1283    EXPR - the memory reference that is being analyzed
1284    DR - the data_reference struct of the _original_ memory reference
1285         (Note: DR_REF (DR) is not necessarily EXPR)
1286    VECTYPE - the type that defines the alignment (i.e, we compute
1287              alignment relative to TYPE_ALIGN(VECTYPE))
1288    
1289    Output:
1290    BASE (returned value) - the base of the data reference EXPR.
1291                            E.g, if EXPR is a.b[k].c[i][j] the returned
1292                            base is a.
1293    OFFSET - offset of EXPR from BASE in bits
1294    BASE_ALIGNED_P - indicates if BASE is aligned
1295  
1296    If something unexpected is encountered (an unsupported form of data-ref),
1297    or if VECTYPE is given but OFFSET cannot be determined:
1298    then NULL_TREE is returned.  */
1299
1300 static tree 
1301 vect_get_base_and_bit_offset (struct data_reference *dr, 
1302                               tree expr, 
1303                               tree vectype, 
1304                               loop_vec_info loop_vinfo,
1305                               tree *offset,
1306                               bool *base_aligned_p)
1307 {
1308   tree this_offset = size_zero_node;
1309   tree base = NULL_TREE;
1310   tree next_ref;
1311   tree oprnd0, oprnd1;
1312   struct data_reference *array_dr;
1313   enum tree_code code = TREE_CODE (expr);
1314
1315   *base_aligned_p = false;
1316
1317   switch (code)
1318     {
1319     /* These cases end the recursion:  */
1320     case VAR_DECL:
1321       *offset = size_zero_node;
1322       if (vectype && DECL_ALIGN (expr) >= TYPE_ALIGN (vectype))
1323         *base_aligned_p = true;
1324       return expr;
1325
1326     case SSA_NAME:
1327       if (!vectype)
1328         return expr;
1329
1330       if (TREE_CODE (TREE_TYPE (expr)) != POINTER_TYPE)
1331         return NULL_TREE;
1332       
1333       if (TYPE_ALIGN (TREE_TYPE (TREE_TYPE (expr))) < TYPE_ALIGN (vectype)) 
1334         {
1335           base = vect_get_ptr_offset (expr, vectype, offset);
1336           if (base)
1337             *base_aligned_p = true;
1338         }
1339       else
1340         {         
1341           *base_aligned_p = true;
1342           *offset = size_zero_node;
1343           base = expr;
1344         }
1345       return base;
1346       
1347     case INTEGER_CST:      
1348       *offset = int_const_binop (MULT_EXPR, expr,     
1349                                  build_int_cst (NULL_TREE, BITS_PER_UNIT), 1);
1350       return expr;
1351
1352     /* These cases continue the recursion:  */
1353     case COMPONENT_REF:
1354       oprnd0 = TREE_OPERAND (expr, 0);
1355       oprnd1 = TREE_OPERAND (expr, 1);
1356
1357       this_offset = bit_position (oprnd1);
1358       if (vectype && !host_integerp (this_offset, 1))
1359         return NULL_TREE;
1360       next_ref = oprnd0;
1361       break;
1362
1363     case ADDR_EXPR:
1364       oprnd0 = TREE_OPERAND (expr, 0);
1365       next_ref = oprnd0;
1366       break;
1367
1368     case INDIRECT_REF:
1369       oprnd0 = TREE_OPERAND (expr, 0);
1370       next_ref = oprnd0;
1371       break;
1372     
1373     case ARRAY_REF:
1374       if (DR_REF (dr) != expr)
1375         /* Build array data_reference struct if the existing DR_REF 
1376            doesn't match EXPR. This happens, for example, when the 
1377            EXPR is *T and T is initialized to &arr[indx]. The DR struct
1378            contains information on the access of T, not of arr. In order
1379            to continue  the analysis, we create a new DR struct that
1380            describes the access of arr.  
1381         */
1382         array_dr = analyze_array (DR_STMT (dr), expr, DR_IS_READ (dr));
1383       else
1384         array_dr = dr;
1385           
1386       next_ref = vect_compute_array_ref_alignment (array_dr, loop_vinfo,  
1387                                                    vectype, &this_offset);
1388       if (!next_ref)
1389         return NULL_TREE;
1390
1391       if (vectype &&
1392           TYPE_ALIGN (TREE_TYPE (TREE_TYPE (next_ref))) >= TYPE_ALIGN (vectype))
1393         {
1394           *offset = this_offset;
1395           *base_aligned_p = true;
1396           return next_ref;
1397         }
1398       break;
1399
1400     case PLUS_EXPR:
1401     case MINUS_EXPR:
1402       /* In case we have a PLUS_EXPR of the form
1403          (oprnd0 + oprnd1), we assume that only oprnd0 determines the base. 
1404          This is verified in  vect_get_symbl_and_dr.  */ 
1405       oprnd0 = TREE_OPERAND (expr, 0);
1406       oprnd1 = TREE_OPERAND (expr, 1);
1407
1408       base = vect_get_base_and_bit_offset 
1409         (dr, oprnd1, vectype, loop_vinfo, &this_offset, base_aligned_p);  
1410       if (vectype && !base) 
1411         return NULL_TREE;
1412
1413       next_ref = oprnd0;
1414       break;
1415
1416     default:
1417       return NULL_TREE;
1418     }
1419
1420   base = vect_get_base_and_bit_offset (dr, next_ref, vectype, 
1421                                        loop_vinfo, offset, base_aligned_p);  
1422
1423   if (vectype && base)
1424     {
1425       *offset = int_const_binop (PLUS_EXPR, *offset, this_offset, 1);
1426       if (!host_integerp (*offset, 1) || TREE_OVERFLOW (*offset))
1427         return NULL_TREE;
1428
1429       if (vect_debug_details (NULL))
1430         {
1431           print_generic_expr (dump_file, expr, TDF_SLIM);
1432           fprintf (dump_file, " --> total offset for ref: ");
1433           print_generic_expr (dump_file, *offset, TDF_SLIM);
1434         }
1435     }    
1436   return base;
1437 }
1438
1439
1440 /* Function vect_force_dr_alignment_p.
1441
1442    Returns whether the alignment of a DECL can be forced to be aligned
1443    on ALIGNMENT bit boundary.  */
1444
1445 static bool 
1446 vect_can_force_dr_alignment_p (tree decl, unsigned int alignment)
1447 {
1448   if (TREE_CODE (decl) != VAR_DECL)
1449     return false;
1450
1451   if (DECL_EXTERNAL (decl))
1452     return false;
1453
1454   if (TREE_STATIC (decl))
1455     return (alignment <= MAX_OFILE_ALIGNMENT);
1456   else
1457     /* This is not 100% correct.  The absolute correct stack alignment
1458        is STACK_BOUNDARY.  We're supposed to hope, but not assume, that
1459        PREFERRED_STACK_BOUNDARY is honored by all translation units.
1460        However, until someone implements forced stack alignment, SSE
1461        isn't really usable without this.  */  
1462     return (alignment <= PREFERRED_STACK_BOUNDARY); 
1463 }
1464
1465
1466 /* Function vect_get_new_vect_var.
1467
1468    Returns a name for a new variable. The current naming scheme appends the 
1469    prefix "vect_" or "vect_p" (depending on the value of VAR_KIND) to 
1470    the name of vectorizer generated variables, and appends that to NAME if 
1471    provided.  */
1472
1473 static tree
1474 vect_get_new_vect_var (tree type, enum vect_var_kind var_kind, const char *name)
1475 {
1476   const char *prefix;
1477   int prefix_len;
1478   tree new_vect_var;
1479
1480   if (var_kind == vect_simple_var)
1481     prefix = "vect_"; 
1482   else
1483     prefix = "vect_p";
1484
1485   prefix_len = strlen (prefix);
1486
1487   if (name)
1488     new_vect_var = create_tmp_var (type, concat (prefix, name, NULL));
1489   else
1490     new_vect_var = create_tmp_var (type, prefix);
1491
1492   return new_vect_var;
1493 }
1494
1495
1496 /* Function vect_create_index_for_vector_ref.
1497
1498    Create (and return) an index variable, along with it's update chain in the
1499    loop. This variable will be used to access a memory location in a vector
1500    operation.
1501
1502    Input:
1503    LOOP: The loop being vectorized.
1504    BSI: The block_stmt_iterator where STMT is. Any new stmts created by this
1505         function can be added here, or in the loop pre-header.
1506
1507    Output:
1508    Return an index that will be used to index a vector array.  It is expected
1509    that a pointer to the first vector will be used as the base address for the
1510    indexed reference.
1511
1512    FORNOW: we are not trying to be efficient, just creating a new index each
1513    time from scratch.  At this time all vector references could use the same
1514    index.
1515
1516    TODO: create only one index to be used by all vector references.  Record
1517    the index in the LOOP_VINFO the first time this procedure is called and
1518    return it on subsequent calls.  The increment of this index must be placed
1519    just before the conditional expression that ends the single block loop.  */
1520
1521 static tree
1522 vect_create_index_for_vector_ref (struct loop *loop, block_stmt_iterator *bsi)
1523 {
1524   tree init, step;
1525   tree indx_before_incr, indx_after_incr;
1526
1527   /* It is assumed that the base pointer used for vectorized access contains
1528      the address of the first vector.  Therefore the index used for vectorized
1529      access must be initialized to zero and incremented by 1.  */
1530
1531   init = integer_zero_node;
1532   step = integer_one_node;
1533
1534   /* Assuming that bsi_insert is used with BSI_NEW_STMT  */
1535   create_iv (init, step, NULL_TREE, loop, bsi, false,
1536         &indx_before_incr, &indx_after_incr);
1537
1538   return indx_before_incr;
1539 }
1540
1541
1542 /* Function vect_create_addr_base_for_vector_ref.
1543
1544    Create an expression that computes the address of the first memory location
1545    that will be accessed for a data reference.
1546
1547    Input:
1548    STMT: The statement containing the data reference.
1549    NEW_STMT_LIST: Must be initialized to NULL_TREE or a statement list.
1550    OFFSET: Optional. If supplied, it is be added to the initial address.
1551
1552    Output:
1553    1. Return an SSA_NAME whose value is the address of the memory location of 
1554       the first vector of the data reference.
1555    2. If new_stmt_list is not NULL_TREE after return then the caller must insert
1556       these statement(s) which define the returned SSA_NAME.
1557
1558    FORNOW: We are only handling array accesses with step 1.  */
1559
1560 static tree
1561 vect_create_addr_base_for_vector_ref (tree stmt,
1562                                       tree *new_stmt_list,
1563                                       tree offset)
1564 {
1565   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1566   struct loop *loop = STMT_VINFO_LOOP (stmt_info);
1567   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
1568   tree data_ref_base = unshare_expr (STMT_VINFO_VECT_DR_BASE (stmt_info));
1569   tree base_name = unshare_expr (DR_BASE_NAME (dr));
1570   tree ref = DR_REF (dr);
1571   tree data_ref_base_type = TREE_TYPE (data_ref_base);
1572   tree scalar_type = TREE_TYPE (ref);
1573   tree scalar_ptr_type = build_pointer_type (scalar_type);
1574   tree access_fn;
1575   tree init_val, step, init_oval;
1576   bool ok;
1577   bool is_ptr_ref, is_array_ref, is_addr_expr;
1578   tree array_base;
1579   tree vec_stmt;
1580   tree new_temp;
1581   tree array_ref;
1582   tree addr_base, addr_expr;
1583   tree dest, new_stmt;
1584
1585   /* Only the access function of the last index is relevant (i_n in
1586      a[i_1][i_2]...[i_n]), the others correspond to loop invariants.  */
1587   access_fn = DR_ACCESS_FN (dr, 0);
1588   ok = vect_is_simple_iv_evolution (loop->num, access_fn, &init_oval, &step, 
1589                                     true);
1590   if (!ok)
1591     init_oval = integer_zero_node;
1592
1593   is_ptr_ref = TREE_CODE (data_ref_base_type) == POINTER_TYPE
1594                && TREE_CODE (data_ref_base) == SSA_NAME;
1595   is_array_ref = TREE_CODE (data_ref_base_type) == ARRAY_TYPE;
1596   is_addr_expr = TREE_CODE (data_ref_base) == ADDR_EXPR
1597                  || TREE_CODE (data_ref_base) == PLUS_EXPR
1598                  || TREE_CODE (data_ref_base) == MINUS_EXPR;
1599   gcc_assert (is_ptr_ref || is_array_ref || is_addr_expr);
1600
1601   /** Create: &(base[init_val])
1602
1603       if data_ref_base is an ARRAY_TYPE:
1604          base = data_ref_base
1605
1606       if data_ref_base is the SSA_NAME of a POINTER_TYPE:
1607          base = *((scalar_array *) data_ref_base)
1608    **/
1609
1610   if (is_array_ref)
1611     array_base = data_ref_base;
1612   else /* is_ptr_ref  or is_addr_expr */
1613     {
1614       /* array_ptr = (scalar_array_ptr_type *) data_ref_base;  */
1615       tree scalar_array_type = build_array_type (scalar_type, 0);
1616       tree scalar_array_ptr_type = build_pointer_type (scalar_array_type);
1617       tree array_ptr = create_tmp_var (scalar_array_ptr_type, "array_ptr");
1618       add_referenced_tmp_var (array_ptr);
1619
1620       dest = create_tmp_var (TREE_TYPE (data_ref_base), "dataref");
1621       add_referenced_tmp_var (dest);
1622       data_ref_base = 
1623         force_gimple_operand (data_ref_base, &new_stmt, false, dest);  
1624       append_to_statement_list_force (new_stmt, new_stmt_list);
1625
1626       vec_stmt = fold_convert (scalar_array_ptr_type, data_ref_base);
1627       vec_stmt = build2 (MODIFY_EXPR, void_type_node, array_ptr, vec_stmt);
1628       new_temp = make_ssa_name (array_ptr, vec_stmt);
1629       TREE_OPERAND (vec_stmt, 0) = new_temp;
1630       append_to_statement_list_force (vec_stmt, new_stmt_list);
1631
1632       /* (*array_ptr)  */
1633       array_base = build_fold_indirect_ref (new_temp);
1634     }
1635
1636   dest = create_tmp_var (TREE_TYPE (init_oval), "newinit");
1637   add_referenced_tmp_var (dest);
1638   init_val = force_gimple_operand (init_oval, &new_stmt, false, dest);  
1639   append_to_statement_list_force (new_stmt, new_stmt_list);
1640
1641   if (offset)
1642     {
1643       tree tmp = create_tmp_var (TREE_TYPE (init_val), "offset");
1644       add_referenced_tmp_var (tmp);
1645       vec_stmt = build2 (PLUS_EXPR, TREE_TYPE (init_val), init_val, offset);
1646       vec_stmt = build2 (MODIFY_EXPR, TREE_TYPE (init_val), tmp, vec_stmt);
1647       init_val = make_ssa_name (tmp, vec_stmt);
1648       TREE_OPERAND (vec_stmt, 0) = init_val;
1649       append_to_statement_list_force (vec_stmt, new_stmt_list);
1650     }
1651
1652   array_ref = build4 (ARRAY_REF, scalar_type, array_base, init_val, 
1653                       NULL_TREE, NULL_TREE);
1654   addr_base = build_fold_addr_expr (array_ref);
1655
1656   /* addr_expr = addr_base */
1657   addr_expr = vect_get_new_vect_var (scalar_ptr_type, vect_pointer_var,
1658                                      get_name (base_name));
1659   add_referenced_tmp_var (addr_expr);
1660   vec_stmt = build2 (MODIFY_EXPR, void_type_node, addr_expr, addr_base);
1661   new_temp = make_ssa_name (addr_expr, vec_stmt);
1662   TREE_OPERAND (vec_stmt, 0) = new_temp;
1663   append_to_statement_list_force (vec_stmt, new_stmt_list);
1664
1665   return new_temp;
1666 }
1667
1668
1669 /* Function get_vectype_for_scalar_type.
1670
1671    Returns the vector type corresponding to SCALAR_TYPE as supported
1672    by the target.  */
1673
1674 static tree
1675 get_vectype_for_scalar_type (tree scalar_type)
1676 {
1677   enum machine_mode inner_mode = TYPE_MODE (scalar_type);
1678   int nbytes = GET_MODE_SIZE (inner_mode);
1679   int nunits;
1680   tree vectype;
1681
1682   if (nbytes == 0)
1683     return NULL_TREE;
1684
1685   /* FORNOW: Only a single vector size per target (UNITS_PER_SIMD_WORD)
1686      is expected.  */
1687   nunits = UNITS_PER_SIMD_WORD / nbytes;
1688
1689   vectype = build_vector_type (scalar_type, nunits);
1690   if (vect_debug_details (NULL))
1691     {
1692       fprintf (dump_file, "get vectype with %d units of type ", nunits);
1693       print_generic_expr (dump_file, scalar_type, TDF_SLIM);
1694     }
1695
1696   if (!vectype)
1697     return NULL_TREE;
1698
1699   if (vect_debug_details (NULL))
1700     {
1701       fprintf (dump_file, "vectype: ");
1702       print_generic_expr (dump_file, vectype, TDF_SLIM);
1703     }
1704
1705   if (!VECTOR_MODE_P (TYPE_MODE (vectype)))
1706     {
1707       /* TODO: tree-complex.c sometimes can parallelize operations
1708          on generic vectors.  We can vectorize the loop in that case,
1709          but then we should re-run the lowering pass.  */
1710       if (vect_debug_details (NULL))
1711         fprintf (dump_file, "mode not supported by target.");
1712       return NULL_TREE;
1713     }
1714
1715   return vectype;
1716 }
1717
1718
1719 /* Function vect_align_data_ref.
1720
1721    Handle mislignment of a memory accesses.
1722
1723    FORNOW: Can't handle misaligned accesses. 
1724    Make sure that the dataref is aligned.  */
1725
1726 static void
1727 vect_align_data_ref (tree stmt)
1728 {
1729   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1730   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
1731
1732   /* FORNOW: can't handle misaligned accesses; 
1733              all accesses expected to be aligned.  */
1734   gcc_assert (aligned_access_p (dr));
1735 }
1736
1737
1738 /* Function vect_create_data_ref_ptr.
1739
1740    Create a memory reference expression for vector access, to be used in a
1741    vector load/store stmt. The reference is based on a new pointer to vector
1742    type (vp).
1743
1744    Input:
1745    1. STMT: a stmt that references memory. Expected to be of the form
1746          MODIFY_EXPR <name, data-ref> or MODIFY_EXPR <data-ref, name>.
1747    2. BSI: block_stmt_iterator where new stmts can be added.
1748    3. OFFSET (optional): an offset to be added to the initial address accessed
1749         by the data-ref in STMT.
1750    4. ONLY_INIT: indicate if vp is to be updated in the loop, or remain
1751         pointing to the initial address.
1752
1753    Output:
1754    1. Declare a new ptr to vector_type, and have it point to the base of the
1755       data reference (initial addressed accessed by the data reference).
1756       For example, for vector of type V8HI, the following code is generated:
1757
1758       v8hi *vp;
1759       vp = (v8hi *)initial_address;
1760
1761       if OFFSET is not supplied:
1762          initial_address = &a[init];
1763       if OFFSET is supplied:
1764          initial_address = &a[init + OFFSET];
1765
1766       Return the initial_address in INITIAL_ADDRESS.
1767
1768    2. Create a data-reference in the loop based on the new vector pointer vp,
1769       and using a new index variable 'idx' as follows:
1770
1771       vp' = vp + update
1772
1773       where if ONLY_INIT is true:
1774          update = zero
1775       and otherwise
1776          update = idx + vector_type_size
1777
1778       Return the pointer vp'.
1779
1780
1781    FORNOW: handle only aligned and consecutive accesses.  */
1782
1783 static tree
1784 vect_create_data_ref_ptr (tree stmt, block_stmt_iterator *bsi, tree offset,
1785                           tree *initial_address, bool only_init)
1786 {
1787   tree base_name;
1788   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1789   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
1790   struct loop *loop = STMT_VINFO_LOOP (stmt_info);
1791   tree vectype = STMT_VINFO_VECTYPE (stmt_info);
1792   tree vect_ptr_type;
1793   tree vect_ptr;
1794   tree tag;
1795   v_may_def_optype v_may_defs = STMT_V_MAY_DEF_OPS (stmt);
1796   v_must_def_optype v_must_defs = STMT_V_MUST_DEF_OPS (stmt);
1797   vuse_optype vuses = STMT_VUSE_OPS (stmt);
1798   int nvuses, nv_may_defs, nv_must_defs;
1799   int i;
1800   tree new_temp;
1801   tree vec_stmt;
1802   tree new_stmt_list = NULL_TREE;
1803   tree idx;
1804   edge pe = loop_preheader_edge (loop);
1805   basic_block new_bb;
1806   tree vect_ptr_init;
1807   tree vectype_size;
1808   tree ptr_update;
1809   tree data_ref_ptr;
1810
1811   base_name = unshare_expr (DR_BASE_NAME (dr));
1812   if (vect_debug_details (NULL))
1813     {
1814       tree data_ref_base = base_name;
1815       fprintf (dump_file, "create array_ref of type: ");
1816       print_generic_expr (dump_file, vectype, TDF_SLIM);
1817       if (TREE_CODE (data_ref_base) == VAR_DECL)
1818         fprintf (dump_file, "vectorizing a one dimensional array ref: ");
1819       else if (TREE_CODE (data_ref_base) == ARRAY_REF)
1820         fprintf (dump_file, "vectorizing a multidimensional array ref: ");
1821       else if (TREE_CODE (data_ref_base) == COMPONENT_REF)
1822         fprintf (dump_file, "vectorizing a record based array ref: ");
1823       else if (TREE_CODE (data_ref_base) == SSA_NAME)
1824         fprintf (dump_file, "vectorizing a pointer ref: ");
1825       print_generic_expr (dump_file, base_name, TDF_SLIM);
1826     }
1827
1828   /** (1) Create the new vector-pointer variable:  **/
1829
1830   vect_ptr_type = build_pointer_type (vectype);
1831   vect_ptr = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
1832                                     get_name (base_name));
1833   add_referenced_tmp_var (vect_ptr);
1834   
1835   
1836   /** (2) Handle aliasing information of the new vector-pointer:  **/
1837   
1838   tag = STMT_VINFO_MEMTAG (stmt_info);
1839   gcc_assert (tag);
1840   get_var_ann (vect_ptr)->type_mem_tag = tag;
1841   
1842   /* Mark for renaming all aliased variables
1843      (i.e, the may-aliases of the type-mem-tag).  */
1844   nvuses = NUM_VUSES (vuses);
1845   nv_may_defs = NUM_V_MAY_DEFS (v_may_defs);
1846   nv_must_defs = NUM_V_MUST_DEFS (v_must_defs);
1847   for (i = 0; i < nvuses; i++)
1848     {
1849       tree use = VUSE_OP (vuses, i);
1850       if (TREE_CODE (use) == SSA_NAME)
1851         bitmap_set_bit (vars_to_rename, var_ann (SSA_NAME_VAR (use))->uid);
1852     }
1853   for (i = 0; i < nv_may_defs; i++)
1854     {
1855       tree def = V_MAY_DEF_RESULT (v_may_defs, i);
1856       if (TREE_CODE (def) == SSA_NAME)
1857         bitmap_set_bit (vars_to_rename, var_ann (SSA_NAME_VAR (def))->uid);
1858     }
1859   for (i = 0; i < nv_must_defs; i++)
1860     {
1861       tree def = V_MUST_DEF_RESULT (v_must_defs, i);
1862       if (TREE_CODE (def) == SSA_NAME)
1863         bitmap_set_bit (vars_to_rename, var_ann (SSA_NAME_VAR (def))->uid);
1864     }
1865
1866
1867   /** (3) Calculate the initial address the vector-pointer, and set
1868           the vector-pointer to point to it before the loop:  **/
1869
1870   /* Create: (&(base[init_val+offset]) in the loop preheader.  */
1871   new_temp = vect_create_addr_base_for_vector_ref (stmt, &new_stmt_list,
1872                                                    offset);
1873   pe = loop_preheader_edge (loop);
1874   new_bb = bsi_insert_on_edge_immediate (pe, new_stmt_list);
1875   gcc_assert (!new_bb);
1876   *initial_address = new_temp;
1877
1878   /* Create: p = (vectype *) initial_base  */
1879   vec_stmt = fold_convert (vect_ptr_type, new_temp);
1880   vec_stmt = build2 (MODIFY_EXPR, void_type_node, vect_ptr, vec_stmt);
1881   new_temp = make_ssa_name (vect_ptr, vec_stmt);
1882   TREE_OPERAND (vec_stmt, 0) = new_temp;
1883   new_bb = bsi_insert_on_edge_immediate (pe, vec_stmt);
1884   gcc_assert (!new_bb);
1885   vect_ptr_init = TREE_OPERAND (vec_stmt, 0);
1886
1887
1888   /** (4) Handle the updating of the vector-pointer inside the loop: **/
1889
1890   if (only_init) /* No update in loop is required.  */
1891     return vect_ptr_init;
1892
1893   idx = vect_create_index_for_vector_ref (loop, bsi);
1894
1895   /* Create: update = idx * vectype_size  */
1896   ptr_update = create_tmp_var (integer_type_node, "update");
1897   add_referenced_tmp_var (ptr_update);
1898   vectype_size = build_int_cst (integer_type_node,
1899                                 GET_MODE_SIZE (TYPE_MODE (vectype)));
1900   vec_stmt = build2 (MULT_EXPR, integer_type_node, idx, vectype_size);
1901   vec_stmt = build2 (MODIFY_EXPR, void_type_node, ptr_update, vec_stmt);
1902   new_temp = make_ssa_name (ptr_update, vec_stmt);
1903   TREE_OPERAND (vec_stmt, 0) = new_temp;
1904   bsi_insert_before (bsi, vec_stmt, BSI_SAME_STMT);
1905
1906   /* Create: data_ref_ptr = vect_ptr_init + update  */
1907   vec_stmt = build2 (PLUS_EXPR, vect_ptr_type, vect_ptr_init, new_temp);
1908   vec_stmt = build2 (MODIFY_EXPR, void_type_node, vect_ptr, vec_stmt);
1909   new_temp = make_ssa_name (vect_ptr, vec_stmt);
1910   TREE_OPERAND (vec_stmt, 0) = new_temp;
1911   bsi_insert_before (bsi, vec_stmt, BSI_SAME_STMT);
1912   data_ref_ptr = TREE_OPERAND (vec_stmt, 0);
1913
1914   return data_ref_ptr;
1915 }
1916
1917
1918 /* Function vect_create_destination_var.
1919
1920    Create a new temporary of type VECTYPE.  */
1921
1922 static tree
1923 vect_create_destination_var (tree scalar_dest, tree vectype)
1924 {
1925   tree vec_dest;
1926   const char *new_name;
1927
1928   gcc_assert (TREE_CODE (scalar_dest) == SSA_NAME);
1929
1930   new_name = get_name (scalar_dest);
1931   if (!new_name)
1932     new_name = "var_";
1933   vec_dest = vect_get_new_vect_var (vectype, vect_simple_var, new_name);
1934   add_referenced_tmp_var (vec_dest);
1935
1936   return vec_dest;
1937 }
1938
1939
1940 /* Function vect_init_vector.
1941
1942    Insert a new stmt (INIT_STMT) that initializes a new vector variable with
1943    the vector elements of VECTOR_VAR. Return the DEF of INIT_STMT. It will be
1944    used in the vectorization of STMT.  */
1945
1946 static tree
1947 vect_init_vector (tree stmt, tree vector_var)
1948 {
1949   stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt);
1950   struct loop *loop = STMT_VINFO_LOOP (stmt_vinfo);
1951   tree new_var;
1952   tree init_stmt;
1953   tree vectype = STMT_VINFO_VECTYPE (stmt_vinfo); 
1954   tree vec_oprnd;
1955   edge pe;
1956   tree new_temp;
1957   basic_block new_bb;
1958  
1959   new_var = vect_get_new_vect_var (vectype, vect_simple_var, "cst_");
1960   add_referenced_tmp_var (new_var); 
1961  
1962   init_stmt = build2 (MODIFY_EXPR, vectype, new_var, vector_var);
1963   new_temp = make_ssa_name (new_var, init_stmt);
1964   TREE_OPERAND (init_stmt, 0) = new_temp;
1965
1966   pe = loop_preheader_edge (loop);
1967   new_bb = bsi_insert_on_edge_immediate (pe, init_stmt);
1968   gcc_assert (!new_bb);
1969
1970   if (vect_debug_details (NULL))
1971     {
1972       fprintf (dump_file, "created new init_stmt: ");
1973       print_generic_expr (dump_file, init_stmt, TDF_SLIM);
1974     }
1975
1976   vec_oprnd = TREE_OPERAND (init_stmt, 0);
1977   return vec_oprnd;
1978 }
1979
1980
1981 /* Function vect_get_vec_def_for_operand.
1982
1983    OP is an operand in STMT. This function returns a (vector) def that will be
1984    used in the vectorized stmt for STMT.
1985
1986    In the case that OP is an SSA_NAME which is defined in the loop, then
1987    STMT_VINFO_VEC_STMT of the defining stmt holds the relevant def.
1988
1989    In case OP is an invariant or constant, a new stmt that creates a vector def
1990    needs to be introduced.  */
1991
1992 static tree
1993 vect_get_vec_def_for_operand (tree op, tree stmt)
1994 {
1995   tree vec_oprnd;
1996   tree vec_stmt;
1997   tree def_stmt;
1998   stmt_vec_info def_stmt_info = NULL;
1999   stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt);
2000   tree vectype = STMT_VINFO_VECTYPE (stmt_vinfo);
2001   int nunits = GET_MODE_NUNITS (TYPE_MODE (vectype));
2002   struct loop *loop = STMT_VINFO_LOOP (stmt_vinfo);
2003   basic_block bb;
2004   tree vec_inv;
2005   tree t = NULL_TREE;
2006   tree def;
2007   int i;
2008
2009   if (vect_debug_details (NULL))
2010     {
2011       fprintf (dump_file, "vect_get_vec_def_for_operand: ");
2012       print_generic_expr (dump_file, op, TDF_SLIM);
2013     }
2014
2015   /** ===> Case 1: operand is a constant.  **/
2016
2017   if (TREE_CODE (op) == INTEGER_CST || TREE_CODE (op) == REAL_CST)
2018     {
2019       /* Create 'vect_cst_ = {cst,cst,...,cst}'  */
2020
2021       tree vec_cst;
2022
2023       /* Build a tree with vector elements.  */
2024       if (vect_debug_details (NULL))
2025         fprintf (dump_file, "Create vector_cst. nunits = %d", nunits);
2026
2027       for (i = nunits - 1; i >= 0; --i)
2028         {
2029           t = tree_cons (NULL_TREE, op, t);
2030         }
2031       vec_cst = build_vector (vectype, t);
2032       return vect_init_vector (stmt, vec_cst);
2033     }
2034
2035   gcc_assert (TREE_CODE (op) == SSA_NAME);
2036  
2037   /** ===> Case 2: operand is an SSA_NAME - find the stmt that defines it.  **/
2038
2039   def_stmt = SSA_NAME_DEF_STMT (op);
2040   def_stmt_info = vinfo_for_stmt (def_stmt);
2041
2042   if (vect_debug_details (NULL))
2043     {
2044       fprintf (dump_file, "vect_get_vec_def_for_operand: def_stmt: ");
2045       print_generic_expr (dump_file, def_stmt, TDF_SLIM);
2046     }
2047
2048
2049   /** ==> Case 2.1: operand is defined inside the loop.  **/
2050
2051   if (def_stmt_info)
2052     {
2053       /* Get the def from the vectorized stmt.  */
2054
2055       vec_stmt = STMT_VINFO_VEC_STMT (def_stmt_info);
2056       gcc_assert (vec_stmt);
2057       vec_oprnd = TREE_OPERAND (vec_stmt, 0);
2058       return vec_oprnd;
2059     }
2060
2061
2062   /** ==> Case 2.2: operand is defined by the loop-header phi-node - 
2063                     it is a reduction/induction.  **/
2064
2065   bb = bb_for_stmt (def_stmt);
2066   if (TREE_CODE (def_stmt) == PHI_NODE && flow_bb_inside_loop_p (loop, bb))
2067     {
2068       if (vect_debug_details (NULL))
2069         fprintf (dump_file, "reduction/induction - unsupported.");
2070       internal_error ("no support for reduction/induction"); /* FORNOW */
2071     }
2072
2073
2074   /** ==> Case 2.3: operand is defined outside the loop - 
2075                     it is a loop invariant.  */
2076
2077   switch (TREE_CODE (def_stmt))
2078     {
2079     case PHI_NODE:
2080       def = PHI_RESULT (def_stmt);
2081       break;
2082     case MODIFY_EXPR:
2083       def = TREE_OPERAND (def_stmt, 0);
2084       break;
2085     case NOP_EXPR:
2086       def = TREE_OPERAND (def_stmt, 0);
2087       gcc_assert (IS_EMPTY_STMT (def_stmt));
2088       def = op;
2089       break;
2090     default:
2091       if (vect_debug_details (NULL))
2092         {
2093           fprintf (dump_file, "unsupported defining stmt: ");
2094           print_generic_expr (dump_file, def_stmt, TDF_SLIM);
2095         }
2096       internal_error ("unsupported defining stmt");
2097     }
2098
2099   /* Build a tree with vector elements. Create 'vec_inv = {inv,inv,..,inv}'  */
2100
2101   if (vect_debug_details (NULL))
2102     fprintf (dump_file, "Create vector_inv.");
2103
2104   for (i = nunits - 1; i >= 0; --i)
2105     {
2106       t = tree_cons (NULL_TREE, def, t);
2107     }
2108
2109   vec_inv = build_constructor (vectype, t);
2110   return vect_init_vector (stmt, vec_inv);
2111 }
2112
2113
2114 /* Function vect_finish_stmt_generation.
2115
2116    Insert a new stmt.  */
2117
2118 static void
2119 vect_finish_stmt_generation (tree stmt, tree vec_stmt, block_stmt_iterator *bsi)
2120 {
2121   bsi_insert_before (bsi, vec_stmt, BSI_SAME_STMT);
2122
2123   if (vect_debug_details (NULL))
2124     {
2125       fprintf (dump_file, "add new stmt: ");
2126       print_generic_expr (dump_file, vec_stmt, TDF_SLIM);
2127     }
2128
2129   /* Make sure bsi points to the stmt that is being vectorized.  */
2130
2131   /* Assumption: any stmts created for the vectorization of stmt S were
2132      inserted before S. BSI is expected to point to S or some new stmt before S.  */
2133
2134   while (stmt != bsi_stmt (*bsi) && !bsi_end_p (*bsi))
2135     bsi_next (bsi);
2136   gcc_assert (stmt == bsi_stmt (*bsi));
2137 }
2138
2139
2140 /* Function vectorizable_assignment.
2141
2142    Check if STMT performs an assignment (copy) that can be vectorized. 
2143    If VEC_STMT is also passed, vectorize the STMT: create a vectorized 
2144    stmt to replace it, put it in VEC_STMT, and insert it at BSI.
2145    Return FALSE if not a vectorizable STMT, TRUE otherwise.  */
2146
2147 static bool
2148 vectorizable_assignment (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
2149 {
2150   tree vec_dest;
2151   tree scalar_dest;
2152   tree op;
2153   tree vec_oprnd;
2154   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
2155   tree vectype = STMT_VINFO_VECTYPE (stmt_info);
2156   struct loop *loop = STMT_VINFO_LOOP (stmt_info);
2157   tree new_temp;
2158
2159   /* Is vectorizable assignment?  */
2160
2161   if (TREE_CODE (stmt) != MODIFY_EXPR)
2162     return false;
2163
2164   scalar_dest = TREE_OPERAND (stmt, 0);
2165   if (TREE_CODE (scalar_dest) != SSA_NAME)
2166     return false;
2167
2168   op = TREE_OPERAND (stmt, 1);
2169   if (!vect_is_simple_use (op, loop, NULL))
2170     {
2171       if (vect_debug_details (NULL))
2172         fprintf (dump_file, "use not simple.");
2173       return false;
2174     }
2175
2176   if (!vec_stmt) /* transformation not required.  */
2177     {
2178       STMT_VINFO_TYPE (stmt_info) = assignment_vec_info_type;
2179       return true;
2180     }
2181
2182   /** Trasform.  **/
2183   if (vect_debug_details (NULL))
2184     fprintf (dump_file, "transform assignment.");
2185
2186   /* Handle def.  */
2187   vec_dest = vect_create_destination_var (scalar_dest, vectype);
2188
2189   /* Handle use.  */
2190   op = TREE_OPERAND (stmt, 1);
2191   vec_oprnd = vect_get_vec_def_for_operand (op, stmt);
2192
2193   /* Arguments are ready. create the new vector stmt.  */
2194   *vec_stmt = build2 (MODIFY_EXPR, vectype, vec_dest, vec_oprnd);
2195   new_temp = make_ssa_name (vec_dest, *vec_stmt);
2196   TREE_OPERAND (*vec_stmt, 0) = new_temp;
2197   vect_finish_stmt_generation (stmt, *vec_stmt, bsi);
2198   
2199   return true;
2200 }
2201
2202
2203 /* Function vectorizable_operation.
2204
2205    Check if STMT performs a binary or unary operation that can be vectorized. 
2206    If VEC_STMT is also passed, vectorize the STMT: create a vectorized 
2207    stmt to replace it, put it in VEC_STMT, and insert it at BSI.
2208    Return FALSE if not a vectorizable STMT, TRUE otherwise.  */
2209
2210 static bool
2211 vectorizable_operation (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
2212 {
2213   tree vec_dest;
2214   tree scalar_dest;
2215   tree operation;
2216   tree op0, op1 = NULL;
2217   tree vec_oprnd0, vec_oprnd1=NULL;
2218   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
2219   tree vectype = STMT_VINFO_VECTYPE (stmt_info);
2220   struct loop *loop = STMT_VINFO_LOOP (stmt_info);
2221   int i;
2222   enum tree_code code;
2223   enum machine_mode vec_mode;
2224   tree new_temp;
2225   int op_type;
2226   tree op;
2227   optab optab;
2228
2229   /* Is STMT a vectorizable binary/unary operation?   */
2230   if (TREE_CODE (stmt) != MODIFY_EXPR)
2231     return false;
2232
2233   if (TREE_CODE (TREE_OPERAND (stmt, 0)) != SSA_NAME)
2234     return false;
2235
2236   operation = TREE_OPERAND (stmt, 1);
2237   code = TREE_CODE (operation);
2238   optab = optab_for_tree_code (code, vectype);
2239
2240   /* Support only unary or binary operations.  */
2241   op_type = TREE_CODE_LENGTH (code);
2242   if (op_type != unary_op && op_type != binary_op)
2243     {
2244       if (vect_debug_details (NULL))
2245         fprintf (dump_file, "num. args = %d (not unary/binary op).", op_type);
2246       return false;
2247     }
2248
2249   for (i = 0; i < op_type; i++)
2250     {
2251       op = TREE_OPERAND (operation, i);
2252       if (!vect_is_simple_use (op, loop, NULL))
2253         {
2254           if (vect_debug_details (NULL))
2255             fprintf (dump_file, "use not simple.");
2256           return false;
2257         }       
2258     } 
2259
2260   /* Supportable by target?  */
2261   if (!optab)
2262     {
2263       if (vect_debug_details (NULL))
2264         fprintf (dump_file, "no optab.");
2265       return false;
2266     }
2267   vec_mode = TYPE_MODE (vectype);
2268   if (optab->handlers[(int) vec_mode].insn_code == CODE_FOR_nothing)
2269     {
2270       if (vect_debug_details (NULL))
2271         fprintf (dump_file, "op not supported by target.");
2272       return false;
2273     }
2274
2275   if (!vec_stmt) /* transformation not required.  */
2276     {
2277       STMT_VINFO_TYPE (stmt_info) = op_vec_info_type;
2278       return true;
2279     }
2280
2281   /** Transform.  **/
2282
2283   if (vect_debug_details (NULL))
2284     fprintf (dump_file, "transform binary/unary operation.");
2285
2286   /* Handle def.  */
2287   scalar_dest = TREE_OPERAND (stmt, 0);
2288   vec_dest = vect_create_destination_var (scalar_dest, vectype);
2289
2290   /* Handle uses.  */
2291   op0 = TREE_OPERAND (operation, 0);
2292   vec_oprnd0 = vect_get_vec_def_for_operand (op0, stmt);
2293
2294   if (op_type == binary_op)
2295     {
2296       op1 = TREE_OPERAND (operation, 1);
2297       vec_oprnd1 = vect_get_vec_def_for_operand (op1, stmt); 
2298     }
2299
2300   /* Arguments are ready. create the new vector stmt.  */
2301
2302   if (op_type == binary_op)
2303     *vec_stmt = build2 (MODIFY_EXPR, vectype, vec_dest,
2304                 build2 (code, vectype, vec_oprnd0, vec_oprnd1));
2305   else
2306     *vec_stmt = build2 (MODIFY_EXPR, vectype, vec_dest,
2307                 build1 (code, vectype, vec_oprnd0));
2308   new_temp = make_ssa_name (vec_dest, *vec_stmt);
2309   TREE_OPERAND (*vec_stmt, 0) = new_temp;
2310   vect_finish_stmt_generation (stmt, *vec_stmt, bsi);
2311
2312   return true;
2313 }
2314
2315
2316 /* Function vectorizable_store.
2317
2318    Check if STMT defines a non scalar data-ref (array/pointer/structure) that 
2319    can be vectorized. 
2320    If VEC_STMT is also passed, vectorize the STMT: create a vectorized 
2321    stmt to replace it, put it in VEC_STMT, and insert it at BSI.
2322    Return FALSE if not a vectorizable STMT, TRUE otherwise.  */
2323
2324 static bool
2325 vectorizable_store (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
2326 {
2327   tree scalar_dest;
2328   tree data_ref;
2329   tree op;
2330   tree vec_oprnd1;
2331   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
2332   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
2333   tree vectype = STMT_VINFO_VECTYPE (stmt_info);
2334   struct loop *loop = STMT_VINFO_LOOP (stmt_info);
2335   enum machine_mode vec_mode;
2336   tree dummy;
2337   enum dr_alignment_support alignment_support_cheme;
2338
2339   /* Is vectorizable store? */
2340
2341   if (TREE_CODE (stmt) != MODIFY_EXPR)
2342     return false;
2343
2344   scalar_dest = TREE_OPERAND (stmt, 0);
2345   if (TREE_CODE (scalar_dest) != ARRAY_REF
2346       && TREE_CODE (scalar_dest) != INDIRECT_REF)
2347     return false;
2348
2349   op = TREE_OPERAND (stmt, 1);
2350   if (!vect_is_simple_use (op, loop, NULL))
2351     {
2352       if (vect_debug_details (NULL))
2353         fprintf (dump_file, "use not simple.");
2354       return false;
2355     }
2356
2357   vec_mode = TYPE_MODE (vectype);
2358   /* FORNOW. In some cases can vectorize even if data-type not supported
2359      (e.g. - array initialization with 0).  */
2360   if (mov_optab->handlers[(int)vec_mode].insn_code == CODE_FOR_nothing)
2361     return false;
2362
2363   if (!STMT_VINFO_DATA_REF (stmt_info))
2364     return false;
2365
2366
2367   if (!vec_stmt) /* transformation not required.  */
2368     {
2369       STMT_VINFO_TYPE (stmt_info) = store_vec_info_type;
2370       return true;
2371     }
2372
2373   /** Trasform.  **/
2374
2375   if (vect_debug_details (NULL))
2376     fprintf (dump_file, "transform store");
2377
2378   alignment_support_cheme = vect_supportable_dr_alignment (dr);
2379   gcc_assert (alignment_support_cheme);
2380   gcc_assert (alignment_support_cheme = dr_aligned);  /* FORNOW */
2381
2382   /* Handle use - get the vectorized def from the defining stmt.  */
2383   vec_oprnd1 = vect_get_vec_def_for_operand (op, stmt);
2384
2385   /* Handle def.  */
2386   /* FORNOW: make sure the data reference is aligned.  */
2387   vect_align_data_ref (stmt);
2388   data_ref = vect_create_data_ref_ptr (stmt, bsi, NULL_TREE, &dummy, false);
2389   data_ref = build_fold_indirect_ref (data_ref);
2390
2391   /* Arguments are ready. create the new vector stmt.  */
2392   *vec_stmt = build2 (MODIFY_EXPR, vectype, data_ref, vec_oprnd1);
2393   vect_finish_stmt_generation (stmt, *vec_stmt, bsi);
2394
2395   return true;
2396 }
2397
2398
2399 /* vectorizable_load.
2400
2401    Check if STMT reads a non scalar data-ref (array/pointer/structure) that 
2402    can be vectorized. 
2403    If VEC_STMT is also passed, vectorize the STMT: create a vectorized 
2404    stmt to replace it, put it in VEC_STMT, and insert it at BSI.
2405    Return FALSE if not a vectorizable STMT, TRUE otherwise.  */
2406
2407 static bool
2408 vectorizable_load (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
2409 {
2410   tree scalar_dest;
2411   tree vec_dest = NULL;
2412   tree data_ref = NULL;
2413   tree op;
2414   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
2415   struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
2416   tree vectype = STMT_VINFO_VECTYPE (stmt_info);
2417   tree new_temp;
2418   int mode;
2419   tree init_addr;
2420   tree new_stmt;
2421   tree dummy;
2422   basic_block new_bb;
2423   struct loop *loop = STMT_VINFO_LOOP (stmt_info);
2424   edge pe = loop_preheader_edge (loop);
2425   enum dr_alignment_support alignment_support_cheme;
2426
2427   /* Is vectorizable load? */
2428
2429   if (TREE_CODE (stmt) != MODIFY_EXPR)
2430     return false;
2431
2432   scalar_dest = TREE_OPERAND (stmt, 0);
2433   if (TREE_CODE (scalar_dest) != SSA_NAME)
2434     return false;
2435
2436   op = TREE_OPERAND (stmt, 1);
2437   if (TREE_CODE (op) != ARRAY_REF && TREE_CODE (op) != INDIRECT_REF)
2438     return false;
2439
2440   if (!STMT_VINFO_DATA_REF (stmt_info))
2441     return false;
2442
2443   mode = (int) TYPE_MODE (vectype);
2444
2445   /* FORNOW. In some cases can vectorize even if data-type not supported
2446     (e.g. - data copies).  */
2447   if (mov_optab->handlers[mode].insn_code == CODE_FOR_nothing)
2448     {
2449       if (vect_debug_details (loop))
2450         fprintf (dump_file, "Aligned load, but unsupported type.");
2451       return false;
2452     }
2453
2454   if (!vec_stmt) /* transformation not required.  */
2455     {
2456       STMT_VINFO_TYPE (stmt_info) = load_vec_info_type;
2457       return true;
2458     }
2459
2460   /** Trasform.  **/
2461
2462   if (vect_debug_details (NULL))
2463     fprintf (dump_file, "transform load.");
2464
2465   alignment_support_cheme = vect_supportable_dr_alignment (dr);
2466   gcc_assert (alignment_support_cheme);
2467
2468   if (alignment_support_cheme == dr_aligned
2469       || alignment_support_cheme == dr_unaligned_supported)
2470     {
2471       /* Create:
2472          p = initial_addr;
2473          indx = 0;
2474          loop {
2475            vec_dest = *(p);
2476            indx = indx + 1;
2477          }
2478       */
2479
2480       vec_dest = vect_create_destination_var (scalar_dest, vectype);
2481       data_ref = vect_create_data_ref_ptr (stmt, bsi, NULL_TREE, &dummy, false);
2482       if (aligned_access_p (dr))
2483         data_ref = build_fold_indirect_ref (data_ref);
2484       else
2485         {
2486           int mis = DR_MISALIGNMENT (dr);
2487           tree tmis = (mis == -1 ?
2488                        integer_zero_node : 
2489                        build_int_cst (integer_type_node, mis));
2490           tmis = int_const_binop (MULT_EXPR, tmis, 
2491                         build_int_cst (integer_type_node, BITS_PER_UNIT), 1);
2492           data_ref = build2 (MISALIGNED_INDIRECT_REF, vectype, data_ref, tmis);
2493         }
2494       new_stmt = build2 (MODIFY_EXPR, vectype, vec_dest, data_ref);
2495       new_temp = make_ssa_name (vec_dest, new_stmt);
2496       TREE_OPERAND (new_stmt, 0) = new_temp;
2497       vect_finish_stmt_generation (stmt, new_stmt, bsi);
2498     }
2499   else if (alignment_support_cheme == dr_unaligned_software_pipeline)
2500     {
2501       /* Create:
2502          p1 = initial_addr;
2503          msq_init = *(floor(p1))
2504          p2 = initial_addr + VS - 1;
2505          magic = have_builtin ? builtin_result : initial_address;
2506          indx = 0;
2507          loop {
2508            p2' = p2 + indx * vectype_size
2509            lsq = *(floor(p2'))
2510            vec_dest = realign_load (msq, lsq, magic)
2511            indx = indx + 1;
2512            msq = lsq;
2513          }
2514       */
2515
2516       tree offset;
2517       tree magic;
2518       tree phi_stmt;
2519       tree msq_init;
2520       tree msq, lsq;
2521       tree dataref_ptr;
2522       tree params;
2523
2524       /* <1> Create msq_init = *(floor(p1)) in the loop preheader  */
2525       vec_dest = vect_create_destination_var (scalar_dest, vectype);
2526       data_ref = vect_create_data_ref_ptr (stmt, bsi, NULL_TREE, 
2527                                            &init_addr, true);
2528       data_ref = build1 (ALIGN_INDIRECT_REF, vectype, data_ref);
2529       new_stmt = build2 (MODIFY_EXPR, vectype, vec_dest, data_ref);
2530       new_temp = make_ssa_name (vec_dest, new_stmt);
2531       TREE_OPERAND (new_stmt, 0) = new_temp;
2532       new_bb = bsi_insert_on_edge_immediate (pe, new_stmt);
2533       gcc_assert (!new_bb);
2534       msq_init = TREE_OPERAND (new_stmt, 0);
2535
2536
2537       /* <2> Create lsq = *(floor(p2')) in the loop  */ 
2538       offset = build_int_cst (integer_type_node, 
2539                               GET_MODE_NUNITS (TYPE_MODE (vectype)));
2540       offset = int_const_binop (MINUS_EXPR, offset, integer_one_node, 1);
2541       vec_dest = vect_create_destination_var (scalar_dest, vectype);
2542       dataref_ptr = vect_create_data_ref_ptr (stmt, bsi, offset, &dummy, false);
2543       data_ref = build1 (ALIGN_INDIRECT_REF, vectype, dataref_ptr);
2544       new_stmt = build2 (MODIFY_EXPR, vectype, vec_dest, data_ref);
2545       new_temp = make_ssa_name (vec_dest, new_stmt);
2546       TREE_OPERAND (new_stmt, 0) = new_temp;
2547       vect_finish_stmt_generation (stmt, new_stmt, bsi);
2548       lsq = TREE_OPERAND (new_stmt, 0);
2549
2550
2551       /* <3> */
2552       if (targetm.vectorize.builtin_mask_for_load)
2553         {
2554           /* Create permutation mask, if required, in loop preheader.  */
2555           tree builtin_decl;
2556           params = build_tree_list (NULL_TREE, init_addr);
2557           vec_dest = vect_create_destination_var (scalar_dest, vectype);
2558           builtin_decl = targetm.vectorize.builtin_mask_for_load ();
2559           new_stmt = build_function_call_expr (builtin_decl, params);
2560           new_stmt = build2 (MODIFY_EXPR, vectype, vec_dest, new_stmt);
2561           new_temp = make_ssa_name (vec_dest, new_stmt);
2562           TREE_OPERAND (new_stmt, 0) = new_temp;
2563           new_bb = bsi_insert_on_edge_immediate (pe, new_stmt);
2564           gcc_assert (!new_bb);
2565           magic = TREE_OPERAND (new_stmt, 0);
2566         }
2567       else
2568         {
2569           /* Use current address instead of init_addr for reduced reg pressure.
2570            */
2571           magic = dataref_ptr;
2572         }
2573
2574
2575       /* <4> Create msq = phi <msq_init, lsq> in loop  */ 
2576       vec_dest = vect_create_destination_var (scalar_dest, vectype);
2577       msq = make_ssa_name (vec_dest, NULL_TREE);
2578       phi_stmt = create_phi_node (msq, loop->header); /* CHECKME */
2579       SSA_NAME_DEF_STMT (msq) = phi_stmt;
2580       add_phi_arg (&phi_stmt, msq_init, loop_preheader_edge (loop));
2581       add_phi_arg (&phi_stmt, lsq, loop_latch_edge (loop));
2582
2583
2584       /* <5> Create <vec_dest = realign_load (msq, lsq, magic)> in loop  */
2585       vec_dest = vect_create_destination_var (scalar_dest, vectype);
2586       new_stmt = build3 (REALIGN_LOAD_EXPR, vectype, msq, lsq, magic);
2587       new_stmt = build2 (MODIFY_EXPR, vectype, vec_dest, new_stmt);
2588       new_temp = make_ssa_name (vec_dest, new_stmt); 
2589       TREE_OPERAND (new_stmt, 0) = new_temp;
2590       vect_finish_stmt_generation (stmt, new_stmt, bsi);
2591     }
2592   else
2593     gcc_unreachable ();
2594
2595   *vec_stmt = new_stmt;
2596   return true;
2597 }
2598
2599
2600 /* Function vect_supportable_dr_alignment
2601
2602    Return whether the data reference DR is supported with respect to its
2603    alignment.  */
2604
2605 static enum dr_alignment_support
2606 vect_supportable_dr_alignment (struct data_reference *dr)
2607 {
2608   tree vectype = STMT_VINFO_VECTYPE (vinfo_for_stmt (DR_STMT (dr)));
2609   enum machine_mode mode = (int) TYPE_MODE (vectype);
2610
2611   if (aligned_access_p (dr))
2612     return dr_aligned;
2613
2614   /* Possibly unaligned access.  */
2615   
2616   if (DR_IS_READ (dr))
2617     {
2618       if (vec_realign_load_optab->handlers[mode].insn_code != CODE_FOR_nothing
2619           && (!targetm.vectorize.builtin_mask_for_load
2620               || targetm.vectorize.builtin_mask_for_load ()))
2621         return dr_unaligned_software_pipeline;
2622
2623       if (targetm.vectorize.misaligned_mem_ok (mode))
2624         /* Can't software pipeline the loads.  */
2625         return dr_unaligned_supported;
2626     }
2627
2628   /* Unsupported.  */
2629   return dr_unaligned_unsupported;
2630 }
2631
2632
2633 /* Function vect_transform_stmt.
2634
2635    Create a vectorized stmt to replace STMT, and insert it at BSI.  */
2636
2637 static bool
2638 vect_transform_stmt (tree stmt, block_stmt_iterator *bsi)
2639 {
2640   bool is_store = false;
2641   tree vec_stmt = NULL_TREE;
2642   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
2643   bool done;
2644
2645   switch (STMT_VINFO_TYPE (stmt_info))
2646     {
2647     case op_vec_info_type:
2648       done = vectorizable_operation (stmt, bsi, &vec_stmt);
2649       gcc_assert (done);
2650       break;
2651
2652     case assignment_vec_info_type:
2653       done = vectorizable_assignment (stmt, bsi, &vec_stmt);
2654       gcc_assert (done);
2655       break;
2656
2657     case load_vec_info_type:
2658       done = vectorizable_load (stmt, bsi, &vec_stmt);
2659       gcc_assert (done);
2660       break;
2661
2662     case store_vec_info_type:
2663       done = vectorizable_store (stmt, bsi, &vec_stmt);
2664       gcc_assert (done);
2665       is_store = true;
2666       break;
2667     default:
2668       if (vect_debug_details (NULL))
2669         fprintf (dump_file, "stmt not supported.");
2670       gcc_unreachable ();
2671     }
2672
2673   STMT_VINFO_VEC_STMT (stmt_info) = vec_stmt;
2674
2675   return is_store;
2676 }
2677
2678
2679 /* This function builds ni_name = number of iterations loop executes
2680    on the loop preheader.  */
2681
2682 static tree
2683 vect_build_loop_niters (loop_vec_info loop_vinfo)
2684 {
2685   tree ni_name, stmt, var;
2686   edge pe;
2687   basic_block new_bb = NULL;
2688   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
2689   tree ni = unshare_expr (LOOP_VINFO_NITERS(loop_vinfo));
2690
2691   var = create_tmp_var (TREE_TYPE (ni), "niters");
2692   add_referenced_tmp_var (var);
2693   if (TREE_CODE (ni) == INTEGER_CST)
2694     {
2695       /* This case is generated when treating a known loop bound 
2696          indivisible by VF. Here we cannot use force_gimple_operand.  */
2697       stmt = build (MODIFY_EXPR, void_type_node, var, ni);
2698       ni_name = make_ssa_name (var, stmt);
2699       TREE_OPERAND (stmt, 0) = ni_name;
2700     }
2701   else
2702     ni_name = force_gimple_operand (ni, &stmt, false, var);
2703
2704   pe = loop_preheader_edge (loop);
2705   if (stmt)
2706     new_bb = bsi_insert_on_edge_immediate (pe, stmt);
2707   if (new_bb)
2708     add_bb_to_loop (new_bb, EDGE_PRED (new_bb, 0)->src->loop_father);
2709       
2710   return ni_name;
2711 }
2712
2713
2714 /* This function generates the following statements:
2715
2716  ni_name = number of iterations loop executes
2717  ratio = ni_name / vf
2718  ratio_mult_vf_name = ratio * vf
2719
2720  and places them at the loop preheader edge.  */
2721
2722 static void 
2723 vect_generate_tmps_on_preheader (loop_vec_info loop_vinfo, tree *ni_name_p,
2724                                  tree *ratio_mult_vf_name_p, tree *ratio_p)
2725 {
2726
2727   edge pe;
2728   basic_block new_bb;
2729   tree stmt, ni_name;
2730   tree ratio;
2731   tree ratio_mult_vf_name, ratio_mult_vf;
2732   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
2733   tree ni = LOOP_VINFO_NITERS(loop_vinfo);
2734   
2735   int vf, i;
2736
2737   /* Generate temporary variable that contains 
2738      number of iterations loop executes.  */
2739
2740   ni_name = vect_build_loop_niters (loop_vinfo);
2741
2742   /* ratio = ni / vf.
2743      vf is power of 2; then if ratio =  = n >> log2 (vf).  */
2744   vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
2745   ratio = vect_build_symbol_bound (ni_name, vf, loop);
2746        
2747   /* Update initial conditions of loop copy.  */
2748        
2749   /* ratio_mult_vf = ratio * vf;  
2750      then if ratio_mult_vf = ratio << log2 (vf).  */
2751
2752   i = exact_log2 (vf);
2753   ratio_mult_vf = create_tmp_var (TREE_TYPE (ni), "ratio_mult_vf");
2754   add_referenced_tmp_var (ratio_mult_vf);
2755
2756   ratio_mult_vf_name = make_ssa_name (ratio_mult_vf, NULL_TREE);
2757
2758   stmt = build2 (MODIFY_EXPR, void_type_node, ratio_mult_vf_name,
2759                 build2 (LSHIFT_EXPR, TREE_TYPE (ratio),
2760                        ratio, build_int_cst (unsigned_type_node,
2761                                              i)));
2762
2763   SSA_NAME_DEF_STMT (ratio_mult_vf_name) = stmt;
2764
2765   pe = loop_preheader_edge (loop);
2766   new_bb = bsi_insert_on_edge_immediate (pe, stmt);
2767   if (new_bb)
2768     add_bb_to_loop (new_bb, EDGE_PRED (new_bb, 0)->src->loop_father);
2769
2770   *ni_name_p = ni_name;
2771   *ratio_mult_vf_name_p = ratio_mult_vf_name;
2772   *ratio_p = ratio;
2773     
2774   return;  
2775 }
2776
2777
2778 /* This function generates stmt 
2779    
2780    tmp = n / vf;
2781
2782    and attaches it to preheader of LOOP.  */
2783
2784 static tree 
2785 vect_build_symbol_bound (tree n, int vf, struct loop * loop)
2786 {
2787   tree var, stmt, var_name;
2788   edge pe;
2789   basic_block new_bb;
2790   int i;
2791
2792   /* create temporary variable */
2793   var = create_tmp_var (TREE_TYPE (n), "bnd");
2794   add_referenced_tmp_var (var);
2795
2796   var_name = make_ssa_name (var, NULL_TREE);
2797
2798   /* vf is power of 2; then n/vf = n >> log2 (vf).  */
2799
2800   i = exact_log2 (vf);
2801   stmt = build2 (MODIFY_EXPR, void_type_node, var_name,
2802                 build2 (RSHIFT_EXPR, TREE_TYPE (n),
2803                        n, build_int_cst (unsigned_type_node,i)));
2804
2805   SSA_NAME_DEF_STMT (var_name) = stmt;
2806
2807   pe = loop_preheader_edge (loop);
2808   new_bb = bsi_insert_on_edge_immediate (pe, stmt);
2809   if (new_bb)
2810     add_bb_to_loop (new_bb, EDGE_PRED (new_bb, 0)->src->loop_father);
2811   else  
2812     if (vect_debug_details (NULL))
2813       fprintf (dump_file, "New bb on preheader edge was not generated.");
2814
2815   return var_name;
2816 }
2817
2818
2819 /* Function vect_transform_loop_bound.
2820
2821    Create a new exit condition for the loop.  */
2822
2823 static void
2824 vect_transform_loop_bound (loop_vec_info loop_vinfo, tree niters)
2825 {
2826   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
2827   edge exit_edge = loop->single_exit;
2828   block_stmt_iterator loop_exit_bsi = bsi_last (exit_edge->src);
2829   tree indx_before_incr, indx_after_incr;
2830   tree orig_cond_expr;
2831   HOST_WIDE_INT old_N = 0;
2832   int vf;
2833   tree cond_stmt;
2834   tree new_loop_bound;
2835   bool symbol_niters;
2836   tree cond;
2837   tree lb_type;
2838
2839   symbol_niters = !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo);
2840
2841   if (!symbol_niters)
2842     old_N = LOOP_VINFO_INT_NITERS (loop_vinfo);
2843
2844   vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
2845
2846   orig_cond_expr = LOOP_VINFO_EXIT_COND (loop_vinfo);
2847 #ifdef ENABLE_CHECKING
2848   gcc_assert (orig_cond_expr);
2849 #endif
2850   gcc_assert (orig_cond_expr == bsi_stmt (loop_exit_bsi));
2851
2852   create_iv (integer_zero_node, integer_one_node, NULL_TREE, loop, 
2853              &loop_exit_bsi, false, &indx_before_incr, &indx_after_incr);
2854
2855   /* bsi_insert is using BSI_NEW_STMT. We need to bump it back 
2856      to point to the exit condition.  */
2857   bsi_next (&loop_exit_bsi);
2858   gcc_assert (bsi_stmt (loop_exit_bsi) == orig_cond_expr);
2859
2860   /* new loop exit test:  */
2861   lb_type = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (orig_cond_expr, 0), 1));
2862   if (!symbol_niters)
2863     new_loop_bound = fold_convert (lb_type, 
2864                                    build_int_cst (unsigned_type_node, 
2865                                                   old_N/vf));
2866   else
2867     new_loop_bound = niters;
2868
2869   if (exit_edge->flags & EDGE_TRUE_VALUE) /* 'then' edge exits the loop.  */
2870     cond = build2 (GE_EXPR, boolean_type_node, 
2871                    indx_after_incr, new_loop_bound);
2872   else /* 'then' edge loops back.  */
2873     cond = build2 (LT_EXPR, boolean_type_node, 
2874                    indx_after_incr, new_loop_bound);
2875
2876   cond_stmt = build3 (COND_EXPR, TREE_TYPE (orig_cond_expr), cond,
2877         TREE_OPERAND (orig_cond_expr, 1), TREE_OPERAND (orig_cond_expr, 2));
2878
2879   bsi_insert_before (&loop_exit_bsi, cond_stmt, BSI_SAME_STMT);   
2880
2881   /* remove old loop exit test:  */
2882   bsi_remove (&loop_exit_bsi);
2883
2884   if (vect_debug_details (NULL))
2885     print_generic_expr (dump_file, cond_stmt, TDF_SLIM);
2886 }
2887
2888
2889 /*   Function vect_update_ivs_after_vectorizer.
2890
2891      "Advance" the induction variables of LOOP to the value they should take
2892      after the execution of LOOP.  This is currently necessary because the
2893      vectorizer does not handle induction variables that are used after the
2894      loop.  Such a situation occurs when the last iterations of LOOP are
2895      peeled, because:
2896      1. We introduced new uses after LOOP for IVs that were not originally used
2897         after LOOP: the IVs of LOOP are now used by an epilog loop.
2898      2. LOOP is going to be vectorized; this means that it will iterate N/VF
2899         times, whereas the loop IVs should be bumped N times.
2900
2901      Input:
2902      - LOOP - a loop that is going to be vectorized. The last few iterations
2903               of LOOP were peeled.
2904      - NITERS - the number of iterations that LOOP executes (before it is
2905                 vectorized). i.e, the number of times the ivs should be bumped.
2906
2907      We have:
2908
2909         bb_before_loop:
2910           if (guard-cond) GOTO bb_before_epilog_loop
2911           else            GOTO loop
2912
2913         loop:
2914           do {
2915           } while ...
2916
2917         bb_before_epilog_loop:
2918
2919      bb_before_epilog_loop has edges coming in form the loop exit and
2920      from bb_before_loop.  New definitions for ivs will be placed on the edge
2921      from loop->exit to bb_before_epilog_loop.  This also requires that we update
2922      the phis in bb_before_epilog_loop. (In the code this bb is denoted 
2923      "update_bb").
2924
2925      Assumption 1: Like the rest of the vectorizer, this function assumes
2926      a single loop exit that has a single predecessor.
2927
2928      Assumption 2: The phi nodes in the LOOP header and in update_bb are
2929      organized in the same order.
2930
2931      Assumption 3: The access function of the ivs is simple enough (see
2932      vect_can_advance_ivs_p).  This assumption will be relaxed in the future.
2933  */
2934
2935 static void
2936 vect_update_ivs_after_vectorizer (struct loop *loop, tree niters)
2937 {
2938   edge exit = loop->exit_edges[0];
2939   tree phi, phi1;
2940   basic_block update_bb = exit->dest;
2941   edge update_e;
2942
2943   /* Generate basic block at the exit from the loop.  */
2944   basic_block new_bb = split_edge (exit);
2945
2946   add_bb_to_loop (new_bb, EDGE_SUCC (new_bb, 0)->dest->loop_father);
2947   loop->exit_edges[0] = EDGE_PRED (new_bb, 0);
2948   update_e = EDGE_SUCC (new_bb, 0);
2949   
2950   for (phi = phi_nodes (loop->header), phi1 = phi_nodes (update_bb); 
2951        phi && phi1; 
2952        phi = PHI_CHAIN (phi), phi1 = PHI_CHAIN (phi1))
2953     {
2954       tree access_fn = NULL;
2955       tree evolution_part;
2956       tree init_expr;
2957       tree step_expr;
2958       tree var, stmt, ni, ni_name;
2959       block_stmt_iterator last_bsi;
2960
2961       /* Skip virtual phi's. The data dependences that are associated with
2962          virtual defs/uses (i.e., memory accesses) are analyzed elsewhere.  */
2963
2964       if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (phi))))
2965         {
2966           if (vect_debug_details (NULL))
2967             fprintf (dump_file, "virtual phi. skip.");
2968           continue;
2969         }
2970
2971       access_fn = analyze_scalar_evolution (loop, PHI_RESULT (phi)); 
2972       gcc_assert (access_fn);
2973       evolution_part =
2974          unshare_expr (evolution_part_in_loop_num (access_fn, loop->num));
2975       
2976       /* FORNOW: We do not transform initial conditions of IVs 
2977          which evolution functions are a polynomial of degree >= 2 or
2978          exponential.  */
2979       gcc_assert (!tree_is_chrec (evolution_part));
2980
2981       step_expr = evolution_part;
2982       init_expr = unshare_expr (initial_condition (access_fn));
2983
2984       ni = build2 (PLUS_EXPR, TREE_TYPE (init_expr),
2985                   build2 (MULT_EXPR, TREE_TYPE (niters),
2986                        niters, step_expr), init_expr);
2987
2988       var = create_tmp_var (TREE_TYPE (init_expr), "tmp");
2989       add_referenced_tmp_var (var);
2990
2991       ni_name = force_gimple_operand (ni, &stmt, false, var);
2992       
2993       /* Insert stmt into new_bb.  */
2994       last_bsi = bsi_last (new_bb);
2995       if (stmt)
2996         bsi_insert_after (&last_bsi, stmt, BSI_NEW_STMT);   
2997
2998       /* Fix phi expressions in duplicated loop.  */
2999       gcc_assert (PHI_ARG_DEF_FROM_EDGE (phi1, update_e) ==
3000                   PHI_ARG_DEF_FROM_EDGE (phi, EDGE_SUCC (loop->latch, 0)));
3001       SET_PHI_ARG_DEF (phi1, phi_arg_from_edge (phi1, update_e), ni_name);
3002     }
3003 }
3004
3005
3006 /* This function is the main driver of transformation 
3007    to be done for loop before vectorizing it in case of 
3008    unknown loop bound.  */
3009
3010 static void 
3011 vect_transform_for_unknown_loop_bound (loop_vec_info loop_vinfo, tree * ratio,
3012                                        struct loops *loops)
3013 {
3014
3015   tree ni_name, ratio_mult_vf_name;
3016 #ifdef ENABLE_CHECKING
3017   int loop_num;
3018 #endif
3019   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
3020   struct loop *new_loop;
3021
3022   if (vect_debug_details (NULL))
3023     fprintf (dump_file, "\n<<vect_transtorm_for_unknown_loop_bound>>\n");
3024
3025   /* Generate the following variables on the preheader of original loop:
3026          
3027      ni_name = number of iteration the original loop executes
3028      ratio = ni_name / vf
3029      ratio_mult_vf_name = ratio * vf  */
3030   vect_generate_tmps_on_preheader (loop_vinfo, &ni_name,
3031                                    &ratio_mult_vf_name, ratio);
3032
3033   /* Update loop info.  */
3034   loop->pre_header = loop_preheader_edge (loop)->src;
3035   loop->pre_header_edges[0] = loop_preheader_edge (loop);
3036
3037 #ifdef ENABLE_CHECKING
3038   loop_num  = loop->num; 
3039 #endif
3040   new_loop = tree_duplicate_loop_to_edge (loop, loops, loop->exit_edges[0],
3041                                           ratio_mult_vf_name, ni_name, true); 
3042 #ifdef ENABLE_CHECKING
3043   gcc_assert (new_loop);
3044   gcc_assert (loop_num == loop->num);
3045 #endif
3046
3047   /* Update IVs of original loop as if they were advanced 
3048      by ratio_mult_vf_name steps.  */
3049
3050 #ifdef ENABLE_CHECKING
3051   /* Check existence of intermediate bb.  */
3052   gcc_assert (loop->exit_edges[0]->dest == new_loop->pre_header);
3053 #endif
3054   vect_update_ivs_after_vectorizer (loop, ratio_mult_vf_name); 
3055
3056   return;
3057
3058 }
3059
3060
3061 /* Function vect_gen_niters_for_prolog_loop
3062
3063    Set the number of iterations for the loop represented by LOOP_VINFO
3064    to the minimum between NITERS (the original iteration count of the loop)
3065    and the misalignment of DR - the first data reference recorded in
3066    LOOP_VINFO_UNALIGNED_DR (LOOP_VINFO).  As a result, after the execution of 
3067    this loop, the data reference DR will refer to an aligned location.  */
3068
3069 static tree 
3070 vect_gen_niters_for_prolog_loop (loop_vec_info loop_vinfo, tree niters)
3071 {
3072   struct data_reference *dr = LOOP_VINFO_UNALIGNED_DR (loop_vinfo);
3073   int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
3074   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
3075   tree var, stmt;
3076   tree iters, iters_name;
3077   edge pe;
3078   basic_block new_bb;
3079   tree dr_stmt = DR_STMT (dr);
3080   stmt_vec_info stmt_info = vinfo_for_stmt (dr_stmt);
3081   tree start_addr, byte_miss_align, elem_miss_align;
3082   int vec_type_align = 
3083     GET_MODE_ALIGNMENT (TYPE_MODE (STMT_VINFO_VECTYPE (stmt_info))) 
3084                                                         / BITS_PER_UNIT;
3085   tree tmp1, tmp2;
3086   tree new_stmt_list = NULL_TREE;
3087
3088   start_addr = vect_create_addr_base_for_vector_ref (dr_stmt,
3089                                                      &new_stmt_list, NULL_TREE);
3090
3091   pe = loop_preheader_edge (loop); 
3092   new_bb = bsi_insert_on_edge_immediate (pe, new_stmt_list); 
3093   if (new_bb)
3094     add_bb_to_loop (new_bb, EDGE_PRED (new_bb, 0)->src->loop_father);
3095
3096   byte_miss_align = 
3097         build (BIT_AND_EXPR, integer_type_node, start_addr, 
3098                   build (MINUS_EXPR, integer_type_node, 
3099                          build_int_cst (unsigned_type_node,
3100                                         vec_type_align), integer_one_node));
3101   tmp1 = build_int_cst (unsigned_type_node, vec_type_align/vf);
3102   elem_miss_align = build (FLOOR_DIV_EXPR, integer_type_node, 
3103                            byte_miss_align, tmp1); 
3104   
3105   tmp2 = 
3106         build (BIT_AND_EXPR, integer_type_node,
3107           build (MINUS_EXPR, integer_type_node, 
3108                 build_int_cst (unsigned_type_node, vf), elem_miss_align),
3109           build (MINUS_EXPR, integer_type_node, 
3110                 build_int_cst (unsigned_type_node, vf), integer_one_node)); 
3111
3112   iters = build2 (MIN_EXPR, TREE_TYPE (tmp2), tmp2, niters);
3113   var = create_tmp_var (TREE_TYPE (iters), "iters");
3114   add_referenced_tmp_var (var);
3115   iters_name = force_gimple_operand (iters, &stmt, false, var);
3116
3117   /* Insert stmt on loop preheader edge.  */
3118   pe = loop_preheader_edge (loop);
3119   if (stmt)
3120     new_bb = bsi_insert_on_edge_immediate (pe, stmt);
3121   if (new_bb)
3122     add_bb_to_loop (new_bb, EDGE_PRED (new_bb, 0)->src->loop_father);
3123
3124   return iters_name; 
3125 }
3126
3127
3128 /* Function vect_update_niters_after_peeling
3129
3130    NITERS iterations were peeled from the loop represented by LOOP_VINFO. 
3131    The new number of iterations is therefore original_niters - NITERS.
3132    Record the new number of iterations in LOOP_VINFO.  */
3133
3134 static void
3135 vect_update_niters_after_peeling (loop_vec_info loop_vinfo, tree niters)
3136 {
3137   tree n_iters = LOOP_VINFO_NITERS (loop_vinfo);
3138   LOOP_VINFO_NITERS (loop_vinfo) = 
3139     build (MINUS_EXPR, integer_type_node, n_iters, niters);      
3140 }
3141
3142
3143 /* Function vect_update_inits_of_dr
3144
3145    NITERS iterations were peeled from LOOP.  DR represents a data reference
3146    in LOOP.  This function updates the information recorded in DR to
3147    account for the fact that the first NITERS iterations had already been 
3148    executed.  Specifically, it updates the initial_condition of the 
3149    access_function of DR.  */
3150
3151 static void
3152 vect_update_inits_of_dr (struct data_reference *dr, struct loop *loop, 
3153                          tree niters)
3154 {
3155   tree access_fn = DR_ACCESS_FN (dr, 0);
3156   tree init, init_new, step;
3157       
3158   step = evolution_part_in_loop_num (access_fn, loop->num);
3159   init = initial_condition (access_fn);
3160       
3161   init_new = build (PLUS_EXPR, TREE_TYPE (init),
3162                   build (MULT_EXPR, TREE_TYPE (niters),
3163                          niters, step), init);
3164   DR_ACCESS_FN (dr, 0) = chrec_replace_initial_condition (access_fn, init_new);
3165   
3166   return;
3167 }
3168
3169
3170 /* Function vect_update_inits_of_drs
3171
3172    NITERS iterations were peeled from the loop represented by LOOP_VINFO.  
3173    This function updates the information recorded for the data references in 
3174    the loop to account for the fact that the first NITERS iterations had 
3175    already been executed.  Specifically, it updates the initial_condition of the
3176    access_function of all the data_references in the loop.  */
3177
3178 static void
3179 vect_update_inits_of_drs (loop_vec_info loop_vinfo, tree niters)
3180 {
3181   unsigned int i;
3182   varray_type loop_write_datarefs = LOOP_VINFO_DATAREF_WRITES (loop_vinfo);
3183   varray_type loop_read_datarefs = LOOP_VINFO_DATAREF_READS (loop_vinfo);
3184   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
3185
3186   if (dump_file && (dump_flags & TDF_DETAILS))
3187     fprintf (dump_file, "\n<<vect_update_inits_of_dr>>\n");
3188
3189   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_write_datarefs); i++)
3190     {
3191       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_write_datarefs, i);
3192       vect_update_inits_of_dr (dr, loop, niters);
3193     }
3194
3195   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_read_datarefs); i++)
3196     {
3197       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_read_datarefs, i);
3198       vect_update_inits_of_dr (dr, loop, niters);
3199     }
3200 }
3201
3202
3203 /* Function vect_do_peeling_for_alignment
3204
3205    Peel the first 'niters' iterations of the loop represented by LOOP_VINFO.
3206    'niters' is set to the misalignment of one of the data references in the
3207    loop, thereby forcing it to refer to an aligned location at the beginning
3208    of the execution of this loop.  The data reference for which we are
3209    peeling is recorded in LOOP_VINFO_UNALIGNED_DR.  */
3210
3211 static void
3212 vect_do_peeling_for_alignment (loop_vec_info loop_vinfo, struct loops *loops)
3213 {
3214   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
3215   tree niters_of_prolog_loop, ni_name;
3216
3217   if (vect_debug_details (NULL))
3218     fprintf (dump_file, "\n<<vect_do_peeling_for_alignment>>\n");
3219
3220   ni_name = vect_build_loop_niters (loop_vinfo);
3221   niters_of_prolog_loop = vect_gen_niters_for_prolog_loop (loop_vinfo, ni_name);
3222   
3223
3224   /* Peel the prolog loop and iterate it niters_of_prolog_loop.  */
3225   tree_duplicate_loop_to_edge (loop, loops, loop_preheader_edge(loop), 
3226                                   niters_of_prolog_loop, ni_name, false); 
3227
3228   /* Update number of times loop executes.  */
3229   vect_update_niters_after_peeling (loop_vinfo, niters_of_prolog_loop);
3230
3231   /* Update all inits of access functions of all data refs.  */
3232   vect_update_inits_of_drs (loop_vinfo, niters_of_prolog_loop);
3233
3234   /* After peeling we have to reset scalar evolution analyzer.  */
3235   scev_reset ();
3236
3237   return;
3238 }
3239
3240
3241 /* Function vect_transform_loop.
3242
3243    The analysis phase has determined that the loop is vectorizable.
3244    Vectorize the loop - created vectorized stmts to replace the scalar
3245    stmts in the loop, and update the loop exit condition.  */
3246
3247 static void
3248 vect_transform_loop (loop_vec_info loop_vinfo, 
3249                      struct loops *loops ATTRIBUTE_UNUSED)
3250 {
3251   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
3252   basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
3253   int nbbs = loop->num_nodes;
3254   block_stmt_iterator si;
3255   int i;
3256   tree ratio = NULL;
3257   int vectorization_factor = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
3258
3259   if (vect_debug_details (NULL))
3260     fprintf (dump_file, "\n<<vec_transform_loop>>\n");
3261
3262   
3263   /* Peel the loop if there are data refs with unknown alignment.
3264      Only one data ref with unknown store is allowed.  */
3265
3266   
3267   if (LOOP_DO_PEELING_FOR_ALIGNMENT (loop_vinfo))
3268     vect_do_peeling_for_alignment (loop_vinfo, loops);
3269   
3270   /* If the loop has a symbolic number of iterations 'n' 
3271      (i.e. it's not a compile time constant), 
3272      then an epilog loop needs to be created. We therefore duplicate 
3273      the initial loop. The original loop will be vectorized, and will compute
3274      the first (n/VF) iterations. The second copy of the loop will remain 
3275      serial and will compute the remaining (n%VF) iterations.
3276      (VF is the vectorization factor).  */
3277
3278   if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
3279     vect_transform_for_unknown_loop_bound (loop_vinfo, &ratio, loops);
3280
3281   /* FORNOW: we'll treat the case where niters is constant and 
3282      
3283                         niters % vf != 0
3284
3285      in the way similar to one with symbolic niters. 
3286      For this we'll generate variable which value is equal to niters.  */
3287
3288   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) 
3289       && (LOOP_VINFO_INT_NITERS (loop_vinfo) % vectorization_factor != 0))
3290     vect_transform_for_unknown_loop_bound (loop_vinfo, &ratio, loops);
3291
3292
3293   /* 1) Make sure the loop header has exactly two entries
3294      2) Make sure we have a preheader basic block.  */
3295
3296   gcc_assert (EDGE_COUNT (loop->header->preds) == 2);
3297
3298   loop_split_edge_with (loop_preheader_edge (loop), NULL);
3299
3300
3301   /* FORNOW: the vectorizer supports only loops which body consist
3302      of one basic block (header + empty latch). When the vectorizer will 
3303      support more involved loop forms, the order by which the BBs are 
3304      traversed need to be reconsidered.  */
3305
3306   for (i = 0; i < nbbs; i++)
3307     {
3308       basic_block bb = bbs[i];
3309
3310       for (si = bsi_start (bb); !bsi_end_p (si);)
3311         {
3312           tree stmt = bsi_stmt (si);
3313           stmt_vec_info stmt_info;
3314           bool is_store;
3315
3316           if (vect_debug_details (NULL))
3317             {
3318               fprintf (dump_file, "------>vectorizing statement: ");
3319               print_generic_expr (dump_file, stmt, TDF_SLIM);
3320             }   
3321           stmt_info = vinfo_for_stmt (stmt);
3322           gcc_assert (stmt_info);
3323           if (!STMT_VINFO_RELEVANT_P (stmt_info))
3324             {
3325               bsi_next (&si);
3326               continue;
3327             }
3328 #ifdef ENABLE_CHECKING
3329           /* FORNOW: Verify that all stmts operate on the same number of
3330                      units and no inner unrolling is necessary.  */
3331           gcc_assert 
3332                 (GET_MODE_NUNITS (TYPE_MODE (STMT_VINFO_VECTYPE (stmt_info)))
3333                  == vectorization_factor);
3334 #endif
3335           /* -------- vectorize statement ------------ */
3336           if (vect_debug_details (NULL))
3337             fprintf (dump_file, "transform statement.");
3338
3339           is_store = vect_transform_stmt (stmt, &si);
3340           if (is_store)
3341             {
3342               /* free the attached stmt_vec_info and remove the stmt.  */
3343               stmt_ann_t ann = stmt_ann (stmt);
3344               free (stmt_info);
3345               set_stmt_info (ann, NULL);
3346               bsi_remove (&si);
3347               continue;
3348             }
3349
3350           bsi_next (&si);
3351         }                       /* stmts in BB */
3352     }                           /* BBs in loop */
3353
3354   vect_transform_loop_bound (loop_vinfo, ratio);
3355
3356   if (vect_debug_details (loop))
3357     fprintf (dump_file,"Success! loop vectorized.");
3358   if (vect_debug_stats (loop))
3359     fprintf (dump_file, "LOOP VECTORIZED.");
3360 }
3361
3362
3363 /* Function vect_is_simple_use.
3364
3365    Input:
3366    LOOP - the loop that is being vectorized.
3367    OPERAND - operand of a stmt in LOOP.
3368    DEF - the defining stmt in case OPERAND is an SSA_NAME.
3369
3370    Returns whether a stmt with OPERAND can be vectorized.
3371    Supportable operands are constants, loop invariants, and operands that are
3372    defined by the current iteration of the loop. Unsupportable operands are 
3373    those that are defined by a previous iteration of the loop (as is the case
3374    in reduction/induction computations).  */
3375
3376 static bool
3377 vect_is_simple_use (tree operand, struct loop *loop, tree *def)
3378
3379   tree def_stmt;
3380   basic_block bb;
3381
3382   if (def)
3383     *def = NULL_TREE;
3384
3385   if (TREE_CODE (operand) == INTEGER_CST || TREE_CODE (operand) == REAL_CST)
3386     return true;
3387
3388   if (TREE_CODE (operand) != SSA_NAME)
3389     return false;
3390
3391   def_stmt = SSA_NAME_DEF_STMT (operand);
3392   if (def_stmt == NULL_TREE )
3393     {
3394       if (vect_debug_details (NULL))
3395         fprintf (dump_file, "no def_stmt.");
3396       return false;
3397     }
3398
3399   /* empty stmt is expected only in case of a function argument.
3400      (Otherwise - we expect a phi_node or a modify_expr).  */
3401   if (IS_EMPTY_STMT (def_stmt))
3402     {
3403       tree arg = TREE_OPERAND (def_stmt, 0);
3404       if (TREE_CODE (arg) == INTEGER_CST || TREE_CODE (arg) == REAL_CST)
3405         return true;
3406       if (vect_debug_details (NULL))
3407         {
3408           fprintf (dump_file, "Unexpected empty stmt: ");
3409           print_generic_expr (dump_file, def_stmt, TDF_SLIM);
3410         }
3411       return false;  
3412     }
3413
3414   /* phi_node inside the loop indicates an induction/reduction pattern.
3415      This is not supported yet.  */
3416   bb = bb_for_stmt (def_stmt);
3417   if (TREE_CODE (def_stmt) == PHI_NODE && flow_bb_inside_loop_p (loop, bb))
3418     {
3419       if (vect_debug_details (NULL))
3420         fprintf (dump_file, "reduction/induction - unsupported.");
3421       return false; /* FORNOW: not supported yet.  */
3422     }
3423
3424   /* Expecting a modify_expr or a phi_node.  */
3425   if (TREE_CODE (def_stmt) == MODIFY_EXPR
3426       || TREE_CODE (def_stmt) == PHI_NODE)
3427     {
3428       if (def)
3429         *def = def_stmt;        
3430       return true;
3431     }
3432
3433   return false;
3434 }
3435
3436
3437 /* Function vect_analyze_operations.
3438
3439    Scan the loop stmts and make sure they are all vectorizable.  */
3440
3441 static bool
3442 vect_analyze_operations (loop_vec_info loop_vinfo)
3443 {
3444   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
3445   basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
3446   int nbbs = loop->num_nodes;
3447   block_stmt_iterator si;
3448   int vectorization_factor = 0;
3449   int i;
3450   bool ok;
3451   tree scalar_type;
3452
3453   if (vect_debug_details (NULL))
3454     fprintf (dump_file, "\n<<vect_analyze_operations>>\n");
3455
3456   for (i = 0; i < nbbs; i++)
3457     {
3458       basic_block bb = bbs[i];
3459
3460       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
3461         {
3462           tree stmt = bsi_stmt (si);
3463           int nunits;
3464           stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
3465           tree vectype;
3466
3467           if (vect_debug_details (NULL))
3468             {
3469               fprintf (dump_file, "==> examining statement: ");
3470               print_generic_expr (dump_file, stmt, TDF_SLIM);
3471             }
3472
3473           gcc_assert (stmt_info);
3474
3475           /* skip stmts which do not need to be vectorized.
3476              this is expected to include:
3477              - the COND_EXPR which is the loop exit condition
3478              - any LABEL_EXPRs in the loop
3479              - computations that are used only for array indexing or loop
3480              control  */
3481
3482           if (!STMT_VINFO_RELEVANT_P (stmt_info))
3483             {
3484               if (vect_debug_details (NULL))
3485                 fprintf (dump_file, "irrelevant.");
3486               continue;
3487             }
3488
3489           if (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (stmt))))
3490             {
3491               if (vect_debug_stats (loop) || vect_debug_details (loop))
3492                 {
3493                   fprintf (dump_file, "not vectorized: vector stmt in loop:");
3494                   print_generic_expr (dump_file, stmt, TDF_SLIM);
3495                 }
3496               return false;
3497             }
3498
3499           if (STMT_VINFO_DATA_REF (stmt_info))
3500             scalar_type = TREE_TYPE (DR_REF (STMT_VINFO_DATA_REF (stmt_info)));    
3501           else if (TREE_CODE (stmt) == MODIFY_EXPR)
3502             scalar_type = TREE_TYPE (TREE_OPERAND (stmt, 0));
3503           else
3504             scalar_type = TREE_TYPE (stmt);
3505
3506           if (vect_debug_details (NULL))
3507             {
3508               fprintf (dump_file, "get vectype for scalar type:  ");
3509               print_generic_expr (dump_file, scalar_type, TDF_SLIM);
3510             }
3511
3512           vectype = get_vectype_for_scalar_type (scalar_type);
3513           if (!vectype)
3514             {
3515               if (vect_debug_stats (loop) || vect_debug_details (loop))
3516                 {
3517                   fprintf (dump_file, "not vectorized: unsupported data-type ");
3518                   print_generic_expr (dump_file, scalar_type, TDF_SLIM);
3519                 }
3520               return false;
3521             }
3522
3523           if (vect_debug_details (NULL))
3524             {
3525               fprintf (dump_file, "vectype: ");
3526               print_generic_expr (dump_file, vectype, TDF_SLIM);
3527             }
3528           STMT_VINFO_VECTYPE (stmt_info) = vectype;
3529
3530           ok = (vectorizable_operation (stmt, NULL, NULL)
3531                 || vectorizable_assignment (stmt, NULL, NULL)
3532                 || vectorizable_load (stmt, NULL, NULL)
3533                 || vectorizable_store (stmt, NULL, NULL));
3534
3535           if (!ok)
3536             {
3537               if (vect_debug_stats (loop) || vect_debug_details (loop))
3538                 {
3539                   fprintf (dump_file, "not vectorized: stmt not supported: ");
3540                   print_generic_expr (dump_file, stmt, TDF_SLIM);
3541                 }
3542               return false;
3543             }
3544
3545           nunits = GET_MODE_NUNITS (TYPE_MODE (vectype));
3546           if (vect_debug_details (NULL))
3547             fprintf (dump_file, "nunits = %d", nunits);
3548
3549           if (vectorization_factor)
3550             {
3551               /* FORNOW: don't allow mixed units.
3552                  This restriction will be relaxed in the future.  */
3553               if (nunits != vectorization_factor)
3554                 {
3555                   if (vect_debug_stats (loop) || vect_debug_details (loop))
3556                     fprintf (dump_file, "not vectorized: mixed data-types");
3557                   return false;
3558                 }
3559             }
3560           else
3561             vectorization_factor = nunits;
3562
3563 #ifdef ENABLE_CHECKING
3564           gcc_assert (GET_MODE_SIZE (TYPE_MODE (scalar_type))
3565                         * vectorization_factor == UNITS_PER_SIMD_WORD);
3566 #endif
3567         }
3568     }
3569
3570   /* TODO: Analyze cost. Decide if worth while to vectorize.  */
3571
3572   if (vectorization_factor <= 1)
3573     {
3574       if (vect_debug_stats (loop) || vect_debug_details (loop))
3575         fprintf (dump_file, "not vectorized: unsupported data-type");
3576       return false;
3577     }
3578   LOOP_VINFO_VECT_FACTOR (loop_vinfo) = vectorization_factor;
3579
3580   
3581   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) 
3582       && vect_debug_details (NULL))
3583     fprintf (dump_file, 
3584         "vectorization_factor = %d, niters = " HOST_WIDE_INT_PRINT_DEC,
3585         vectorization_factor, LOOP_VINFO_INT_NITERS (loop_vinfo));
3586
3587   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
3588       && LOOP_VINFO_INT_NITERS (loop_vinfo) % vectorization_factor != 0)
3589     {
3590       /* In this case we have to generate epilog loop, that 
3591          can be done only for loops with one entry edge.  */
3592       if (LOOP_VINFO_LOOP (loop_vinfo)->num_entries != 1
3593           || !(LOOP_VINFO_LOOP (loop_vinfo)->pre_header))
3594         {
3595           if (vect_debug_stats (loop) || vect_debug_details (loop))
3596             fprintf (dump_file, "not vectorized: more than one entry.");
3597           return false;
3598         }
3599     }
3600   
3601   return true;
3602 }
3603
3604
3605 /* Function exist_non_indexing_operands_for_use_p 
3606
3607    USE is one of the uses attached to STMT. Check if USE is 
3608    used in STMT for anything other than indexing an array.  */
3609
3610 static bool
3611 exist_non_indexing_operands_for_use_p (tree use, tree stmt)
3612 {
3613   tree operand;
3614   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
3615  
3616   /* USE corresponds to some operand in STMT. If there is no data
3617      reference in STMT, then any operand that corresponds to USE
3618      is not indexing an array.  */
3619   if (!STMT_VINFO_DATA_REF (stmt_info))
3620     return true;
3621  
3622   /* STMT has a data_ref. FORNOW this means that its of one of
3623      the following forms:
3624      -1- ARRAY_REF = var
3625      -2- var = ARRAY_REF
3626      (This should have been verified in analyze_data_refs).
3627
3628      'var' in the second case corresponds to a def, not a use,
3629      so USE cannot correspond to any operands that are not used 
3630      for array indexing.
3631
3632      Therefore, all we need to check is if STMT falls into the
3633      first case, and whether var corresponds to USE.  */
3634  
3635   if (TREE_CODE (TREE_OPERAND (stmt, 0)) == SSA_NAME)
3636     return false;
3637
3638   operand = TREE_OPERAND (stmt, 1);
3639
3640   if (TREE_CODE (operand) != SSA_NAME)
3641     return false;
3642
3643   if (operand == use)
3644     return true;
3645
3646   return false;
3647 }
3648
3649
3650 /* Function vect_is_simple_iv_evolution.
3651
3652    FORNOW: A simple evolution of an induction variables in the loop is
3653    considered a polynomial evolution with constant step.  */
3654
3655 static bool
3656 vect_is_simple_iv_evolution (unsigned loop_nb, tree access_fn, tree * init, 
3657                                 tree * step, bool strict)
3658 {
3659   tree init_expr;
3660   tree step_expr;
3661   
3662   tree evolution_part = evolution_part_in_loop_num (access_fn, loop_nb);
3663
3664   /* When there is no evolution in this loop, the evolution function
3665      is not "simple".  */  
3666   if (evolution_part == NULL_TREE)
3667     return false;
3668   
3669   /* When the evolution is a polynomial of degree >= 2
3670      the evolution function is not "simple".  */
3671   if (tree_is_chrec (evolution_part))
3672     return false;
3673   
3674   step_expr = evolution_part;
3675   init_expr = unshare_expr (initial_condition (access_fn));
3676
3677   if (vect_debug_details (NULL))
3678     {
3679       fprintf (dump_file, "step: ");
3680       print_generic_expr (dump_file, step_expr, TDF_SLIM);
3681       fprintf (dump_file, ",  init: ");
3682       print_generic_expr (dump_file, init_expr, TDF_SLIM);
3683     }
3684
3685   *init = init_expr;
3686   *step = step_expr;
3687
3688   if (TREE_CODE (step_expr) != INTEGER_CST)
3689     {
3690       if (vect_debug_details (NULL))
3691         fprintf (dump_file, "step unknown.");
3692       return false;
3693     }
3694
3695   if (strict)
3696     if (!integer_onep (step_expr))
3697       {
3698         if (vect_debug_details (NULL))
3699           print_generic_expr (dump_file, step_expr, TDF_SLIM);
3700         return false;
3701       }
3702
3703   return true;
3704 }
3705
3706
3707 /* Function vect_analyze_scalar_cycles.
3708
3709    Examine the cross iteration def-use cycles of scalar variables, by
3710    analyzing the loop (scalar) PHIs; verify that the cross iteration def-use
3711    cycles that they represent do not impede vectorization.
3712
3713    FORNOW: Reduction as in the following loop, is not supported yet:
3714               loop1:
3715               for (i=0; i<N; i++)
3716                  sum += a[i];
3717            The cross-iteration cycle corresponding to variable 'sum' will be
3718            considered too complicated and will impede vectorization.
3719
3720    FORNOW: Induction as in the following loop, is not supported yet:
3721               loop2:
3722               for (i=0; i<N; i++)
3723                  a[i] = i;
3724
3725            However, the following loop *is* vectorizable:
3726               loop3:
3727               for (i=0; i<N; i++)
3728                  a[i] = b[i];
3729
3730            In both loops there exists a def-use cycle for the variable i:
3731               loop: i_2 = PHI (i_0, i_1)
3732                     a[i_2] = ...;
3733                     i_1 = i_2 + 1;
3734                     GOTO loop;
3735
3736            The evolution of the above cycle is considered simple enough,
3737            however, we also check that the cycle does not need to be
3738            vectorized, i.e - we check that the variable that this cycle
3739            defines is only used for array indexing or in stmts that do not
3740            need to be vectorized. This is not the case in loop2, but it
3741            *is* the case in loop3.  */
3742
3743 static bool
3744 vect_analyze_scalar_cycles (loop_vec_info loop_vinfo)
3745 {
3746   tree phi;
3747   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
3748   basic_block bb = loop->header;
3749   tree dummy;
3750
3751   if (vect_debug_details (NULL))
3752     fprintf (dump_file, "\n<<vect_analyze_scalar_cycles>>\n");
3753
3754   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
3755     {
3756       tree access_fn = NULL;
3757
3758       if (vect_debug_details (NULL))
3759         {
3760           fprintf (dump_file, "Analyze phi: ");
3761           print_generic_expr (dump_file, phi, TDF_SLIM);
3762         }
3763
3764       /* Skip virtual phi's. The data dependences that are associated with
3765          virtual defs/uses (i.e., memory accesses) are analyzed elsewhere.  */
3766
3767       if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (phi))))
3768         {
3769           if (vect_debug_details (NULL))
3770             fprintf (dump_file, "virtual phi. skip.");
3771           continue;
3772         }
3773
3774       /* Analyze the evolution function.  */
3775
3776       /* FORNOW: The only scalar cross-iteration cycles that we allow are
3777          those of loop induction variables; This property is verified here.
3778
3779          Furthermore, if that induction variable is used in an operation
3780          that needs to be vectorized (i.e, is not solely used to index
3781          arrays and check the exit condition) - we do not support its
3782          vectorization yet. This property is verified in vect_is_simple_use,
3783          during vect_analyze_operations.  */
3784
3785       access_fn = /* instantiate_parameters
3786                      (loop,*/
3787          analyze_scalar_evolution (loop, PHI_RESULT (phi));
3788
3789       if (!access_fn)
3790         {
3791           if (vect_debug_stats (loop) || vect_debug_details (loop))
3792             fprintf (dump_file, "not vectorized: unsupported scalar cycle.");
3793           return false;
3794         }
3795
3796       if (vect_debug_details (NULL))
3797         {
3798            fprintf (dump_file, "Access function of PHI: ");
3799            print_generic_expr (dump_file, access_fn, TDF_SLIM);
3800         }
3801
3802       if (!vect_is_simple_iv_evolution (loop->num, access_fn, &dummy, 
3803                                         &dummy, false))
3804         {
3805           if (vect_debug_stats (loop) || vect_debug_details (loop))
3806             fprintf (dump_file, "not vectorized: unsupported scalar cycle.");
3807           return false;
3808         }
3809     }
3810
3811   return true;
3812 }
3813
3814
3815 /* Function vect_analyze_data_ref_dependence.
3816
3817    Return TRUE if there (might) exist a dependence between a memory-reference
3818    DRA and a memory-reference DRB.  */
3819
3820 static bool
3821 vect_analyze_data_ref_dependence (struct data_reference *dra,
3822                                   struct data_reference *drb, 
3823                                   struct loop *loop)
3824 {
3825   bool differ_p; 
3826   struct data_dependence_relation *ddr;
3827   
3828   if (!array_base_name_differ_p (dra, drb, &differ_p))
3829     {
3830       if (vect_debug_stats (loop) || vect_debug_details (loop))   
3831         {
3832           fprintf (dump_file,
3833                 "not vectorized: can't determine dependence between: ");
3834           print_generic_expr (dump_file, DR_REF (dra), TDF_SLIM);
3835           fprintf (dump_file, " and ");
3836           print_generic_expr (dump_file, DR_REF (drb), TDF_SLIM);
3837         }
3838       return true;
3839     }
3840
3841   if (differ_p)
3842     return false;
3843
3844   ddr = initialize_data_dependence_relation (dra, drb);
3845   compute_affine_dependence (ddr);
3846
3847   if (DDR_ARE_DEPENDENT (ddr) == chrec_known)
3848     return false;
3849   
3850   if (vect_debug_stats (loop) || vect_debug_details (loop))
3851     {
3852       fprintf (dump_file,
3853         "not vectorized: possible dependence between data-refs ");
3854       print_generic_expr (dump_file, DR_REF (dra), TDF_SLIM);
3855       fprintf (dump_file, " and ");
3856       print_generic_expr (dump_file, DR_REF (drb), TDF_SLIM);
3857     }
3858
3859   return true;
3860 }
3861
3862
3863 /* Function vect_analyze_data_ref_dependences.
3864
3865    Examine all the data references in the loop, and make sure there do not
3866    exist any data dependences between them.
3867
3868    TODO: dependences which distance is greater than the vectorization factor
3869          can be ignored.  */
3870
3871 static bool
3872 vect_analyze_data_ref_dependences (loop_vec_info loop_vinfo)
3873 {
3874   unsigned int i, j;
3875   varray_type loop_write_refs = LOOP_VINFO_DATAREF_WRITES (loop_vinfo);
3876   varray_type loop_read_refs = LOOP_VINFO_DATAREF_READS (loop_vinfo);
3877   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
3878
3879   /* Examine store-store (output) dependences.  */
3880
3881   if (vect_debug_details (NULL))
3882     fprintf (dump_file, "\n<<vect_analyze_dependences>>\n");
3883
3884   if (vect_debug_details (NULL))
3885     fprintf (dump_file, "compare all store-store pairs.");
3886
3887   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_write_refs); i++)
3888     {
3889       for (j = i + 1; j < VARRAY_ACTIVE_SIZE (loop_write_refs); j++)
3890         {
3891           struct data_reference *dra =
3892             VARRAY_GENERIC_PTR (loop_write_refs, i);
3893           struct data_reference *drb =
3894             VARRAY_GENERIC_PTR (loop_write_refs, j);
3895           if (vect_analyze_data_ref_dependence (dra, drb, loop))
3896             return false;
3897         }
3898     }
3899
3900   /* Examine load-store (true/anti) dependences.  */
3901
3902   if (vect_debug_details (NULL))
3903     fprintf (dump_file, "compare all load-store pairs.");
3904
3905   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_read_refs); i++)
3906     {
3907       for (j = 0; j < VARRAY_ACTIVE_SIZE (loop_write_refs); j++)
3908         {
3909           struct data_reference *dra = VARRAY_GENERIC_PTR (loop_read_refs, i);
3910           struct data_reference *drb =
3911             VARRAY_GENERIC_PTR (loop_write_refs, j);
3912           if (vect_analyze_data_ref_dependence (dra, drb, loop))
3913             return false;
3914         }
3915     }
3916
3917   return true;
3918 }
3919
3920
3921 /* Function vect_get_first_index.
3922
3923    REF is a data reference.  
3924    If it is an ARRAY_REF: if its lower bound is simple enough, 
3925    put it in ARRAY_FIRST_INDEX and return TRUE; otherwise - return FALSE.
3926    If it is not an ARRAY_REF: REF has no "first index";
3927    ARRAY_FIRST_INDEX in zero, and the function returns TRUE.  */
3928
3929 static bool
3930 vect_get_first_index (tree ref, tree *array_first_index)
3931 {
3932   tree array_start;
3933
3934   if (TREE_CODE (ref) != ARRAY_REF)
3935     *array_first_index = size_zero_node;
3936   else
3937     {
3938       array_start = array_ref_low_bound (ref);
3939       if (!host_integerp (array_start,0))
3940         {
3941           if (vect_debug_details (NULL))
3942             {
3943               fprintf (dump_file, "array min val not simple integer cst.");
3944               print_generic_expr (dump_file, array_start, TDF_DETAILS);
3945             }
3946           return false;
3947         }
3948       *array_first_index = array_start;
3949     }
3950
3951   return true;
3952 }
3953
3954
3955 /* Function vect_compute_array_base_alignment.
3956    A utility function of vect_compute_array_ref_alignment.
3957
3958    Compute the misalignment of ARRAY in bits.
3959
3960    Input:
3961    ARRAY - an array_ref (possibly multidimensional) of type ARRAY_TYPE.
3962    VECTYPE - we are interested in the misalignment modulo the size of vectype.
3963              if NULL: don't compute misalignment, just return the base of ARRAY.
3964    PREV_DIMENSIONS - initialized to one.
3965    MISALIGNMENT - the computed misalignment in bits.
3966
3967    Output:
3968    If VECTYPE is not NULL:
3969      Return NULL_TREE if the misalignment cannot be computed. Otherwise, return 
3970      the base of the array, and put the computed misalignment in MISALIGNMENT. 
3971    If VECTYPE is NULL:
3972      Return the base of the array.
3973
3974    For a[idx_N]...[idx_2][idx_1][idx_0], the address of 
3975    a[idx_N]...[idx_2][idx_1] is 
3976    {&a + idx_1 * dim_0 + idx_2 * dim_0 * dim_1 + ...  
3977     ... + idx_N * dim_0 * ... * dim_N-1}. 
3978    (The misalignment of &a is not checked here).
3979    Note, that every term contains dim_0, therefore, if dim_0 is a 
3980    multiple of NUNITS, the whole sum is a multiple of NUNITS.
3981    Otherwise, if idx_1 is constant, and dim_1 is a multiple of
3982    NUINTS, we can say that the misalignment of the sum is equal to
3983    the misalignment of {idx_1 * dim_0}.  If idx_1 is not constant,
3984    we can't determine this array misalignment, and we return
3985    false. 
3986    We proceed recursively in this manner, accumulating total misalignment
3987    and the multiplication of previous dimensions for correct misalignment
3988    calculation.  */
3989
3990 static tree
3991 vect_compute_array_base_alignment (tree array,
3992                                    tree vectype,
3993                                    tree *prev_dimensions,
3994                                    tree *misalignment)
3995 {
3996   tree index;
3997   tree domain;
3998   tree dimension_size;
3999   tree mis;
4000   tree bits_per_vectype;
4001   tree bits_per_vectype_unit;
4002
4003   /* The 'stop condition' of the recursion.  */
4004   if (TREE_CODE (array) != ARRAY_REF)
4005     return array;
4006   
4007   if (!vectype)
4008     /* Just get the base decl.  */
4009     return vect_compute_array_base_alignment 
4010                 (TREE_OPERAND (array, 0), NULL, NULL, NULL);
4011
4012   if (!host_integerp (*misalignment, 1) || TREE_OVERFLOW (*misalignment) || 
4013       !host_integerp (*prev_dimensions, 1) || TREE_OVERFLOW (*prev_dimensions))
4014     return NULL_TREE;
4015
4016   domain = TYPE_DOMAIN (TREE_TYPE (array));
4017   dimension_size = 
4018         int_const_binop (PLUS_EXPR,
4019                 int_const_binop (MINUS_EXPR, TYPE_MAX_VALUE (domain), 
4020                                              TYPE_MIN_VALUE (domain), 1),
4021                 size_one_node, 1);
4022
4023   /* Check if the dimension size is a multiple of NUNITS, the remaining sum
4024      is a multiple of NUNITS: 
4025
4026      dimension_size % GET_MODE_NUNITS (TYPE_MODE (vectype)) == 0 ?
4027    */
4028   mis = int_const_binop (TRUNC_MOD_EXPR, dimension_size,
4029          build_int_cst (NULL_TREE, GET_MODE_NUNITS (TYPE_MODE (vectype))), 1);
4030   if (integer_zerop (mis))
4031     /* This array is aligned. Continue just in order to get the base decl.  */
4032     return vect_compute_array_base_alignment 
4033                 (TREE_OPERAND (array, 0), NULL, NULL, NULL);
4034
4035   index = TREE_OPERAND (array, 1);
4036   if (!host_integerp (index, 1))
4037     /* The current index is not constant.  */
4038     return NULL_TREE;
4039    
4040   index = int_const_binop (MINUS_EXPR, index, TYPE_MIN_VALUE (domain), 0);
4041
4042   bits_per_vectype = fold_convert (unsigned_type_node, 
4043     build_int_cst (NULL_TREE, BITS_PER_UNIT * 
4044                  GET_MODE_SIZE (TYPE_MODE (vectype))));
4045   bits_per_vectype_unit =  fold_convert (unsigned_type_node,
4046     build_int_cst (NULL_TREE, BITS_PER_UNIT * 
4047                  GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (vectype)))));
4048   
4049   /* Add {idx_i * dim_i-1 * ... * dim_0 } to the misalignment computed
4050      earlier:
4051
4052      *misalignment = 
4053        (*misalignment + index_val * dimension_size * *prev_dimensions) 
4054                                                         % vectype_nunits;
4055    */
4056
4057   mis = int_const_binop (MULT_EXPR, index, dimension_size, 1);
4058   mis = int_const_binop (MULT_EXPR, mis, *prev_dimensions, 1);
4059   mis = int_const_binop (MULT_EXPR, mis, bits_per_vectype_unit, 1);
4060   mis = int_const_binop (PLUS_EXPR, *misalignment, mis, 1);
4061   *misalignment = int_const_binop (TRUNC_MOD_EXPR, mis, bits_per_vectype, 1);
4062
4063
4064   *prev_dimensions = int_const_binop (MULT_EXPR, 
4065                                 *prev_dimensions, dimension_size, 1);
4066
4067   return vect_compute_array_base_alignment (TREE_OPERAND (array, 0), vectype,
4068                                             prev_dimensions,
4069                                             misalignment);
4070 }
4071
4072  
4073 /* Function vect_compute_data_ref_alignment
4074
4075    Compute the misalignment of the data reference DR.
4076
4077    Output:
4078    1. If during the misalignment computation it is found that the data reference
4079       cannot be vectorized then false is returned.
4080    2. DR_MISALIGNMENT (DR) is defined.
4081
4082    FOR NOW: No analysis is actually performed. Misalignment is calculated
4083    only for trivial cases. TODO.  */
4084
4085 static bool
4086 vect_compute_data_ref_alignment (struct data_reference *dr, 
4087                                  loop_vec_info loop_vinfo)
4088 {
4089   tree stmt = DR_STMT (dr);
4090   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);  
4091   tree ref = DR_REF (dr);
4092   tree vectype;
4093   tree scalar_type;
4094   tree offset = size_zero_node;
4095   tree base, bit_offset, alignment;
4096   tree unit_bits = fold_convert (unsigned_type_node, 
4097                                  build_int_cst (NULL_TREE, BITS_PER_UNIT));
4098   tree dr_base;
4099   bool base_aligned_p;
4100    
4101   if (vect_debug_details (NULL))
4102     fprintf (dump_file, "vect_compute_data_ref_alignment:");
4103
4104   /* Initialize misalignment to unknown.  */
4105   DR_MISALIGNMENT (dr) = -1;
4106
4107   scalar_type = TREE_TYPE (ref);
4108   vectype = get_vectype_for_scalar_type (scalar_type);
4109   if (!vectype)
4110     {
4111       if (vect_debug_details (NULL))
4112         {
4113           fprintf (dump_file, "no vectype for stmt: ");
4114           print_generic_expr (dump_file, stmt, TDF_SLIM);
4115           fprintf (dump_file, " scalar_type: ");
4116           print_generic_expr (dump_file, scalar_type, TDF_DETAILS);
4117         }
4118       /* It is not possible to vectorize this data reference.  */
4119       return false;
4120     }
4121   STMT_VINFO_VECTYPE (stmt_info) = vectype;
4122   gcc_assert (TREE_CODE (ref) == ARRAY_REF || TREE_CODE (ref) == INDIRECT_REF);
4123   
4124   if (TREE_CODE (ref) == ARRAY_REF)
4125     dr_base = ref;
4126   else
4127     dr_base = STMT_VINFO_VECT_DR_BASE (stmt_info);
4128
4129   base = vect_get_base_and_bit_offset (dr, dr_base, vectype, 
4130                           loop_vinfo, &bit_offset, &base_aligned_p);
4131   if (!base)
4132     {
4133       if (vect_debug_details (NULL)) 
4134         {
4135           fprintf (dump_file, "Unknown alignment for access: ");
4136           print_generic_expr (dump_file, 
4137                               STMT_VINFO_VECT_DR_BASE (stmt_info), TDF_SLIM);
4138         }
4139       return true;
4140     }
4141
4142   if (!base_aligned_p) 
4143     {
4144       if (!vect_can_force_dr_alignment_p (base, TYPE_ALIGN (vectype)))
4145         {
4146           if (vect_debug_details (NULL))
4147             {
4148               fprintf (dump_file, "can't force alignment of ref: ");
4149               print_generic_expr (dump_file, ref, TDF_SLIM);
4150             }
4151           return true;
4152         }
4153       
4154       /* Force the alignment of the decl.
4155          NOTE: This is the only change to the code we make during
4156          the analysis phase, before deciding to vectorize the loop.  */
4157       if (vect_debug_details (NULL))
4158         fprintf (dump_file, "force alignment");
4159       DECL_ALIGN (base) = TYPE_ALIGN (vectype);
4160       DECL_USER_ALIGN (base) = TYPE_ALIGN (vectype);
4161     }
4162
4163   /* At this point we assume that the base is aligned, and the offset from it
4164      (including index, if relevant) has been computed and is in BIT_OFFSET.  */
4165   gcc_assert (base_aligned_p 
4166               || (TREE_CODE (base) == VAR_DECL 
4167                   && DECL_ALIGN (base) >= TYPE_ALIGN (vectype)));
4168
4169   /* Convert into bytes.  */
4170   offset = int_const_binop (TRUNC_DIV_EXPR, bit_offset, unit_bits, 1);
4171   /* Check that there is no remainder in bits.  */
4172   bit_offset = int_const_binop (TRUNC_MOD_EXPR, bit_offset, unit_bits, 1);
4173   if (!integer_zerop (bit_offset))
4174     {
4175       if (vect_debug_details (NULL))
4176         {
4177           fprintf (dump_file, "bit offset alignment: ");
4178           print_generic_expr (dump_file, bit_offset, TDF_SLIM);
4179         }
4180       return false;
4181     }
4182   
4183   /* Alignment required, in bytes:  */
4184   alignment = fold_convert (unsigned_type_node,
4185             build_int_cst (NULL_TREE, TYPE_ALIGN (vectype)/BITS_PER_UNIT));
4186
4187   /* Modulo alignment.  */
4188   offset = int_const_binop (TRUNC_MOD_EXPR, offset, alignment, 0);
4189   if (!host_integerp (offset, 1) || TREE_OVERFLOW (offset))
4190     {
4191       if (vect_debug_details (NULL))
4192         fprintf (dump_file, "unexpected misalign value");
4193       return false;
4194     }
4195
4196   DR_MISALIGNMENT (dr) = tree_low_cst (offset, 1);
4197
4198   if (vect_debug_details (NULL))
4199     fprintf (dump_file, "misalign = %d", DR_MISALIGNMENT (dr));
4200
4201   return true;
4202 }
4203
4204
4205 /* Function vect_compute_array_ref_alignment
4206
4207    Compute the alignment of an array-ref.
4208    The alignment we compute here is relative to 
4209    TYPE_ALIGN(VECTYPE) boundary.  
4210
4211    Output:
4212    OFFSET - the alignment in bits
4213    Return value - the base of the array-ref. E.g, 
4214                   if the array-ref is a.b[k].c[i][j] the returned
4215                   base is a.b[k].c
4216 */
4217
4218 static tree
4219 vect_compute_array_ref_alignment (struct data_reference *dr,
4220                                   loop_vec_info loop_vinfo,
4221                                   tree vectype,
4222                                   tree *offset)
4223 {
4224   tree array_first_index = size_zero_node;
4225   tree init;
4226   tree ref = DR_REF (dr);
4227   tree scalar_type = TREE_TYPE (ref);
4228   tree oprnd0 = TREE_OPERAND (ref, 0);
4229   tree dims = size_one_node;  
4230   tree misalign = size_zero_node;
4231   tree next_ref, this_offset = size_zero_node;
4232   tree nunits;
4233   tree nbits;
4234
4235   if (TREE_CODE (TREE_TYPE (ref)) == ARRAY_TYPE)
4236     /* The reference is an array without its last index.  */
4237     next_ref = vect_compute_array_base_alignment (ref, vectype, &dims, 
4238                                                   &misalign);
4239   else
4240     next_ref = vect_compute_array_base_alignment (oprnd0, vectype, &dims, 
4241                                                   &misalign);
4242   if (!vectype)
4243     /* Alignment is not requested. Just return the base.  */
4244     return next_ref;
4245
4246   /* Compute alignment.  */
4247   if (!host_integerp (misalign, 1) || TREE_OVERFLOW (misalign) || !next_ref)
4248     return NULL_TREE;
4249   this_offset = misalign;
4250
4251   /* Check the first index accessed.  */
4252   if (!vect_get_first_index (ref, &array_first_index))
4253     {
4254       if (vect_debug_details (NULL))
4255         fprintf (dump_file, "no first_index for array.");
4256       return NULL_TREE;
4257     }
4258
4259   /* Check the index of the array_ref.  */
4260   init = initial_condition_in_loop_num (DR_ACCESS_FN (dr, 0), 
4261                                         LOOP_VINFO_LOOP (loop_vinfo)->num);
4262
4263   /* FORNOW: In order to simplify the handling of alignment, we make sure
4264      that the first location at which the array is accessed ('init') is on an
4265      'NUNITS' boundary, since we are assuming here that 'array base' is aligned. 
4266      This is too conservative, since we require that
4267      both {'array_base' is a multiple of NUNITS} && {'init' is a multiple of
4268      NUNITS}, instead of just {('array_base' + 'init') is a multiple of NUNITS}.
4269      This should be relaxed in the future.  */
4270
4271   if (!init || !host_integerp (init, 0))
4272     {
4273       if (vect_debug_details (NULL))
4274         fprintf (dump_file, "non constant init. ");
4275       return NULL_TREE;
4276     }
4277
4278   /* bytes per scalar element: */
4279   nunits = fold_convert (unsigned_type_node,
4280         build_int_cst (NULL_TREE, GET_MODE_SIZE (TYPE_MODE (scalar_type))));
4281   nbits = int_const_binop (MULT_EXPR, nunits,     
4282                            build_int_cst (NULL_TREE, BITS_PER_UNIT), 1);
4283
4284   /* misalign = offset + (init-array_first_index)*nunits*bits_in_byte */
4285   misalign = int_const_binop (MINUS_EXPR, init, array_first_index, 0);
4286   misalign = int_const_binop (MULT_EXPR, misalign, nbits, 0);
4287   misalign = int_const_binop (PLUS_EXPR, misalign, this_offset, 0);
4288
4289   /* TODO: allow negative misalign values.  */
4290   if (!host_integerp (misalign, 1) || TREE_OVERFLOW (misalign))
4291     {
4292       if (vect_debug_details (NULL))
4293         fprintf (dump_file, "unexpected misalign value");
4294       return NULL_TREE;
4295     }
4296   *offset = misalign;
4297   return next_ref;
4298 }
4299
4300
4301 /* Function vect_compute_data_refs_alignment
4302
4303    Compute the misalignment of data references in the loop.
4304    This pass may take place at function granularity instead of at loop
4305    granularity.
4306
4307    FOR NOW: No analysis is actually performed. Misalignment is calculated
4308    only for trivial cases. TODO.  */
4309
4310 static bool
4311 vect_compute_data_refs_alignment (loop_vec_info loop_vinfo)
4312 {
4313   varray_type loop_write_datarefs = LOOP_VINFO_DATAREF_WRITES (loop_vinfo);
4314   varray_type loop_read_datarefs = LOOP_VINFO_DATAREF_READS (loop_vinfo);
4315   unsigned int i;
4316
4317   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_write_datarefs); i++)
4318     {
4319       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_write_datarefs, i);
4320       if (!vect_compute_data_ref_alignment (dr, loop_vinfo))
4321         return false;
4322     }
4323
4324   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_read_datarefs); i++)
4325     {
4326       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_read_datarefs, i);
4327       if (!vect_compute_data_ref_alignment (dr, loop_vinfo))
4328         return false;
4329     }
4330
4331   return true;
4332 }
4333
4334
4335 /* Function vect_enhance_data_refs_alignment
4336
4337    This pass will use loop versioning and loop peeling in order to enhance
4338    the alignment of data references in the loop.
4339
4340    FOR NOW: we assume that whatever versioning/peeling takes place, only the
4341    original loop is to be vectorized; Any other loops that are created by
4342    the transformations performed in this pass - are not supposed to be
4343    vectorized. This restriction will be relaxed.
4344
4345    FOR NOW: No transformation is actually performed. TODO.  */
4346
4347 static void
4348 vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
4349 {
4350   varray_type loop_read_datarefs = LOOP_VINFO_DATAREF_READS (loop_vinfo);
4351   varray_type loop_write_datarefs = LOOP_VINFO_DATAREF_WRITES (loop_vinfo);
4352   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
4353   unsigned int i;
4354
4355   /*
4356      This pass will require a cost model to guide it whether to apply peeling 
4357      or versioning or a combination of the two. For example, the scheme that
4358      intel uses when given a loop with several memory accesses, is as follows:
4359      choose one memory access ('p') which alignment you want to force by doing 
4360      peeling. Then, either (1) generate a loop in which 'p' is aligned and all 
4361      other accesses are not necessarily aligned, or (2) use loop versioning to 
4362      generate one loop in which all accesses are aligned, and another loop in 
4363      which only 'p' is necessarily aligned. 
4364
4365      ("Automatic Intra-Register Vectorization for the Intel Architecture",
4366       Aart J.C. Bik, Milind Girkar, Paul M. Grey and Ximmin Tian, International
4367       Journal of Parallel Programming, Vol. 30, No. 2, April 2002.)     
4368
4369      Devising a cost model is the most critical aspect of this work. It will 
4370      guide us on which access to peel for, whether to use loop versioning, how 
4371      many versions to create, etc. The cost model will probably consist of 
4372      generic considerations as well as target specific considerations (on 
4373      powerpc for example, misaligned stores are more painful than misaligned 
4374      loads). 
4375
4376      Here is the general steps involved in alignment enhancements:
4377     
4378      -- original loop, before alignment analysis:
4379         for (i=0; i<N; i++){
4380           x = q[i];                     # DR_MISALIGNMENT(q) = unknown
4381           p[i] = y;                     # DR_MISALIGNMENT(p) = unknown
4382         }
4383
4384      -- After vect_compute_data_refs_alignment:
4385         for (i=0; i<N; i++){
4386           x = q[i];                     # DR_MISALIGNMENT(q) = 3
4387           p[i] = y;                     # DR_MISALIGNMENT(p) = unknown
4388         }
4389
4390      -- Possibility 1: we do loop versioning:
4391      if (p is aligned) {
4392         for (i=0; i<N; i++){    # loop 1A
4393           x = q[i];                     # DR_MISALIGNMENT(q) = 3
4394           p[i] = y;                     # DR_MISALIGNMENT(p) = 0
4395         }
4396      } 
4397      else {
4398         for (i=0; i<N; i++){    # loop 1B
4399           x = q[i];                     # DR_MISALIGNMENT(q) = 3
4400           p[i] = y;                     # DR_MISALIGNMENT(p) = unaligned
4401         }
4402      }
4403    
4404      -- Possibility 2: we do loop peeling:
4405      for (i = 0; i < 3; i++){   # (scalar loop, not to be vectorized).
4406         x = q[i];
4407         p[i] = y;
4408      }
4409      for (i = 3; i < N; i++){   # loop 2A
4410         x = q[i];                       # DR_MISALIGNMENT(q) = 0
4411         p[i] = y;                       # DR_MISALIGNMENT(p) = unknown
4412      }
4413
4414      -- Possibility 3: combination of loop peeling and versioning:
4415      for (i = 0; i < 3; i++){   # (scalar loop, not to be vectorized).
4416         x = q[i];
4417         p[i] = y;
4418      }
4419      if (p is aligned) {
4420         for (i = 3; i<N; i++){  # loop 3A
4421           x = q[i];                     # DR_MISALIGNMENT(q) = 0
4422           p[i] = y;                     # DR_MISALIGNMENT(p) = 0
4423         }
4424      } 
4425      else {
4426         for (i = 3; i<N; i++){  # loop 3B
4427           x = q[i];                     # DR_MISALIGNMENT(q) = 0
4428           p[i] = y;                     # DR_MISALIGNMENT(p) = unaligned
4429         }
4430      }
4431
4432      These loops are later passed to loop_transform to be vectorized. The 
4433      vectorizer will use the alignment information to guide the transformation 
4434      (whether to generate regular loads/stores, or with special handling for 
4435      misalignment). 
4436    */
4437
4438   /* (1) Peeling to force alignment.  */
4439
4440   /* (1.1) Decide whether to perform peeling, and how many iterations to peel:
4441      Considerations:
4442      + How many accesses will become aligned due to the peeling
4443      - How many accesses will become unaligned due to the peeling,
4444        and the cost of misaligned accesses.
4445      - The cost of peeling (the extra runtime checks, the increase 
4446        in code size).
4447
4448      The scheme we use FORNOW: peel to force the alignment of the first
4449      misaligned store in the loop.
4450      Rationale: misaligned stores are not yet supported.
4451
4452      TODO: Use a better cost model.  */
4453
4454   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_write_datarefs); i++)
4455     {
4456       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_write_datarefs, i);
4457       if (!aligned_access_p (dr))
4458         {
4459           LOOP_VINFO_UNALIGNED_DR (loop_vinfo) = dr;
4460           LOOP_DO_PEELING_FOR_ALIGNMENT (loop_vinfo) = true;
4461           break;
4462         }
4463     }
4464
4465   if (!LOOP_VINFO_UNALIGNED_DR (loop_vinfo))
4466     {
4467       if (vect_debug_details (loop))
4468         fprintf (dump_file, "Peeling for alignment will not be applied.");
4469       return;
4470     }
4471   else
4472     if (vect_debug_details (loop))
4473       fprintf (dump_file, "Peeling for alignment will be applied.");
4474
4475
4476   /* (1.2) Update the alignment info according to the peeling factor.
4477            If the misalignment of the DR we peel for is M, then the
4478            peeling factor is VF - M, and the misalignment of each access DR_i
4479            in the loop is DR_MISALIGNMENT (DR_i) + VF - M.
4480            If the misalignment of the DR we peel for is unknown, then the 
4481            misalignment of each access DR_i in the loop is also unknown.
4482
4483            FORNOW: set the misalignment of the accesses to unknown even
4484                    if the peeling factor is known at compile time.
4485
4486            TODO: - if the peeling factor is known at compile time, use that
4487                    when updating the misalignment info of the loop DRs.
4488                  - consider accesses that are known to have the same 
4489                    alignment, even if that alignment is unknown.  */
4490    
4491   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_write_datarefs); i++)
4492     {
4493       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_write_datarefs, i);
4494       if (dr == LOOP_VINFO_UNALIGNED_DR (loop_vinfo))
4495         DR_MISALIGNMENT (dr) = 0;
4496       else
4497         DR_MISALIGNMENT (dr) = -1;
4498     }
4499   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_read_datarefs); i++)
4500     {
4501       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_read_datarefs, i);
4502       if (dr == LOOP_VINFO_UNALIGNED_DR (loop_vinfo))
4503         DR_MISALIGNMENT (dr) = 0;
4504       else
4505         DR_MISALIGNMENT (dr) = -1;
4506     }
4507 }
4508
4509
4510 /* Function vect_analyze_data_refs_alignment
4511
4512    Analyze the alignment of the data-references in the loop.
4513    FOR NOW: Until support for misliagned accesses is in place, only if all
4514    accesses are aligned can the loop be vectorized. This restriction will be 
4515    relaxed.  */ 
4516
4517 static bool
4518 vect_analyze_data_refs_alignment (loop_vec_info loop_vinfo)
4519 {
4520   varray_type loop_read_datarefs = LOOP_VINFO_DATAREF_READS (loop_vinfo);
4521   varray_type loop_write_datarefs = LOOP_VINFO_DATAREF_WRITES (loop_vinfo);
4522   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
4523   enum dr_alignment_support supportable_dr_alignment;
4524   unsigned int i;
4525
4526   if (vect_debug_details (NULL))
4527     fprintf (dump_file, "\n<<vect_analyze_data_refs_alignment>>\n");
4528
4529
4530   /* This pass may take place at function granularity instead of at loop
4531      granularity.  */
4532
4533   if (!vect_compute_data_refs_alignment (loop_vinfo))
4534     {
4535       if (vect_debug_details (loop) || vect_debug_stats (loop))
4536         fprintf (dump_file, 
4537                  "not vectorized: can't calculate alignment for data ref.");
4538       return false;
4539     }
4540
4541
4542   /* This pass will decide on using loop versioning and/or loop peeling in 
4543      order to enhance the alignment of data references in the loop.  */
4544
4545   vect_enhance_data_refs_alignment (loop_vinfo);
4546
4547
4548   /* Finally, check that all the data references in the loop can be
4549      handled with respect to their alignment.  */
4550
4551   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_read_datarefs); i++)
4552     {
4553       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_read_datarefs, i);
4554       supportable_dr_alignment = vect_supportable_dr_alignment (dr);
4555       if (!supportable_dr_alignment)
4556         {
4557           if (vect_debug_details (loop) || vect_debug_stats (loop))
4558             fprintf (dump_file, "not vectorized: unsupported unaligned load.");
4559           return false;
4560         }
4561     }
4562   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_write_datarefs); i++)
4563     {
4564       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_write_datarefs, i);
4565       supportable_dr_alignment = vect_supportable_dr_alignment (dr);
4566       if (!supportable_dr_alignment)
4567         {
4568           if (vect_debug_details (loop) || vect_debug_stats (loop))
4569             fprintf (dump_file, "not vectorized: unsupported unaligned store.");
4570           return false;
4571         }
4572     }
4573
4574   return true;
4575 }
4576
4577
4578 /* Function vect_analyze_data_ref_access.
4579
4580    Analyze the access pattern of the data-reference DR. For now, a data access
4581    has to consecutive and aligned to be considered vectorizable.  */
4582
4583 static bool
4584 vect_analyze_data_ref_access (struct data_reference *dr)
4585 {
4586   varray_type access_fns = DR_ACCESS_FNS (dr);
4587   tree access_fn;
4588   tree init, step;
4589   unsigned int dimensions, i;
4590
4591   /* Check that in case of multidimensional array ref A[i1][i2]..[iN],
4592      i1, i2, ..., iN-1 are loop invariant (to make sure that the memory
4593      access is contiguous).  */
4594   dimensions = VARRAY_ACTIVE_SIZE (access_fns);
4595
4596   for (i = 1; i < dimensions; i++) /* Not including the last dimension.  */
4597     {
4598       access_fn = DR_ACCESS_FN (dr, i);
4599
4600       if (evolution_part_in_loop_num (access_fn, 
4601                                       loop_containing_stmt (DR_STMT (dr))->num))
4602         {
4603           /* Evolution part is not NULL in this loop (it is neither constant 
4604              nor invariant).  */
4605           if (vect_debug_details (NULL))
4606             {
4607               fprintf (dump_file, 
4608                        "not vectorized: complicated multidim. array access.");
4609               print_generic_expr (dump_file, access_fn, TDF_SLIM);
4610             }
4611           return false;
4612         }
4613     }
4614   
4615   access_fn = DR_ACCESS_FN (dr, 0); /*  The last dimension access function.  */
4616   if (!evolution_function_is_constant_p (access_fn)
4617       && !vect_is_simple_iv_evolution (loop_containing_stmt (DR_STMT (dr))->num,
4618                                        access_fn, &init, &step, true))
4619     {
4620       if (vect_debug_details (NULL))
4621         {
4622           fprintf (dump_file, "not vectorized: complicated access function.");
4623           print_generic_expr (dump_file, access_fn, TDF_SLIM);
4624         }
4625       return false;
4626     }
4627   
4628   return true;
4629 }
4630
4631
4632 /* Function vect_analyze_data_ref_accesses.
4633
4634    Analyze the access pattern of all the data references in the loop.
4635
4636    FORNOW: the only access pattern that is considered vectorizable is a
4637            simple step 1 (consecutive) access.
4638
4639    FORNOW: handle only arrays and pointer accesses.  */
4640
4641 static bool
4642 vect_analyze_data_ref_accesses (loop_vec_info loop_vinfo)
4643 {
4644   unsigned int i;
4645   varray_type loop_write_datarefs = LOOP_VINFO_DATAREF_WRITES (loop_vinfo);
4646   varray_type loop_read_datarefs = LOOP_VINFO_DATAREF_READS (loop_vinfo);
4647
4648   if (vect_debug_details (NULL))
4649     fprintf (dump_file, "\n<<vect_analyze_data_ref_accesses>>\n");
4650
4651   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_write_datarefs); i++)
4652     {
4653       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_write_datarefs, i);
4654       bool ok = vect_analyze_data_ref_access (dr);
4655       if (!ok)
4656         {
4657           if (vect_debug_stats (LOOP_VINFO_LOOP (loop_vinfo))
4658               || vect_debug_details (LOOP_VINFO_LOOP (loop_vinfo)))
4659             fprintf (dump_file, "not vectorized: complicated access pattern.");
4660           return false;
4661         }
4662     }
4663
4664   for (i = 0; i < VARRAY_ACTIVE_SIZE (loop_read_datarefs); i++)
4665     {
4666       struct data_reference *dr = VARRAY_GENERIC_PTR (loop_read_datarefs, i);
4667       bool ok = vect_analyze_data_ref_access (dr);
4668       if (!ok)
4669         {
4670           if (vect_debug_stats (LOOP_VINFO_LOOP (loop_vinfo))
4671               || vect_debug_details (LOOP_VINFO_LOOP (loop_vinfo))) 
4672             fprintf (dump_file, "not vectorized: complicated access pattern.");
4673           return false;
4674         }
4675     }
4676
4677   return true;
4678 }
4679
4680
4681 /* Function vect_analyze_pointer_ref_access.
4682
4683    Input:
4684    STMT - a stmt that contains a data-ref
4685    MEMREF - a data-ref in STMT, which is an INDIRECT_REF.
4686
4687    If the data-ref access is vectorizable, return a data_reference structure
4688    that represents it (DR). Otherwise - return NULL.  */
4689
4690 static struct data_reference *
4691 vect_analyze_pointer_ref_access (tree memref, tree stmt, bool is_read)
4692 {
4693   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
4694   struct loop *loop = STMT_VINFO_LOOP (stmt_info);
4695   tree access_fn = analyze_scalar_evolution (loop, TREE_OPERAND (memref, 0));
4696   tree init, step;      
4697   int step_val;
4698   tree reftype, innertype;
4699   enum machine_mode innermode;
4700   tree indx_access_fn; 
4701   int loopnum = loop->num;
4702   struct data_reference *dr;
4703
4704   if (!access_fn)
4705     {
4706       if (vect_debug_stats (loop) || vect_debug_details (loop))
4707         fprintf (dump_file, "not vectorized: complicated pointer access.");     
4708       return NULL;
4709     }
4710
4711   if (vect_debug_details (NULL))
4712     {
4713       fprintf (dump_file, "Access function of ptr: ");
4714       print_generic_expr (dump_file, access_fn, TDF_SLIM);
4715     }
4716
4717   if (!vect_is_simple_iv_evolution (loopnum, access_fn, &init, &step, false))
4718     {
4719       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
4720         fprintf (dump_file, "not vectorized: pointer access is not simple.");   
4721       return NULL;
4722     }
4723                 
4724   STRIP_NOPS (init);
4725
4726   if (!host_integerp (step,0))
4727     {
4728       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
4729         fprintf (dump_file, 
4730                 "not vectorized: non constant step for pointer access.");       
4731       return NULL;
4732     }
4733
4734   step_val = TREE_INT_CST_LOW (step);
4735
4736   reftype = TREE_TYPE (TREE_OPERAND (memref, 0));
4737   if (TREE_CODE (reftype) != POINTER_TYPE) 
4738     {
4739       if (vect_debug_stats (loop) || vect_debug_details (loop))
4740         fprintf (dump_file, "not vectorized: unexpected pointer access form."); 
4741       return NULL;
4742     }
4743
4744   reftype = TREE_TYPE (init);
4745   if (TREE_CODE (reftype) != POINTER_TYPE) 
4746     {
4747       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
4748         fprintf (dump_file, "not vectorized: unexpected pointer access form.");
4749       return NULL;
4750     }
4751
4752   innertype = TREE_TYPE (reftype);
4753   innermode = TYPE_MODE (innertype);
4754   if (GET_MODE_SIZE (innermode) != step_val) 
4755     {
4756       /* FORNOW: support only consecutive access */
4757       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
4758         fprintf (dump_file, "not vectorized: non consecutive access."); 
4759       return NULL;
4760     }
4761
4762   indx_access_fn = 
4763         build_polynomial_chrec (loopnum, integer_zero_node, integer_one_node);
4764   if (vect_debug_details (NULL)) 
4765     {
4766       fprintf (dump_file, "Access function of ptr indx: ");
4767       print_generic_expr (dump_file, indx_access_fn, TDF_SLIM);
4768     }
4769   dr = init_data_ref (stmt, memref, init, indx_access_fn, is_read);
4770   return dr;
4771 }
4772
4773
4774 /* Function vect_get_symbl_and_dr.  
4775
4776    The function returns SYMBL - the relevant variable for
4777    memory tag (for aliasing purposes). 
4778    Also data reference structure DR is created.  
4779
4780    Input:
4781    MEMREF - data reference in STMT
4782    IS_READ - TRUE if STMT reads from MEMREF, FALSE if writes to MEMREF
4783    
4784    Output:
4785    DR - data_reference struct for MEMREF
4786    return value - the relevant variable for memory tag (for aliasing purposes).
4787
4788 */ 
4789
4790 static tree
4791 vect_get_symbl_and_dr (tree memref, tree stmt, bool is_read, 
4792                        loop_vec_info loop_vinfo, struct data_reference **dr)
4793 {
4794   tree symbl, oprnd0, oprnd1;
4795   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
4796   tree offset;
4797   tree array_base, base;
4798   struct data_reference *new_dr;
4799   bool base_aligned_p;
4800
4801   *dr = NULL;
4802   switch (TREE_CODE (memref))
4803     {
4804     case INDIRECT_REF:
4805       new_dr = vect_analyze_pointer_ref_access (memref, stmt, is_read);
4806       if (! new_dr)
4807         return NULL_TREE; 
4808       *dr = new_dr;
4809       symbl = DR_BASE_NAME (new_dr);
4810       STMT_VINFO_VECT_DR_BASE (stmt_info) = symbl;
4811
4812       switch (TREE_CODE (symbl))
4813         {
4814         case PLUS_EXPR:
4815         case MINUS_EXPR:
4816           oprnd0 = TREE_OPERAND (symbl, 0);
4817           oprnd1 = TREE_OPERAND (symbl, 1);
4818
4819           STRIP_NOPS(oprnd1);
4820           /* Only {address_base + offset} expressions are supported,  
4821              where address_base can be POINTER_TYPE or ARRAY_TYPE and 
4822              offset can be anything but POINTER_TYPE or ARRAY_TYPE.  
4823              TODO: swap operands if {offset + address_base}.  */
4824           if ((TREE_CODE (TREE_TYPE (oprnd1)) == POINTER_TYPE 
4825                && TREE_CODE (oprnd1) != INTEGER_CST)
4826               || TREE_CODE (TREE_TYPE (oprnd1)) == ARRAY_TYPE)
4827             return NULL_TREE;
4828
4829           if (TREE_CODE (TREE_TYPE (oprnd0)) == POINTER_TYPE)
4830             symbl = oprnd0;
4831           else
4832             symbl = vect_get_symbl_and_dr (oprnd0, stmt, is_read, 
4833                                            loop_vinfo, &new_dr); 
4834
4835         case SSA_NAME:
4836         case ADDR_EXPR:
4837           /* symbl remains unchanged.  */
4838           break;
4839
4840         default:
4841           if (vect_debug_details (NULL))
4842             {
4843               fprintf (dump_file, "unhandled data ref: ");
4844               print_generic_expr (dump_file, memref, TDF_SLIM);
4845               fprintf (dump_file, " (symbl ");
4846               print_generic_expr (dump_file, symbl, TDF_SLIM);
4847               fprintf (dump_file, ") in stmt  ");
4848               print_generic_expr (dump_file, stmt, TDF_SLIM);
4849             }
4850           return NULL_TREE;     
4851         }
4852       break;
4853
4854     case ARRAY_REF:
4855       offset = size_zero_node;
4856
4857       /* Store the array base in the stmt info. 
4858          For one dimensional array ref a[i], the base is a,
4859          for multidimensional a[i1][i2]..[iN], the base is 
4860          a[i1][i2]..[iN-1].  */
4861       array_base = TREE_OPERAND (memref, 0);
4862       STMT_VINFO_VECT_DR_BASE (stmt_info) = array_base;      
4863
4864       new_dr = analyze_array (stmt, memref, is_read);
4865       *dr = new_dr;
4866
4867       /* Find the relevant symbol for aliasing purposes.  */    
4868       base = DR_BASE_NAME (new_dr);
4869       switch (TREE_CODE (base)) 
4870         {
4871         case VAR_DECL:
4872           symbl = base;
4873           break;
4874
4875         case INDIRECT_REF:
4876           symbl = TREE_OPERAND (base, 0); 
4877           break;
4878
4879         case COMPONENT_REF:
4880           /* Could have recorded more accurate information - 
4881              i.e, the actual FIELD_DECL that is being referenced -
4882              but later passes expect VAR_DECL as the nmt.  */   
4883           symbl = vect_get_base_and_bit_offset (new_dr, base, NULL_TREE, 
4884                                         loop_vinfo, &offset, &base_aligned_p);
4885           if (symbl)
4886             break;
4887           /* fall through */    
4888         default:
4889           if (vect_debug_details (NULL))
4890             {
4891               fprintf (dump_file, "unhandled struct/class field access ");
4892               print_generic_expr (dump_file, stmt, TDF_SLIM);
4893             }
4894           return NULL_TREE;
4895         }
4896       break;
4897
4898     default:
4899       if (vect_debug_details (NULL))
4900         {
4901           fprintf (dump_file, "unhandled data ref: ");
4902           print_generic_expr (dump_file, memref, TDF_SLIM);
4903           fprintf (dump_file, " in stmt  ");
4904           print_generic_expr (dump_file, stmt, TDF_SLIM);
4905         }
4906       return NULL_TREE;
4907     }
4908   return symbl;
4909 }
4910
4911
4912 /* Function vect_analyze_data_refs.
4913
4914    Find all the data references in the loop.
4915
4916    FORNOW: Handle aligned INDIRECT_REFs and ARRAY_REFs 
4917            which base is really an array (not a pointer) and which alignment 
4918            can be forced. This restriction will be relaxed.  */
4919
4920 static bool
4921 vect_analyze_data_refs (loop_vec_info loop_vinfo)
4922 {
4923   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
4924   basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
4925   int nbbs = loop->num_nodes;
4926   block_stmt_iterator si;
4927   int j;
4928   struct data_reference *dr;
4929   tree tag;
4930   tree address_base;
4931   bool base_aligned_p;
4932   tree offset;
4933
4934   if (vect_debug_details (NULL))
4935     fprintf (dump_file, "\n<<vect_analyze_data_refs>>\n");
4936
4937   for (j = 0; j < nbbs; j++)
4938     {
4939       basic_block bb = bbs[j];
4940       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
4941         {
4942           bool is_read = false;
4943           tree stmt = bsi_stmt (si);
4944           stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
4945           v_may_def_optype v_may_defs = STMT_V_MAY_DEF_OPS (stmt);
4946           v_must_def_optype v_must_defs = STMT_V_MUST_DEF_OPS (stmt);
4947           vuse_optype vuses = STMT_VUSE_OPS (stmt);
4948           varray_type *datarefs = NULL;
4949           int nvuses, nv_may_defs, nv_must_defs;
4950           tree memref = NULL;
4951           tree symbl;
4952
4953           /* Assumption: there exists a data-ref in stmt, if and only if 
4954              it has vuses/vdefs.  */
4955
4956           if (!vuses && !v_may_defs && !v_must_defs)
4957             continue;
4958
4959           nvuses = NUM_VUSES (vuses);
4960           nv_may_defs = NUM_V_MAY_DEFS (v_may_defs);
4961           nv_must_defs = NUM_V_MUST_DEFS (v_must_defs);
4962
4963           if (nvuses && (nv_may_defs || nv_must_defs))
4964             {
4965               if (vect_debug_details (NULL))
4966                 {
4967                   fprintf (dump_file, "unexpected vdefs and vuses in stmt: ");
4968                   print_generic_expr (dump_file, stmt, TDF_SLIM);
4969                 }
4970               return false;
4971             }
4972
4973           if (TREE_CODE (stmt) != MODIFY_EXPR)
4974             {
4975               if (vect_debug_details (NULL))
4976                 {
4977                   fprintf (dump_file, "unexpected vops in stmt: ");
4978                   print_generic_expr (dump_file, stmt, TDF_SLIM);
4979                 }
4980               return false;
4981             }
4982
4983           if (vuses)
4984             {
4985               memref = TREE_OPERAND (stmt, 1);
4986               datarefs = &(LOOP_VINFO_DATAREF_READS (loop_vinfo));
4987               is_read = true;
4988             } 
4989           else /* vdefs */
4990             {
4991               memref = TREE_OPERAND (stmt, 0);
4992               datarefs = &(LOOP_VINFO_DATAREF_WRITES (loop_vinfo));
4993               is_read = false;
4994             }
4995
4996           /* Analyze MEMREF. If it is of a supported form, build data_reference
4997              struct for it (DR) and find the relevant symbol for aliasing 
4998              purposes.  */
4999           symbl = vect_get_symbl_and_dr (memref, stmt, is_read, loop_vinfo, 
5000                                          &dr);
5001           if (!symbl)
5002             {
5003               if (vect_debug_stats (loop) || vect_debug_details (loop))
5004                 {
5005                   fprintf (dump_file, "not vectorized: unhandled data ref: "); 
5006                   print_generic_expr (dump_file, stmt, TDF_SLIM);
5007                 }
5008               return false;
5009             }
5010
5011           /* Find and record the memtag assigned to this data-ref.  */
5012            switch (TREE_CODE (symbl))
5013             {
5014             case VAR_DECL:
5015               STMT_VINFO_MEMTAG (stmt_info) = symbl;
5016               break;
5017               
5018             case SSA_NAME:
5019               symbl = SSA_NAME_VAR (symbl);
5020               tag = get_var_ann (symbl)->type_mem_tag;
5021               if (!tag)
5022                 {
5023                   tree ptr = TREE_OPERAND (memref, 0);
5024                   if (TREE_CODE (ptr) == SSA_NAME)
5025                     tag = get_var_ann (SSA_NAME_VAR (ptr))->type_mem_tag;
5026                 }
5027               if (!tag)
5028                 {
5029                   if (vect_debug_stats (loop) || vect_debug_details (loop))
5030                     fprintf (dump_file, "not vectorized: no memtag for ref.");
5031                   return false;
5032                 }
5033               STMT_VINFO_MEMTAG (stmt_info) = tag;
5034               break;
5035
5036             case ADDR_EXPR:
5037               address_base = TREE_OPERAND (symbl, 0);
5038
5039               switch (TREE_CODE (address_base))
5040                 {
5041                 case ARRAY_REF:
5042                   dr = analyze_array (stmt, TREE_OPERAND (symbl, 0), 
5043                                       DR_IS_READ(dr));
5044                   STMT_VINFO_MEMTAG (stmt_info) = 
5045                      vect_get_base_and_bit_offset (dr, DR_BASE_NAME (dr), NULL_TREE,
5046                                                    loop_vinfo, &offset, 
5047                                                    &base_aligned_p);
5048                   break;
5049                   
5050                 case VAR_DECL: 
5051                   STMT_VINFO_MEMTAG (stmt_info) = address_base;
5052                   break;
5053
5054                 default:
5055                   if (vect_debug_stats (loop) || vect_debug_details (loop))
5056                     {
5057                       fprintf (dump_file, 
5058                                "not vectorized: unhandled address expr: ");
5059                       print_generic_expr (dump_file, stmt, TDF_SLIM);
5060                     }
5061                   return false;
5062                 }
5063               break;
5064               
5065             default:
5066               if (vect_debug_stats (loop) || vect_debug_details (loop))
5067                 {
5068                   fprintf (dump_file, "not vectorized: unsupported data-ref: ");
5069                   print_generic_expr (dump_file, memref, TDF_SLIM);
5070                 }
5071               return false;
5072             }
5073
5074           VARRAY_PUSH_GENERIC_PTR (*datarefs, dr);
5075           STMT_VINFO_DATA_REF (stmt_info) = dr;
5076         }
5077     }
5078
5079   return true;
5080 }
5081
5082
5083 /* Utility functions used by vect_mark_stmts_to_be_vectorized.  */
5084
5085 /* Function vect_mark_relevant.
5086
5087    Mark STMT as "relevant for vectorization" and add it to WORKLIST.  */
5088
5089 static void
5090 vect_mark_relevant (varray_type worklist, tree stmt)
5091 {
5092   stmt_vec_info stmt_info;
5093
5094   if (vect_debug_details (NULL))
5095     fprintf (dump_file, "mark relevant.");
5096
5097   if (TREE_CODE (stmt) == PHI_NODE)
5098     {
5099       VARRAY_PUSH_TREE (worklist, stmt);
5100       return;
5101     }
5102
5103   stmt_info = vinfo_for_stmt (stmt);
5104
5105   if (!stmt_info)
5106     {
5107       if (vect_debug_details (NULL))
5108         {
5109           fprintf (dump_file, "mark relevant: no stmt info!!.");
5110           print_generic_expr (dump_file, stmt, TDF_SLIM);
5111         }
5112       return;
5113     }
5114
5115   if (STMT_VINFO_RELEVANT_P (stmt_info))
5116     {
5117       if (vect_debug_details (NULL))
5118         fprintf (dump_file, "already marked relevant.");
5119       return;
5120     }
5121
5122   STMT_VINFO_RELEVANT_P (stmt_info) = 1;
5123   VARRAY_PUSH_TREE (worklist, stmt);
5124 }
5125
5126
5127 /* Function vect_stmt_relevant_p.
5128
5129    Return true if STMT in loop that is represented by LOOP_VINFO is
5130    "relevant for vectorization".
5131
5132    A stmt is considered "relevant for vectorization" if:
5133    - it has uses outside the loop.
5134    - it has vdefs (it alters memory).
5135    - control stmts in the loop (except for the exit condition).
5136
5137    CHECKME: what other side effects would the vectorizer allow?  */
5138
5139 static bool
5140 vect_stmt_relevant_p (tree stmt, loop_vec_info loop_vinfo)
5141 {
5142   v_may_def_optype v_may_defs;
5143   v_must_def_optype v_must_defs;
5144   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
5145   int i;
5146   dataflow_t df;
5147   int num_uses;
5148
5149   /* cond stmt other than loop exit cond.  */
5150   if (is_ctrl_stmt (stmt) && (stmt != LOOP_VINFO_EXIT_COND (loop_vinfo)))
5151     return true;
5152
5153   /* changing memory.  */
5154   v_may_defs = STMT_V_MAY_DEF_OPS (stmt);
5155   v_must_defs = STMT_V_MUST_DEF_OPS (stmt);
5156   if (v_may_defs || v_must_defs)
5157     {
5158       if (vect_debug_details (NULL))
5159         fprintf (dump_file, "vec_stmt_relevant_p: stmt has vdefs.");
5160       return true;
5161     }
5162
5163   /* uses outside the loop.  */
5164   df = get_immediate_uses (stmt);
5165   num_uses = num_immediate_uses (df);
5166   for (i = 0; i < num_uses; i++)
5167     {
5168       tree use = immediate_use (df, i);
5169       basic_block bb = bb_for_stmt (use);
5170       if (!flow_bb_inside_loop_p (loop, bb))
5171         {
5172           if (vect_debug_details (NULL))
5173             fprintf (dump_file, "vec_stmt_relevant_p: used out of loop.");
5174           return true;
5175         }
5176     }
5177
5178   return false;
5179 }
5180
5181
5182 /* Function vect_mark_stmts_to_be_vectorized.
5183
5184    Not all stmts in the loop need to be vectorized. For example:
5185
5186      for i...
5187        for j...
5188    1.    T0 = i + j
5189    2.    T1 = a[T0]
5190
5191    3.    j = j + 1
5192
5193    Stmt 1 and 3 do not need to be vectorized, because loop control and
5194    addressing of vectorized data-refs are handled differently.
5195
5196    This pass detects such stmts.  */
5197
5198 static bool
5199 vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo)
5200 {
5201   varray_type worklist;
5202   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
5203   basic_block *bbs = LOOP_VINFO_BBS (loop_vinfo);
5204   unsigned int nbbs = loop->num_nodes;
5205   block_stmt_iterator si;
5206   tree stmt;
5207   stmt_ann_t ann;
5208   unsigned int i;
5209   int j;
5210   use_optype use_ops;
5211   stmt_vec_info stmt_info;
5212
5213   if (vect_debug_details (NULL))
5214     fprintf (dump_file, "\n<<vect_mark_stmts_to_be_vectorized>>\n");
5215
5216   VARRAY_TREE_INIT (worklist, 64, "work list");
5217
5218   /* 1. Init worklist.  */
5219
5220   for (i = 0; i < nbbs; i++)
5221     {
5222       basic_block bb = bbs[i];
5223       for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
5224         {
5225           stmt = bsi_stmt (si);
5226
5227           if (vect_debug_details (NULL))
5228             {
5229               fprintf (dump_file, "init: stmt relevant? ");
5230               print_generic_expr (dump_file, stmt, TDF_SLIM);
5231             } 
5232
5233           stmt_info = vinfo_for_stmt (stmt);
5234           STMT_VINFO_RELEVANT_P (stmt_info) = 0;
5235
5236           if (vect_stmt_relevant_p (stmt, loop_vinfo))
5237             vect_mark_relevant (worklist, stmt);
5238         }
5239     }
5240
5241
5242   /* 2. Process_worklist */
5243
5244   while (VARRAY_ACTIVE_SIZE (worklist) > 0)
5245     {
5246       stmt = VARRAY_TOP_TREE (worklist);
5247       VARRAY_POP (worklist);
5248
5249       if (vect_debug_details (NULL))
5250         {
5251           fprintf (dump_file, "worklist: examine stmt: ");
5252           print_generic_expr (dump_file, stmt, TDF_SLIM);
5253         }
5254
5255       /* Examine the USES in this statement. Mark all the statements which
5256          feed this statement's uses as "relevant", unless the USE is used as
5257          an array index.  */
5258
5259       if (TREE_CODE (stmt) == PHI_NODE)
5260         {
5261           /* follow the def-use chain inside the loop.  */
5262           for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
5263             {
5264               tree arg = PHI_ARG_DEF (stmt, j);
5265               tree def_stmt = NULL_TREE;
5266               basic_block bb;
5267               if (!vect_is_simple_use (arg, loop, &def_stmt))
5268                 {
5269                   if (vect_debug_details (NULL))        
5270                     fprintf (dump_file, "worklist: unsupported use.");
5271                   varray_clear (worklist);
5272                   return false;
5273                 }
5274               if (!def_stmt)
5275                 continue;
5276
5277               if (vect_debug_details (NULL))
5278                 {
5279                   fprintf (dump_file, "worklist: def_stmt: ");
5280                   print_generic_expr (dump_file, def_stmt, TDF_SLIM);
5281                 }
5282
5283               bb = bb_for_stmt (def_stmt);
5284               if (flow_bb_inside_loop_p (loop, bb))
5285                 vect_mark_relevant (worklist, def_stmt);
5286             }
5287         } 
5288
5289       ann = stmt_ann (stmt);
5290       use_ops = USE_OPS (ann);
5291
5292       for (i = 0; i < NUM_USES (use_ops); i++)
5293         {
5294           tree use = USE_OP (use_ops, i);
5295
5296           /* We are only interested in uses that need to be vectorized. Uses 
5297              that are used for address computation are not considered relevant.
5298            */
5299           if (exist_non_indexing_operands_for_use_p (use, stmt))
5300             {
5301               tree def_stmt = NULL_TREE;
5302               basic_block bb;
5303               if (!vect_is_simple_use (use, loop, &def_stmt))
5304                 {
5305                   if (vect_debug_details (NULL))        
5306                     fprintf (dump_file, "worklist: unsupported use.");
5307                   varray_clear (worklist);
5308                   return false;
5309                 }
5310
5311               if (!def_stmt)
5312                 continue;
5313
5314               if (vect_debug_details (NULL))
5315                 {
5316                   fprintf (dump_file, "worklist: examine use %d: ", i);
5317                   print_generic_expr (dump_file, use, TDF_SLIM);
5318                 }
5319
5320               bb = bb_for_stmt (def_stmt);
5321               if (flow_bb_inside_loop_p (loop, bb))
5322                 vect_mark_relevant (worklist, def_stmt);
5323             }
5324         }
5325     }                           /* while worklist */
5326
5327   varray_clear (worklist);
5328   return true;
5329 }
5330
5331
5332 /* Function vect_analyze_loop_with_symbolic_num_of_iters.
5333
5334    In case the number of iterations that LOOP iterates in unknown at compile 
5335    time, an epilog loop will be generated, and the loop induction variables 
5336    (IVs) will be "advanced" to the value they are supposed to take just before 
5337    the epilog loop. Here we check that the access function of the loop IVs
5338    and the expression that represents the loop bound are simple enough.
5339    These restrictions will be relaxed in the future.  */
5340
5341 static bool 
5342 vect_analyze_loop_with_symbolic_num_of_iters (tree niters, 
5343                                               struct loop *loop)
5344 {
5345   basic_block bb = loop->header;
5346   tree phi;
5347
5348   if (vect_debug_details (NULL))
5349     fprintf (dump_file, 
5350              "\n<<vect_analyze_loop_with_symbolic_num_of_iters>>\n");
5351   
5352   if (chrec_contains_undetermined (niters))
5353     {
5354       if (vect_debug_details (NULL))
5355         fprintf (dump_file, "Infinite number of iterations.");
5356       return false;
5357     }
5358
5359   if (!niters)
5360     {
5361       if (vect_debug_details (NULL))
5362         fprintf (dump_file, "niters is NULL pointer.");
5363       return false;
5364     }
5365
5366   if (vect_debug_details (NULL))
5367     {
5368       fprintf (dump_file, "Symbolic number of iterations is ");
5369       print_generic_expr (dump_file, niters, TDF_DETAILS);
5370     }
5371    
5372   /* Analyze phi functions of the loop header.  */
5373
5374   for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
5375     {
5376       tree access_fn = NULL;
5377       tree evolution_part;
5378
5379       if (vect_debug_details (NULL))
5380         {
5381           fprintf (dump_file, "Analyze phi: ");
5382           print_generic_expr (dump_file, phi, TDF_SLIM);
5383         }
5384
5385       /* Skip virtual phi's. The data dependences that are associated with
5386          virtual defs/uses (i.e., memory accesses) are analyzed elsewhere.  */
5387
5388       if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (phi))))
5389         {
5390           if (vect_debug_details (NULL))
5391             fprintf (dump_file, "virtual phi. skip.");
5392           continue;
5393         }
5394
5395       /* Analyze the evolution function.  */
5396
5397       access_fn = instantiate_parameters
5398         (loop, analyze_scalar_evolution (loop, PHI_RESULT (phi)));
5399
5400       if (!access_fn)
5401         {
5402           if (vect_debug_details (NULL))
5403             fprintf (dump_file, "No Access function.");
5404           return false;
5405         }
5406
5407       if (vect_debug_details (NULL))
5408         {
5409           fprintf (dump_file, "Access function of PHI: ");
5410           print_generic_expr (dump_file, access_fn, TDF_SLIM);
5411         }
5412
5413       evolution_part = evolution_part_in_loop_num (access_fn, loop->num);
5414       
5415       if (evolution_part == NULL_TREE)
5416         return false;
5417   
5418       /* FORNOW: We do not transform initial conditions of IVs 
5419          which evolution functions are a polynomial of degree >= 2.  */
5420
5421       if (tree_is_chrec (evolution_part))
5422         return false;  
5423     }
5424
5425   return  true;
5426 }
5427
5428
5429 /* Function vect_get_loop_niters.
5430
5431    Determine how many iterations the loop is executed.  */
5432
5433 static tree
5434 vect_get_loop_niters (struct loop *loop, tree *number_of_iterations)
5435 {
5436   tree niters;
5437
5438   if (vect_debug_details (NULL))
5439     fprintf (dump_file, "\n<<get_loop_niters>>\n");
5440
5441   niters = number_of_iterations_in_loop (loop);
5442
5443   if (niters != NULL_TREE
5444       && niters != chrec_dont_know)
5445     {
5446       *number_of_iterations = niters;
5447
5448       if (vect_debug_details (NULL))
5449         {
5450           fprintf (dump_file, "==> get_loop_niters:" );
5451           print_generic_expr (dump_file, *number_of_iterations, TDF_SLIM);
5452         }
5453     }
5454
5455   return get_loop_exit_condition (loop);
5456 }
5457
5458
5459 /* Function vect_analyze_loop_form.
5460
5461    Verify the following restrictions (some may be relaxed in the future):
5462    - it's an inner-most loop
5463    - number of BBs = 2 (which are the loop header and the latch)
5464    - the loop has a pre-header
5465    - the loop has a single entry and exit
5466    - the loop exit condition is simple enough, and the number of iterations
5467      can be analyzed (a countable loop).  */
5468
5469 static loop_vec_info
5470 vect_analyze_loop_form (struct loop *loop)
5471 {
5472   loop_vec_info loop_vinfo;
5473   tree loop_cond;
5474   tree number_of_iterations = NULL;
5475
5476   if (vect_debug_details (loop))
5477     fprintf (dump_file, "\n<<vect_analyze_loop_form>>\n");
5478
5479   if (loop->inner
5480       || !loop->single_exit
5481       || loop->num_nodes != 2)
5482     {
5483       if (vect_debug_stats (loop) || vect_debug_details (loop)) 
5484         {
5485           fprintf (dump_file, "not vectorized: bad loop form. ");
5486           if (loop->inner)
5487             fprintf (dump_file, "nested loop.");
5488           else if (!loop->single_exit)
5489             fprintf (dump_file, "multiple exits.");
5490           else if (loop->num_nodes != 2)
5491             fprintf (dump_file, "too many BBs in loop.");
5492         }
5493
5494       return NULL;
5495     }
5496
5497   /* We assume that the loop exit condition is at the end of the loop. i.e,
5498      that the loop is represented as a do-while (with a proper if-guard
5499      before the loop if needed), where the loop header contains all the
5500      executable statements, and the latch is empty.  */
5501   if (!empty_block_p (loop->latch))
5502     {
5503       if (vect_debug_stats (loop) || vect_debug_details (loop))
5504         fprintf (dump_file, "not vectorized: unexpectd loop form.");
5505       return NULL;
5506     }
5507
5508   if (empty_block_p (loop->header))
5509     {
5510       if (vect_debug_stats (loop) || vect_debug_details (loop))
5511         fprintf (dump_file, "not vectorized: empty loop.");
5512       return NULL;
5513     }
5514
5515   loop_cond = vect_get_loop_niters (loop, &number_of_iterations);
5516   if (!loop_cond)
5517     {
5518       if (vect_debug_stats (loop) || vect_debug_details (loop))
5519         fprintf (dump_file, "not vectorized: complicated exit condition.");
5520       return NULL;
5521     }
5522   
5523   if (!number_of_iterations) 
5524     {
5525       if (vect_debug_stats (loop) || vect_debug_details (loop))
5526         fprintf (dump_file, 
5527                  "not vectorized: number of iterations cannot be computed.");
5528       return NULL;
5529     }
5530
5531   loop_vinfo = new_loop_vec_info (loop);
5532   LOOP_VINFO_NITERS (loop_vinfo) = number_of_iterations;
5533   if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
5534     {
5535       if (vect_debug_stats (loop) || vect_debug_details (loop))
5536         fprintf (dump_file, "loop bound unknown.");
5537
5538       /* Unknown loop bound.  */
5539       if (!vect_analyze_loop_with_symbolic_num_of_iters 
5540                                         (number_of_iterations, loop))
5541         {
5542           if (vect_debug_stats (loop) || vect_debug_details (loop))
5543             fprintf (dump_file, 
5544                      "not vectorized: can't determine loop bound.");
5545           return NULL;
5546         }
5547       else
5548         {
5549           /* We need only one loop entry for unknown loop bound support.  */
5550           if (loop->num_entries != 1 || !loop->pre_header)
5551             {         
5552               if (vect_debug_stats (loop) || vect_debug_details (loop))
5553                 fprintf (dump_file, 
5554                          "not vectorized: more than one loop entry.");
5555               return NULL;
5556             }
5557         }
5558     }
5559   else
5560   if (LOOP_VINFO_INT_NITERS (loop_vinfo) == 0)
5561     {
5562       if (vect_debug_stats (loop) || vect_debug_details (loop))
5563         fprintf (dump_file, "not vectorized: number of iterations = 0.");
5564       return NULL;
5565     }
5566
5567   LOOP_VINFO_EXIT_COND (loop_vinfo) = loop_cond;
5568
5569   return loop_vinfo;
5570 }
5571
5572
5573 /* Function vect_analyze_loop.
5574
5575    Apply a set of analyses on LOOP, and create a loop_vec_info struct
5576    for it. The different analyses will record information in the
5577    loop_vec_info struct.  */
5578
5579 static loop_vec_info
5580 vect_analyze_loop (struct loop *loop)
5581 {
5582   bool ok;
5583   loop_vec_info loop_vinfo;
5584
5585   if (vect_debug_details (NULL))
5586     fprintf (dump_file, "\n<<<<<<< analyze_loop_nest >>>>>>>\n");
5587
5588   /* Check the CFG characteristics of the loop (nesting, entry/exit, etc.  */
5589
5590   loop_vinfo = vect_analyze_loop_form (loop);
5591   if (!loop_vinfo)
5592     {
5593       if (vect_debug_details (loop))
5594         fprintf (dump_file, "bad loop form.");
5595       return NULL;
5596     }
5597
5598   /* Find all data references in the loop (which correspond to vdefs/vuses)
5599      and analyze their evolution in the loop.
5600
5601      FORNOW: Handle only simple, array references, which
5602      alignment can be forced, and aligned pointer-references.  */
5603
5604   ok = vect_analyze_data_refs (loop_vinfo);
5605   if (!ok)
5606     {
5607       if (vect_debug_details (loop))
5608         fprintf (dump_file, "bad data references.");
5609       destroy_loop_vec_info (loop_vinfo);
5610       return NULL;
5611     }
5612
5613   /* Data-flow analysis to detect stmts that do not need to be vectorized.  */
5614
5615   ok = vect_mark_stmts_to_be_vectorized (loop_vinfo);
5616   if (!ok)
5617     {
5618       if (vect_debug_details (loop))
5619         fprintf (dump_file, "unexpected pattern.");
5620       if (vect_debug_details (loop))
5621         fprintf (dump_file, "not vectorized: unexpected pattern.");
5622       destroy_loop_vec_info (loop_vinfo);
5623       return NULL;
5624     }
5625
5626   /* Check that all cross-iteration scalar data-flow cycles are OK.
5627      Cross-iteration cycles caused by virtual phis are analyzed separately.  */
5628
5629   ok = vect_analyze_scalar_cycles (loop_vinfo);
5630   if (!ok)
5631     {
5632       if (vect_debug_details (loop))
5633         fprintf (dump_file, "bad scalar cycle.");
5634       destroy_loop_vec_info (loop_vinfo);
5635       return NULL;
5636     }
5637
5638   /* Analyze data dependences between the data-refs in the loop. 
5639      FORNOW: fail at the first data dependence that we encounter.  */
5640
5641   ok = vect_analyze_data_ref_dependences (loop_vinfo);
5642   if (!ok)
5643     {
5644       if (vect_debug_details (loop))
5645         fprintf (dump_file, "bad data dependence.");
5646       destroy_loop_vec_info (loop_vinfo);
5647       return NULL;
5648     }
5649
5650   /* Analyze the access patterns of the data-refs in the loop (consecutive,
5651      complex, etc.). FORNOW: Only handle consecutive access pattern.  */
5652
5653   ok = vect_analyze_data_ref_accesses (loop_vinfo);
5654   if (!ok)
5655     {
5656       if (vect_debug_details (loop))
5657         fprintf (dump_file, "bad data access.");
5658       destroy_loop_vec_info (loop_vinfo);
5659       return NULL;
5660     }
5661
5662   /* Analyze the alignment of the data-refs in the loop.
5663      FORNOW: Only aligned accesses are handled.  */
5664
5665   ok = vect_analyze_data_refs_alignment (loop_vinfo);
5666   if (!ok)
5667     {
5668       if (vect_debug_details (loop))
5669         fprintf (dump_file, "bad data alignment.");
5670       destroy_loop_vec_info (loop_vinfo);
5671       return NULL;
5672     }
5673
5674   /* Scan all the operations in the loop and make sure they are
5675      vectorizable.  */
5676
5677   ok = vect_analyze_operations (loop_vinfo);
5678   if (!ok)
5679     {
5680       if (vect_debug_details (loop))
5681         fprintf (dump_file, "bad operation or unsupported loop bound.");
5682       destroy_loop_vec_info (loop_vinfo);
5683       return NULL;
5684     }
5685
5686   LOOP_VINFO_VECTORIZABLE_P (loop_vinfo) = 1;
5687
5688   return loop_vinfo;
5689 }
5690
5691
5692 /* Function need_imm_uses_for.
5693
5694    Return whether we ought to include information for 'var'
5695    when calculating immediate uses.  For this pass we only want use
5696    information for non-virtual variables.  */
5697
5698 static bool
5699 need_imm_uses_for (tree var)
5700 {
5701   return is_gimple_reg (var);
5702 }
5703
5704
5705 /* Function vectorize_loops.
5706    
5707    Entry Point to loop vectorization phase.  */
5708
5709 void
5710 vectorize_loops (struct loops *loops)
5711 {
5712   unsigned int i, loops_num;
5713   unsigned int num_vectorized_loops = 0;
5714
5715   /* Does the target support SIMD?  */
5716   /* FORNOW: until more sophisticated machine modelling is in place.  */
5717   if (!UNITS_PER_SIMD_WORD)
5718     {
5719       if (vect_debug_details (NULL))
5720         fprintf (dump_file, "vectorizer: target vector size is not defined.");
5721       return;
5722     }
5723
5724   compute_immediate_uses (TDFA_USE_OPS, need_imm_uses_for);
5725
5726   /*  ----------- Analyze loops. -----------  */
5727
5728   /* If some loop was duplicated, it gets bigger number 
5729      than all previously defined loops. This fact allows us to run 
5730      only over initial loops skipping newly generated ones.  */
5731   loops_num = loops->num;
5732   for (i = 1; i < loops_num; i++)
5733     {
5734       loop_vec_info loop_vinfo;
5735       struct loop *loop = loops->parray[i];
5736
5737       if (!loop)
5738         continue;
5739
5740       loop_vinfo = vect_analyze_loop (loop);
5741       loop->aux = loop_vinfo;
5742
5743       if (!loop_vinfo || !LOOP_VINFO_VECTORIZABLE_P (loop_vinfo))
5744         continue;
5745
5746       vect_transform_loop (loop_vinfo, loops); 
5747       num_vectorized_loops++;
5748     }
5749
5750   if (vect_debug_stats (NULL) || vect_debug_details (NULL))
5751     fprintf (dump_file, "\nvectorized %u loops in function.\n",
5752              num_vectorized_loops);
5753
5754   /*  ----------- Finalize. -----------  */
5755
5756   free_df ();
5757   for (i = 1; i < loops_num; i++)
5758     {
5759       struct loop *loop = loops->parray[i];
5760       loop_vec_info loop_vinfo;
5761
5762       if (!loop)
5763         continue;
5764       loop_vinfo = loop->aux;
5765       destroy_loop_vec_info (loop_vinfo);
5766       loop->aux = NULL;
5767     }
5768
5769   rewrite_into_ssa (false);
5770   if (!bitmap_empty_p (vars_to_rename))
5771     {
5772       /* The rewrite of ssa names may cause violation of loop closed ssa
5773          form invariants.  TODO -- avoid these rewrites completely.
5774          Information in virtual phi nodes is sufficient for it.  */
5775       rewrite_into_loop_closed_ssa (); 
5776     }
5777   rewrite_into_loop_closed_ssa (); 
5778   bitmap_clear (vars_to_rename);
5779 }