OSDN Git Service

fixing pr42337
[pf3gnuchains/gcc-fork.git] / gcc / tree-vect-slp.c
1 /* SLP - Basic Block Vectorization
2    Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
3    Foundation, Inc.
4    Contributed by Dorit Naishlos <dorit@il.ibm.com>
5    and Ira Rosen <irar@il.ibm.com>
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "ggc.h"
28 #include "tree.h"
29 #include "target.h"
30 #include "basic-block.h"
31 #include "diagnostic.h"
32 #include "tree-flow.h"
33 #include "tree-dump.h"
34 #include "cfgloop.h"
35 #include "cfglayout.h"
36 #include "expr.h"
37 #include "recog.h"
38 #include "optabs.h"
39 #include "tree-vectorizer.h"
40
41 /* Extract the location of the basic block in the source code.
42    Return the basic block location if succeed and NULL if not.  */
43
44 LOC
45 find_bb_location (basic_block bb)
46 {
47   gimple stmt = NULL;
48   gimple_stmt_iterator si;
49
50   if (!bb)
51     return UNKNOWN_LOC;
52
53   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
54     {
55       stmt = gsi_stmt (si);
56       if (gimple_location (stmt) != UNKNOWN_LOC)
57         return gimple_location (stmt);
58     }
59
60   return UNKNOWN_LOC;
61 }
62
63
64 /* Recursively free the memory allocated for the SLP tree rooted at NODE.  */
65
66 static void
67 vect_free_slp_tree (slp_tree node)
68 {
69   if (!node)
70     return;
71
72   if (SLP_TREE_LEFT (node))
73     vect_free_slp_tree (SLP_TREE_LEFT (node));
74
75   if (SLP_TREE_RIGHT (node))
76     vect_free_slp_tree (SLP_TREE_RIGHT (node));
77
78   VEC_free (gimple, heap, SLP_TREE_SCALAR_STMTS (node));
79
80   if (SLP_TREE_VEC_STMTS (node))
81     VEC_free (gimple, heap, SLP_TREE_VEC_STMTS (node));
82
83   free (node);
84 }
85
86
87 /* Free the memory allocated for the SLP instance.  */
88
89 void
90 vect_free_slp_instance (slp_instance instance)
91 {
92   vect_free_slp_tree (SLP_INSTANCE_TREE (instance));
93   VEC_free (int, heap, SLP_INSTANCE_LOAD_PERMUTATION (instance));
94   VEC_free (slp_tree, heap, SLP_INSTANCE_LOADS (instance));
95 }
96
97
98 /* Get the defs for the rhs of STMT (collect them in DEF_STMTS0/1), check that
99    they are of a legal type and that they match the defs of the first stmt of
100    the SLP group (stored in FIRST_STMT_...).  */
101
102 static bool
103 vect_get_and_check_slp_defs (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
104                              slp_tree slp_node, gimple stmt,
105                              VEC (gimple, heap) **def_stmts0,
106                              VEC (gimple, heap) **def_stmts1,
107                              enum vect_def_type *first_stmt_dt0,
108                              enum vect_def_type *first_stmt_dt1,
109                              tree *first_stmt_def0_type,
110                              tree *first_stmt_def1_type,
111                              tree *first_stmt_const_oprnd,
112                              int ncopies_for_cost,
113                              bool *pattern0, bool *pattern1)
114 {
115   tree oprnd;
116   unsigned int i, number_of_oprnds;
117   tree def;
118   gimple def_stmt;
119   enum vect_def_type dt[2] = {vect_unknown_def_type, vect_unknown_def_type};
120   stmt_vec_info stmt_info =
121     vinfo_for_stmt (VEC_index (gimple, SLP_TREE_SCALAR_STMTS (slp_node), 0));
122   enum gimple_rhs_class rhs_class;
123   struct loop *loop = NULL;
124
125   if (loop_vinfo)
126     loop = LOOP_VINFO_LOOP (loop_vinfo);
127
128   rhs_class = get_gimple_rhs_class (gimple_assign_rhs_code (stmt));
129   number_of_oprnds = gimple_num_ops (stmt) - 1; /* RHS only */
130
131   for (i = 0; i < number_of_oprnds; i++)
132     {
133       oprnd = gimple_op (stmt, i + 1);
134
135       if (!vect_is_simple_use (oprnd, loop_vinfo, bb_vinfo, &def_stmt, &def,
136                                &dt[i])
137           || (!def_stmt && dt[i] != vect_constant_def))
138         {
139           if (vect_print_dump_info (REPORT_SLP))
140             {
141               fprintf (vect_dump, "Build SLP failed: can't find def for ");
142               print_generic_expr (vect_dump, oprnd, TDF_SLIM);
143             }
144
145           return false;
146         }
147
148       /* Check if DEF_STMT is a part of a pattern in LOOP and get the def stmt
149          from the pattern. Check that all the stmts of the node are in the
150          pattern.  */
151       if (loop && def_stmt && gimple_bb (def_stmt)
152           && flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))
153           && vinfo_for_stmt (def_stmt)
154           && STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (def_stmt)))
155         {
156           if (!*first_stmt_dt0)
157             *pattern0 = true;
158           else
159             {
160               if (i == 1 && !*first_stmt_dt1)
161                 *pattern1 = true;
162               else if ((i == 0 && !*pattern0) || (i == 1 && !*pattern1))
163                 {
164                   if (vect_print_dump_info (REPORT_DETAILS))
165                     {
166                       fprintf (vect_dump, "Build SLP failed: some of the stmts"
167                                      " are in a pattern, and others are not ");
168                       print_generic_expr (vect_dump, oprnd, TDF_SLIM);
169                     }
170
171                   return false;
172                 }
173             }
174
175           def_stmt = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (def_stmt));
176           dt[i] = STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_stmt));
177
178           if (*dt == vect_unknown_def_type)
179             {
180               if (vect_print_dump_info (REPORT_DETAILS))
181                 fprintf (vect_dump, "Unsupported pattern.");
182               return false;
183             }
184
185           switch (gimple_code (def_stmt))
186             {
187               case GIMPLE_PHI:
188                 def = gimple_phi_result (def_stmt);
189                 break;
190
191               case GIMPLE_ASSIGN:
192                 def = gimple_assign_lhs (def_stmt);
193                 break;
194
195               default:
196                 if (vect_print_dump_info (REPORT_DETAILS))
197                   fprintf (vect_dump, "unsupported defining stmt: ");
198                 return false;
199             }
200         }
201
202       if (!*first_stmt_dt0)
203         {
204           /* op0 of the first stmt of the group - store its info.  */
205           *first_stmt_dt0 = dt[i];
206           if (def)
207             *first_stmt_def0_type = TREE_TYPE (def);
208           else
209             *first_stmt_const_oprnd = oprnd;
210
211           /* Analyze costs (for the first stmt of the group only).  */
212           if (rhs_class != GIMPLE_SINGLE_RHS)
213             /* Not memory operation (we don't call this functions for loads).  */
214             vect_model_simple_cost (stmt_info, ncopies_for_cost, dt, slp_node);
215           else
216             /* Store.  */
217             vect_model_store_cost (stmt_info, ncopies_for_cost, dt[0], slp_node);
218         }
219
220       else
221         {
222           if (!*first_stmt_dt1 && i == 1)
223             {
224               /* op1 of the first stmt of the group - store its info.  */
225               *first_stmt_dt1 = dt[i];
226               if (def)
227                 *first_stmt_def1_type = TREE_TYPE (def);
228               else
229                 {
230                   /* We assume that the stmt contains only one constant
231                      operand. We fail otherwise, to be on the safe side.  */
232                   if (*first_stmt_const_oprnd)
233                     {
234                       if (vect_print_dump_info (REPORT_SLP))
235                         fprintf (vect_dump, "Build SLP failed: two constant "
236                                  "oprnds in stmt");
237                       return false;
238                     }
239                   *first_stmt_const_oprnd = oprnd;
240                 }
241             }
242           else
243             {
244               /* Not first stmt of the group, check that the def-stmt/s match
245                  the def-stmt/s of the first stmt.  */
246               if ((i == 0
247                    && (*first_stmt_dt0 != dt[i]
248                        || (*first_stmt_def0_type && def
249                            && *first_stmt_def0_type != TREE_TYPE (def))))
250                   || (i == 1
251                       && (*first_stmt_dt1 != dt[i]
252                           || (*first_stmt_def1_type && def
253                               && *first_stmt_def1_type != TREE_TYPE (def))))
254                   || (!def
255                       && TREE_TYPE (*first_stmt_const_oprnd)
256                       != TREE_TYPE (oprnd)))
257                 {
258                   if (vect_print_dump_info (REPORT_SLP))
259                     fprintf (vect_dump, "Build SLP failed: different types ");
260
261                   return false;
262                 }
263             }
264         }
265
266       /* Check the types of the definitions.  */
267       switch (dt[i])
268         {
269         case vect_constant_def:
270         case vect_external_def:
271           break;
272
273         case vect_internal_def:
274           if (i == 0)
275             VEC_safe_push (gimple, heap, *def_stmts0, def_stmt);
276           else
277             VEC_safe_push (gimple, heap, *def_stmts1, def_stmt);
278           break;
279
280         default:
281           /* FORNOW: Not supported.  */
282           if (vect_print_dump_info (REPORT_SLP))
283             {
284               fprintf (vect_dump, "Build SLP failed: illegal type of def ");
285               print_generic_expr (vect_dump, def, TDF_SLIM);
286             }
287
288           return false;
289         }
290     }
291
292   return true;
293 }
294
295
296 /* Recursively build an SLP tree starting from NODE.
297    Fail (and return FALSE) if def-stmts are not isomorphic, require data
298    permutation or are of unsupported types of operation. Otherwise, return
299    TRUE.  */
300
301 static bool
302 vect_build_slp_tree (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
303                      slp_tree *node, unsigned int group_size,
304                      int *inside_cost, int *outside_cost,
305                      int ncopies_for_cost, unsigned int *max_nunits,
306                      VEC (int, heap) **load_permutation,
307                      VEC (slp_tree, heap) **loads,
308                      unsigned int vectorization_factor)
309 {
310   VEC (gimple, heap) *def_stmts0 = VEC_alloc (gimple, heap, group_size);
311   VEC (gimple, heap) *def_stmts1 =  VEC_alloc (gimple, heap, group_size);
312   unsigned int i;
313   VEC (gimple, heap) *stmts = SLP_TREE_SCALAR_STMTS (*node);
314   gimple stmt = VEC_index (gimple, stmts, 0);
315   enum vect_def_type first_stmt_dt0 = vect_uninitialized_def;
316   enum vect_def_type first_stmt_dt1 = vect_uninitialized_def;
317   enum tree_code first_stmt_code = ERROR_MARK, rhs_code;
318   tree first_stmt_def1_type = NULL_TREE, first_stmt_def0_type = NULL_TREE;
319   tree lhs;
320   bool stop_recursion = false, need_same_oprnds = false;
321   tree vectype, scalar_type, first_op1 = NULL_TREE;
322   unsigned int ncopies;
323   optab optab;
324   int icode;
325   enum machine_mode optab_op2_mode;
326   enum machine_mode vec_mode;
327   tree first_stmt_const_oprnd = NULL_TREE;
328   struct data_reference *first_dr;
329   bool pattern0 = false, pattern1 = false;
330   HOST_WIDE_INT dummy;
331   bool permutation = false;
332   unsigned int load_place;
333   gimple first_load;
334
335   /* For every stmt in NODE find its def stmt/s.  */
336   for (i = 0; VEC_iterate (gimple, stmts, i, stmt); i++)
337     {
338       if (vect_print_dump_info (REPORT_SLP))
339         {
340           fprintf (vect_dump, "Build SLP for ");
341           print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
342         }
343
344       lhs = gimple_get_lhs (stmt);
345       if (lhs == NULL_TREE)
346         {
347           if (vect_print_dump_info (REPORT_SLP))
348             {
349               fprintf (vect_dump,
350                        "Build SLP failed: not GIMPLE_ASSIGN nor GIMPLE_CALL");
351               print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
352             }
353
354           return false;
355         }
356
357       scalar_type = vect_get_smallest_scalar_type (stmt, &dummy, &dummy);
358       vectype = get_vectype_for_scalar_type (scalar_type);
359       if (!vectype)
360         {
361           if (vect_print_dump_info (REPORT_SLP))
362             {
363               fprintf (vect_dump, "Build SLP failed: unsupported data-type ");
364               print_generic_expr (vect_dump, scalar_type, TDF_SLIM);
365             }
366           return false;
367         }
368
369       ncopies = vectorization_factor / TYPE_VECTOR_SUBPARTS (vectype);
370       if (ncopies != 1)
371         {
372           if (vect_print_dump_info (REPORT_SLP))
373             fprintf (vect_dump, "SLP with multiple types ");
374
375           /* FORNOW: multiple types are unsupported in BB SLP.  */
376           if (bb_vinfo)
377             return false;
378         }
379
380       /* In case of multiple types we need to detect the smallest type.  */
381       if (*max_nunits < TYPE_VECTOR_SUBPARTS (vectype))
382         *max_nunits = TYPE_VECTOR_SUBPARTS (vectype);
383
384       if (is_gimple_call (stmt))
385         rhs_code = CALL_EXPR;
386       else
387         rhs_code = gimple_assign_rhs_code (stmt);
388
389       /* Check the operation.  */
390       if (i == 0)
391         {
392           first_stmt_code = rhs_code;
393
394           /* Shift arguments should be equal in all the packed stmts for a
395              vector shift with scalar shift operand.  */
396           if (rhs_code == LSHIFT_EXPR || rhs_code == RSHIFT_EXPR
397               || rhs_code == LROTATE_EXPR
398               || rhs_code == RROTATE_EXPR)
399             {
400               vec_mode = TYPE_MODE (vectype);
401
402               /* First see if we have a vector/vector shift.  */
403               optab = optab_for_tree_code (rhs_code, vectype,
404                                            optab_vector);
405
406               if (!optab
407                   || (optab->handlers[(int) vec_mode].insn_code
408                       == CODE_FOR_nothing))
409                 {
410                   /* No vector/vector shift, try for a vector/scalar shift.  */
411                   optab = optab_for_tree_code (rhs_code, vectype,
412                                                optab_scalar);
413
414                   if (!optab)
415                     {
416                       if (vect_print_dump_info (REPORT_SLP))
417                         fprintf (vect_dump, "Build SLP failed: no optab.");
418                       return false;
419                     }
420                   icode = (int) optab->handlers[(int) vec_mode].insn_code;
421                   if (icode == CODE_FOR_nothing)
422                     {
423                       if (vect_print_dump_info (REPORT_SLP))
424                         fprintf (vect_dump, "Build SLP failed: "
425                                             "op not supported by target.");
426                       return false;
427                     }
428                   optab_op2_mode = insn_data[icode].operand[2].mode;
429                   if (!VECTOR_MODE_P (optab_op2_mode))
430                     {
431                       need_same_oprnds = true;
432                       first_op1 = gimple_assign_rhs2 (stmt);
433                     }
434                 }
435             }
436         }
437       else
438         {
439           if (first_stmt_code != rhs_code
440               && (first_stmt_code != IMAGPART_EXPR
441                   || rhs_code != REALPART_EXPR)
442               && (first_stmt_code != REALPART_EXPR
443                   || rhs_code != IMAGPART_EXPR))
444             {
445               if (vect_print_dump_info (REPORT_SLP))
446                 {
447                   fprintf (vect_dump,
448                            "Build SLP failed: different operation in stmt ");
449                   print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
450                 }
451
452               return false;
453             }
454
455           if (need_same_oprnds
456               && !operand_equal_p (first_op1, gimple_assign_rhs2 (stmt), 0))
457             {
458               if (vect_print_dump_info (REPORT_SLP))
459                 {
460                   fprintf (vect_dump,
461                            "Build SLP failed: different shift arguments in ");
462                   print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
463                 }
464
465               return false;
466             }
467         }
468
469       /* Strided store or load.  */
470       if (STMT_VINFO_STRIDED_ACCESS (vinfo_for_stmt (stmt)))
471         {
472           if (REFERENCE_CLASS_P (lhs))
473             {
474               /* Store.  */
475               if (!vect_get_and_check_slp_defs (loop_vinfo, bb_vinfo, *node,
476                                                 stmt, &def_stmts0, &def_stmts1,
477                                                 &first_stmt_dt0,
478                                                 &first_stmt_dt1,
479                                                 &first_stmt_def0_type,
480                                                 &first_stmt_def1_type,
481                                                 &first_stmt_const_oprnd,
482                                                 ncopies_for_cost,
483                                                 &pattern0, &pattern1))
484                 return false;
485             }
486             else
487               {
488                 /* Load.  */
489                 /* FORNOW: Check that there is no gap between the loads.  */
490                 if ((DR_GROUP_FIRST_DR (vinfo_for_stmt (stmt)) == stmt
491                      && DR_GROUP_GAP (vinfo_for_stmt (stmt)) != 0)
492                     || (DR_GROUP_FIRST_DR (vinfo_for_stmt (stmt)) != stmt
493                         && DR_GROUP_GAP (vinfo_for_stmt (stmt)) != 1))
494                   {
495                     if (vect_print_dump_info (REPORT_SLP))
496                       {
497                         fprintf (vect_dump, "Build SLP failed: strided "
498                                             "loads have gaps ");
499                         print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
500                       }
501
502                     return false;
503                   }
504
505                 /* Check that the size of interleaved loads group is not
506                    greater than the SLP group size.  */
507                 if (DR_GROUP_SIZE (vinfo_for_stmt (stmt))
508                     > ncopies * group_size)
509                   {
510                     if (vect_print_dump_info (REPORT_SLP))
511                       {
512                         fprintf (vect_dump, "Build SLP failed: the number of "
513                                             "interleaved loads is greater than"
514                                             " the SLP group size ");
515                         print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
516                       }
517
518                     return false;
519                   }
520
521                 first_load = DR_GROUP_FIRST_DR (vinfo_for_stmt (stmt));
522
523               if (first_load == stmt)
524                 {
525                   first_dr = STMT_VINFO_DATA_REF (vinfo_for_stmt (stmt));
526                   if (vect_supportable_dr_alignment (first_dr)
527                       == dr_unaligned_unsupported)
528                     {
529                       if (vect_print_dump_info (REPORT_SLP))
530                         {
531                           fprintf (vect_dump, "Build SLP failed: unsupported "
532                                               "unaligned load ");
533                           print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
534                         }
535
536                       return false;
537                     }
538
539                   /* Analyze costs (for the first stmt in the group).  */
540                   vect_model_load_cost (vinfo_for_stmt (stmt),
541                                         ncopies_for_cost, *node);
542                 }
543
544               /* Store the place of this load in the interleaving chain. In
545                  case that permutation is needed we later decide if a specific
546                  permutation is supported.  */
547               load_place = vect_get_place_in_interleaving_chain (stmt,
548                                                                  first_load);
549               if (load_place != i)
550                 permutation = true;
551
552               VEC_safe_push (int, heap, *load_permutation, load_place);
553
554               /* We stop the tree when we reach a group of loads.  */
555               stop_recursion = true;
556              continue;
557            }
558         } /* Strided access.  */
559       else
560         {
561           if (TREE_CODE_CLASS (rhs_code) == tcc_reference)
562             {
563               /* Not strided load. */
564               if (vect_print_dump_info (REPORT_SLP))
565                 {
566                   fprintf (vect_dump, "Build SLP failed: not strided load ");
567                   print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
568                 }
569
570               /* FORNOW: Not strided loads are not supported.  */
571               return false;
572             }
573
574           /* Not memory operation.  */
575           if (TREE_CODE_CLASS (rhs_code) != tcc_binary
576               && TREE_CODE_CLASS (rhs_code) != tcc_unary)
577             {
578               if (vect_print_dump_info (REPORT_SLP))
579                 {
580                   fprintf (vect_dump, "Build SLP failed: operation");
581                   fprintf (vect_dump, " unsupported ");
582                   print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
583                 }
584
585               return false;
586             }
587
588           /* Find the def-stmts.  */
589           if (!vect_get_and_check_slp_defs (loop_vinfo, bb_vinfo, *node, stmt,
590                                             &def_stmts0, &def_stmts1,
591                                             &first_stmt_dt0, &first_stmt_dt1,
592                                             &first_stmt_def0_type,
593                                             &first_stmt_def1_type,
594                                             &first_stmt_const_oprnd,
595                                             ncopies_for_cost,
596                                             &pattern0, &pattern1))
597             return false;
598         }
599     }
600
601   /* Add the costs of the node to the overall instance costs.  */
602   *inside_cost += SLP_TREE_INSIDE_OF_LOOP_COST (*node);
603   *outside_cost += SLP_TREE_OUTSIDE_OF_LOOP_COST (*node);
604
605   /* Strided loads were reached - stop the recursion.  */
606   if (stop_recursion)
607     {
608       if (permutation)
609         {
610           VEC_safe_push (slp_tree, heap, *loads, *node);
611           *inside_cost += TARG_VEC_PERMUTE_COST * group_size;
612         }
613
614       return true;
615     }
616
617   /* Create SLP_TREE nodes for the definition node/s.  */
618   if (first_stmt_dt0 == vect_internal_def)
619     {
620       slp_tree left_node = XNEW (struct _slp_tree);
621       SLP_TREE_SCALAR_STMTS (left_node) = def_stmts0;
622       SLP_TREE_VEC_STMTS (left_node) = NULL;
623       SLP_TREE_LEFT (left_node) = NULL;
624       SLP_TREE_RIGHT (left_node) = NULL;
625       SLP_TREE_OUTSIDE_OF_LOOP_COST (left_node) = 0;
626       SLP_TREE_INSIDE_OF_LOOP_COST (left_node) = 0;
627       if (!vect_build_slp_tree (loop_vinfo, bb_vinfo, &left_node, group_size,
628                                 inside_cost, outside_cost, ncopies_for_cost,
629                                 max_nunits, load_permutation, loads,
630                                 vectorization_factor))
631         return false;
632
633       SLP_TREE_LEFT (*node) = left_node;
634     }
635
636   if (first_stmt_dt1 == vect_internal_def)
637     {
638       slp_tree right_node = XNEW (struct _slp_tree);
639       SLP_TREE_SCALAR_STMTS (right_node) = def_stmts1;
640       SLP_TREE_VEC_STMTS (right_node) = NULL;
641       SLP_TREE_LEFT (right_node) = NULL;
642       SLP_TREE_RIGHT (right_node) = NULL;
643       SLP_TREE_OUTSIDE_OF_LOOP_COST (right_node) = 0;
644       SLP_TREE_INSIDE_OF_LOOP_COST (right_node) = 0;
645       if (!vect_build_slp_tree (loop_vinfo, bb_vinfo, &right_node, group_size,
646                                 inside_cost, outside_cost, ncopies_for_cost,
647                                 max_nunits, load_permutation, loads,
648                                 vectorization_factor))
649         return false;
650
651       SLP_TREE_RIGHT (*node) = right_node;
652     }
653
654   return true;
655 }
656
657
658 static void
659 vect_print_slp_tree (slp_tree node)
660 {
661   int i;
662   gimple stmt;
663
664   if (!node)
665     return;
666
667   fprintf (vect_dump, "node ");
668   for (i = 0; VEC_iterate (gimple, SLP_TREE_SCALAR_STMTS (node), i, stmt); i++)
669     {
670       fprintf (vect_dump, "\n\tstmt %d ", i);
671       print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
672     }
673   fprintf (vect_dump, "\n");
674
675   vect_print_slp_tree (SLP_TREE_LEFT (node));
676   vect_print_slp_tree (SLP_TREE_RIGHT (node));
677 }
678
679
680 /* Mark the tree rooted at NODE with MARK (PURE_SLP or HYBRID).
681    If MARK is HYBRID, it refers to a specific stmt in NODE (the stmt at index
682    J). Otherwise, MARK is PURE_SLP and J is -1, which indicates that all the
683    stmts in NODE are to be marked.  */
684
685 static void
686 vect_mark_slp_stmts (slp_tree node, enum slp_vect_type mark, int j)
687 {
688   int i;
689   gimple stmt;
690
691   if (!node)
692     return;
693
694   for (i = 0; VEC_iterate (gimple, SLP_TREE_SCALAR_STMTS (node), i, stmt); i++)
695     if (j < 0 || i == j)
696       STMT_SLP_TYPE (vinfo_for_stmt (stmt)) = mark;
697
698   vect_mark_slp_stmts (SLP_TREE_LEFT (node), mark, j);
699   vect_mark_slp_stmts (SLP_TREE_RIGHT (node), mark, j);
700 }
701
702
703 /* Mark the statements of the tree rooted at NODE as relevant (vect_used).  */
704
705 static void
706 vect_mark_slp_stmts_relevant (slp_tree node)
707 {
708   int i;
709   gimple stmt;
710   stmt_vec_info stmt_info;
711
712   if (!node)
713     return;
714
715   for (i = 0; VEC_iterate (gimple, SLP_TREE_SCALAR_STMTS (node), i, stmt); i++)
716     {
717       stmt_info = vinfo_for_stmt (stmt);
718       gcc_assert (!STMT_VINFO_RELEVANT (stmt_info)
719                   || STMT_VINFO_RELEVANT (stmt_info) == vect_used_in_scope);
720       STMT_VINFO_RELEVANT (stmt_info) = vect_used_in_scope;
721     }
722
723   vect_mark_slp_stmts_relevant (SLP_TREE_LEFT (node));
724   vect_mark_slp_stmts_relevant (SLP_TREE_RIGHT (node));
725 }
726
727
728 /* Check if the permutation required by the SLP INSTANCE is supported.
729    Reorganize the SLP nodes stored in SLP_INSTANCE_LOADS if needed.  */
730
731 static bool
732 vect_supported_slp_permutation_p (slp_instance instance)
733 {
734   slp_tree node = VEC_index (slp_tree, SLP_INSTANCE_LOADS (instance), 0);
735   gimple stmt = VEC_index (gimple, SLP_TREE_SCALAR_STMTS (node), 0);
736   gimple first_load = DR_GROUP_FIRST_DR (vinfo_for_stmt (stmt));
737   VEC (slp_tree, heap) *sorted_loads = NULL;
738   int index;
739   slp_tree *tmp_loads = NULL;
740   int group_size = SLP_INSTANCE_GROUP_SIZE (instance), i, j;
741   slp_tree load;
742
743   /* FORNOW: The only supported loads permutation is loads from the same
744      location in all the loads in the node, when the data-refs in
745      nodes of LOADS constitute an interleaving chain.
746      Sort the nodes according to the order of accesses in the chain.  */
747   tmp_loads = (slp_tree *) xmalloc (sizeof (slp_tree) * group_size);
748   for (i = 0, j = 0;
749        VEC_iterate (int, SLP_INSTANCE_LOAD_PERMUTATION (instance), i, index)
750        && VEC_iterate (slp_tree, SLP_INSTANCE_LOADS (instance), j, load);
751        i += group_size, j++)
752     {
753       gimple scalar_stmt = VEC_index (gimple, SLP_TREE_SCALAR_STMTS (load), 0);
754       /* Check that the loads are all in the same interleaving chain.  */
755       if (DR_GROUP_FIRST_DR (vinfo_for_stmt (scalar_stmt)) != first_load)
756         {
757           if (vect_print_dump_info (REPORT_DETAILS))
758             {
759               fprintf (vect_dump, "Build SLP failed: unsupported data "
760                                    "permutation ");
761               print_gimple_stmt (vect_dump, scalar_stmt, 0, TDF_SLIM);
762             }
763
764           free (tmp_loads);
765           return false;
766         }
767
768       tmp_loads[index] = load;
769     }
770
771   sorted_loads = VEC_alloc (slp_tree, heap, group_size);
772   for (i = 0; i < group_size; i++)
773      VEC_safe_push (slp_tree, heap, sorted_loads, tmp_loads[i]);
774
775   VEC_free (slp_tree, heap, SLP_INSTANCE_LOADS (instance));
776   SLP_INSTANCE_LOADS (instance) = sorted_loads;
777   free (tmp_loads);
778
779   if (!vect_transform_slp_perm_load (stmt, NULL, NULL,
780                                      SLP_INSTANCE_UNROLLING_FACTOR (instance),
781                                      instance, true))
782     return false;
783
784   return true;
785 }
786
787
788 /* Check if the required load permutation is supported.
789    LOAD_PERMUTATION contains a list of indices of the loads.
790    In SLP this permutation is relative to the order of strided stores that are
791    the base of the SLP instance.  */
792
793 static bool
794 vect_supported_load_permutation_p (slp_instance slp_instn, int group_size,
795                                    VEC (int, heap) *load_permutation)
796 {
797   int i = 0, j, prev = -1, next, k;
798   bool supported;
799
800   /* FORNOW: permutations are only supported in SLP.  */
801   if (!slp_instn)
802     return false;
803
804   if (vect_print_dump_info (REPORT_SLP))
805     {
806       fprintf (vect_dump, "Load permutation ");
807       for (i = 0; VEC_iterate (int, load_permutation, i, next); i++)
808         fprintf (vect_dump, "%d ", next);
809     }
810
811   /* FORNOW: the only supported permutation is 0..01..1.. of length equal to
812      GROUP_SIZE and where each sequence of same drs is of GROUP_SIZE length as
813      well.  */
814   if (VEC_length (int, load_permutation)
815       != (unsigned int) (group_size * group_size))
816     return false;
817
818   supported = true;
819   for (j = 0; j < group_size; j++)
820     {
821       for (i = j * group_size, k = 0;
822            VEC_iterate (int, load_permutation, i, next) && k < group_size;
823            i++, k++)
824        {
825          if (i != j * group_size && next != prev)
826           {
827             supported = false;
828             break;
829           }
830
831          prev = next;
832        }
833     }
834
835   if (supported && i == group_size * group_size
836       && vect_supported_slp_permutation_p (slp_instn))
837     return true;
838
839   return false;
840 }
841
842
843 /* Find the first load in the loop that belongs to INSTANCE.
844    When loads are in several SLP nodes, there can be a case in which the first
845    load does not appear in the first SLP node to be transformed, causing
846    incorrect order of statements. Since we generate all the loads together,
847    they must be inserted before the first load of the SLP instance and not
848    before the first load of the first node of the instance.  */
849 static gimple
850 vect_find_first_load_in_slp_instance (slp_instance instance)
851 {
852   int i, j;
853   slp_tree load_node;
854   gimple first_load = NULL, load;
855
856   for (i = 0;
857        VEC_iterate (slp_tree, SLP_INSTANCE_LOADS (instance), i, load_node);
858        i++)
859     for (j = 0;
860          VEC_iterate (gimple, SLP_TREE_SCALAR_STMTS (load_node), j, load);
861          j++)
862       first_load = get_earlier_stmt (load, first_load);
863
864   return first_load;
865 }
866
867
868 /* Analyze an SLP instance starting from a group of strided stores. Call
869    vect_build_slp_tree to build a tree of packed stmts if possible.
870    Return FALSE if it's impossible to SLP any stmt in the loop.  */
871
872 static bool
873 vect_analyze_slp_instance (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo,
874                            gimple stmt)
875 {
876   slp_instance new_instance;
877   slp_tree node = XNEW (struct _slp_tree);
878   unsigned int group_size = DR_GROUP_SIZE (vinfo_for_stmt (stmt));
879   unsigned int unrolling_factor = 1, nunits;
880   tree vectype, scalar_type;
881   gimple next;
882   unsigned int vectorization_factor = 0;
883   int inside_cost = 0, outside_cost = 0, ncopies_for_cost;
884   unsigned int max_nunits = 0;
885   VEC (int, heap) *load_permutation;
886   VEC (slp_tree, heap) *loads;
887
888   scalar_type = TREE_TYPE (DR_REF (STMT_VINFO_DATA_REF (
889                                              vinfo_for_stmt (stmt))));
890   vectype = get_vectype_for_scalar_type (scalar_type);
891   if (!vectype)
892     {
893       if (vect_print_dump_info (REPORT_SLP))
894         {
895           fprintf (vect_dump, "Build SLP failed: unsupported data-type ");
896           print_generic_expr (vect_dump, scalar_type, TDF_SLIM);
897         }
898       return false;
899     }
900
901   nunits = TYPE_VECTOR_SUBPARTS (vectype);
902   if (loop_vinfo)
903     vectorization_factor = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
904   else
905     /* No multitypes in BB SLP.  */
906     vectorization_factor = nunits;
907
908   /* Calculate the unrolling factor.  */
909   unrolling_factor = least_common_multiple (nunits, group_size) / group_size;
910   if (unrolling_factor != 1 && !loop_vinfo)
911     {
912       if (vect_print_dump_info (REPORT_SLP))
913         fprintf (vect_dump, "Build SLP failed: unrolling required in basic"
914                             " block SLP");
915
916       return false;
917     }
918
919   /* Create a node (a root of the SLP tree) for the packed strided stores.  */
920   SLP_TREE_SCALAR_STMTS (node) = VEC_alloc (gimple, heap, group_size);
921   next = stmt;
922   /* Collect the stores and store them in SLP_TREE_SCALAR_STMTS.  */
923   while (next)
924     {
925       VEC_safe_push (gimple, heap, SLP_TREE_SCALAR_STMTS (node), next);
926       next = DR_GROUP_NEXT_DR (vinfo_for_stmt (next));
927     }
928
929   SLP_TREE_VEC_STMTS (node) = NULL;
930   SLP_TREE_NUMBER_OF_VEC_STMTS (node) = 0;
931   SLP_TREE_LEFT (node) = NULL;
932   SLP_TREE_RIGHT (node) = NULL;
933   SLP_TREE_OUTSIDE_OF_LOOP_COST (node) = 0;
934   SLP_TREE_INSIDE_OF_LOOP_COST (node) = 0;
935
936   /* Calculate the number of vector stmts to create based on the unrolling
937      factor (number of vectors is 1 if NUNITS >= GROUP_SIZE, and is
938      GROUP_SIZE / NUNITS otherwise.  */
939   ncopies_for_cost = unrolling_factor * group_size / nunits;
940
941   load_permutation = VEC_alloc (int, heap, group_size * group_size);
942   loads = VEC_alloc (slp_tree, heap, group_size);
943
944   /* Build the tree for the SLP instance.  */
945   if (vect_build_slp_tree (loop_vinfo, bb_vinfo, &node, group_size,
946                            &inside_cost, &outside_cost, ncopies_for_cost,
947                            &max_nunits, &load_permutation, &loads,
948                            vectorization_factor))
949     {
950       /* Create a new SLP instance.  */
951       new_instance = XNEW (struct _slp_instance);
952       SLP_INSTANCE_TREE (new_instance) = node;
953       SLP_INSTANCE_GROUP_SIZE (new_instance) = group_size;
954       /* Calculate the unrolling factor based on the smallest type in the
955          loop.  */
956       if (max_nunits > nunits)
957         unrolling_factor = least_common_multiple (max_nunits, group_size)
958                            / group_size;
959
960       SLP_INSTANCE_UNROLLING_FACTOR (new_instance) = unrolling_factor;
961       SLP_INSTANCE_OUTSIDE_OF_LOOP_COST (new_instance) = outside_cost;
962       SLP_INSTANCE_INSIDE_OF_LOOP_COST (new_instance) = inside_cost;
963       SLP_INSTANCE_LOADS (new_instance) = loads;
964       SLP_INSTANCE_FIRST_LOAD_STMT (new_instance) = NULL;
965       SLP_INSTANCE_LOAD_PERMUTATION (new_instance) = load_permutation;
966       if (VEC_length (slp_tree, loads))
967         {
968           if (!vect_supported_load_permutation_p (new_instance, group_size,
969                                                   load_permutation))
970             {
971               if (vect_print_dump_info (REPORT_SLP))
972                 {
973                   fprintf (vect_dump, "Build SLP failed: unsupported load "
974                                       "permutation ");
975                   print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
976                 }
977
978               vect_free_slp_instance (new_instance);
979               return false;
980             }
981
982           SLP_INSTANCE_FIRST_LOAD_STMT (new_instance)
983              = vect_find_first_load_in_slp_instance (new_instance);
984         }
985       else
986         VEC_free (int, heap, SLP_INSTANCE_LOAD_PERMUTATION (new_instance));
987
988       if (loop_vinfo)
989         VEC_safe_push (slp_instance, heap,
990                        LOOP_VINFO_SLP_INSTANCES (loop_vinfo),
991                        new_instance);
992       else
993         VEC_safe_push (slp_instance, heap, BB_VINFO_SLP_INSTANCES (bb_vinfo),
994                        new_instance);
995
996       if (vect_print_dump_info (REPORT_SLP))
997         vect_print_slp_tree (node);
998
999       return true;
1000     }
1001
1002   /* Failed to SLP.  */
1003   /* Free the allocated memory.  */
1004   vect_free_slp_tree (node);
1005   VEC_free (int, heap, load_permutation);
1006   VEC_free (slp_tree, heap, loads);
1007
1008   return false;
1009 }
1010
1011
1012 /* Check if there are stmts in the loop can be vectorized using SLP. Build SLP
1013    trees of packed scalar stmts if SLP is possible.  */
1014
1015 bool
1016 vect_analyze_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
1017 {
1018   unsigned int i;
1019   VEC (gimple, heap) *strided_stores;
1020   gimple store;
1021   bool ok = false;
1022
1023   if (vect_print_dump_info (REPORT_SLP))
1024     fprintf (vect_dump, "=== vect_analyze_slp ===");
1025
1026   if (loop_vinfo)
1027     strided_stores = LOOP_VINFO_STRIDED_STORES (loop_vinfo);
1028   else
1029     strided_stores = BB_VINFO_STRIDED_STORES (bb_vinfo);
1030
1031   for (i = 0; VEC_iterate (gimple, strided_stores, i, store); i++)
1032     if (vect_analyze_slp_instance (loop_vinfo, bb_vinfo, store))
1033       ok = true;
1034
1035   if (bb_vinfo && !ok)
1036     {
1037       if (vect_print_dump_info (REPORT_SLP))
1038         fprintf (vect_dump, "Failed to SLP the basic block.");
1039
1040       return false;
1041     }
1042
1043   return true;
1044 }
1045
1046
1047 /* For each possible SLP instance decide whether to SLP it and calculate overall
1048    unrolling factor needed to SLP the loop.  */
1049
1050 void
1051 vect_make_slp_decision (loop_vec_info loop_vinfo)
1052 {
1053   unsigned int i, unrolling_factor = 1;
1054   VEC (slp_instance, heap) *slp_instances = LOOP_VINFO_SLP_INSTANCES (loop_vinfo);
1055   slp_instance instance;
1056   int decided_to_slp = 0;
1057
1058   if (vect_print_dump_info (REPORT_SLP))
1059     fprintf (vect_dump, "=== vect_make_slp_decision ===");
1060
1061   for (i = 0; VEC_iterate (slp_instance, slp_instances, i, instance); i++)
1062     {
1063       /* FORNOW: SLP if you can.  */
1064       if (unrolling_factor < SLP_INSTANCE_UNROLLING_FACTOR (instance))
1065         unrolling_factor = SLP_INSTANCE_UNROLLING_FACTOR (instance);
1066
1067       /* Mark all the stmts that belong to INSTANCE as PURE_SLP stmts. Later we
1068          call vect_detect_hybrid_slp () to find stmts that need hybrid SLP and
1069          loop-based vectorization. Such stmts will be marked as HYBRID.  */
1070       vect_mark_slp_stmts (SLP_INSTANCE_TREE (instance), pure_slp, -1);
1071       decided_to_slp++;
1072     }
1073
1074   LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo) = unrolling_factor;
1075
1076   if (decided_to_slp && vect_print_dump_info (REPORT_SLP))
1077     fprintf (vect_dump, "Decided to SLP %d instances. Unrolling factor %d",
1078              decided_to_slp, unrolling_factor);
1079 }
1080
1081
1082 /* Find stmts that must be both vectorized and SLPed (since they feed stmts that
1083    can't be SLPed) in the tree rooted at NODE. Mark such stmts as HYBRID.  */
1084
1085 static void
1086 vect_detect_hybrid_slp_stmts (slp_tree node)
1087 {
1088   int i;
1089   gimple stmt;
1090   imm_use_iterator imm_iter;
1091   gimple use_stmt;
1092
1093   if (!node)
1094     return;
1095
1096   for (i = 0; VEC_iterate (gimple, SLP_TREE_SCALAR_STMTS (node), i, stmt); i++)
1097     if (PURE_SLP_STMT (vinfo_for_stmt (stmt))
1098         && TREE_CODE (gimple_op (stmt, 0)) == SSA_NAME)
1099       FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, gimple_op (stmt, 0))
1100         if (vinfo_for_stmt (use_stmt)
1101             && !STMT_SLP_TYPE (vinfo_for_stmt (use_stmt))
1102             && STMT_VINFO_RELEVANT (vinfo_for_stmt (use_stmt)))
1103           vect_mark_slp_stmts (node, hybrid, i);
1104
1105   vect_detect_hybrid_slp_stmts (SLP_TREE_LEFT (node));
1106   vect_detect_hybrid_slp_stmts (SLP_TREE_RIGHT (node));
1107 }
1108
1109
1110 /* Find stmts that must be both vectorized and SLPed.  */
1111
1112 void
1113 vect_detect_hybrid_slp (loop_vec_info loop_vinfo)
1114 {
1115   unsigned int i;
1116   VEC (slp_instance, heap) *slp_instances = LOOP_VINFO_SLP_INSTANCES (loop_vinfo);
1117   slp_instance instance;
1118
1119   if (vect_print_dump_info (REPORT_SLP))
1120     fprintf (vect_dump, "=== vect_detect_hybrid_slp ===");
1121
1122   for (i = 0; VEC_iterate (slp_instance, slp_instances, i, instance); i++)
1123     vect_detect_hybrid_slp_stmts (SLP_INSTANCE_TREE (instance));
1124 }
1125
1126
1127 /* Create and initialize a new bb_vec_info struct for BB, as well as
1128    stmt_vec_info structs for all the stmts in it.  */
1129
1130 static bb_vec_info
1131 new_bb_vec_info (basic_block bb)
1132 {
1133   bb_vec_info res = NULL;
1134   gimple_stmt_iterator gsi;
1135
1136   res = (bb_vec_info) xcalloc (1, sizeof (struct _bb_vec_info));
1137   BB_VINFO_BB (res) = bb;
1138
1139   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1140     {
1141       gimple stmt = gsi_stmt (gsi);
1142       gimple_set_uid (stmt, 0);
1143       set_vinfo_for_stmt (stmt, new_stmt_vec_info (stmt, NULL, res));
1144     }
1145
1146   BB_VINFO_STRIDED_STORES (res) = VEC_alloc (gimple, heap, 10);
1147   BB_VINFO_SLP_INSTANCES (res) = VEC_alloc (slp_instance, heap, 2);
1148
1149   bb->aux = res;
1150   return res;
1151 }
1152
1153
1154 /* Free BB_VINFO struct, as well as all the stmt_vec_info structs of all the
1155    stmts in the basic block.  */
1156
1157 static void
1158 destroy_bb_vec_info (bb_vec_info bb_vinfo)
1159 {
1160   basic_block bb;
1161   gimple_stmt_iterator si;
1162
1163   if (!bb_vinfo)
1164     return;
1165
1166   bb = BB_VINFO_BB (bb_vinfo);
1167
1168   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
1169     {
1170       gimple stmt = gsi_stmt (si);
1171       stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1172
1173       if (stmt_info)
1174         /* Free stmt_vec_info.  */
1175         free_stmt_vec_info (stmt);
1176     }
1177
1178   VEC_free (gimple, heap, BB_VINFO_STRIDED_STORES (bb_vinfo));
1179   VEC_free (slp_instance, heap, BB_VINFO_SLP_INSTANCES (bb_vinfo));
1180   free (bb_vinfo);
1181   bb->aux = NULL;
1182 }
1183
1184
1185 /* Analyze statements contained in SLP tree node after recursively analyzing
1186    the subtree. Return TRUE if the operations are supported.  */
1187
1188 static bool
1189 vect_slp_analyze_node_operations (bb_vec_info bb_vinfo, slp_tree node)
1190 {
1191   bool dummy;
1192   int i;
1193   gimple stmt;
1194
1195   if (!node)
1196     return true;
1197
1198   if (!vect_slp_analyze_node_operations (bb_vinfo, SLP_TREE_LEFT (node))
1199       || !vect_slp_analyze_node_operations (bb_vinfo, SLP_TREE_RIGHT (node)))
1200     return false;
1201
1202   for (i = 0; VEC_iterate (gimple, SLP_TREE_SCALAR_STMTS (node), i, stmt); i++)
1203     {
1204       stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1205       gcc_assert (stmt_info);
1206       gcc_assert (PURE_SLP_STMT (stmt_info));
1207
1208       if (!vect_analyze_stmt (stmt, &dummy, node))
1209         return false;
1210     }
1211
1212   return true;
1213 }
1214
1215
1216 /* Analyze statements in SLP instances of the basic block. Return TRUE if the
1217    operations are supported. */
1218
1219 static bool
1220 vect_slp_analyze_operations (bb_vec_info bb_vinfo)
1221 {
1222   VEC (slp_instance, heap) *slp_instances = BB_VINFO_SLP_INSTANCES (bb_vinfo);
1223   slp_instance instance;
1224   int i;
1225
1226   for (i = 0; VEC_iterate (slp_instance, slp_instances, i, instance); )
1227     {
1228       if (!vect_slp_analyze_node_operations (bb_vinfo,
1229                                              SLP_INSTANCE_TREE (instance)))
1230         {
1231           vect_free_slp_instance (instance);
1232           VEC_ordered_remove (slp_instance, slp_instances, i);
1233         }
1234       else
1235         i++;
1236     }
1237
1238   if (!VEC_length (slp_instance, slp_instances))
1239     return false;
1240
1241   return true;
1242 }
1243
1244
1245 /* Cheick if the basic block can be vectorized.  */
1246
1247 bb_vec_info
1248 vect_slp_analyze_bb (basic_block bb)
1249 {
1250   bb_vec_info bb_vinfo;
1251   VEC (ddr_p, heap) *ddrs;
1252   VEC (slp_instance, heap) *slp_instances;
1253   slp_instance instance;
1254   int i, insns = 0;
1255   gimple_stmt_iterator gsi;
1256
1257   if (vect_print_dump_info (REPORT_DETAILS))
1258     fprintf (vect_dump, "===vect_slp_analyze_bb===\n");
1259
1260   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1261     insns++;
1262
1263   if (insns > PARAM_VALUE (PARAM_SLP_MAX_INSNS_IN_BB))
1264     {
1265       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1266         fprintf (vect_dump, "not vectorized: too many instructions in basic "
1267                             "block.\n");
1268
1269       return NULL;
1270     }
1271
1272   bb_vinfo = new_bb_vec_info (bb);
1273   if (!bb_vinfo)
1274     return NULL;
1275
1276   if (!vect_analyze_data_refs (NULL, bb_vinfo))
1277     {
1278       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1279         fprintf (vect_dump, "not vectorized: unhandled data-ref in basic "
1280                             "block.\n");
1281
1282       destroy_bb_vec_info (bb_vinfo);
1283       return NULL;
1284     }
1285
1286   ddrs = BB_VINFO_DDRS (bb_vinfo);
1287   if (!VEC_length (ddr_p, ddrs))
1288     {
1289       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1290         fprintf (vect_dump, "not vectorized: not enough data-refs in basic "
1291                             "block.\n");
1292
1293       destroy_bb_vec_info (bb_vinfo);
1294       return NULL;
1295     }
1296
1297   if (!vect_analyze_data_refs_alignment (NULL, bb_vinfo))
1298     {
1299       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1300         fprintf (vect_dump, "not vectorized: bad data alignment in basic "
1301                             "block.\n");
1302
1303       destroy_bb_vec_info (bb_vinfo);
1304       return NULL;
1305     }
1306
1307    if (!vect_analyze_data_ref_dependences (NULL, bb_vinfo))
1308     {
1309      if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1310        fprintf (vect_dump, "not vectorized: unhandled data dependence in basic"
1311                            " block.\n");
1312
1313       destroy_bb_vec_info (bb_vinfo);
1314       return NULL;
1315     }
1316
1317   if (!vect_analyze_data_ref_accesses (NULL, bb_vinfo))
1318     {
1319      if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1320        fprintf (vect_dump, "not vectorized: unhandled data access in basic "
1321                            "block.\n");
1322
1323       destroy_bb_vec_info (bb_vinfo);
1324       return NULL;
1325     }
1326
1327    if (!vect_verify_datarefs_alignment (NULL, bb_vinfo))
1328     {
1329       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1330         fprintf (vect_dump, "not vectorized: unsupported alignment in basic "
1331                             "block.\n");
1332
1333       destroy_bb_vec_info (bb_vinfo);
1334       return NULL;
1335     }
1336
1337   /* Check the SLP opportunities in the basic block, analyze and build SLP
1338      trees.  */
1339   if (!vect_analyze_slp (NULL, bb_vinfo))
1340     {
1341       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1342         fprintf (vect_dump, "not vectorized: failed to find SLP opportunities "
1343                             "in basic block.\n");
1344
1345       destroy_bb_vec_info (bb_vinfo);
1346       return NULL;
1347     }
1348
1349   slp_instances = BB_VINFO_SLP_INSTANCES (bb_vinfo);
1350
1351   /* Mark all the statements that we want to vectorize as pure SLP and
1352      relevant.  */
1353   for (i = 0; VEC_iterate (slp_instance, slp_instances, i, instance); i++)
1354     {
1355       vect_mark_slp_stmts (SLP_INSTANCE_TREE (instance), pure_slp, -1);
1356       vect_mark_slp_stmts_relevant (SLP_INSTANCE_TREE (instance));
1357     }
1358
1359   if (!vect_slp_analyze_operations (bb_vinfo))
1360     {
1361       if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
1362         fprintf (vect_dump, "not vectorized: bad operation in basic block.\n");
1363
1364       destroy_bb_vec_info (bb_vinfo);
1365       return NULL;
1366     }
1367
1368   if (vect_print_dump_info (REPORT_DETAILS))
1369     fprintf (vect_dump, "Basic block will be vectorized using SLP\n");
1370
1371   return bb_vinfo;
1372 }
1373
1374
1375 /* SLP costs are calculated according to SLP instance unrolling factor (i.e.,
1376    the number of created vector stmts depends on the unrolling factor). However,
1377    the actual number of vector stmts for every SLP node depends on VF which is
1378    set later in vect_analyze_operations(). Hence, SLP costs should be updated.
1379    In this function we assume that the inside costs calculated in
1380    vect_model_xxx_cost are linear in ncopies.  */
1381
1382 void
1383 vect_update_slp_costs_according_to_vf (loop_vec_info loop_vinfo)
1384 {
1385   unsigned int i, vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
1386   VEC (slp_instance, heap) *slp_instances = LOOP_VINFO_SLP_INSTANCES (loop_vinfo);
1387   slp_instance instance;
1388
1389   if (vect_print_dump_info (REPORT_SLP))
1390     fprintf (vect_dump, "=== vect_update_slp_costs_according_to_vf ===");
1391
1392   for (i = 0; VEC_iterate (slp_instance, slp_instances, i, instance); i++)
1393     /* We assume that costs are linear in ncopies.  */
1394     SLP_INSTANCE_INSIDE_OF_LOOP_COST (instance) *= vf
1395       / SLP_INSTANCE_UNROLLING_FACTOR (instance);
1396 }
1397
1398
1399 /* For constant and loop invariant defs of SLP_NODE this function returns
1400    (vector) defs (VEC_OPRNDS) that will be used in the vectorized stmts.
1401    OP_NUM determines if we gather defs for operand 0 or operand 1 of the scalar
1402    stmts. NUMBER_OF_VECTORS is the number of vector defs to create.  */
1403
1404 static void
1405 vect_get_constant_vectors (slp_tree slp_node, VEC(tree,heap) **vec_oprnds,
1406                            unsigned int op_num, unsigned int number_of_vectors)
1407 {
1408   VEC (gimple, heap) *stmts = SLP_TREE_SCALAR_STMTS (slp_node);
1409   gimple stmt = VEC_index (gimple, stmts, 0);
1410   stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt);
1411   tree vectype = STMT_VINFO_VECTYPE (stmt_vinfo);
1412   int nunits;
1413   tree vec_cst;
1414   tree t = NULL_TREE;
1415   int j, number_of_places_left_in_vector;
1416   tree vector_type;
1417   tree op, vop;
1418   int group_size = VEC_length (gimple, stmts);
1419   unsigned int vec_num, i;
1420   int number_of_copies = 1;
1421   VEC (tree, heap) *voprnds = VEC_alloc (tree, heap, number_of_vectors);
1422   bool constant_p, is_store;
1423
1424   if (STMT_VINFO_DATA_REF (stmt_vinfo))
1425     {
1426       is_store = true;
1427       op = gimple_assign_rhs1 (stmt);
1428     }
1429   else
1430     {
1431       is_store = false;
1432       op = gimple_op (stmt, op_num + 1);
1433     }
1434
1435   if (CONSTANT_CLASS_P (op))
1436     {
1437       vector_type = vectype;
1438       constant_p = true;
1439     }
1440   else
1441     {
1442       vector_type = get_vectype_for_scalar_type (TREE_TYPE (op));
1443       gcc_assert (vector_type);
1444       constant_p = false;
1445     }
1446
1447   nunits = TYPE_VECTOR_SUBPARTS (vector_type);
1448
1449   /* NUMBER_OF_COPIES is the number of times we need to use the same values in
1450      created vectors. It is greater than 1 if unrolling is performed.
1451
1452      For example, we have two scalar operands, s1 and s2 (e.g., group of
1453      strided accesses of size two), while NUNITS is four (i.e., four scalars
1454      of this type can be packed in a vector). The output vector will contain
1455      two copies of each scalar operand: {s1, s2, s1, s2}. (NUMBER_OF_COPIES
1456      will be 2).
1457
1458      If GROUP_SIZE > NUNITS, the scalars will be split into several vectors
1459      containing the operands.
1460
1461      For example, NUNITS is four as before, and the group size is 8
1462      (s1, s2, ..., s8). We will create two vectors {s1, s2, s3, s4} and
1463      {s5, s6, s7, s8}.  */
1464
1465   number_of_copies = least_common_multiple (nunits, group_size) / group_size;
1466
1467   number_of_places_left_in_vector = nunits;
1468   for (j = 0; j < number_of_copies; j++)
1469     {
1470       for (i = group_size - 1; VEC_iterate (gimple, stmts, i, stmt); i--)
1471         {
1472           if (is_store)
1473             op = gimple_assign_rhs1 (stmt);
1474           else
1475             op = gimple_op (stmt, op_num + 1);
1476
1477           /* Create 'vect_ = {op0,op1,...,opn}'.  */
1478           t = tree_cons (NULL_TREE, op, t);
1479
1480           number_of_places_left_in_vector--;
1481
1482           if (number_of_places_left_in_vector == 0)
1483             {
1484               number_of_places_left_in_vector = nunits;
1485
1486               if (constant_p)
1487                 vec_cst = build_vector (vector_type, t);
1488               else
1489                 vec_cst = build_constructor_from_list (vector_type, t);
1490               VEC_quick_push (tree, voprnds,
1491                               vect_init_vector (stmt, vec_cst, vector_type, NULL));
1492               t = NULL_TREE;
1493             }
1494         }
1495     }
1496
1497   /* Since the vectors are created in the reverse order, we should invert
1498      them.  */
1499   vec_num = VEC_length (tree, voprnds);
1500   for (j = vec_num - 1; j >= 0; j--)
1501     {
1502       vop = VEC_index (tree, voprnds, j);
1503       VEC_quick_push (tree, *vec_oprnds, vop);
1504     }
1505
1506   VEC_free (tree, heap, voprnds);
1507
1508   /* In case that VF is greater than the unrolling factor needed for the SLP
1509      group of stmts, NUMBER_OF_VECTORS to be created is greater than
1510      NUMBER_OF_SCALARS/NUNITS or NUNITS/NUMBER_OF_SCALARS, and hence we have
1511      to replicate the vectors.  */
1512   while (number_of_vectors > VEC_length (tree, *vec_oprnds))
1513     {
1514       for (i = 0; VEC_iterate (tree, *vec_oprnds, i, vop) && i < vec_num; i++)
1515         VEC_quick_push (tree, *vec_oprnds, vop);
1516     }
1517 }
1518
1519
1520 /* Get vectorized definitions from SLP_NODE that contains corresponding
1521    vectorized def-stmts.  */
1522
1523 static void
1524 vect_get_slp_vect_defs (slp_tree slp_node, VEC (tree,heap) **vec_oprnds)
1525 {
1526   tree vec_oprnd;
1527   gimple vec_def_stmt;
1528   unsigned int i;
1529
1530   gcc_assert (SLP_TREE_VEC_STMTS (slp_node));
1531
1532   for (i = 0;
1533        VEC_iterate (gimple, SLP_TREE_VEC_STMTS (slp_node), i, vec_def_stmt);
1534        i++)
1535     {
1536       gcc_assert (vec_def_stmt);
1537       vec_oprnd = gimple_get_lhs (vec_def_stmt);
1538       VEC_quick_push (tree, *vec_oprnds, vec_oprnd);
1539     }
1540 }
1541
1542
1543 /* Get vectorized definitions for SLP_NODE.
1544    If the scalar definitions are loop invariants or constants, collect them and
1545    call vect_get_constant_vectors() to create vector stmts.
1546    Otherwise, the def-stmts must be already vectorized and the vectorized stmts
1547    must be stored in the LEFT/RIGHT node of SLP_NODE, and we call
1548    vect_get_slp_vect_defs() to retrieve them.
1549    If VEC_OPRNDS1 is NULL, don't get vector defs for the second operand (from
1550    the right node. This is used when the second operand must remain scalar.  */
1551
1552 void
1553 vect_get_slp_defs (slp_tree slp_node, VEC (tree,heap) **vec_oprnds0,
1554                    VEC (tree,heap) **vec_oprnds1)
1555 {
1556   gimple first_stmt;
1557   enum tree_code code;
1558   int number_of_vects;
1559   HOST_WIDE_INT lhs_size_unit, rhs_size_unit;
1560
1561   first_stmt = VEC_index (gimple, SLP_TREE_SCALAR_STMTS (slp_node), 0);
1562   /* The number of vector defs is determined by the number of vector statements
1563      in the node from which we get those statements.  */
1564   if (SLP_TREE_LEFT (slp_node))
1565     number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (SLP_TREE_LEFT (slp_node));
1566   else
1567     {
1568       number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
1569       /* Number of vector stmts was calculated according to LHS in
1570          vect_schedule_slp_instance(), fix it by replacing LHS with RHS, if
1571          necessary. See vect_get_smallest_scalar_type() for details.  */
1572       vect_get_smallest_scalar_type (first_stmt, &lhs_size_unit,
1573                                      &rhs_size_unit);
1574       if (rhs_size_unit != lhs_size_unit)
1575         {
1576           number_of_vects *= rhs_size_unit;
1577           number_of_vects /= lhs_size_unit;
1578         }
1579     }
1580
1581   /* Allocate memory for vectorized defs.  */
1582   *vec_oprnds0 = VEC_alloc (tree, heap, number_of_vects);
1583
1584   /* SLP_NODE corresponds either to a group of stores or to a group of
1585      unary/binary operations. We don't call this function for loads.  */
1586   if (SLP_TREE_LEFT (slp_node))
1587     /* The defs are already vectorized.  */
1588     vect_get_slp_vect_defs (SLP_TREE_LEFT (slp_node), vec_oprnds0);
1589   else
1590     /* Build vectors from scalar defs.  */
1591     vect_get_constant_vectors (slp_node, vec_oprnds0, 0, number_of_vects);
1592
1593   if (STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt)))
1594     /* Since we don't call this function with loads, this is a group of
1595        stores.  */
1596     return;
1597
1598   code = gimple_assign_rhs_code (first_stmt);
1599   if (get_gimple_rhs_class (code) != GIMPLE_BINARY_RHS || !vec_oprnds1)
1600     return;
1601
1602   /* The number of vector defs is determined by the number of vector statements
1603      in the node from which we get those statements.  */
1604   if (SLP_TREE_RIGHT (slp_node))
1605     number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (SLP_TREE_RIGHT (slp_node));
1606   else
1607     number_of_vects = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
1608
1609   *vec_oprnds1 = VEC_alloc (tree, heap, number_of_vects);
1610
1611   if (SLP_TREE_RIGHT (slp_node))
1612     /* The defs are already vectorized.  */
1613     vect_get_slp_vect_defs (SLP_TREE_RIGHT (slp_node), vec_oprnds1);
1614   else
1615     /* Build vectors from scalar defs.  */
1616     vect_get_constant_vectors (slp_node, vec_oprnds1, 1, number_of_vects);
1617 }
1618
1619
1620 /* Create NCOPIES permutation statements using the mask MASK_BYTES (by
1621    building a vector of type MASK_TYPE from it) and two input vectors placed in
1622    DR_CHAIN at FIRST_VEC_INDX and SECOND_VEC_INDX for the first copy and
1623    shifting by STRIDE elements of DR_CHAIN for every copy.
1624    (STRIDE is the number of vectorized stmts for NODE divided by the number of
1625    copies).
1626    VECT_STMTS_COUNTER specifies the index in the vectorized stmts of NODE, where
1627    the created stmts must be inserted.  */
1628
1629 static inline void
1630 vect_create_mask_and_perm (gimple stmt, gimple next_scalar_stmt,
1631                            tree mask, int first_vec_indx, int second_vec_indx,
1632                            gimple_stmt_iterator *gsi, slp_tree node,
1633                            tree builtin_decl, tree vectype,
1634                            VEC(tree,heap) *dr_chain,
1635                            int ncopies, int vect_stmts_counter)
1636 {
1637   tree perm_dest;
1638   gimple perm_stmt = NULL;
1639   stmt_vec_info next_stmt_info;
1640   int i, stride;
1641   tree first_vec, second_vec, data_ref;
1642   VEC (tree, heap) *params = NULL;
1643
1644   stride = SLP_TREE_NUMBER_OF_VEC_STMTS (node) / ncopies;
1645
1646   /* Initialize the vect stmts of NODE to properly insert the generated
1647      stmts later.  */
1648   for (i = VEC_length (gimple, SLP_TREE_VEC_STMTS (node));
1649        i < (int) SLP_TREE_NUMBER_OF_VEC_STMTS (node); i++)
1650     VEC_quick_push (gimple, SLP_TREE_VEC_STMTS (node), NULL);
1651
1652   perm_dest = vect_create_destination_var (gimple_assign_lhs (stmt), vectype);
1653   for (i = 0; i < ncopies; i++)
1654     {
1655       first_vec = VEC_index (tree, dr_chain, first_vec_indx);
1656       second_vec = VEC_index (tree, dr_chain, second_vec_indx);
1657
1658       /* Build argument list for the vectorized call.  */
1659       VEC_free (tree, heap, params);
1660       params = VEC_alloc (tree, heap, 3);
1661       VEC_quick_push (tree, params, first_vec);
1662       VEC_quick_push (tree, params, second_vec);
1663       VEC_quick_push (tree, params, mask);
1664
1665       /* Generate the permute statement.  */
1666       perm_stmt = gimple_build_call_vec (builtin_decl, params);
1667       data_ref = make_ssa_name (perm_dest, perm_stmt);
1668       gimple_call_set_lhs (perm_stmt, data_ref);
1669       vect_finish_stmt_generation (stmt, perm_stmt, gsi);
1670
1671       /* Store the vector statement in NODE.  */
1672       VEC_replace (gimple, SLP_TREE_VEC_STMTS (node),
1673                    stride * i + vect_stmts_counter, perm_stmt);
1674
1675       first_vec_indx += stride;
1676       second_vec_indx += stride;
1677     }
1678
1679   /* Mark the scalar stmt as vectorized.  */
1680   next_stmt_info = vinfo_for_stmt (next_scalar_stmt);
1681   STMT_VINFO_VEC_STMT (next_stmt_info) = perm_stmt;
1682 }
1683
1684
1685 /* Given FIRST_MASK_ELEMENT - the mask element in element representation,
1686    return in CURRENT_MASK_ELEMENT its equivalent in target specific
1687    representation. Check that the mask is valid and return FALSE if not.
1688    Return TRUE in NEED_NEXT_VECTOR if the permutation requires to move to
1689    the next vector, i.e., the current first vector is not needed.  */
1690
1691 static bool
1692 vect_get_mask_element (gimple stmt, int first_mask_element, int m,
1693                        int mask_nunits, bool only_one_vec, int index,
1694                        int *mask, int *current_mask_element,
1695                        bool *need_next_vector)
1696 {
1697   int i;
1698   static int number_of_mask_fixes = 1;
1699   static bool mask_fixed = false;
1700   static bool needs_first_vector = false;
1701
1702   /* Convert to target specific representation.  */
1703   *current_mask_element = first_mask_element + m;
1704   /* Adjust the value in case it's a mask for second and third vectors.  */
1705   *current_mask_element -= mask_nunits * (number_of_mask_fixes - 1);
1706
1707   if (*current_mask_element < mask_nunits)
1708     needs_first_vector = true;
1709
1710   /* We have only one input vector to permute but the mask accesses values in
1711      the next vector as well.  */
1712   if (only_one_vec && *current_mask_element >= mask_nunits)
1713     {
1714       if (vect_print_dump_info (REPORT_DETAILS))
1715         {
1716           fprintf (vect_dump, "permutation requires at least two vectors ");
1717           print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
1718         }
1719
1720       return false;
1721     }
1722
1723   /* The mask requires the next vector.  */
1724   if (*current_mask_element >= mask_nunits * 2)
1725     {
1726       if (needs_first_vector || mask_fixed)
1727         {
1728           /* We either need the first vector too or have already moved to the
1729              next vector. In both cases, this permutation needs three
1730              vectors.  */
1731           if (vect_print_dump_info (REPORT_DETAILS))
1732             {
1733               fprintf (vect_dump, "permutation requires at "
1734                                   "least three vectors ");
1735               print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
1736             }
1737
1738           return false;
1739         }
1740
1741       /* We move to the next vector, dropping the first one and working with
1742          the second and the third - we need to adjust the values of the mask
1743          accordingly.  */
1744       *current_mask_element -= mask_nunits * number_of_mask_fixes;
1745
1746       for (i = 0; i < index; i++)
1747         mask[i] -= mask_nunits * number_of_mask_fixes;
1748
1749       (number_of_mask_fixes)++;
1750       mask_fixed = true;
1751     }
1752
1753   *need_next_vector = mask_fixed;
1754
1755   /* This was the last element of this mask. Start a new one.  */
1756   if (index == mask_nunits - 1)
1757     {
1758       number_of_mask_fixes = 1;
1759       mask_fixed = false;
1760       needs_first_vector = false;
1761     }
1762
1763   return true;
1764 }
1765
1766
1767 /* Generate vector permute statements from a list of loads in DR_CHAIN.
1768    If ANALYZE_ONLY is TRUE, only check that it is possible to create valid
1769    permute statements for SLP_NODE_INSTANCE.  */
1770 bool
1771 vect_transform_slp_perm_load (gimple stmt, VEC (tree, heap) *dr_chain,
1772                               gimple_stmt_iterator *gsi, int vf,
1773                               slp_instance slp_node_instance, bool analyze_only)
1774 {
1775   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
1776   tree mask_element_type = NULL_TREE, mask_type;
1777   int i, j, k, m, scale, mask_nunits, nunits, vec_index = 0, scalar_index;
1778   slp_tree node;
1779   tree vectype = STMT_VINFO_VECTYPE (stmt_info), builtin_decl;
1780   gimple next_scalar_stmt;
1781   int group_size = SLP_INSTANCE_GROUP_SIZE (slp_node_instance);
1782   int first_mask_element;
1783   int index, unroll_factor, *mask, current_mask_element, ncopies;
1784   bool only_one_vec = false, need_next_vector = false;
1785   int first_vec_index, second_vec_index, orig_vec_stmts_num, vect_stmts_counter;
1786
1787   if (!targetm.vectorize.builtin_vec_perm)
1788     {
1789       if (vect_print_dump_info (REPORT_DETAILS))
1790         {
1791           fprintf (vect_dump, "no builtin for vect permute for ");
1792           print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
1793         }
1794
1795        return false;
1796     }
1797
1798   builtin_decl = targetm.vectorize.builtin_vec_perm (vectype,
1799                                                      &mask_element_type);
1800   if (!builtin_decl || !mask_element_type)
1801     {
1802       if (vect_print_dump_info (REPORT_DETAILS))
1803         {
1804           fprintf (vect_dump, "no builtin for vect permute for ");
1805           print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
1806         }
1807
1808        return false;
1809     }
1810
1811   mask_type = get_vectype_for_scalar_type (mask_element_type);
1812   mask_nunits = TYPE_VECTOR_SUBPARTS (mask_type);
1813   mask = (int *) xmalloc (sizeof (int) * mask_nunits);
1814   nunits = TYPE_VECTOR_SUBPARTS (vectype);
1815   scale = mask_nunits / nunits;
1816   unroll_factor = SLP_INSTANCE_UNROLLING_FACTOR (slp_node_instance);
1817
1818   /* The number of vector stmts to generate based only on SLP_NODE_INSTANCE
1819      unrolling factor.  */
1820   orig_vec_stmts_num = group_size *
1821                 SLP_INSTANCE_UNROLLING_FACTOR (slp_node_instance) / nunits;
1822   if (orig_vec_stmts_num == 1)
1823     only_one_vec = true;
1824
1825   /* Number of copies is determined by the final vectorization factor
1826      relatively to SLP_NODE_INSTANCE unrolling factor.  */
1827   ncopies = vf / SLP_INSTANCE_UNROLLING_FACTOR (slp_node_instance);
1828
1829   /* Generate permutation masks for every NODE. Number of masks for each NODE
1830      is equal to GROUP_SIZE.
1831      E.g., we have a group of three nodes with three loads from the same
1832      location in each node, and the vector size is 4. I.e., we have a
1833      a0b0c0a1b1c1... sequence and we need to create the following vectors:
1834      for a's: a0a0a0a1 a1a1a2a2 a2a3a3a3
1835      for b's: b0b0b0b1 b1b1b2b2 b2b3b3b3
1836      ...
1837
1838      The masks for a's should be: {0,0,0,3} {3,3,6,6} {6,9,9,9} (in target
1839      scpecific type, e.g., in bytes for Altivec.
1840      The last mask is illegal since we assume two operands for permute
1841      operation, and the mask element values can't be outside that range. Hence,
1842      the last mask must be converted into {2,5,5,5}.
1843      For the first two permutations we need the first and the second input
1844      vectors: {a0,b0,c0,a1} and {b1,c1,a2,b2}, and for the last permutation
1845      we need the second and the third vectors: {b1,c1,a2,b2} and
1846      {c2,a3,b3,c3}.  */
1847
1848   for (i = 0;
1849        VEC_iterate (slp_tree, SLP_INSTANCE_LOADS (slp_node_instance),
1850                     i, node);
1851        i++)
1852     {
1853       scalar_index = 0;
1854       index = 0;
1855       vect_stmts_counter = 0;
1856       vec_index = 0;
1857       first_vec_index = vec_index++;
1858       if (only_one_vec)
1859         second_vec_index = first_vec_index;
1860       else
1861         second_vec_index =  vec_index++;
1862
1863       for (j = 0; j < unroll_factor; j++)
1864         {
1865           for (k = 0; k < group_size; k++)
1866             {
1867               first_mask_element = (i + j * group_size) * scale;
1868               for (m = 0; m < scale; m++)
1869                 {
1870                   if (!vect_get_mask_element (stmt, first_mask_element, m,
1871                                    mask_nunits, only_one_vec, index, mask,
1872                                    &current_mask_element, &need_next_vector))
1873                     return false;
1874
1875                   mask[index++] = current_mask_element;
1876                 }
1877
1878               if (index == mask_nunits)
1879                 {
1880                   tree mask_vec = NULL;
1881
1882                   while (--index >= 0)
1883                     {
1884                       tree t = build_int_cst (mask_element_type, mask[index]);
1885                       mask_vec = tree_cons (NULL, t, mask_vec);
1886                     }
1887                   mask_vec = build_vector (mask_type, mask_vec);
1888                   index = 0;
1889
1890                   if (!targetm.vectorize.builtin_vec_perm_ok (vectype,
1891                                                               mask_vec))
1892                     {
1893                       if (vect_print_dump_info (REPORT_DETAILS))
1894                         {
1895                           fprintf (vect_dump, "unsupported vect permute ");
1896                           print_generic_expr (vect_dump, mask_vec, 0);
1897                         }
1898                       free (mask);
1899                       return false;
1900                     }
1901
1902                   if (!analyze_only)
1903                     {
1904                       if (need_next_vector)
1905                         {
1906                           first_vec_index = second_vec_index;
1907                           second_vec_index = vec_index;
1908                         }
1909
1910                       next_scalar_stmt = VEC_index (gimple,
1911                                 SLP_TREE_SCALAR_STMTS (node), scalar_index++);
1912
1913                       vect_create_mask_and_perm (stmt, next_scalar_stmt,
1914                                mask_vec, first_vec_index, second_vec_index,
1915                                gsi, node, builtin_decl, vectype, dr_chain,
1916                                ncopies, vect_stmts_counter++);
1917                     }
1918                 }
1919             }
1920         }
1921     }
1922
1923   free (mask);
1924   return true;
1925 }
1926
1927
1928
1929 /* Vectorize SLP instance tree in postorder.  */
1930
1931 static bool
1932 vect_schedule_slp_instance (slp_tree node, slp_instance instance,
1933                             unsigned int vectorization_factor)
1934 {
1935   gimple stmt;
1936   bool strided_store, is_store;
1937   gimple_stmt_iterator si;
1938   stmt_vec_info stmt_info;
1939   unsigned int vec_stmts_size, nunits, group_size;
1940   tree vectype;
1941   int i;
1942   slp_tree loads_node;
1943
1944   if (!node)
1945     return false;
1946
1947   vect_schedule_slp_instance (SLP_TREE_LEFT (node), instance,
1948                               vectorization_factor);
1949   vect_schedule_slp_instance (SLP_TREE_RIGHT (node), instance,
1950                               vectorization_factor);
1951
1952   stmt = VEC_index (gimple, SLP_TREE_SCALAR_STMTS (node), 0);
1953   stmt_info = vinfo_for_stmt (stmt);
1954
1955   /* VECTYPE is the type of the destination.  */
1956   vectype = get_vectype_for_scalar_type (TREE_TYPE (gimple_assign_lhs (stmt)));
1957   nunits = (unsigned int) TYPE_VECTOR_SUBPARTS (vectype);
1958   group_size = SLP_INSTANCE_GROUP_SIZE (instance);
1959
1960   /* For each SLP instance calculate number of vector stmts to be created
1961      for the scalar stmts in each node of the SLP tree. Number of vector
1962      elements in one vector iteration is the number of scalar elements in
1963      one scalar iteration (GROUP_SIZE) multiplied by VF divided by vector
1964      size.  */
1965   vec_stmts_size = (vectorization_factor * group_size) / nunits;
1966
1967   /* In case of load permutation we have to allocate vectorized statements for
1968      all the nodes that participate in that permutation.  */
1969   if (SLP_INSTANCE_LOAD_PERMUTATION (instance))
1970     {
1971       for (i = 0;
1972            VEC_iterate (slp_tree, SLP_INSTANCE_LOADS (instance), i, loads_node);
1973            i++)
1974         {
1975           if (!SLP_TREE_VEC_STMTS (loads_node))
1976             {
1977               SLP_TREE_VEC_STMTS (loads_node) = VEC_alloc (gimple, heap,
1978                                                            vec_stmts_size);
1979               SLP_TREE_NUMBER_OF_VEC_STMTS (loads_node) = vec_stmts_size;
1980             }
1981         }
1982     }
1983
1984   if (!SLP_TREE_VEC_STMTS (node))
1985     {
1986       SLP_TREE_VEC_STMTS (node) = VEC_alloc (gimple, heap, vec_stmts_size);
1987       SLP_TREE_NUMBER_OF_VEC_STMTS (node) = vec_stmts_size;
1988     }
1989
1990   if (vect_print_dump_info (REPORT_DETAILS))
1991     {
1992       fprintf (vect_dump, "------>vectorizing SLP node starting from: ");
1993       print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
1994     }
1995
1996   /* Loads should be inserted before the first load.  */
1997   if (SLP_INSTANCE_FIRST_LOAD_STMT (instance)
1998       && STMT_VINFO_STRIDED_ACCESS (stmt_info)
1999       && !REFERENCE_CLASS_P (gimple_get_lhs (stmt)))
2000     si = gsi_for_stmt (SLP_INSTANCE_FIRST_LOAD_STMT (instance));
2001   else
2002     si = gsi_for_stmt (stmt);
2003
2004   is_store = vect_transform_stmt (stmt, &si, &strided_store, node, instance);
2005   if (is_store)
2006     {
2007       if (DR_GROUP_FIRST_DR (stmt_info))
2008         /* If IS_STORE is TRUE, the vectorization of the
2009            interleaving chain was completed - free all the stores in
2010            the chain.  */
2011         vect_remove_stores (DR_GROUP_FIRST_DR (stmt_info));
2012       else
2013         /* FORNOW: SLP originates only from strided stores.  */
2014         gcc_unreachable ();
2015
2016       return true;
2017     }
2018
2019   /* FORNOW: SLP originates only from strided stores.  */
2020   return false;
2021 }
2022
2023
2024 bool
2025 vect_schedule_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
2026 {
2027   VEC (slp_instance, heap) *slp_instances;
2028   slp_instance instance;
2029   unsigned int i, vf;
2030   bool is_store = false;
2031
2032   if (loop_vinfo)
2033     {
2034       slp_instances = LOOP_VINFO_SLP_INSTANCES (loop_vinfo);
2035       vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
2036     }
2037   else
2038     {
2039       slp_instances = BB_VINFO_SLP_INSTANCES (bb_vinfo);
2040       vf = 1;
2041     }
2042
2043   for (i = 0; VEC_iterate (slp_instance, slp_instances, i, instance); i++)
2044     {
2045       /* Schedule the tree of INSTANCE.  */
2046       is_store = vect_schedule_slp_instance (SLP_INSTANCE_TREE (instance),
2047                                              instance, vf);
2048       if (vect_print_dump_info (REPORT_VECTORIZED_LOCATIONS)
2049           || vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
2050         fprintf (vect_dump, "vectorizing stmts using SLP.");
2051     }
2052
2053   return is_store;
2054 }
2055
2056
2057 /* Vectorize the basic block.  */
2058
2059 void
2060 vect_slp_transform_bb (basic_block bb)
2061 {
2062   bb_vec_info bb_vinfo = vec_info_for_bb (bb);
2063   gimple_stmt_iterator si;
2064
2065   gcc_assert (bb_vinfo);
2066
2067   if (vect_print_dump_info (REPORT_DETAILS))
2068     fprintf (vect_dump, "SLPing BB\n");
2069
2070   for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
2071     {
2072       gimple stmt = gsi_stmt (si);
2073       stmt_vec_info stmt_info;
2074
2075       if (vect_print_dump_info (REPORT_DETAILS))
2076         {
2077           fprintf (vect_dump, "------>SLPing statement: ");
2078           print_gimple_stmt (vect_dump, stmt, 0, TDF_SLIM);
2079         }
2080
2081       stmt_info = vinfo_for_stmt (stmt);
2082       gcc_assert (stmt_info);
2083
2084       /* Schedule all the SLP instances when the first SLP stmt is reached.  */
2085       if (STMT_SLP_TYPE (stmt_info))
2086         {
2087           vect_schedule_slp (NULL, bb_vinfo);
2088           break;
2089         }
2090     }
2091
2092   mark_sym_for_renaming (gimple_vop (cfun));
2093   /* The memory tags and pointers in vectorized statements need to
2094      have their SSA forms updated.  FIXME, why can't this be delayed
2095      until all the loops have been transformed?  */
2096   update_ssa (TODO_update_ssa);
2097
2098   if (vect_print_dump_info (REPORT_DETAILS))
2099     fprintf (vect_dump, "BASIC BLOCK VECTORIZED\n");
2100
2101   destroy_bb_vec_info (bb_vinfo);
2102 }
2103