Bug Summary

File:build/gcc/tree-vect-generic.cc
Warning:line 526, column 24
The left operand of '!=' is a garbage value due to array index out of bounds

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-suse-linux -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name tree-vect-generic.cc -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model static -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -resource-dir /usr/lib64/clang/15.0.7 -D IN_GCC -D HAVE_CONFIG_H -I . -I . -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/. -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcpp/include -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libcody -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libdecnumber/bid -I ../libdecnumber -I /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/../libbacktrace -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/x86_64-suse-linux -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../include/c++/13/backward -internal-isystem /usr/lib64/clang/15.0.7/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/13/../../../../x86_64-suse-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-narrowing -Wwrite-strings -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fdeprecated-macro -fdebug-compilation-dir=/buildworker/marxinbox-gcc-clang-static-analyzer/objdir/gcc -ferror-limit 19 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=plist-html -analyzer-config silence-checkers=core.NullDereference -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /buildworker/marxinbox-gcc-clang-static-analyzer/objdir/clang-static-analyzer/2023-03-27-141847-20772-1/report-8M2m5Q.plist -x c++ /buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc
1/* Lower vector operations to scalar operations.
2 Copyright (C) 2004-2023 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it
7under the terms of the GNU General Public License as published by the
8Free Software Foundation; either version 3, or (at your option) any
9later version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT
12ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#include "config.h"
21#include "system.h"
22#include "coretypes.h"
23#include "backend.h"
24#include "rtl.h"
25#include "tree.h"
26#include "gimple.h"
27#include "tree-pass.h"
28#include "ssa.h"
29#include "expmed.h"
30#include "optabs-tree.h"
31#include "diagnostic.h"
32#include "fold-const.h"
33#include "stor-layout.h"
34#include "langhooks.h"
35#include "tree-eh.h"
36#include "gimple-iterator.h"
37#include "gimplify-me.h"
38#include "gimplify.h"
39#include "tree-cfg.h"
40#include "tree-vector-builder.h"
41#include "vec-perm-indices.h"
42#include "insn-config.h"
43#include "tree-ssa-dce.h"
44#include "gimple-fold.h"
45#include "gimple-match.h"
46#include "recog.h" /* FIXME: for insn_data */
47
48
49/* Build a ternary operation and gimplify it. Emit code before GSI.
50 Return the gimple_val holding the result. */
51
52static tree
53gimplify_build3 (gimple_stmt_iterator *gsi, enum tree_code code,
54 tree type, tree a, tree b, tree c)
55{
56 location_t loc = gimple_location (gsi_stmt (*gsi));
57 return gimple_build (gsi, true, GSI_SAME_STMT, loc, code, type, a, b, c);
58}
59
60/* Build a binary operation and gimplify it. Emit code before GSI.
61 Return the gimple_val holding the result. */
62
63static tree
64gimplify_build2 (gimple_stmt_iterator *gsi, enum tree_code code,
65 tree type, tree a, tree b)
66{
67 location_t loc = gimple_location (gsi_stmt (*gsi));
68 return gimple_build (gsi, true, GSI_SAME_STMT, loc, code, type, a, b);
69}
70
71/* Build a unary operation and gimplify it. Emit code before GSI.
72 Return the gimple_val holding the result. */
73
74static tree
75gimplify_build1 (gimple_stmt_iterator *gsi, enum tree_code code, tree type,
76 tree a)
77{
78 location_t loc = gimple_location (gsi_stmt (*gsi));
79 return gimple_build (gsi, true, GSI_SAME_STMT, loc, code, type, a);
80}
81
82
83static void expand_vector_operations_1 (gimple_stmt_iterator *, bitmap);
84
85/* Return the number of elements in a vector type TYPE that we have
86 already decided needs to be expanded piecewise. We don't support
87 this kind of expansion for variable-length vectors, since we should
88 always check for target support before introducing uses of those. */
89static unsigned int
90nunits_for_known_piecewise_op (const_tree type)
91{
92 return TYPE_VECTOR_SUBPARTS (type).to_constant ();
93}
94
95/* Return true if TYPE1 has more elements than TYPE2, where either
96 type may be a vector or a scalar. */
97
98static inline bool
99subparts_gt (tree type1, tree type2)
100{
101 poly_uint64 n1 = VECTOR_TYPE_P (type1)(((enum tree_code) (type1)->base.code) == VECTOR_TYPE) ? TYPE_VECTOR_SUBPARTS (type1) : 1;
102 poly_uint64 n2 = VECTOR_TYPE_P (type2)(((enum tree_code) (type2)->base.code) == VECTOR_TYPE) ? TYPE_VECTOR_SUBPARTS (type2) : 1;
103 return known_gt (n1, n2)(!maybe_le (n1, n2));
104}
105
106/* Build a constant of type TYPE, made of VALUE's bits replicated
107 every WIDTH bits to fit TYPE's precision. */
108static tree
109build_replicated_const (tree type, unsigned int width, HOST_WIDE_INTlong value)
110{
111 int n = (TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 111, __FUNCTION__))->type_common.precision)
+ HOST_BITS_PER_WIDE_INT64 - 1)
112 / HOST_BITS_PER_WIDE_INT64;
113 unsigned HOST_WIDE_INTlong low, mask;
114 HOST_WIDE_INTlong a[WIDE_INT_MAX_ELTS(((64*(8)) + 64) / 64)];
115 int i;
116
117 gcc_assert (n && n <= WIDE_INT_MAX_ELTS)((void)(!(n && n <= (((64*(8)) + 64) / 64)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 117, __FUNCTION__), 0 : 0))
;
118
119 if (width == HOST_BITS_PER_WIDE_INT64)
120 low = value;
121 else
122 {
123 mask = ((HOST_WIDE_INTlong)1 << width) - 1;
124 low = (unsigned HOST_WIDE_INTlong) ~0 / mask * (value & mask);
125 }
126
127 for (i = 0; i < n; i++)
128 a[i] = low;
129
130 gcc_assert (TYPE_PRECISION (type) <= MAX_BITSIZE_MODE_ANY_INT)((void)(!(((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 130, __FUNCTION__))->type_common.precision) <= (64*(8
))) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 130, __FUNCTION__), 0 : 0))
;
131 return wide_int_to_tree
132 (type, wide_int::from_array (a, n, TYPE_PRECISION (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 132, __FUNCTION__))->type_common.precision)
));
133}
134
135static GTY(()) tree vector_inner_type;
136static GTY(()) tree vector_last_type;
137static GTY(()) int vector_last_nunits;
138
139/* Return a suitable vector types made of SUBPARTS units each of mode
140 "word_mode" (the global variable). */
141static tree
142build_word_mode_vector_type (int nunits)
143{
144 if (!vector_inner_type)
145 vector_inner_type = lang_hooks.types.type_for_mode (word_mode, 1);
146 else if (vector_last_nunits == nunits)
147 {
148 gcc_assert (TREE_CODE (vector_last_type) == VECTOR_TYPE)((void)(!(((enum tree_code) (vector_last_type)->base.code)
== VECTOR_TYPE) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 148, __FUNCTION__), 0 : 0))
;
149 return vector_last_type;
150 }
151
152 vector_last_nunits = nunits;
153 vector_last_type = build_vector_type (vector_inner_type, nunits);
154 return vector_last_type;
155}
156
157typedef tree (*elem_op_func) (gimple_stmt_iterator *,
158 tree, tree, tree, tree, tree, enum tree_code,
159 tree);
160
161/* Extract the vector element of type TYPE at BITPOS with BITSIZE from T
162 and return it. */
163
164tree
165tree_vec_extract (gimple_stmt_iterator *gsi, tree type,
166 tree t, tree bitsize, tree bitpos)
167{
168 /* We're using the resimplify API and maybe_push_res_to_seq to
169 simplify the BIT_FIELD_REF but restrict the simplification to
170 a single stmt while at the same time following SSA edges for
171 simplification with already emitted CTORs. */
172 gimple_match_op opr;
173 opr.set_op (BIT_FIELD_REF, type, t, bitsize, bitpos);
174 opr.resimplify (NULLnullptr, follow_all_ssa_edges);
175 gimple_seq stmts = NULLnullptr;
176 tree res = maybe_push_res_to_seq (&opr, &stmts);
177 gcc_assert (res)((void)(!(res) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 177, __FUNCTION__), 0 : 0))
;
178 gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
179 return res;
180}
181
182static tree
183do_unop (gimple_stmt_iterator *gsi, tree inner_type, tree a,
184 tree b ATTRIBUTE_UNUSED__attribute__ ((__unused__)), tree bitpos, tree bitsize,
185 enum tree_code code, tree type ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
186{
187 a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
188 return gimplify_build1 (gsi, code, inner_type, a);
189}
190
191static tree
192do_binop (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b,
193 tree bitpos, tree bitsize, enum tree_code code,
194 tree type ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
195{
196 if (TREE_CODE (TREE_TYPE (a))((enum tree_code) (((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 196, __FUNCTION__))->typed.type))->base.code)
== VECTOR_TYPE)
197 a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
198 if (TREE_CODE (TREE_TYPE (b))((enum tree_code) (((contains_struct_check ((b), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 198, __FUNCTION__))->typed.type))->base.code)
== VECTOR_TYPE)
199 b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos);
200 return gimplify_build2 (gsi, code, inner_type, a, b);
201}
202
203/* Construct expression (A[BITPOS] code B[BITPOS]) ? -1 : 0
204
205 INNER_TYPE is the type of A and B elements
206
207 returned expression is of signed integer type with the
208 size equal to the size of INNER_TYPE. */
209static tree
210do_compare (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b,
211 tree bitpos, tree bitsize, enum tree_code code, tree type)
212{
213 tree stype = TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 213, __FUNCTION__))->typed.type)
;
214 tree cst_false = build_zero_cst (stype);
215 tree cst_true = build_all_ones_cst (stype);
216 tree cmp;
217
218 a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
219 b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos);
220
221 cmp = build2 (code, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], a, b);
222 return gimplify_build3 (gsi, COND_EXPR, stype, cmp, cst_true, cst_false);
223}
224
225/* Expand vector addition to scalars. This does bit twiddling
226 in order to increase parallelism:
227
228 a + b = (((int) a & 0x7f7f7f7f) + ((int) b & 0x7f7f7f7f)) ^
229 (a ^ b) & 0x80808080
230
231 a - b = (((int) a | 0x80808080) - ((int) b & 0x7f7f7f7f)) ^
232 (a ^ ~b) & 0x80808080
233
234 -b = (0x80808080 - ((int) b & 0x7f7f7f7f)) ^ (~b & 0x80808080)
235
236 This optimization should be done only if 4 vector items or more
237 fit into a word. */
238static tree
239do_plus_minus (gimple_stmt_iterator *gsi, tree word_type, tree a, tree b,
240 tree bitpos ATTRIBUTE_UNUSED__attribute__ ((__unused__)), tree bitsize ATTRIBUTE_UNUSED__attribute__ ((__unused__)),
241 enum tree_code code, tree type ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
242{
243 unsigned int width = vector_element_bits (TREE_TYPE (a)((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 243, __FUNCTION__))->typed.type)
);
244 tree inner_type = TREE_TYPE (TREE_TYPE (a))((contains_struct_check ((((contains_struct_check ((a), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 244, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 244, __FUNCTION__))->typed.type)
;
245 unsigned HOST_WIDE_INTlong max;
246 tree low_bits, high_bits, a_low, b_low, result_low, signs;
247
248 max = GET_MODE_MASK (TYPE_MODE (inner_type))mode_mask_array[((((enum tree_code) ((tree_class_check ((inner_type
), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 248, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(inner_type) : (inner_type)->type_common.mode)]
;
249 low_bits = build_replicated_const (word_type, width, max >> 1);
250 high_bits = build_replicated_const (word_type, width, max & ~(max >> 1));
251
252 a = tree_vec_extract (gsi, word_type, a, bitsize, bitpos);
253 b = tree_vec_extract (gsi, word_type, b, bitsize, bitpos);
254
255 signs = gimplify_build2 (gsi, BIT_XOR_EXPR, word_type, a, b);
256 b_low = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, b, low_bits);
257 if (code == PLUS_EXPR)
258 a_low = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, a, low_bits);
259 else
260 {
261 a_low = gimplify_build2 (gsi, BIT_IOR_EXPR, word_type, a, high_bits);
262 signs = gimplify_build1 (gsi, BIT_NOT_EXPR, word_type, signs);
263 }
264
265 signs = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, signs, high_bits);
266 result_low = gimplify_build2 (gsi, code, word_type, a_low, b_low);
267 return gimplify_build2 (gsi, BIT_XOR_EXPR, word_type, result_low, signs);
268}
269
270static tree
271do_negate (gimple_stmt_iterator *gsi, tree word_type, tree b,
272 tree unused ATTRIBUTE_UNUSED__attribute__ ((__unused__)), tree bitpos ATTRIBUTE_UNUSED__attribute__ ((__unused__)),
273 tree bitsize ATTRIBUTE_UNUSED__attribute__ ((__unused__)),
274 enum tree_code code ATTRIBUTE_UNUSED__attribute__ ((__unused__)),
275 tree type ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
276{
277 unsigned int width = vector_element_bits (TREE_TYPE (b)((contains_struct_check ((b), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 277, __FUNCTION__))->typed.type)
);
278 tree inner_type = TREE_TYPE (TREE_TYPE (b))((contains_struct_check ((((contains_struct_check ((b), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 278, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 278, __FUNCTION__))->typed.type)
;
279 HOST_WIDE_INTlong max;
280 tree low_bits, high_bits, b_low, result_low, signs;
281
282 max = GET_MODE_MASK (TYPE_MODE (inner_type))mode_mask_array[((((enum tree_code) ((tree_class_check ((inner_type
), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 282, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(inner_type) : (inner_type)->type_common.mode)]
;
283 low_bits = build_replicated_const (word_type, width, max >> 1);
284 high_bits = build_replicated_const (word_type, width, max & ~(max >> 1));
285
286 b = tree_vec_extract (gsi, word_type, b, bitsize, bitpos);
287
288 b_low = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, b, low_bits);
289 signs = gimplify_build1 (gsi, BIT_NOT_EXPR, word_type, b);
290 signs = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, signs, high_bits);
291 result_low = gimplify_build2 (gsi, MINUS_EXPR, word_type, high_bits, b_low);
292 return gimplify_build2 (gsi, BIT_XOR_EXPR, word_type, result_low, signs);
293}
294
295/* Expand a vector operation to scalars, by using many operations
296 whose type is the vector type's inner type. */
297static tree
298expand_vector_piecewise (gimple_stmt_iterator *gsi, elem_op_func f,
299 tree type, tree inner_type,
300 tree a, tree b, enum tree_code code,
301 bool parallel_p, tree ret_type = NULL_TREE(tree) nullptr)
302{
303 vec<constructor_elt, va_gc> *v;
304 tree part_width = TYPE_SIZE (inner_type)((tree_class_check ((inner_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 304, __FUNCTION__))->type_common.size)
;
305 tree index = bitsize_int (0)size_int_kind (0, stk_bitsizetype);
306 int nunits = nunits_for_known_piecewise_op (type);
307 int delta = tree_to_uhwi (part_width) / vector_element_bits (type);
308 int i;
309 location_t loc = gimple_location (gsi_stmt (*gsi));
310
311 if (nunits == 1
312 || warning_suppressed_p (gsi_stmt (*gsi),
313 OPT_Wvector_operation_performance))
314 /* Do not diagnose decomposing single element vectors or when
315 decomposing vectorizer produced operations. */
316 ;
317 else if (ret_type || !parallel_p)
318 warning_at (loc, OPT_Wvector_operation_performance,
319 "vector operation will be expanded piecewise");
320 else
321 warning_at (loc, OPT_Wvector_operation_performance,
322 "vector operation will be expanded in parallel");
323
324 if (!ret_type)
325 ret_type = type;
326 vec_alloc (v, (nunits + delta - 1) / delta);
327 bool constant_p = true;
328 for (i = 0; i < nunits;
329 i += delta, index = int_const_binop (PLUS_EXPR, index, part_width))
330 {
331 tree result = f (gsi, inner_type, a, b, index, part_width, code,
332 ret_type);
333 if (!CONSTANT_CLASS_P (result)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (result)->base.code))] == tcc_constant)
)
334 constant_p = false;
335 constructor_elt ce = {NULL_TREE(tree) nullptr, result};
336 v->quick_push (ce);
337 }
338
339 if (constant_p)
340 return build_vector_from_ctor (ret_type, v);
341 else
342 return build_constructor (ret_type, v);
343}
344
345/* Expand a vector operation to scalars with the freedom to use
346 a scalar integer type, or to use a different size for the items
347 in the vector type. */
348static tree
349expand_vector_parallel (gimple_stmt_iterator *gsi, elem_op_func f, tree type,
350 tree a, tree b, enum tree_code code)
351{
352 tree result, compute_type;
353 int n_words = tree_to_uhwi (TYPE_SIZE_UNIT (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 353, __FUNCTION__))->type_common.size_unit)
) / UNITS_PER_WORD(((global_options.x_ix86_isa_flags & (1UL << 1)) !=
0) ? 8 : 4)
;
354 location_t loc = gimple_location (gsi_stmt (*gsi));
355
356 /* We have three strategies. If the type is already correct, just do
357 the operation an element at a time. Else, if the vector is wider than
358 one word, do it a word at a time; finally, if the vector is smaller
359 than one word, do it as a scalar. */
360 if (TYPE_MODE (TREE_TYPE (type))((((enum tree_code) ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 360, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 360, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 360, __FUNCTION__))->typed.type)) : (((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 360, __FUNCTION__))->typed.type))->type_common.mode)
== word_mode)
361 return expand_vector_piecewise (gsi, f,
362 type, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 362, __FUNCTION__))->typed.type)
,
363 a, b, code, true);
364 else if (n_words > 1)
365 {
366 tree word_type = build_word_mode_vector_type (n_words);
367 result = expand_vector_piecewise (gsi, f,
368 word_type, TREE_TYPE (word_type)((contains_struct_check ((word_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 368, __FUNCTION__))->typed.type)
,
369 a, b, code, true);
370 result = force_gimple_operand_gsi (gsi, result, true, NULLnullptr, true,
371 GSI_SAME_STMT);
372 }
373 else
374 {
375 /* Use a single scalar operation with a mode no wider than word_mode. */
376 if (!warning_suppressed_p (gsi_stmt (*gsi),
377 OPT_Wvector_operation_performance))
378 warning_at (loc, OPT_Wvector_operation_performance,
379 "vector operation will be expanded with a "
380 "single scalar operation");
381 scalar_int_mode mode
382 = int_mode_for_size (tree_to_uhwi (TYPE_SIZE (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 382, __FUNCTION__))->type_common.size)
), 0).require ();
383 compute_type = lang_hooks.types.type_for_mode (mode, 1);
384 result = f (gsi, compute_type, a, b, bitsize_zero_nodeglobal_trees[TI_BITSIZE_ZERO],
385 TYPE_SIZE (compute_type)((tree_class_check ((compute_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 385, __FUNCTION__))->type_common.size)
, code, type);
386 }
387
388 return result;
389}
390
391/* Expand a vector operation to scalars; for integer types we can use
392 special bit twiddling tricks to do the sums a word at a time, using
393 function F_PARALLEL instead of F. These tricks are done only if
394 they can process at least four items, that is, only if the vector
395 holds at least four items and if a word can hold four items. */
396static tree
397expand_vector_addition (gimple_stmt_iterator *gsi,
398 elem_op_func f, elem_op_func f_parallel,
399 tree type, tree a, tree b, enum tree_code code)
400{
401 int parts_per_word = BITS_PER_WORD((8) * (((global_options.x_ix86_isa_flags & (1UL <<
1)) != 0) ? 8 : 4))
/ vector_element_bits (type);
402
403 if (INTEGRAL_TYPE_P (TREE_TYPE (type))(((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 403, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE
|| ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 403, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
|| ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 403, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
404 && parts_per_word >= 4
405 && nunits_for_known_piecewise_op (type) >= 4)
406 return expand_vector_parallel (gsi, f_parallel,
407 type, a, b, code);
408 else
409 return expand_vector_piecewise (gsi, f,
410 type, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 410, __FUNCTION__))->typed.type)
,
411 a, b, code, false);
412}
413
414static bool
415expand_vector_condition (gimple_stmt_iterator *gsi, bitmap dce_ssa_names);
416
417/* Try to expand vector comparison expression OP0 CODE OP1 by
418 querying optab if the following expression:
419 VEC_COND_EXPR< OP0 CODE OP1, {-1,...}, {0,...}>
420 can be expanded. */
421static tree
422expand_vector_comparison (gimple_stmt_iterator *gsi, tree type, tree op0,
423 tree op1, enum tree_code code,
424 bitmap dce_ssa_names)
425{
426 tree lhs = gimple_assign_lhs (gsi_stmt (*gsi));
427 use_operand_p use_p;
428 imm_use_iterator iterator;
429 bool vec_cond_expr_only = true;
430
431 /* As seen in PR95830, we should not expand comparisons that are only
432 feeding a VEC_COND_EXPR statement. */
433 auto_vec<gimple *> uses;
434 FOR_EACH_IMM_USE_FAST (use_p, iterator, lhs)for ((use_p) = first_readonly_imm_use (&(iterator), (lhs)
); !end_readonly_imm_use_p (&(iterator)); (void) ((use_p)
= next_readonly_imm_use (&(iterator))))
435 {
436 gimple *use = USE_STMT (use_p)(use_p)->loc.stmt;
437 if (is_gimple_debug (use))
438 continue;
439 if (is_gimple_assign (use)
440 && gimple_assign_rhs_code (use) == VEC_COND_EXPR
441 && gimple_assign_rhs1 (use) == lhs
442 && gimple_assign_rhs2 (use) != lhs
443 && gimple_assign_rhs3 (use) != lhs)
444 uses.safe_push (use);
445 else
446 vec_cond_expr_only = false;
447 }
448
449 if (vec_cond_expr_only)
450 for (gimple *use : uses)
451 {
452 gimple_stmt_iterator it = gsi_for_stmt (use);
453 if (!expand_vector_condition (&it, dce_ssa_names))
454 {
455 vec_cond_expr_only = false;
456 break;
457 }
458 }
459
460 if (!uses.is_empty () && vec_cond_expr_only)
461 return NULL_TREE(tree) nullptr;
462
463 tree t;
464 if (!expand_vec_cmp_expr_p (TREE_TYPE (op0)((contains_struct_check ((op0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 464, __FUNCTION__))->typed.type)
, type, code))
465 {
466 if (VECTOR_BOOLEAN_TYPE_P (type)(((enum tree_code) (type)->base.code) == VECTOR_TYPE &&
((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 466, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
)
467 && SCALAR_INT_MODE_P (TYPE_MODE (type))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 467, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_INT || ((enum
mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 467, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_PARTIAL_INT)
468 && known_lt (GET_MODE_BITSIZE (TYPE_MODE (type)),(!maybe_le (TYPE_VECTOR_SUBPARTS (type) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 471, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 471, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 468, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode))))
469 TYPE_VECTOR_SUBPARTS (type)(!maybe_le (TYPE_VECTOR_SUBPARTS (type) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 471, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 471, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 468, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode))))
470 * GET_MODE_BITSIZE (SCALAR_TYPE_MODE(!maybe_le (TYPE_VECTOR_SUBPARTS (type) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 471, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 471, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 468, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode))))
471 (TREE_TYPE (type))))(!maybe_le (TYPE_VECTOR_SUBPARTS (type) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 471, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 471, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 468, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode))))
)
472 {
473 tree inner_type = TREE_TYPE (TREE_TYPE (op0))((contains_struct_check ((((contains_struct_check ((op0), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 473, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 473, __FUNCTION__))->typed.type)
;
474 tree part_width = vector_element_bits_tree (TREE_TYPE (op0)((contains_struct_check ((op0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 474, __FUNCTION__))->typed.type)
);
475 tree index = bitsize_int (0)size_int_kind (0, stk_bitsizetype);
476 int nunits = nunits_for_known_piecewise_op (TREE_TYPE (op0)((contains_struct_check ((op0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 476, __FUNCTION__))->typed.type)
);
477 int prec = GET_MODE_PRECISION (SCALAR_TYPE_MODE (type)(as_a <scalar_mode> ((tree_class_check ((type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 477, __FUNCTION__))->type_common.mode))
);
478 tree ret_type = build_nonstandard_integer_type (prec, 1);
479 tree ret_inner_type = boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE];
480 int i;
481 location_t loc = gimple_location (gsi_stmt (*gsi));
482 t = build_zero_cst (ret_type);
483
484 if (TYPE_PRECISION (ret_inner_type)((tree_class_check ((ret_inner_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 484, __FUNCTION__))->type_common.precision)
!= 1)
485 ret_inner_type = build_nonstandard_integer_type (1, 1);
486 if (!warning_suppressed_p (gsi_stmt (*gsi),
487 OPT_Wvector_operation_performance))
488 warning_at (loc, OPT_Wvector_operation_performance,
489 "vector operation will be expanded piecewise");
490 for (i = 0; i < nunits;
491 i++, index = int_const_binop (PLUS_EXPR, index, part_width))
492 {
493 tree a = tree_vec_extract (gsi, inner_type, op0, part_width,
494 index);
495 tree b = tree_vec_extract (gsi, inner_type, op1, part_width,
496 index);
497 tree result = gimplify_build2 (gsi, code, ret_inner_type, a, b);
498 t = gimplify_build3 (gsi, BIT_INSERT_EXPR, ret_type, t, result,
499 bitsize_int (i)size_int_kind (i, stk_bitsizetype));
500 }
501 t = gimplify_build1 (gsi, VIEW_CONVERT_EXPR, type, t);
502 }
503 else
504 t = expand_vector_piecewise (gsi, do_compare, type,
505 TREE_TYPE (TREE_TYPE (op0))((contains_struct_check ((((contains_struct_check ((op0), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 505, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 505, __FUNCTION__))->typed.type)
, op0, op1,
506 code, false);
507 }
508 else
509 t = NULL_TREE(tree) nullptr;
510
511 return t;
512}
513
514/* Helper function of expand_vector_divmod. Gimplify a RSHIFT_EXPR in type
515 of OP0 with shift counts in SHIFTCNTS array and return the temporary holding
516 the result if successful, otherwise return NULL_TREE. */
517static tree
518add_rshift (gimple_stmt_iterator *gsi, tree type, tree op0, int *shiftcnts)
519{
520 optab op;
521 unsigned int i, nunits = nunits_for_known_piecewise_op (type);
522 bool scalar_shift = true;
523
524 for (i = 1; i < nunits; i++)
33
The value 1 is assigned to 'i'
34
Assuming 'i' is < 'nunits'
35
Loop condition is true. Entering loop body
525 {
526 if (shiftcnts[i] != shiftcnts[0])
36
The left operand of '!=' is a garbage value due to array index out of bounds
527 scalar_shift = false;
528 }
529
530 if (scalar_shift && shiftcnts[0] == 0)
531 return op0;
532
533 if (scalar_shift)
534 {
535 op = optab_for_tree_code (RSHIFT_EXPR, type, optab_scalar);
536 if (op != unknown_optab
537 && optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 537, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) != CODE_FOR_nothing)
538 return gimplify_build2 (gsi, RSHIFT_EXPR, type, op0,
539 build_int_cst (NULL_TREE(tree) nullptr, shiftcnts[0]));
540 }
541
542 op = optab_for_tree_code (RSHIFT_EXPR, type, optab_vector);
543 if (op != unknown_optab
544 && optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 544, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) != CODE_FOR_nothing)
545 {
546 tree_vector_builder vec (type, nunits, 1);
547 for (i = 0; i < nunits; i++)
548 vec.quick_push (build_int_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 548, __FUNCTION__))->typed.type)
, shiftcnts[i]));
549 return gimplify_build2 (gsi, RSHIFT_EXPR, type, op0, vec.build ());
550 }
551
552 return NULL_TREE(tree) nullptr;
553}
554
555/* Try to expand integer vector division by constant using
556 widening multiply, shifts and additions. */
557static tree
558expand_vector_divmod (gimple_stmt_iterator *gsi, tree type, tree op0,
559 tree op1, enum tree_code code)
560{
561 bool use_pow2 = true;
562 bool has_vector_shift = true;
563 bool use_abs_op1 = false;
564 int mode = -1, this_mode;
565 int pre_shift = -1, post_shift;
566 unsigned int nunits = nunits_for_known_piecewise_op (type);
567 int *shifts = XALLOCAVEC (int, nunits * 4)((int *) __builtin_alloca(sizeof (int) * (nunits * 4)));
568 int *pre_shifts = shifts + nunits;
569 int *post_shifts = pre_shifts + nunits;
570 int *shift_temps = post_shifts + nunits;
571 unsigned HOST_WIDE_INTlong *mulc = XALLOCAVEC (unsigned HOST_WIDE_INT, nunits)((unsigned long *) __builtin_alloca(sizeof (unsigned long) * (
nunits)))
;
572 int prec = TYPE_PRECISION (TREE_TYPE (type))((tree_class_check ((((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 572, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 572, __FUNCTION__))->type_common.precision)
;
573 int dummy_int;
574 unsigned int i;
575 signop sign_p = TYPE_SIGN (TREE_TYPE (type))((signop) ((tree_class_check ((((contains_struct_check ((type
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 575, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 575, __FUNCTION__))->base.u.bits.unsigned_flag))
;
576 unsigned HOST_WIDE_INTlong mask = GET_MODE_MASK (TYPE_MODE (TREE_TYPE (type)))mode_mask_array[((((enum tree_code) ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 576, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 576, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 576, __FUNCTION__))->typed.type)) : (((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 576, __FUNCTION__))->typed.type))->type_common.mode)]
;
1
Assuming field 'code' is not equal to VECTOR_TYPE
2
'?' condition is false
577 tree cur_op, mulcst, tem;
578 optab op;
579
580 if (prec > HOST_BITS_PER_WIDE_INT64)
3
Assuming 'prec' is <= HOST_BITS_PER_WIDE_INT
4
Taking false branch
581 return NULL_TREE(tree) nullptr;
582
583 op = optab_for_tree_code (RSHIFT_EXPR, type, optab_vector);
584 if (op == unknown_optab
5
Assuming 'op' is not equal to unknown_optab
8
Taking false branch
585 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 585, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing
)
6
'?' condition is true
7
Assuming the condition is false
586 has_vector_shift = false;
587
588 /* Analysis phase. Determine if all op1 elements are either power
589 of two and it is possible to expand it using shifts (or for remainder
590 using masking). Additionally compute the multiplicative constants
591 and pre and post shifts if the division is to be expanded using
592 widening or high part multiplication plus shifts. */
593 for (i = 0; i < nunits; i++)
9
Assuming 'i' is >= 'nunits'
10
Loop condition is false. Execution continues on line 743
594 {
595 tree cst = VECTOR_CST_ELT (op1, i)vector_cst_elt (op1, i);
596 unsigned HOST_WIDE_INTlong ml;
597
598 if (TREE_CODE (cst)((enum tree_code) (cst)->base.code) != INTEGER_CST || integer_zerop (cst))
599 return NULL_TREE(tree) nullptr;
600 pre_shifts[i] = 0;
601 post_shifts[i] = 0;
602 mulc[i] = 0;
603 if (use_pow2
604 && (!integer_pow2p (cst) || tree_int_cst_sgn (cst) != 1))
605 use_pow2 = false;
606 if (use_pow2)
607 {
608 shifts[i] = tree_log2 (cst);
609 if (shifts[i] != shifts[0]
610 && code == TRUNC_DIV_EXPR
611 && !has_vector_shift)
612 use_pow2 = false;
613 }
614 if (mode == -2)
615 continue;
616 if (sign_p == UNSIGNED)
617 {
618 unsigned HOST_WIDE_INTlong mh;
619 unsigned HOST_WIDE_INTlong d = TREE_INT_CST_LOW (cst)((unsigned long) (*tree_int_cst_elt_check ((cst), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 619, __FUNCTION__)))
& mask;
620
621 if (d >= (HOST_WIDE_INT_1U1UL << (prec - 1)))
622 /* FIXME: Can transform this into op0 >= op1 ? 1 : 0. */
623 return NULL_TREE(tree) nullptr;
624
625 if (d <= 1)
626 {
627 mode = -2;
628 continue;
629 }
630
631 /* Find a suitable multiplier and right shift count
632 instead of multiplying with D. */
633 mh = choose_multiplier (d, prec, prec, &ml, &post_shift, &dummy_int);
634
635 /* If the suggested multiplier is more than SIZE bits, we can
636 do better for even divisors, using an initial right shift. */
637 if ((mh != 0 && (d & 1) == 0)
638 || (!has_vector_shift && pre_shift != -1))
639 {
640 if (has_vector_shift)
641 pre_shift = ctz_or_zero (d);
642 else if (pre_shift == -1)
643 {
644 unsigned int j;
645 for (j = 0; j < nunits; j++)
646 {
647 tree cst2 = VECTOR_CST_ELT (op1, j)vector_cst_elt (op1, j);
648 unsigned HOST_WIDE_INTlong d2;
649 int this_pre_shift;
650
651 if (!tree_fits_uhwi_p (cst2))
652 return NULL_TREE(tree) nullptr;
653 d2 = tree_to_uhwi (cst2) & mask;
654 if (d2 == 0)
655 return NULL_TREE(tree) nullptr;
656 this_pre_shift = floor_log2 (d2 & -d2);
657 if (pre_shift == -1 || this_pre_shift < pre_shift)
658 pre_shift = this_pre_shift;
659 }
660 if (i != 0 && pre_shift != 0)
661 {
662 /* Restart. */
663 i = -1U;
664 mode = -1;
665 continue;
666 }
667 }
668 if (pre_shift != 0)
669 {
670 if ((d >> pre_shift) <= 1)
671 {
672 mode = -2;
673 continue;
674 }
675 mh = choose_multiplier (d >> pre_shift, prec,
676 prec - pre_shift,
677 &ml, &post_shift, &dummy_int);
678 gcc_assert (!mh)((void)(!(!mh) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 678, __FUNCTION__), 0 : 0))
;
679 pre_shifts[i] = pre_shift;
680 }
681 }
682 if (!mh)
683 this_mode = 0;
684 else
685 this_mode = 1;
686 }
687 else
688 {
689 HOST_WIDE_INTlong d = TREE_INT_CST_LOW (cst)((unsigned long) (*tree_int_cst_elt_check ((cst), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 689, __FUNCTION__)))
;
690 unsigned HOST_WIDE_INTlong abs_d;
691
692 if (d == -1)
693 return NULL_TREE(tree) nullptr;
694
695 /* Since d might be INT_MIN, we have to cast to
696 unsigned HOST_WIDE_INT before negating to avoid
697 undefined signed overflow. */
698 abs_d = (d >= 0
699 ? (unsigned HOST_WIDE_INTlong) d
700 : - (unsigned HOST_WIDE_INTlong) d);
701
702 /* n rem d = n rem -d */
703 if (code == TRUNC_MOD_EXPR && d < 0)
704 {
705 d = abs_d;
706 use_abs_op1 = true;
707 }
708 if (abs_d == HOST_WIDE_INT_1U1UL << (prec - 1))
709 {
710 /* This case is not handled correctly below. */
711 mode = -2;
712 continue;
713 }
714 if (abs_d <= 1)
715 {
716 mode = -2;
717 continue;
718 }
719
720 choose_multiplier (abs_d, prec, prec - 1, &ml,
721 &post_shift, &dummy_int);
722 if (ml >= HOST_WIDE_INT_1U1UL << (prec - 1))
723 {
724 this_mode = 4 + (d < 0);
725 ml |= HOST_WIDE_INT_M1U-1UL << (prec - 1);
726 }
727 else
728 this_mode = 2 + (d < 0);
729 }
730 mulc[i] = ml;
731 post_shifts[i] = post_shift;
732 if ((i && !has_vector_shift && post_shifts[0] != post_shift)
733 || post_shift >= prec
734 || pre_shifts[i] >= prec)
735 this_mode = -2;
736
737 if (i == 0)
738 mode = this_mode;
739 else if (mode != this_mode)
740 mode = -2;
741 }
742
743 if (use_pow2
10.1
'use_pow2' is true
)
11
Taking true branch
744 {
745 tree addend = NULL_TREE(tree) nullptr;
746 if (sign_p == SIGNED)
12
Assuming 'sign_p' is equal to SIGNED
13
Taking true branch
747 {
748 tree uns_type;
749
750 /* Both division and remainder sequences need
751 op0 < 0 ? mask : 0 computed. It can be either computed as
752 (type) (((uns_type) (op0 >> (prec - 1))) >> (prec - shifts[i]))
753 if none of the shifts is 0, or as the conditional. */
754 for (i = 0; i < nunits; i++)
14
Loop condition is false. Execution continues on line 758
755 if (shifts[i] == 0)
756 break;
757 uns_type
758 = build_vector_type (build_nonstandard_integer_type (prec, 1),
759 nunits);
760 if (i
14.1
'i' is equal to 'nunits'
== nunits && TYPE_MODE (uns_type)((((enum tree_code) ((tree_class_check ((uns_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 760, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(uns_type) : (uns_type)->type_common.mode)
== TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 760, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
)
15
Assuming field 'code' is not equal to VECTOR_TYPE
16
'?' condition is false
17
'?' condition is true
18
Assuming the condition is false
761 {
762 for (i = 0; i < nunits; i++)
763 shift_temps[i] = prec - 1;
764 cur_op = add_rshift (gsi, type, op0, shift_temps);
765 if (cur_op != NULL_TREE(tree) nullptr)
766 {
767 cur_op = gimplify_build1 (gsi, VIEW_CONVERT_EXPR,
768 uns_type, cur_op);
769 for (i = 0; i < nunits; i++)
770 shift_temps[i] = prec - shifts[i];
771 cur_op = add_rshift (gsi, uns_type, cur_op, shift_temps);
772 if (cur_op != NULL_TREE(tree) nullptr)
773 addend = gimplify_build1 (gsi, VIEW_CONVERT_EXPR,
774 type, cur_op);
775 }
776 }
777 if (addend == NULL_TREE(tree) nullptr
20
Taking true branch
778 && expand_vec_cond_expr_p (type, type, LT_EXPR))
19
Assuming the condition is true
779 {
780 tree zero, cst, mask_type, mask;
781 gimple *stmt, *cond;
782
783 mask_type = truth_type_for (type);
784 zero = build_zero_cst (type);
785 mask = make_ssa_name (mask_type);
786 cond = gimple_build_assign (mask, LT_EXPR, op0, zero);
787 gsi_insert_before (gsi, cond, GSI_SAME_STMT);
788 tree_vector_builder vec (type, nunits, 1);
789 for (i = 0; i < nunits; i++)
21
Loop condition is false. Execution continues on line 793
790 vec.quick_push (build_int_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 790, __FUNCTION__))->typed.type)
,
791 (HOST_WIDE_INT_1U1UL
792 << shifts[i]) - 1));
793 cst = vec.build ();
794 addend = make_ssa_name (type);
795 stmt
796 = gimple_build_assign (addend, VEC_COND_EXPR, mask, cst, zero);
797 gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
798 }
799 }
800 if (code == TRUNC_DIV_EXPR)
22
Assuming 'code' is equal to TRUNC_DIV_EXPR
23
Taking true branch
801 {
802 if (sign_p
23.1
'sign_p' is not equal to UNSIGNED
== UNSIGNED)
24
Taking false branch
803 {
804 /* q = op0 >> shift; */
805 cur_op = add_rshift (gsi, type, op0, shifts);
806 if (cur_op != NULL_TREE(tree) nullptr)
807 return cur_op;
808 }
809 else if (addend != NULL_TREE(tree) nullptr)
25
Assuming the condition is true
26
Taking true branch
810 {
811 /* t1 = op0 + addend;
812 q = t1 >> shift; */
813 op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
814 if (op != unknown_optab
27
Assuming 'op' is not equal to unknown_optab
31
Taking true branch
815 && optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 815, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) != CODE_FOR_nothing
)
28
Assuming field 'code' is not equal to VECTOR_TYPE
29
'?' condition is false
30
Assuming the condition is true
816 {
817 cur_op = gimplify_build2 (gsi, PLUS_EXPR, type, op0, addend);
818 cur_op = add_rshift (gsi, type, cur_op, shifts);
32
Calling 'add_rshift'
819 if (cur_op != NULL_TREE(tree) nullptr)
820 return cur_op;
821 }
822 }
823 }
824 else
825 {
826 tree mask;
827 tree_vector_builder vec (type, nunits, 1);
828 for (i = 0; i < nunits; i++)
829 vec.quick_push (build_int_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 829, __FUNCTION__))->typed.type)
,
830 (HOST_WIDE_INT_1U1UL
831 << shifts[i]) - 1));
832 mask = vec.build ();
833 op = optab_for_tree_code (BIT_AND_EXPR, type, optab_default);
834 if (op != unknown_optab
835 && optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 835, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) != CODE_FOR_nothing)
836 {
837 if (sign_p == UNSIGNED)
838 /* r = op0 & mask; */
839 return gimplify_build2 (gsi, BIT_AND_EXPR, type, op0, mask);
840 else if (addend != NULL_TREE(tree) nullptr)
841 {
842 /* t1 = op0 + addend;
843 t2 = t1 & mask;
844 r = t2 - addend; */
845 op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
846 if (op != unknown_optab
847 && optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 847, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
)
848 != CODE_FOR_nothing)
849 {
850 cur_op = gimplify_build2 (gsi, PLUS_EXPR, type, op0,
851 addend);
852 cur_op = gimplify_build2 (gsi, BIT_AND_EXPR, type,
853 cur_op, mask);
854 op = optab_for_tree_code (MINUS_EXPR, type,
855 optab_default);
856 if (op != unknown_optab
857 && optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 857, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
)
858 != CODE_FOR_nothing)
859 return gimplify_build2 (gsi, MINUS_EXPR, type,
860 cur_op, addend);
861 }
862 }
863 }
864 }
865 }
866
867 if (mode == -2 || BYTES_BIG_ENDIAN0 != WORDS_BIG_ENDIAN0)
868 return NULL_TREE(tree) nullptr;
869
870 if (!can_mult_highpart_p (TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 870, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
, TYPE_UNSIGNED (type)((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 870, __FUNCTION__))->base.u.bits.unsigned_flag)
))
871 return NULL_TREE(tree) nullptr;
872
873 cur_op = op0;
874
875 switch (mode)
876 {
877 case 0:
878 gcc_assert (sign_p == UNSIGNED)((void)(!(sign_p == UNSIGNED) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 878, __FUNCTION__), 0 : 0))
;
879 /* t1 = oprnd0 >> pre_shift;
880 t2 = t1 h* ml;
881 q = t2 >> post_shift; */
882 cur_op = add_rshift (gsi, type, cur_op, pre_shifts);
883 if (cur_op == NULL_TREE(tree) nullptr)
884 return NULL_TREE(tree) nullptr;
885 break;
886 case 1:
887 gcc_assert (sign_p == UNSIGNED)((void)(!(sign_p == UNSIGNED) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 887, __FUNCTION__), 0 : 0))
;
888 for (i = 0; i < nunits; i++)
889 {
890 shift_temps[i] = 1;
891 post_shifts[i]--;
892 }
893 break;
894 case 2:
895 case 3:
896 case 4:
897 case 5:
898 gcc_assert (sign_p == SIGNED)((void)(!(sign_p == SIGNED) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 898, __FUNCTION__), 0 : 0))
;
899 for (i = 0; i < nunits; i++)
900 shift_temps[i] = prec - 1;
901 break;
902 default:
903 return NULL_TREE(tree) nullptr;
904 }
905
906 tree_vector_builder vec (type, nunits, 1);
907 for (i = 0; i < nunits; i++)
908 vec.quick_push (build_int_cst (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 908, __FUNCTION__))->typed.type)
, mulc[i]));
909 mulcst = vec.build ();
910
911 cur_op = gimplify_build2 (gsi, MULT_HIGHPART_EXPR, type, cur_op, mulcst);
912
913 switch (mode)
914 {
915 case 0:
916 /* t1 = oprnd0 >> pre_shift;
917 t2 = t1 h* ml;
918 q = t2 >> post_shift; */
919 cur_op = add_rshift (gsi, type, cur_op, post_shifts);
920 break;
921 case 1:
922 /* t1 = oprnd0 h* ml;
923 t2 = oprnd0 - t1;
924 t3 = t2 >> 1;
925 t4 = t1 + t3;
926 q = t4 >> (post_shift - 1); */
927 op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
928 if (op == unknown_optab
929 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 929, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing)
930 return NULL_TREE(tree) nullptr;
931 tem = gimplify_build2 (gsi, MINUS_EXPR, type, op0, cur_op);
932 tem = add_rshift (gsi, type, tem, shift_temps);
933 op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
934 if (op == unknown_optab
935 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 935, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing)
936 return NULL_TREE(tree) nullptr;
937 tem = gimplify_build2 (gsi, PLUS_EXPR, type, cur_op, tem);
938 cur_op = add_rshift (gsi, type, tem, post_shifts);
939 if (cur_op == NULL_TREE(tree) nullptr)
940 return NULL_TREE(tree) nullptr;
941 break;
942 case 2:
943 case 3:
944 case 4:
945 case 5:
946 /* t1 = oprnd0 h* ml;
947 t2 = t1; [ iff (mode & 2) != 0 ]
948 t2 = t1 + oprnd0; [ iff (mode & 2) == 0 ]
949 t3 = t2 >> post_shift;
950 t4 = oprnd0 >> (prec - 1);
951 q = t3 - t4; [ iff (mode & 1) == 0 ]
952 q = t4 - t3; [ iff (mode & 1) != 0 ] */
953 if ((mode & 2) == 0)
954 {
955 op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
956 if (op == unknown_optab
957 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 957, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing)
958 return NULL_TREE(tree) nullptr;
959 cur_op = gimplify_build2 (gsi, PLUS_EXPR, type, cur_op, op0);
960 }
961 cur_op = add_rshift (gsi, type, cur_op, post_shifts);
962 if (cur_op == NULL_TREE(tree) nullptr)
963 return NULL_TREE(tree) nullptr;
964 tem = add_rshift (gsi, type, op0, shift_temps);
965 if (tem == NULL_TREE(tree) nullptr)
966 return NULL_TREE(tree) nullptr;
967 op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
968 if (op == unknown_optab
969 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 969, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing)
970 return NULL_TREE(tree) nullptr;
971 if ((mode & 1) == 0)
972 cur_op = gimplify_build2 (gsi, MINUS_EXPR, type, cur_op, tem);
973 else
974 cur_op = gimplify_build2 (gsi, MINUS_EXPR, type, tem, cur_op);
975 break;
976 default:
977 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 977, __FUNCTION__))
;
978 }
979
980 if (code == TRUNC_DIV_EXPR)
981 return cur_op;
982
983 /* We divided. Now finish by:
984 t1 = q * oprnd1;
985 r = oprnd0 - t1; */
986 op = optab_for_tree_code (MULT_EXPR, type, optab_default);
987 if (op == unknown_optab
988 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 988, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing)
989 return NULL_TREE(tree) nullptr;
990 if (use_abs_op1)
991 {
992 tree_vector_builder elts;
993 if (!elts.new_unary_operation (type, op1, false))
994 return NULL_TREE(tree) nullptr;
995 unsigned int count = elts.encoded_nelts ();
996 for (unsigned int i = 0; i < count; ++i)
997 {
998 tree elem1 = VECTOR_CST_ELT (op1, i)vector_cst_elt (op1, i);
999
1000 tree elt = const_unop (ABS_EXPR, TREE_TYPE (elem1)((contains_struct_check ((elem1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1000, __FUNCTION__))->typed.type)
, elem1);
1001 if (elt == NULL_TREE(tree) nullptr)
1002 return NULL_TREE(tree) nullptr;
1003 elts.quick_push (elt);
1004 }
1005 op1 = elts.build ();
1006 }
1007 tem = gimplify_build2 (gsi, MULT_EXPR, type, cur_op, op1);
1008 op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
1009 if (op == unknown_optab
1010 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1010, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing)
1011 return NULL_TREE(tree) nullptr;
1012 return gimplify_build2 (gsi, MINUS_EXPR, type, op0, tem);
1013}
1014
1015/* Expand a vector condition to scalars, by using many conditions
1016 on the vector's elements. */
1017
1018static bool
1019expand_vector_condition (gimple_stmt_iterator *gsi, bitmap dce_ssa_names)
1020{
1021 gassign *stmt = as_a <gassign *> (gsi_stmt (*gsi));
1022 tree type = TREE_TYPE (gimple_assign_lhs (stmt))((contains_struct_check ((gimple_assign_lhs (stmt)), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1022, __FUNCTION__))->typed.type)
;
1023 tree a = gimple_assign_rhs1 (stmt);
1024 tree a1 = a;
1025 tree a2 = NULL_TREE(tree) nullptr;
1026 bool a_is_comparison = false;
1027 bool a_is_scalar_bitmask = false;
1028 tree b = gimple_assign_rhs2 (stmt);
1029 tree c = gimple_assign_rhs3 (stmt);
1030 vec<constructor_elt, va_gc> *v;
1031 tree constr;
1032 tree inner_type = TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1032, __FUNCTION__))->typed.type)
;
1033 tree width = vector_element_bits_tree (type);
1034 tree cond_type = TREE_TYPE (TREE_TYPE (a))((contains_struct_check ((((contains_struct_check ((a), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1034, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1034, __FUNCTION__))->typed.type)
;
1035 tree comp_inner_type = cond_type;
1036 tree index = bitsize_int (0)size_int_kind (0, stk_bitsizetype);
1037 tree comp_width = width;
1038 tree comp_index = index;
1039 location_t loc = gimple_location (gsi_stmt (*gsi));
1040 tree_code code = TREE_CODE (a)((enum tree_code) (a)->base.code);
1041 gassign *assign = NULLnullptr;
1042
1043 if (code == SSA_NAME)
1044 {
1045 assign = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (a)(tree_check ((a), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1045, __FUNCTION__, (SSA_NAME)))->ssa_name.def_stmt
);
1046 if (assign != NULLnullptr
1047 && TREE_CODE_CLASS (gimple_assign_rhs_code (assign))tree_code_type_tmpl <0>::tree_code_type[(int) (gimple_assign_rhs_code
(assign))]
== tcc_comparison)
1048 {
1049 a_is_comparison = true;
1050 a1 = gimple_assign_rhs1 (assign);
1051 a2 = gimple_assign_rhs2 (assign);
1052 code = gimple_assign_rhs_code (assign);
1053 comp_inner_type = TREE_TYPE (TREE_TYPE (a1))((contains_struct_check ((((contains_struct_check ((a1), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1053, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1053, __FUNCTION__))->typed.type)
;
1054 comp_width = vector_element_bits_tree (TREE_TYPE (a1)((contains_struct_check ((a1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1054, __FUNCTION__))->typed.type)
);
1055 }
1056 }
1057
1058 if (expand_vec_cond_expr_p (type, TREE_TYPE (a1)((contains_struct_check ((a1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1058, __FUNCTION__))->typed.type)
, code)
1059 || (integer_all_onesp (b) && integer_zerop (c)
1060 && expand_vec_cmp_expr_p (type, TREE_TYPE (a1)((contains_struct_check ((a1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1060, __FUNCTION__))->typed.type)
, code)))
1061 {
1062 gcc_assert (TREE_CODE (a) == SSA_NAME || TREE_CODE (a) == VECTOR_CST)((void)(!(((enum tree_code) (a)->base.code) == SSA_NAME ||
((enum tree_code) (a)->base.code) == VECTOR_CST) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1062, __FUNCTION__), 0 : 0))
;
1063 return true;
1064 }
1065
1066 /* If a has vector boolean type and is a comparison, above
1067 expand_vec_cond_expr_p might fail, even if both the comparison and
1068 VEC_COND_EXPR could be supported individually. See PR109176. */
1069 if (a_is_comparison
1070 && VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (a))(((enum tree_code) (((contains_struct_check ((a), (TS_TYPED),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1070, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
&& ((enum tree_code) (((contains_struct_check ((((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1070, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1070, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
)
1071 && expand_vec_cond_expr_p (type, TREE_TYPE (a)((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1071, __FUNCTION__))->typed.type)
, SSA_NAME)
1072 && expand_vec_cmp_expr_p (TREE_TYPE (a1)((contains_struct_check ((a1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1072, __FUNCTION__))->typed.type)
, TREE_TYPE (a)((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1072, __FUNCTION__))->typed.type)
, code))
1073 return true;
1074
1075 /* Handle vector boolean types with bitmasks. If there is a comparison
1076 and we can expand the comparison into the vector boolean bitmask,
1077 or otherwise if it is compatible with type, we can transform
1078 vbfld_1 = x_2 < y_3 ? vbfld_4 : vbfld_5;
1079 into
1080 tmp_6 = x_2 < y_3;
1081 tmp_7 = tmp_6 & vbfld_4;
1082 tmp_8 = ~tmp_6;
1083 tmp_9 = tmp_8 & vbfld_5;
1084 vbfld_1 = tmp_7 | tmp_9;
1085 Similarly for vbfld_10 instead of x_2 < y_3. */
1086 if (VECTOR_BOOLEAN_TYPE_P (type)(((enum tree_code) (type)->base.code) == VECTOR_TYPE &&
((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1086, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
)
1087 && SCALAR_INT_MODE_P (TYPE_MODE (type))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1087, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_INT || ((enum
mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1087, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_PARTIAL_INT)
1088 && known_lt (GET_MODE_BITSIZE (TYPE_MODE (type)),(!maybe_le (TYPE_VECTOR_SUBPARTS (type) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1090, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1090, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1088, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode))))
1089 TYPE_VECTOR_SUBPARTS (type)(!maybe_le (TYPE_VECTOR_SUBPARTS (type) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1090, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1090, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1088, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode))))
1090 * GET_MODE_BITSIZE (SCALAR_TYPE_MODE (TREE_TYPE (type))))(!maybe_le (TYPE_VECTOR_SUBPARTS (type) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1090, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1090, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((type), (tcc_type),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1088, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode))))
1091 && (a_is_comparison
1092 ? useless_type_conversion_p (type, TREE_TYPE (a)((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1092, __FUNCTION__))->typed.type)
)
1093 : expand_vec_cmp_expr_p (TREE_TYPE (a1)((contains_struct_check ((a1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1093, __FUNCTION__))->typed.type)
, type, TREE_CODE (a)((enum tree_code) (a)->base.code))))
1094 {
1095 if (a_is_comparison)
1096 a = gimplify_build2 (gsi, code, type, a1, a2);
1097 a1 = gimplify_build2 (gsi, BIT_AND_EXPR, type, a, b);
1098 a2 = gimplify_build1 (gsi, BIT_NOT_EXPR, type, a);
1099 a2 = gimplify_build2 (gsi, BIT_AND_EXPR, type, a2, c);
1100 a = gimplify_build2 (gsi, BIT_IOR_EXPR, type, a1, a2);
1101 gimple_assign_set_rhs_from_tree (gsi, a);
1102 update_stmt (gsi_stmt (*gsi));
1103 return true;
1104 }
1105
1106 /* TODO: try and find a smaller vector type. */
1107
1108 if (!warning_suppressed_p (stmt, OPT_Wvector_operation_performance))
1109 warning_at (loc, OPT_Wvector_operation_performance,
1110 "vector condition will be expanded piecewise");
1111
1112 if (!a_is_comparison
1113 && VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (a))(((enum tree_code) (((contains_struct_check ((a), (TS_TYPED),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1113, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
&& ((enum tree_code) (((contains_struct_check ((((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1113, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1113, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
)
1114 && SCALAR_INT_MODE_P (TYPE_MODE (TREE_TYPE (a)))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1114, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1114, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1114, __FUNCTION__))->typed.type)) : (((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1114, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_INT || ((enum mode_class) mode_class[((((enum tree_code
) ((tree_class_check ((((contains_struct_check ((a), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1114, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1114, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1114, __FUNCTION__))->typed.type)) : (((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1114, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_PARTIAL_INT)
1115 && known_lt (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (a))),(!maybe_le (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((a
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1116, __FUNCTION__))->typed.type)) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type)) : (((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type))->type_common.mode)
)))
1116 TYPE_VECTOR_SUBPARTS (TREE_TYPE (a))(!maybe_le (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((a
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1116, __FUNCTION__))->typed.type)) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type)) : (((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type))->type_common.mode)
)))
1117 * GET_MODE_BITSIZE (SCALAR_TYPE_MODE(!maybe_le (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((a
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1116, __FUNCTION__))->typed.type)) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type)) : (((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type))->type_common.mode)
)))
1118 (TREE_TYPE (TREE_TYPE (a)))))(!maybe_le (TYPE_VECTOR_SUBPARTS (((contains_struct_check ((a
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1116, __FUNCTION__))->typed.type)) * GET_MODE_BITSIZE ((
as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1118, __FUNCTION__))->type_common.mode))), GET_MODE_BITSIZE
(((((enum tree_code) ((tree_class_check ((((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type)) : (((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1115, __FUNCTION__))->typed.type))->type_common.mode)
)))
)
1119 {
1120 a_is_scalar_bitmask = true;
1121 int prec = GET_MODE_PRECISION (SCALAR_TYPE_MODE (TREE_TYPE (a))(as_a <scalar_mode> ((tree_class_check ((((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1121, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1121, __FUNCTION__))->type_common.mode))
);
1122 tree atype = build_nonstandard_integer_type (prec, 1);
1123 a = gimplify_build1 (gsi, VIEW_CONVERT_EXPR, atype, a);
1124 }
1125 else if (!a_is_comparison
1126 && VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (a))(((enum tree_code) (((contains_struct_check ((a), (TS_TYPED),
"/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1126, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
&& ((enum tree_code) (((contains_struct_check ((((contains_struct_check
((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1126, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1126, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
)
)
1127 comp_width = vector_element_bits_tree (TREE_TYPE (a)((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1127, __FUNCTION__))->typed.type)
);
1128
1129 int nunits = nunits_for_known_piecewise_op (type);
1130 vec_alloc (v, nunits);
1131 bool constant_p = true;
1132 for (int i = 0; i < nunits; i++)
1133 {
1134 tree aa, result;
1135 tree bb = tree_vec_extract (gsi, inner_type, b, width, index);
1136 tree cc = tree_vec_extract (gsi, inner_type, c, width, index);
1137 if (a_is_comparison)
1138 {
1139 tree aa1 = tree_vec_extract (gsi, comp_inner_type, a1,
1140 comp_width, comp_index);
1141 tree aa2 = tree_vec_extract (gsi, comp_inner_type, a2,
1142 comp_width, comp_index);
1143 aa = gimplify_build2 (gsi, code, cond_type, aa1, aa2);
1144 }
1145 else if (a_is_scalar_bitmask)
1146 {
1147 wide_int w = wi::set_bit_in_zero (i, TYPE_PRECISION (TREE_TYPE (a))((tree_class_check ((((contains_struct_check ((a), (TS_TYPED)
, "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1147, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1147, __FUNCTION__))->type_common.precision)
);
1148 result = gimplify_build2 (gsi, BIT_AND_EXPR, TREE_TYPE (a)((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1148, __FUNCTION__))->typed.type)
,
1149 a, wide_int_to_tree (TREE_TYPE (a)((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1149, __FUNCTION__))->typed.type)
, w));
1150 aa = gimplify_build2 (gsi, NE_EXPR, boolean_type_nodeglobal_trees[TI_BOOLEAN_TYPE], result,
1151 build_zero_cst (TREE_TYPE (a)((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1151, __FUNCTION__))->typed.type)
));
1152 }
1153 else
1154 aa = tree_vec_extract (gsi, cond_type, a, comp_width, comp_index);
1155 result = gimplify_build3 (gsi, COND_EXPR, inner_type, aa, bb, cc);
1156 if (!CONSTANT_CLASS_P (result)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (result)->base.code))] == tcc_constant)
)
1157 constant_p = false;
1158 constructor_elt ce = {NULL_TREE(tree) nullptr, result};
1159 v->quick_push (ce);
1160 index = int_const_binop (PLUS_EXPR, index, width);
1161 if (width == comp_width)
1162 comp_index = index;
1163 else
1164 comp_index = int_const_binop (PLUS_EXPR, comp_index, comp_width);
1165 }
1166
1167 if (constant_p)
1168 constr = build_vector_from_ctor (type, v);
1169 else
1170 constr = build_constructor (type, v);
1171 gimple_assign_set_rhs_from_tree (gsi, constr);
1172 update_stmt (gsi_stmt (*gsi));
1173
1174 if (a_is_comparison)
1175 bitmap_set_bit (dce_ssa_names,
1176 SSA_NAME_VERSION (gimple_assign_lhs (assign))(tree_check ((gimple_assign_lhs (assign)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1176, __FUNCTION__, (SSA_NAME)))->base.u.version
);
1177
1178 return false;
1179}
1180
1181static tree
1182expand_vector_operation (gimple_stmt_iterator *gsi, tree type, tree compute_type,
1183 gassign *assign, enum tree_code code,
1184 bitmap dce_ssa_names)
1185{
1186 machine_mode compute_mode = TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1186, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
;
1187
1188 /* If the compute mode is not a vector mode (hence we are not decomposing
1189 a BLKmode vector to smaller, hardware-supported vectors), we may want
1190 to expand the operations in parallel. */
1191 if (!VECTOR_MODE_P (compute_mode)(((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_BOOL
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_INT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_FLOAT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_FRACT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_UFRACT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_ACCUM
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_UACCUM
)
)
1192 switch (code)
1193 {
1194 case PLUS_EXPR:
1195 case MINUS_EXPR:
1196 if (ANY_INTEGRAL_TYPE_P (type)((((enum tree_code) (type)->base.code) == ENUMERAL_TYPE ||
((enum tree_code) (type)->base.code) == BOOLEAN_TYPE || (
(enum tree_code) (type)->base.code) == INTEGER_TYPE) || ((
((enum tree_code) (type)->base.code) == COMPLEX_TYPE || ((
(enum tree_code) (type)->base.code) == VECTOR_TYPE)) &&
(((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1196, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE
|| ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1196, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
|| ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1196, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)))
&& !TYPE_OVERFLOW_TRAPS (type)(!(any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1196, __FUNCTION__))->base.u.bits.unsigned_flag &&
global_options.x_flag_trapv)
)
1197 return expand_vector_addition (gsi, do_binop, do_plus_minus, type,
1198 gimple_assign_rhs1 (assign),
1199 gimple_assign_rhs2 (assign), code);
1200 break;
1201
1202 case NEGATE_EXPR:
1203 if (ANY_INTEGRAL_TYPE_P (type)((((enum tree_code) (type)->base.code) == ENUMERAL_TYPE ||
((enum tree_code) (type)->base.code) == BOOLEAN_TYPE || (
(enum tree_code) (type)->base.code) == INTEGER_TYPE) || ((
((enum tree_code) (type)->base.code) == COMPLEX_TYPE || ((
(enum tree_code) (type)->base.code) == VECTOR_TYPE)) &&
(((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1203, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE
|| ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1203, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
|| ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1203, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)))
&& !TYPE_OVERFLOW_TRAPS (type)(!(any_integral_type_check ((type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1203, __FUNCTION__))->base.u.bits.unsigned_flag &&
global_options.x_flag_trapv)
)
1204 return expand_vector_addition (gsi, do_unop, do_negate, type,
1205 gimple_assign_rhs1 (assign),
1206 NULL_TREE(tree) nullptr, code);
1207 break;
1208
1209 case BIT_AND_EXPR:
1210 case BIT_IOR_EXPR:
1211 case BIT_XOR_EXPR:
1212 return expand_vector_parallel (gsi, do_binop, type,
1213 gimple_assign_rhs1 (assign),
1214 gimple_assign_rhs2 (assign), code);
1215
1216 case BIT_NOT_EXPR:
1217 return expand_vector_parallel (gsi, do_unop, type,
1218 gimple_assign_rhs1 (assign),
1219 NULL_TREE(tree) nullptr, code);
1220 case EQ_EXPR:
1221 case NE_EXPR:
1222 case GT_EXPR:
1223 case LT_EXPR:
1224 case GE_EXPR:
1225 case LE_EXPR:
1226 case UNEQ_EXPR:
1227 case UNGT_EXPR:
1228 case UNLT_EXPR:
1229 case UNGE_EXPR:
1230 case UNLE_EXPR:
1231 case LTGT_EXPR:
1232 case ORDERED_EXPR:
1233 case UNORDERED_EXPR:
1234 {
1235 tree rhs1 = gimple_assign_rhs1 (assign);
1236 tree rhs2 = gimple_assign_rhs2 (assign);
1237
1238 return expand_vector_comparison (gsi, type, rhs1, rhs2, code,
1239 dce_ssa_names);
1240 }
1241
1242 case TRUNC_DIV_EXPR:
1243 case TRUNC_MOD_EXPR:
1244 {
1245 tree rhs1 = gimple_assign_rhs1 (assign);
1246 tree rhs2 = gimple_assign_rhs2 (assign);
1247 tree ret;
1248
1249 if (!optimizeglobal_options.x_optimize
1250 || !VECTOR_INTEGER_TYPE_P (type)((((enum tree_code) (type)->base.code) == VECTOR_TYPE) &&
((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1250, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
1251 || TREE_CODE (rhs2)((enum tree_code) (rhs2)->base.code) != VECTOR_CST
1252 || !VECTOR_MODE_P (TYPE_MODE (type))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1252, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_BOOL ||
((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1252, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_INT ||
((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1252, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_FLOAT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1252, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_FRACT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1252, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_UFRACT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1252, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_ACCUM
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1252, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_UACCUM
)
)
1253 break;
1254
1255 ret = expand_vector_divmod (gsi, type, rhs1, rhs2, code);
1256 if (ret != NULL_TREE(tree) nullptr)
1257 return ret;
1258 break;
1259 }
1260
1261 default:
1262 break;
1263 }
1264
1265 if (TREE_CODE_CLASS (code)tree_code_type_tmpl <0>::tree_code_type[(int) (code)] == tcc_unary)
1266 return expand_vector_piecewise (gsi, do_unop, type, compute_type,
1267 gimple_assign_rhs1 (assign),
1268 NULL_TREE(tree) nullptr, code, false);
1269 else
1270 return expand_vector_piecewise (gsi, do_binop, type, compute_type,
1271 gimple_assign_rhs1 (assign),
1272 gimple_assign_rhs2 (assign), code, false);
1273}
1274
1275/* Try to optimize
1276 a_5 = { b_7, b_7 + 3, b_7 + 6, b_7 + 9 };
1277 style stmts into:
1278 _9 = { b_7, b_7, b_7, b_7 };
1279 a_5 = _9 + { 0, 3, 6, 9 };
1280 because vector splat operation is usually more efficient
1281 than piecewise initialization of the vector. */
1282
1283static void
1284optimize_vector_constructor (gimple_stmt_iterator *gsi)
1285{
1286 gassign *stmt = as_a <gassign *> (gsi_stmt (*gsi));
1287 tree lhs = gimple_assign_lhs (stmt);
1288 tree rhs = gimple_assign_rhs1 (stmt);
1289 tree type = TREE_TYPE (rhs)((contains_struct_check ((rhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1289, __FUNCTION__))->typed.type)
;
1290 unsigned int i, j;
1291 unsigned HOST_WIDE_INTlong nelts;
1292 bool all_same = true;
1293 constructor_elt *elt;
1294 gimple *g;
1295 tree base = NULL_TREE(tree) nullptr;
1296 optab op;
1297
1298 if (!TYPE_VECTOR_SUBPARTS (type).is_constant (&nelts)
1299 || nelts <= 2
1300 || CONSTRUCTOR_NELTS (rhs)(vec_safe_length (((tree_check ((rhs), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1300, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)))
!= nelts)
1301 return;
1302 op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
1303 if (op == unknown_optab
1304 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1304, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing)
1305 return;
1306 FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (rhs), i, elt)for (i = 0; vec_safe_iterate ((((tree_check ((rhs), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1306, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)),
(i), &(elt)); ++(i))
1307 if (TREE_CODE (elt->value)((enum tree_code) (elt->value)->base.code) != SSA_NAME
1308 || TREE_CODE (TREE_TYPE (elt->value))((enum tree_code) (((contains_struct_check ((elt->value), (
TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1308, __FUNCTION__))->typed.type))->base.code)
== VECTOR_TYPE)
1309 return;
1310 else
1311 {
1312 tree this_base = elt->value;
1313 if (this_base != CONSTRUCTOR_ELT (rhs, 0)(&(*((tree_check ((rhs), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1313, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))[
0])
->value)
1314 all_same = false;
1315 for (j = 0; j < nelts + 1; j++)
1316 {
1317 g = SSA_NAME_DEF_STMT (this_base)(tree_check ((this_base), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1317, __FUNCTION__, (SSA_NAME)))->ssa_name.def_stmt
;
1318 if (is_gimple_assign (g)
1319 && gimple_assign_rhs_code (g) == PLUS_EXPR
1320 && TREE_CODE (gimple_assign_rhs2 (g))((enum tree_code) (gimple_assign_rhs2 (g))->base.code) == INTEGER_CST
1321 && TREE_CODE (gimple_assign_rhs1 (g))((enum tree_code) (gimple_assign_rhs1 (g))->base.code) == SSA_NAME
1322 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_assign_rhs1 (g))(tree_check ((gimple_assign_rhs1 (g)), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1322, __FUNCTION__, (SSA_NAME)))->base.asm_written_flag
)
1323 this_base = gimple_assign_rhs1 (g);
1324 else
1325 break;
1326 }
1327 if (i == 0)
1328 base = this_base;
1329 else if (this_base != base)
1330 return;
1331 }
1332 if (all_same)
1333 return;
1334 tree_vector_builder cst (type, nelts, 1);
1335 for (i = 0; i < nelts; i++)
1336 {
1337 tree this_base = CONSTRUCTOR_ELT (rhs, i)(&(*((tree_check ((rhs), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1337, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))[
i])
->value;
1338 tree elt = build_zero_cst (TREE_TYPE (base)((contains_struct_check ((base), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1338, __FUNCTION__))->typed.type)
);
1339 while (this_base != base)
1340 {
1341 g = SSA_NAME_DEF_STMT (this_base)(tree_check ((this_base), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1341, __FUNCTION__, (SSA_NAME)))->ssa_name.def_stmt
;
1342 elt = fold_binary (PLUS_EXPR, TREE_TYPE (base),fold_binary_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check
((base), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1342, __FUNCTION__))->typed.type), elt, gimple_assign_rhs2
(g))
1343 elt, gimple_assign_rhs2 (g))fold_binary_loc (((location_t) 0), PLUS_EXPR, ((contains_struct_check
((base), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1342, __FUNCTION__))->typed.type), elt, gimple_assign_rhs2
(g))
;
1344 if (elt == NULL_TREE(tree) nullptr
1345 || TREE_CODE (elt)((enum tree_code) (elt)->base.code) != INTEGER_CST
1346 || TREE_OVERFLOW (elt)((tree_class_check ((elt), (tcc_constant), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1346, __FUNCTION__))->base.public_flag)
)
1347 return;
1348 this_base = gimple_assign_rhs1 (g);
1349 }
1350 cst.quick_push (elt);
1351 }
1352 for (i = 0; i < nelts; i++)
1353 CONSTRUCTOR_ELT (rhs, i)(&(*((tree_check ((rhs), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1353, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))[
i])
->value = base;
1354 g = gimple_build_assign (make_ssa_name (type), rhs);
1355 gsi_insert_before (gsi, g, GSI_SAME_STMT);
1356 g = gimple_build_assign (lhs, PLUS_EXPR, gimple_assign_lhs (g),
1357 cst.build ());
1358 gsi_replace (gsi, g, false);
1359}
1360
1361/* Return a type for the widest vector mode whose components are of type
1362 TYPE, or NULL_TREE if none is found. */
1363
1364static tree
1365type_for_widest_vector_mode (tree type, optab op)
1366{
1367 machine_mode inner_mode = TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1367, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
;
1368 machine_mode best_mode = VOIDmode((void) 0, E_VOIDmode), mode;
1369 poly_int64 best_nunits = 0;
1370
1371 if (SCALAR_FLOAT_MODE_P (inner_mode)(((enum mode_class) mode_class[inner_mode]) == MODE_FLOAT || (
(enum mode_class) mode_class[inner_mode]) == MODE_DECIMAL_FLOAT
)
)
1372 mode = MIN_MODE_VECTOR_FLOAT;
1373 else if (SCALAR_FRACT_MODE_P (inner_mode)(((enum mode_class) mode_class[inner_mode]) == MODE_FRACT))
1374 mode = MIN_MODE_VECTOR_FRACT;
1375 else if (SCALAR_UFRACT_MODE_P (inner_mode)(((enum mode_class) mode_class[inner_mode]) == MODE_UFRACT))
1376 mode = MIN_MODE_VECTOR_UFRACT;
1377 else if (SCALAR_ACCUM_MODE_P (inner_mode)(((enum mode_class) mode_class[inner_mode]) == MODE_ACCUM))
1378 mode = MIN_MODE_VECTOR_ACCUM;
1379 else if (SCALAR_UACCUM_MODE_P (inner_mode)(((enum mode_class) mode_class[inner_mode]) == MODE_UACCUM))
1380 mode = MIN_MODE_VECTOR_UACCUM;
1381 else if (inner_mode == BImode(scalar_int_mode ((scalar_int_mode::from_int) E_BImode)))
1382 mode = MIN_MODE_VECTOR_BOOL;
1383 else
1384 mode = MIN_MODE_VECTOR_INT;
1385
1386 FOR_EACH_MODE_FROM (mode, mode)for ((mode) = (mode); mode_iterator::iterate_p (&(mode));
mode_iterator::get_next (&(mode)))
1387 if (GET_MODE_INNER (mode)(mode_to_inner (mode)) == inner_mode
1388 && maybe_gt (GET_MODE_NUNITS (mode), best_nunits)maybe_lt (best_nunits, GET_MODE_NUNITS (mode))
1389 && optab_handler (op, mode) != CODE_FOR_nothing)
1390 best_mode = mode, best_nunits = GET_MODE_NUNITS (mode);
1391
1392 if (best_mode == VOIDmode((void) 0, E_VOIDmode))
1393 return NULL_TREE(tree) nullptr;
1394 else
1395 return build_vector_type_for_mode (type, best_mode);
1396}
1397
1398
1399/* Build a reference to the element of the vector VECT. Function
1400 returns either the element itself, either BIT_FIELD_REF, or an
1401 ARRAY_REF expression.
1402
1403 GSI is required to insert temporary variables while building a
1404 refernece to the element of the vector VECT.
1405
1406 PTMPVEC is a pointer to the temporary variable for caching
1407 purposes. In case when PTMPVEC is NULL new temporary variable
1408 will be created. */
1409static tree
1410vector_element (gimple_stmt_iterator *gsi, tree vect, tree idx, tree *ptmpvec)
1411{
1412 tree vect_type, vect_elt_type;
1413 gimple *asgn;
1414 tree tmpvec;
1415 tree arraytype;
1416 bool need_asgn = true;
1417 unsigned int elements;
1418
1419 vect_type = TREE_TYPE (vect)((contains_struct_check ((vect), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1419, __FUNCTION__))->typed.type)
;
1420 vect_elt_type = TREE_TYPE (vect_type)((contains_struct_check ((vect_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1420, __FUNCTION__))->typed.type)
;
1421 elements = nunits_for_known_piecewise_op (vect_type);
1422
1423 if (TREE_CODE (idx)((enum tree_code) (idx)->base.code) == INTEGER_CST)
1424 {
1425 unsigned HOST_WIDE_INTlong index;
1426
1427 /* Given that we're about to compute a binary modulus,
1428 we don't care about the high bits of the value. */
1429 index = TREE_INT_CST_LOW (idx)((unsigned long) (*tree_int_cst_elt_check ((idx), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1429, __FUNCTION__)))
;
1430 if (!tree_fits_uhwi_p (idx) || index >= elements)
1431 {
1432 index &= elements - 1;
1433 idx = build_int_cst (TREE_TYPE (idx)((contains_struct_check ((idx), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1433, __FUNCTION__))->typed.type)
, index);
1434 }
1435
1436 /* When lowering a vector statement sequence do some easy
1437 simplification by looking through intermediate vector results. */
1438 if (TREE_CODE (vect)((enum tree_code) (vect)->base.code) == SSA_NAME)
1439 {
1440 gimple *def_stmt = SSA_NAME_DEF_STMT (vect)(tree_check ((vect), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1440, __FUNCTION__, (SSA_NAME)))->ssa_name.def_stmt
;
1441 if (is_gimple_assign (def_stmt)
1442 && (gimple_assign_rhs_code (def_stmt) == VECTOR_CST
1443 || gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR))
1444 vect = gimple_assign_rhs1 (def_stmt);
1445 }
1446
1447 if (TREE_CODE (vect)((enum tree_code) (vect)->base.code) == VECTOR_CST)
1448 return VECTOR_CST_ELT (vect, index)vector_cst_elt (vect, index);
1449 else if (TREE_CODE (vect)((enum tree_code) (vect)->base.code) == CONSTRUCTOR
1450 && (CONSTRUCTOR_NELTS (vect)(vec_safe_length (((tree_check ((vect), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1450, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)))
== 0
1451 || TREE_CODE (TREE_TYPE (CONSTRUCTOR_ELT (vect, 0)->value))((enum tree_code) (((contains_struct_check (((&(*((tree_check
((vect), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1451, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))[
0])->value), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1451, __FUNCTION__))->typed.type))->base.code)
1452 != VECTOR_TYPE))
1453 {
1454 if (index < CONSTRUCTOR_NELTS (vect)(vec_safe_length (((tree_check ((vect), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1454, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts)))
)
1455 return CONSTRUCTOR_ELT (vect, index)(&(*((tree_check ((vect), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1455, __FUNCTION__, (CONSTRUCTOR)))->constructor.elts))[
index])
->value;
1456 return build_zero_cst (vect_elt_type);
1457 }
1458 else
1459 {
1460 tree size = vector_element_bits_tree (vect_type);
1461 tree pos = fold_build2 (MULT_EXPR, bitsizetype, bitsize_int (index),fold_build2_loc (((location_t) 0), MULT_EXPR, sizetype_tab[(int
) stk_bitsizetype], size_int_kind (index, stk_bitsizetype), size
)
1462 size)fold_build2_loc (((location_t) 0), MULT_EXPR, sizetype_tab[(int
) stk_bitsizetype], size_int_kind (index, stk_bitsizetype), size
)
;
1463 return fold_build3 (BIT_FIELD_REF, vect_elt_type, vect, size, pos)fold_build3_loc (((location_t) 0), BIT_FIELD_REF, vect_elt_type
, vect, size, pos )
;
1464 }
1465 }
1466
1467 if (!ptmpvec)
1468 tmpvec = create_tmp_var (vect_type, "vectmp");
1469 else if (!*ptmpvec)
1470 tmpvec = *ptmpvec = create_tmp_var (vect_type, "vectmp");
1471 else
1472 {
1473 tmpvec = *ptmpvec;
1474 need_asgn = false;
1475 }
1476
1477 if (need_asgn)
1478 {
1479 TREE_ADDRESSABLE (tmpvec)((tmpvec)->base.addressable_flag) = 1;
1480 asgn = gimple_build_assign (tmpvec, vect);
1481 gsi_insert_before (gsi, asgn, GSI_SAME_STMT);
1482 }
1483
1484 arraytype = build_array_type_nelts (vect_elt_type, elements);
1485 return build4 (ARRAY_REF, vect_elt_type,
1486 build1 (VIEW_CONVERT_EXPR, arraytype, tmpvec),
1487 idx, NULL_TREE(tree) nullptr, NULL_TREE(tree) nullptr);
1488}
1489
1490/* Check if VEC_PERM_EXPR within the given setting is supported
1491 by hardware, or lower it piecewise.
1492
1493 When VEC_PERM_EXPR has the same first and second operands:
1494 VEC_PERM_EXPR <v0, v0, mask> the lowered version would be
1495 {v0[mask[0]], v0[mask[1]], ...}
1496 MASK and V0 must have the same number of elements.
1497
1498 Otherwise VEC_PERM_EXPR <v0, v1, mask> is lowered to
1499 {mask[0] < len(v0) ? v0[mask[0]] : v1[mask[0]], ...}
1500 V0 and V1 must have the same type. MASK, V0, V1 must have the
1501 same number of arguments. */
1502
1503static void
1504lower_vec_perm (gimple_stmt_iterator *gsi)
1505{
1506 gassign *stmt = as_a <gassign *> (gsi_stmt (*gsi));
1507 tree mask = gimple_assign_rhs3 (stmt);
1508 tree vec0 = gimple_assign_rhs1 (stmt);
1509 tree vec1 = gimple_assign_rhs2 (stmt);
1510 tree vect_type = TREE_TYPE (vec0)((contains_struct_check ((vec0), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1510, __FUNCTION__))->typed.type)
;
1511 tree mask_type = TREE_TYPE (mask)((contains_struct_check ((mask), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1511, __FUNCTION__))->typed.type)
;
1512 tree vect_elt_type = TREE_TYPE (vect_type)((contains_struct_check ((vect_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1512, __FUNCTION__))->typed.type)
;
1513 tree mask_elt_type = TREE_TYPE (mask_type)((contains_struct_check ((mask_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1513, __FUNCTION__))->typed.type)
;
1514 unsigned HOST_WIDE_INTlong elements;
1515 vec<constructor_elt, va_gc> *v;
1516 tree constr, t, si, i_val;
1517 tree vec0tmp = NULL_TREE(tree) nullptr, vec1tmp = NULL_TREE(tree) nullptr, masktmp = NULL_TREE(tree) nullptr;
1518 bool two_operand_p = !operand_equal_p (vec0, vec1, 0);
1519 location_t loc = gimple_location (gsi_stmt (*gsi));
1520 unsigned i;
1521
1522 if (!TYPE_VECTOR_SUBPARTS (vect_type).is_constant (&elements))
1523 return;
1524
1525 if (TREE_CODE (mask)((enum tree_code) (mask)->base.code) == SSA_NAME)
1526 {
1527 gimple *def_stmt = SSA_NAME_DEF_STMT (mask)(tree_check ((mask), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1527, __FUNCTION__, (SSA_NAME)))->ssa_name.def_stmt
;
1528 if (is_gimple_assign (def_stmt)
1529 && gimple_assign_rhs_code (def_stmt) == VECTOR_CST)
1530 mask = gimple_assign_rhs1 (def_stmt);
1531 }
1532
1533 vec_perm_builder sel_int;
1534
1535 if (TREE_CODE (mask)((enum tree_code) (mask)->base.code) == VECTOR_CST
1536 && tree_to_vec_perm_builder (&sel_int, mask))
1537 {
1538 vec_perm_indices indices (sel_int, 2, elements);
1539 machine_mode vmode = TYPE_MODE (vect_type)((((enum tree_code) ((tree_class_check ((vect_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1539, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vect_type) : (vect_type)->type_common.mode)
;
1540 tree lhs_type = TREE_TYPE (gimple_assign_lhs (stmt))((contains_struct_check ((gimple_assign_lhs (stmt)), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1540, __FUNCTION__))->typed.type)
;
1541 machine_mode lhs_mode = TYPE_MODE (lhs_type)((((enum tree_code) ((tree_class_check ((lhs_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1541, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(lhs_type) : (lhs_type)->type_common.mode)
;
1542 if (can_vec_perm_const_p (lhs_mode, vmode, indices))
1543 {
1544 gimple_assign_set_rhs3 (stmt, mask);
1545 update_stmt (stmt);
1546 return;
1547 }
1548 /* Also detect vec_shr pattern - VEC_PERM_EXPR with zero
1549 vector as VEC1 and a right element shift MASK. */
1550 if (optab_handler (vec_shr_optab, TYPE_MODE (vect_type)((((enum tree_code) ((tree_class_check ((vect_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1550, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vect_type) : (vect_type)->type_common.mode)
)
1551 != CODE_FOR_nothing
1552 && TREE_CODE (vec1)((enum tree_code) (vec1)->base.code) == VECTOR_CST
1553 && initializer_zerop (vec1)
1554 && maybe_ne (indices[0], 0)
1555 && known_lt (poly_uint64 (indices[0]), elements)(!maybe_le (elements, poly_uint64 (indices[0]))))
1556 {
1557 bool ok_p = indices.series_p (0, 1, indices[0], 1);
1558 if (!ok_p)
1559 {
1560 for (i = 1; i < elements; ++i)
1561 {
1562 poly_uint64 actual = indices[i];
1563 poly_uint64 expected = i + indices[0];
1564 /* Indices into the second vector are all equivalent. */
1565 if (maybe_lt (actual, elements)
1566 ? maybe_ne (actual, expected)
1567 : maybe_lt (expected, elements))
1568 break;
1569 }
1570 ok_p = i == elements;
1571 }
1572 if (ok_p)
1573 {
1574 gimple_assign_set_rhs3 (stmt, mask);
1575 update_stmt (stmt);
1576 return;
1577 }
1578 }
1579 /* And similarly vec_shl pattern. */
1580 if (optab_handler (vec_shl_optab, TYPE_MODE (vect_type)((((enum tree_code) ((tree_class_check ((vect_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1580, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vect_type) : (vect_type)->type_common.mode)
)
1581 != CODE_FOR_nothing
1582 && TREE_CODE (vec0)((enum tree_code) (vec0)->base.code) == VECTOR_CST
1583 && initializer_zerop (vec0))
1584 {
1585 unsigned int first = 0;
1586 for (i = 0; i < elements; ++i)
1587 if (known_eq (poly_uint64 (indices[i]), elements)(!maybe_ne (poly_uint64 (indices[i]), elements)))
1588 {
1589 if (i == 0 || first)
1590 break;
1591 first = i;
1592 }
1593 else if (first
1594 ? maybe_ne (poly_uint64 (indices[i]),
1595 elements + i - first)
1596 : maybe_ge (poly_uint64 (indices[i]), elements)maybe_le (elements, poly_uint64 (indices[i])))
1597 break;
1598 if (first && i == elements)
1599 {
1600 gimple_assign_set_rhs3 (stmt, mask);
1601 update_stmt (stmt);
1602 return;
1603 }
1604 }
1605 }
1606 else if (can_vec_perm_var_p (TYPE_MODE (vect_type)((((enum tree_code) ((tree_class_check ((vect_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1606, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vect_type) : (vect_type)->type_common.mode)
))
1607 return;
1608
1609 if (!warning_suppressed_p (stmt, OPT_Wvector_operation_performance))
1610 warning_at (loc, OPT_Wvector_operation_performance,
1611 "vector shuffling operation will be expanded piecewise");
1612
1613 vec_alloc (v, elements);
1614 bool constant_p = true;
1615 for (i = 0; i < elements; i++)
1616 {
1617 si = size_int (i)size_int_kind (i, stk_sizetype);
1618 i_val = vector_element (gsi, mask, si, &masktmp);
1619
1620 if (TREE_CODE (i_val)((enum tree_code) (i_val)->base.code) == INTEGER_CST)
1621 {
1622 unsigned HOST_WIDE_INTlong index;
1623
1624 index = TREE_INT_CST_LOW (i_val)((unsigned long) (*tree_int_cst_elt_check ((i_val), (0), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1624, __FUNCTION__)))
;
1625 if (!tree_fits_uhwi_p (i_val) || index >= elements)
1626 i_val = build_int_cst (mask_elt_type, index & (elements - 1));
1627
1628 if (two_operand_p && (index & elements) != 0)
1629 t = vector_element (gsi, vec1, i_val, &vec1tmp);
1630 else
1631 t = vector_element (gsi, vec0, i_val, &vec0tmp);
1632
1633 t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE(tree) nullptr,
1634 true, GSI_SAME_STMT);
1635 }
1636 else
1637 {
1638 tree cond = NULL_TREE(tree) nullptr, v0_val;
1639
1640 if (two_operand_p)
1641 {
1642 cond = fold_build2 (BIT_AND_EXPR, mask_elt_type, i_val,fold_build2_loc (((location_t) 0), BIT_AND_EXPR, mask_elt_type
, i_val, build_int_cst (mask_elt_type, elements) )
1643 build_int_cst (mask_elt_type, elements))fold_build2_loc (((location_t) 0), BIT_AND_EXPR, mask_elt_type
, i_val, build_int_cst (mask_elt_type, elements) )
;
1644 cond = force_gimple_operand_gsi (gsi, cond, true, NULL_TREE(tree) nullptr,
1645 true, GSI_SAME_STMT);
1646 }
1647
1648 i_val = fold_build2 (BIT_AND_EXPR, mask_elt_type, i_val,fold_build2_loc (((location_t) 0), BIT_AND_EXPR, mask_elt_type
, i_val, build_int_cst (mask_elt_type, elements - 1) )
1649 build_int_cst (mask_elt_type, elements - 1))fold_build2_loc (((location_t) 0), BIT_AND_EXPR, mask_elt_type
, i_val, build_int_cst (mask_elt_type, elements - 1) )
;
1650 i_val = force_gimple_operand_gsi (gsi, i_val, true, NULL_TREE(tree) nullptr,
1651 true, GSI_SAME_STMT);
1652
1653 v0_val = vector_element (gsi, vec0, i_val, &vec0tmp);
1654 v0_val = force_gimple_operand_gsi (gsi, v0_val, true, NULL_TREE(tree) nullptr,
1655 true, GSI_SAME_STMT);
1656
1657 if (two_operand_p)
1658 {
1659 tree v1_val;
1660
1661 v1_val = vector_element (gsi, vec1, i_val, &vec1tmp);
1662 v1_val = force_gimple_operand_gsi (gsi, v1_val, true, NULL_TREE(tree) nullptr,
1663 true, GSI_SAME_STMT);
1664
1665 cond = fold_build2 (EQ_EXPR, boolean_type_node,fold_build2_loc (((location_t) 0), EQ_EXPR, global_trees[TI_BOOLEAN_TYPE
], cond, build_zero_cst (mask_elt_type) )
1666 cond, build_zero_cst (mask_elt_type))fold_build2_loc (((location_t) 0), EQ_EXPR, global_trees[TI_BOOLEAN_TYPE
], cond, build_zero_cst (mask_elt_type) )
;
1667 cond = fold_build3 (COND_EXPR, vect_elt_type,fold_build3_loc (((location_t) 0), COND_EXPR, vect_elt_type, cond
, v0_val, v1_val )
1668 cond, v0_val, v1_val)fold_build3_loc (((location_t) 0), COND_EXPR, vect_elt_type, cond
, v0_val, v1_val )
;
1669 t = force_gimple_operand_gsi (gsi, cond, true, NULL_TREE(tree) nullptr,
1670 true, GSI_SAME_STMT);
1671 }
1672 else
1673 t = v0_val;
1674 }
1675
1676 if (!CONSTANT_CLASS_P (t)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (t)->base.code))] == tcc_constant)
)
1677 constant_p = false;
1678 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, t)do { constructor_elt _ce___ = {(tree) nullptr, t}; vec_safe_push
((v), _ce___); } while (0)
;
1679 }
1680
1681 if (constant_p)
1682 constr = build_vector_from_ctor (vect_type, v);
1683 else
1684 constr = build_constructor (vect_type, v);
1685 gimple_assign_set_rhs_from_tree (gsi, constr);
1686 update_stmt (gsi_stmt (*gsi));
1687}
1688
1689/* If OP is a uniform vector return the element it is a splat from. */
1690
1691static tree
1692ssa_uniform_vector_p (tree op)
1693{
1694 if (TREE_CODE (op)((enum tree_code) (op)->base.code) == VECTOR_CST
1695 || TREE_CODE (op)((enum tree_code) (op)->base.code) == VEC_DUPLICATE_EXPR
1696 || TREE_CODE (op)((enum tree_code) (op)->base.code) == CONSTRUCTOR)
1697 return uniform_vector_p (op);
1698 if (TREE_CODE (op)((enum tree_code) (op)->base.code) == SSA_NAME)
1699 {
1700 gimple *def_stmt = SSA_NAME_DEF_STMT (op)(tree_check ((op), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1700, __FUNCTION__, (SSA_NAME)))->ssa_name.def_stmt
;
1701 if (gimple_assign_single_p (def_stmt))
1702 return uniform_vector_p (gimple_assign_rhs1 (def_stmt));
1703 }
1704 return NULL_TREE(tree) nullptr;
1705}
1706
1707/* Return type in which CODE operation with optab OP can be
1708 computed. */
1709
1710static tree
1711get_compute_type (enum tree_code code, optab op, tree type)
1712{
1713 /* For very wide vectors, try using a smaller vector mode. */
1714 tree compute_type = type;
1715 if (op
1716 && (!VECTOR_MODE_P (TYPE_MODE (type))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1716, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_BOOL ||
((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1716, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_INT ||
((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1716, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_FLOAT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1716, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_FRACT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1716, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_UFRACT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1716, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_ACCUM
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1716, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_UACCUM
)
1717 || optab_handler (op, TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1717, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
) == CODE_FOR_nothing))
1718 {
1719 tree vector_compute_type
1720 = type_for_widest_vector_mode (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1720, __FUNCTION__))->typed.type)
, op);
1721 if (vector_compute_type != NULL_TREE(tree) nullptr
1722 && subparts_gt (compute_type, vector_compute_type)
1723 && maybe_ne (TYPE_VECTOR_SUBPARTS (vector_compute_type), 1U)
1724 && (optab_handler (op, TYPE_MODE (vector_compute_type)((((enum tree_code) ((tree_class_check ((vector_compute_type)
, (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1724, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vector_compute_type) : (vector_compute_type)->type_common
.mode)
)
1725 != CODE_FOR_nothing))
1726 compute_type = vector_compute_type;
1727 }
1728
1729 /* If we are breaking a BLKmode vector into smaller pieces,
1730 type_for_widest_vector_mode has already looked into the optab,
1731 so skip these checks. */
1732 if (compute_type == type)
1733 {
1734 machine_mode compute_mode = TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1734, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
;
1735 if (VECTOR_MODE_P (compute_mode)(((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_BOOL
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_INT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_FLOAT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_FRACT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_UFRACT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_ACCUM
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_UACCUM
)
)
1736 {
1737 if (op && optab_handler (op, compute_mode) != CODE_FOR_nothing)
1738 return compute_type;
1739 if (code == MULT_HIGHPART_EXPR
1740 && can_mult_highpart_p (compute_mode,
1741 TYPE_UNSIGNED (compute_type)((tree_class_check ((compute_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1741, __FUNCTION__))->base.u.bits.unsigned_flag)
))
1742 return compute_type;
1743 }
1744 /* There is no operation in hardware, so fall back to scalars. */
1745 compute_type = TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1745, __FUNCTION__))->typed.type)
;
1746 }
1747
1748 return compute_type;
1749}
1750
1751static tree
1752do_cond (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b,
1753 tree bitpos, tree bitsize, enum tree_code code,
1754 tree type ATTRIBUTE_UNUSED__attribute__ ((__unused__)))
1755{
1756 if (TREE_CODE (TREE_TYPE (a))((enum tree_code) (((contains_struct_check ((a), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1756, __FUNCTION__))->typed.type))->base.code)
== VECTOR_TYPE)
1757 a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
1758 if (TREE_CODE (TREE_TYPE (b))((enum tree_code) (((contains_struct_check ((b), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1758, __FUNCTION__))->typed.type))->base.code)
== VECTOR_TYPE)
1759 b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos);
1760 tree cond = gimple_assign_rhs1 (gsi_stmt (*gsi));
1761 return gimplify_build3 (gsi, code, inner_type, unshare_expr (cond), a, b);
1762}
1763
1764/* Expand a vector COND_EXPR to scalars, piecewise. */
1765static void
1766expand_vector_scalar_condition (gimple_stmt_iterator *gsi)
1767{
1768 gassign *stmt = as_a <gassign *> (gsi_stmt (*gsi));
1769 tree lhs = gimple_assign_lhs (stmt);
1770 tree type = TREE_TYPE (lhs)((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1770, __FUNCTION__))->typed.type)
;
1771 tree compute_type = get_compute_type (COND_EXPR, mov_optab, type);
1772 machine_mode compute_mode = TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1772, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
;
1773 gcc_assert (compute_mode != BLKmode)((void)(!(compute_mode != ((void) 0, E_BLKmode)) ? fancy_abort
("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1773, __FUNCTION__), 0 : 0))
;
1774 tree rhs2 = gimple_assign_rhs2 (stmt);
1775 tree rhs3 = gimple_assign_rhs3 (stmt);
1776 tree new_rhs;
1777
1778 /* If the compute mode is not a vector mode (hence we are not decomposing
1779 a BLKmode vector to smaller, hardware-supported vectors), we may want
1780 to expand the operations in parallel. */
1781 if (!VECTOR_MODE_P (compute_mode)(((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_BOOL
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_INT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_FLOAT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_FRACT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_UFRACT
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_ACCUM
|| ((enum mode_class) mode_class[compute_mode]) == MODE_VECTOR_UACCUM
)
)
1782 new_rhs = expand_vector_parallel (gsi, do_cond, type, rhs2, rhs3,
1783 COND_EXPR);
1784 else
1785 new_rhs = expand_vector_piecewise (gsi, do_cond, type, compute_type,
1786 rhs2, rhs3, COND_EXPR, false);
1787 if (!useless_type_conversion_p (TREE_TYPE (lhs)((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1787, __FUNCTION__))->typed.type)
, TREE_TYPE (new_rhs)((contains_struct_check ((new_rhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1787, __FUNCTION__))->typed.type)
))
1788 new_rhs = gimplify_build1 (gsi, VIEW_CONVERT_EXPR, TREE_TYPE (lhs)((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1788, __FUNCTION__))->typed.type)
,
1789 new_rhs);
1790
1791 /* NOTE: We should avoid using gimple_assign_set_rhs_from_tree. One
1792 way to do it is change expand_vector_operation and its callees to
1793 return a tree_code, RHS1 and RHS2 instead of a tree. */
1794 gimple_assign_set_rhs_from_tree (gsi, new_rhs);
1795 update_stmt (gsi_stmt (*gsi));
1796}
1797
1798/* Callback for expand_vector_piecewise to do VEC_CONVERT ifn call
1799 lowering. If INNER_TYPE is not a vector type, this is a scalar
1800 fallback. */
1801
1802static tree
1803do_vec_conversion (gimple_stmt_iterator *gsi, tree inner_type, tree a,
1804 tree decl, tree bitpos, tree bitsize,
1805 enum tree_code code, tree type)
1806{
1807 a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
1808 if (!VECTOR_TYPE_P (inner_type)(((enum tree_code) (inner_type)->base.code) == VECTOR_TYPE
)
)
1809 return gimplify_build1 (gsi, code, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1809, __FUNCTION__))->typed.type)
, a);
1810 if (code == CALL_EXPR)
1811 {
1812 gimple *g = gimple_build_call (decl, 1, a);
1813 tree lhs = make_ssa_name (TREE_TYPE (TREE_TYPE (decl))((contains_struct_check ((((contains_struct_check ((decl), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1813, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1813, __FUNCTION__))->typed.type)
);
1814 gimple_call_set_lhs (g, lhs);
1815 gsi_insert_before (gsi, g, GSI_SAME_STMT);
1816 return lhs;
1817 }
1818 else
1819 {
1820 tree outer_type = build_vector_type (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1820, __FUNCTION__))->typed.type)
,
1821 TYPE_VECTOR_SUBPARTS (inner_type));
1822 return gimplify_build1 (gsi, code, outer_type, a);
1823 }
1824}
1825
1826/* Similarly, but for narrowing conversion. */
1827
1828static tree
1829do_vec_narrow_conversion (gimple_stmt_iterator *gsi, tree inner_type, tree a,
1830 tree, tree bitpos, tree, enum tree_code code,
1831 tree type)
1832{
1833 tree itype = build_vector_type (TREE_TYPE (inner_type)((contains_struct_check ((inner_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1833, __FUNCTION__))->typed.type)
,
1834 exact_div (TYPE_VECTOR_SUBPARTS (inner_type),
1835 2));
1836 tree b = tree_vec_extract (gsi, itype, a, TYPE_SIZE (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1836, __FUNCTION__))->type_common.size)
, bitpos);
1837 tree c = tree_vec_extract (gsi, itype, a, TYPE_SIZE (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1837, __FUNCTION__))->type_common.size)
,
1838 int_const_binop (PLUS_EXPR, bitpos,
1839 TYPE_SIZE (itype)((tree_class_check ((itype), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1839, __FUNCTION__))->type_common.size)
));
1840 tree outer_type = build_vector_type (TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1840, __FUNCTION__))->typed.type)
,
1841 TYPE_VECTOR_SUBPARTS (inner_type));
1842 return gimplify_build2 (gsi, code, outer_type, b, c);
1843}
1844
1845/* Expand VEC_CONVERT ifn call. */
1846
1847static void
1848expand_vector_conversion (gimple_stmt_iterator *gsi)
1849{
1850 gimple *stmt = gsi_stmt (*gsi);
1851 gimple *g;
1852 tree lhs = gimple_call_lhs (stmt);
1853 if (lhs == NULL_TREE(tree) nullptr)
1854 {
1855 g = gimple_build_nop ();
1856 gsi_replace (gsi, g, false);
1857 return;
1858 }
1859 tree arg = gimple_call_arg (stmt, 0);
1860 tree ret_type = TREE_TYPE (lhs)((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1860, __FUNCTION__))->typed.type)
;
1861 tree arg_type = TREE_TYPE (arg)((contains_struct_check ((arg), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1861, __FUNCTION__))->typed.type)
;
1862 tree new_rhs, compute_type = TREE_TYPE (arg_type)((contains_struct_check ((arg_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1862, __FUNCTION__))->typed.type)
;
1863 enum tree_code code = NOP_EXPR;
1864 enum tree_code code1 = ERROR_MARK;
1865 enum { NARROW, NONE, WIDEN } modifier = NONE;
1866 optab optab1 = unknown_optab;
1867
1868 gcc_checking_assert (VECTOR_TYPE_P (ret_type) && VECTOR_TYPE_P (arg_type))((void)(!((((enum tree_code) (ret_type)->base.code) == VECTOR_TYPE
) && (((enum tree_code) (arg_type)->base.code) == VECTOR_TYPE
)) ? fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1868, __FUNCTION__), 0 : 0))
;
1869 if (INTEGRAL_TYPE_P (TREE_TYPE (ret_type))(((enum tree_code) (((contains_struct_check ((ret_type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1869, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE
|| ((enum tree_code) (((contains_struct_check ((ret_type), (
TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1869, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
|| ((enum tree_code) (((contains_struct_check ((ret_type), (
TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1869, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
1870 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (arg_type))(((enum tree_code) (((contains_struct_check ((arg_type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1870, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE
)
)
1871 code = FIX_TRUNC_EXPR;
1872 else if (INTEGRAL_TYPE_P (TREE_TYPE (arg_type))(((enum tree_code) (((contains_struct_check ((arg_type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1872, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE
|| ((enum tree_code) (((contains_struct_check ((arg_type), (
TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1872, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
|| ((enum tree_code) (((contains_struct_check ((arg_type), (
TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1872, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
1873 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (ret_type))(((enum tree_code) (((contains_struct_check ((ret_type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1873, __FUNCTION__))->typed.type))->base.code) == REAL_TYPE
)
)
1874 code = FLOAT_EXPR;
1875 unsigned int ret_elt_bits = vector_element_bits (ret_type);
1876 unsigned int arg_elt_bits = vector_element_bits (arg_type);
1877 if (ret_elt_bits < arg_elt_bits)
1878 modifier = NARROW;
1879 else if (ret_elt_bits > arg_elt_bits)
1880 modifier = WIDEN;
1881
1882 if (modifier == NONE && (code == FIX_TRUNC_EXPR || code == FLOAT_EXPR))
1883 {
1884 if (supportable_convert_operation (code, ret_type, arg_type, &code1))
1885 {
1886 g = gimple_build_assign (lhs, code1, arg);
1887 gsi_replace (gsi, g, false);
1888 return;
1889 }
1890 /* Can't use get_compute_type here, as supportable_convert_operation
1891 doesn't necessarily use an optab and needs two arguments. */
1892 tree vec_compute_type
1893 = type_for_widest_vector_mode (TREE_TYPE (arg_type)((contains_struct_check ((arg_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1893, __FUNCTION__))->typed.type)
, mov_optab);
1894 if (vec_compute_type
1895 && VECTOR_MODE_P (TYPE_MODE (vec_compute_type))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((vec_compute_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1895, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vec_compute_type) : (vec_compute_type)->type_common.mode
)]) == MODE_VECTOR_BOOL || ((enum mode_class) mode_class[((((
enum tree_code) ((tree_class_check ((vec_compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1895, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vec_compute_type) : (vec_compute_type)->type_common.mode
)]) == MODE_VECTOR_INT || ((enum mode_class) mode_class[((((enum
tree_code) ((tree_class_check ((vec_compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1895, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vec_compute_type) : (vec_compute_type)->type_common.mode
)]) == MODE_VECTOR_FLOAT || ((enum mode_class) mode_class[(((
(enum tree_code) ((tree_class_check ((vec_compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1895, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vec_compute_type) : (vec_compute_type)->type_common.mode
)]) == MODE_VECTOR_FRACT || ((enum mode_class) mode_class[(((
(enum tree_code) ((tree_class_check ((vec_compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1895, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vec_compute_type) : (vec_compute_type)->type_common.mode
)]) == MODE_VECTOR_UFRACT || ((enum mode_class) mode_class[((
((enum tree_code) ((tree_class_check ((vec_compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1895, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vec_compute_type) : (vec_compute_type)->type_common.mode
)]) == MODE_VECTOR_ACCUM || ((enum mode_class) mode_class[(((
(enum tree_code) ((tree_class_check ((vec_compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1895, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(vec_compute_type) : (vec_compute_type)->type_common.mode
)]) == MODE_VECTOR_UACCUM)
1896 && subparts_gt (arg_type, vec_compute_type))
1897 {
1898 unsigned HOST_WIDE_INTlong nelts
1899 = constant_lower_bound (TYPE_VECTOR_SUBPARTS (vec_compute_type));
1900 while (nelts > 1)
1901 {
1902 tree ret1_type = build_vector_type (TREE_TYPE (ret_type)((contains_struct_check ((ret_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1902, __FUNCTION__))->typed.type)
, nelts);
1903 tree arg1_type = build_vector_type (TREE_TYPE (arg_type)((contains_struct_check ((arg_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1903, __FUNCTION__))->typed.type)
, nelts);
1904 if (supportable_convert_operation (code, ret1_type, arg1_type,
1905 &code1))
1906 {
1907 new_rhs = expand_vector_piecewise (gsi, do_vec_conversion,
1908 ret_type, arg1_type, arg,
1909 NULL_TREE(tree) nullptr, code1, false);
1910 g = gimple_build_assign (lhs, new_rhs);
1911 gsi_replace (gsi, g, false);
1912 return;
1913 }
1914 nelts = nelts / 2;
1915 }
1916 }
1917 }
1918 else if (modifier == NARROW)
1919 {
1920 switch (code)
1921 {
1922 CASE_CONVERTcase NOP_EXPR: case CONVERT_EXPR:
1923 code1 = VEC_PACK_TRUNC_EXPR;
1924 optab1 = optab_for_tree_code (code1, arg_type, optab_default);
1925 break;
1926 case FIX_TRUNC_EXPR:
1927 code1 = VEC_PACK_FIX_TRUNC_EXPR;
1928 /* The signedness is determined from output operand. */
1929 optab1 = optab_for_tree_code (code1, ret_type, optab_default);
1930 break;
1931 case FLOAT_EXPR:
1932 code1 = VEC_PACK_FLOAT_EXPR;
1933 optab1 = optab_for_tree_code (code1, arg_type, optab_default);
1934 break;
1935 default:
1936 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1936, __FUNCTION__))
;
1937 }
1938
1939 if (optab1)
1940 compute_type = get_compute_type (code1, optab1, arg_type);
1941 enum insn_code icode1;
1942 if (VECTOR_TYPE_P (compute_type)(((enum tree_code) (compute_type)->base.code) == VECTOR_TYPE
)
1943 && ((icode1 = optab_handler (optab1, TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1943, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
))
1944 != CODE_FOR_nothing)
1945 && VECTOR_MODE_P (insn_data[icode1].operand[0].mode)(((enum mode_class) mode_class[insn_data[icode1].operand[0].mode
]) == MODE_VECTOR_BOOL || ((enum mode_class) mode_class[insn_data
[icode1].operand[0].mode]) == MODE_VECTOR_INT || ((enum mode_class
) mode_class[insn_data[icode1].operand[0].mode]) == MODE_VECTOR_FLOAT
|| ((enum mode_class) mode_class[insn_data[icode1].operand[0
].mode]) == MODE_VECTOR_FRACT || ((enum mode_class) mode_class
[insn_data[icode1].operand[0].mode]) == MODE_VECTOR_UFRACT ||
((enum mode_class) mode_class[insn_data[icode1].operand[0].mode
]) == MODE_VECTOR_ACCUM || ((enum mode_class) mode_class[insn_data
[icode1].operand[0].mode]) == MODE_VECTOR_UACCUM)
)
1946 {
1947 tree cretd_type
1948 = build_vector_type (TREE_TYPE (ret_type)((contains_struct_check ((ret_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1948, __FUNCTION__))->typed.type)
,
1949 TYPE_VECTOR_SUBPARTS (compute_type) * 2);
1950 if (insn_data[icode1].operand[0].mode == TYPE_MODE (cretd_type)((((enum tree_code) ((tree_class_check ((cretd_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1950, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(cretd_type) : (cretd_type)->type_common.mode)
)
1951 {
1952 if (compute_type == arg_type)
1953 {
1954 new_rhs = gimplify_build2 (gsi, code1, cretd_type,
1955 arg, build_zero_cst (arg_type));
1956 new_rhs = tree_vec_extract (gsi, ret_type, new_rhs,
1957 TYPE_SIZE (ret_type)((tree_class_check ((ret_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1957, __FUNCTION__))->type_common.size)
,
1958 bitsize_int (0)size_int_kind (0, stk_bitsizetype));
1959 g = gimple_build_assign (lhs, new_rhs);
1960 gsi_replace (gsi, g, false);
1961 return;
1962 }
1963 tree dcompute_type
1964 = build_vector_type (TREE_TYPE (compute_type)((contains_struct_check ((compute_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1964, __FUNCTION__))->typed.type)
,
1965 TYPE_VECTOR_SUBPARTS (compute_type) * 2);
1966 if (TYPE_MAIN_VARIANT (dcompute_type)((tree_class_check ((dcompute_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1966, __FUNCTION__))->type_common.main_variant)
1967 == TYPE_MAIN_VARIANT (arg_type)((tree_class_check ((arg_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 1967, __FUNCTION__))->type_common.main_variant)
)
1968 new_rhs = do_vec_narrow_conversion (gsi, dcompute_type, arg,
1969 NULL_TREE(tree) nullptr, bitsize_int (0)size_int_kind (0, stk_bitsizetype),
1970 NULL_TREE(tree) nullptr, code1,
1971 ret_type);
1972 else
1973 new_rhs = expand_vector_piecewise (gsi,
1974 do_vec_narrow_conversion,
1975 arg_type, dcompute_type,
1976 arg, NULL_TREE(tree) nullptr, code1,
1977 false, ret_type);
1978 g = gimple_build_assign (lhs, new_rhs);
1979 gsi_replace (gsi, g, false);
1980 return;
1981 }
1982 }
1983 }
1984 else if (modifier == WIDEN)
1985 {
1986 enum tree_code code2 = ERROR_MARK;
1987 optab optab2 = unknown_optab;
1988 switch (code)
1989 {
1990 CASE_CONVERTcase NOP_EXPR: case CONVERT_EXPR:
1991 code1 = VEC_UNPACK_LO_EXPR;
1992 code2 = VEC_UNPACK_HI_EXPR;
1993 break;
1994 case FIX_TRUNC_EXPR:
1995 code1 = VEC_UNPACK_FIX_TRUNC_LO_EXPR;
1996 code2 = VEC_UNPACK_FIX_TRUNC_HI_EXPR;
1997 break;
1998 case FLOAT_EXPR:
1999 code1 = VEC_UNPACK_FLOAT_LO_EXPR;
2000 code2 = VEC_UNPACK_FLOAT_HI_EXPR;
2001 break;
2002 default:
2003 gcc_unreachable ()(fancy_abort ("/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2003, __FUNCTION__))
;
2004 }
2005 if (BYTES_BIG_ENDIAN0)
2006 std::swap (code1, code2);
2007
2008 if (code == FIX_TRUNC_EXPR)
2009 {
2010 /* The signedness is determined from output operand. */
2011 optab1 = optab_for_tree_code (code1, ret_type, optab_default);
2012 optab2 = optab_for_tree_code (code2, ret_type, optab_default);
2013 }
2014 else
2015 {
2016 optab1 = optab_for_tree_code (code1, arg_type, optab_default);
2017 optab2 = optab_for_tree_code (code2, arg_type, optab_default);
2018 }
2019
2020 if (optab1 && optab2)
2021 compute_type = get_compute_type (code1, optab1, arg_type);
2022
2023 enum insn_code icode1, icode2;
2024 if (VECTOR_TYPE_P (compute_type)(((enum tree_code) (compute_type)->base.code) == VECTOR_TYPE
)
2025 && ((icode1 = optab_handler (optab1, TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2025, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
))
2026 != CODE_FOR_nothing)
2027 && ((icode2 = optab_handler (optab2, TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2027, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
))
2028 != CODE_FOR_nothing)
2029 && VECTOR_MODE_P (insn_data[icode1].operand[0].mode)(((enum mode_class) mode_class[insn_data[icode1].operand[0].mode
]) == MODE_VECTOR_BOOL || ((enum mode_class) mode_class[insn_data
[icode1].operand[0].mode]) == MODE_VECTOR_INT || ((enum mode_class
) mode_class[insn_data[icode1].operand[0].mode]) == MODE_VECTOR_FLOAT
|| ((enum mode_class) mode_class[insn_data[icode1].operand[0
].mode]) == MODE_VECTOR_FRACT || ((enum mode_class) mode_class
[insn_data[icode1].operand[0].mode]) == MODE_VECTOR_UFRACT ||
((enum mode_class) mode_class[insn_data[icode1].operand[0].mode
]) == MODE_VECTOR_ACCUM || ((enum mode_class) mode_class[insn_data
[icode1].operand[0].mode]) == MODE_VECTOR_UACCUM)
2030 && (insn_data[icode1].operand[0].mode
2031 == insn_data[icode2].operand[0].mode))
2032 {
2033 poly_uint64 nunits
2034 = exact_div (TYPE_VECTOR_SUBPARTS (compute_type), 2);
2035 tree cretd_type = build_vector_type (TREE_TYPE (ret_type)((contains_struct_check ((ret_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2035, __FUNCTION__))->typed.type)
, nunits);
2036 if (insn_data[icode1].operand[0].mode == TYPE_MODE (cretd_type)((((enum tree_code) ((tree_class_check ((cretd_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2036, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(cretd_type) : (cretd_type)->type_common.mode)
)
2037 {
2038 vec<constructor_elt, va_gc> *v;
2039 tree part_width = TYPE_SIZE (compute_type)((tree_class_check ((compute_type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2039, __FUNCTION__))->type_common.size)
;
2040 tree index = bitsize_int (0)size_int_kind (0, stk_bitsizetype);
2041 int nunits = nunits_for_known_piecewise_op (arg_type);
2042 int delta = tree_to_uhwi (part_width) / arg_elt_bits;
2043 int i;
2044 location_t loc = gimple_location (gsi_stmt (*gsi));
2045
2046 if (compute_type != arg_type)
2047 {
2048 if (!warning_suppressed_p (gsi_stmt (*gsi),
2049 OPT_Wvector_operation_performance))
2050 warning_at (loc, OPT_Wvector_operation_performance,
2051 "vector operation will be expanded piecewise");
2052 }
2053 else
2054 {
2055 nunits = 1;
2056 delta = 1;
2057 }
2058
2059 vec_alloc (v, (nunits + delta - 1) / delta * 2);
2060 bool constant_p = true;
2061 for (i = 0; i < nunits;
2062 i += delta, index = int_const_binop (PLUS_EXPR, index,
2063 part_width))
2064 {
2065 tree a = arg;
2066 if (compute_type != arg_type)
2067 a = tree_vec_extract (gsi, compute_type, a, part_width,
2068 index);
2069 tree result = gimplify_build1 (gsi, code1, cretd_type, a);
2070 constructor_elt ce = { NULL_TREE(tree) nullptr, result };
2071 if (!CONSTANT_CLASS_P (ce.value)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (ce.value)->base.code))] == tcc_constant)
)
2072 constant_p = false;
2073 v->quick_push (ce);
2074 ce.value = gimplify_build1 (gsi, code2, cretd_type, a);
2075 if (!CONSTANT_CLASS_P (ce.value)(tree_code_type_tmpl <0>::tree_code_type[(int) (((enum tree_code
) (ce.value)->base.code))] == tcc_constant)
)
2076 constant_p = false;
2077 v->quick_push (ce);
2078 }
2079
2080 if (constant_p)
2081 new_rhs = build_vector_from_ctor (ret_type, v);
2082 else
2083 new_rhs = build_constructor (ret_type, v);
2084 g = gimple_build_assign (lhs, new_rhs);
2085 gsi_replace (gsi, g, false);
2086 return;
2087 }
2088 }
2089 }
2090
2091 new_rhs = expand_vector_piecewise (gsi, do_vec_conversion, arg_type,
2092 TREE_TYPE (arg_type)((contains_struct_check ((arg_type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2092, __FUNCTION__))->typed.type)
, arg,
2093 NULL_TREE(tree) nullptr, code, false, ret_type);
2094 g = gimple_build_assign (lhs, new_rhs);
2095 gsi_replace (gsi, g, false);
2096}
2097
2098/* Process one statement. If we identify a vector operation, expand it. */
2099
2100static void
2101expand_vector_operations_1 (gimple_stmt_iterator *gsi,
2102 bitmap dce_ssa_names)
2103{
2104 tree lhs, rhs1, rhs2 = NULLnullptr, type, compute_type = NULL_TREE(tree) nullptr;
2105 enum tree_code code;
2106 optab op = unknown_optab;
2107 enum gimple_rhs_class rhs_class;
2108 tree new_rhs;
2109
2110 /* Only consider code == GIMPLE_ASSIGN. */
2111 gassign *stmt = dyn_cast <gassign *> (gsi_stmt (*gsi));
2112 if (!stmt)
2113 {
2114 if (gimple_call_internal_p (gsi_stmt (*gsi), IFN_VEC_CONVERT))
2115 expand_vector_conversion (gsi);
2116 return;
2117 }
2118
2119 code = gimple_assign_rhs_code (stmt);
2120 rhs_class = get_gimple_rhs_class (code);
2121 lhs = gimple_assign_lhs (stmt);
2122
2123 if (code == VEC_PERM_EXPR)
2124 {
2125 lower_vec_perm (gsi);
2126 return;
2127 }
2128
2129 if (code == VEC_COND_EXPR)
2130 {
2131 expand_vector_condition (gsi, dce_ssa_names);
2132 return;
2133 }
2134
2135 if (code == COND_EXPR
2136 && TREE_CODE (TREE_TYPE (gimple_assign_lhs (stmt)))((enum tree_code) (((contains_struct_check ((gimple_assign_lhs
(stmt)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2136, __FUNCTION__))->typed.type))->base.code)
== VECTOR_TYPE
2137 && TYPE_MODE (TREE_TYPE (gimple_assign_lhs (stmt)))((((enum tree_code) ((tree_class_check ((((contains_struct_check
((gimple_assign_lhs (stmt)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2137, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2137, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((gimple_assign_lhs (stmt)), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2137, __FUNCTION__))->typed.type)) : (((contains_struct_check
((gimple_assign_lhs (stmt)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2137, __FUNCTION__))->typed.type))->type_common.mode)
== BLKmode((void) 0, E_BLKmode))
2138 {
2139 expand_vector_scalar_condition (gsi);
2140 return;
2141 }
2142
2143 if (code == CONSTRUCTOR
2144 && TREE_CODE (lhs)((enum tree_code) (lhs)->base.code) == SSA_NAME
2145 && VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (lhs)))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)) : (((contains_struct_check
((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_BOOL || ((enum mode_class) mode_class[((((enum
tree_code) ((tree_class_check ((((contains_struct_check ((lhs
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)) : (((contains_struct_check
((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_INT || ((enum mode_class) mode_class[((((enum
tree_code) ((tree_class_check ((((contains_struct_check ((lhs
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)) : (((contains_struct_check
((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_FLOAT || ((enum mode_class) mode_class[((((
enum tree_code) ((tree_class_check ((((contains_struct_check (
(lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)) : (((contains_struct_check
((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_FRACT || ((enum mode_class) mode_class[((((
enum tree_code) ((tree_class_check ((((contains_struct_check (
(lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)) : (((contains_struct_check
((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_UFRACT || ((enum mode_class) mode_class[(((
(enum tree_code) ((tree_class_check ((((contains_struct_check
((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)) : (((contains_struct_check
((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_ACCUM || ((enum mode_class) mode_class[((((
enum tree_code) ((tree_class_check ((((contains_struct_check (
(lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type)) : (((contains_struct_check
((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2145, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_UACCUM)
2146 && !gimple_clobber_p (stmt)
2147 && optimizeglobal_options.x_optimize)
2148 {
2149 optimize_vector_constructor (gsi);
2150 return;
2151 }
2152
2153 if (rhs_class != GIMPLE_UNARY_RHS && rhs_class != GIMPLE_BINARY_RHS)
2154 return;
2155
2156 rhs1 = gimple_assign_rhs1 (stmt);
2157 if (rhs_class == GIMPLE_BINARY_RHS)
2158 rhs2 = gimple_assign_rhs2 (stmt);
2159
2160 type = TREE_TYPE (lhs)((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2160, __FUNCTION__))->typed.type)
;
2161 if (!VECTOR_TYPE_P (type)(((enum tree_code) (type)->base.code) == VECTOR_TYPE)
2162 || !VECTOR_TYPE_P (TREE_TYPE (rhs1))(((enum tree_code) (((contains_struct_check ((rhs1), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2162, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
)
)
2163 return;
2164
2165 /* A scalar operation pretending to be a vector one. */
2166 if (VECTOR_BOOLEAN_TYPE_P (type)(((enum tree_code) (type)->base.code) == VECTOR_TYPE &&
((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2166, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
)
2167 && !VECTOR_MODE_P (TYPE_MODE (type))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2167, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_BOOL ||
((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2167, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_INT ||
((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2167, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_FLOAT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2167, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_FRACT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2167, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_UFRACT
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2167, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_ACCUM
|| ((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2167, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)]) == MODE_VECTOR_UACCUM
)
2168 && TYPE_MODE (type)((((enum tree_code) ((tree_class_check ((type), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2168, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(type) : (type)->type_common.mode)
!= BLKmode((void) 0, E_BLKmode)
2169 && (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))tree_code_type_tmpl <0>::tree_code_type[(int) (gimple_assign_rhs_code
(stmt))]
!= tcc_comparison
2170 || (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (rhs1))(((enum tree_code) (((contains_struct_check ((rhs1), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2170, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
&& ((enum tree_code) (((contains_struct_check ((((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2170, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2170, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
)
2171 && !VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (rhs1)))(((enum mode_class) mode_class[((((enum tree_code) ((tree_class_check
((((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)) : (((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_BOOL || ((enum mode_class) mode_class[((((enum
tree_code) ((tree_class_check ((((contains_struct_check ((rhs1
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)) : (((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_INT || ((enum mode_class) mode_class[((((enum
tree_code) ((tree_class_check ((((contains_struct_check ((rhs1
), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)) : (((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_FLOAT || ((enum mode_class) mode_class[((((
enum tree_code) ((tree_class_check ((((contains_struct_check (
(rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)) : (((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_FRACT || ((enum mode_class) mode_class[((((
enum tree_code) ((tree_class_check ((((contains_struct_check (
(rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)) : (((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_UFRACT || ((enum mode_class) mode_class[(((
(enum tree_code) ((tree_class_check ((((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)) : (((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_ACCUM || ((enum mode_class) mode_class[((((
enum tree_code) ((tree_class_check ((((contains_struct_check (
(rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type)) : (((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2171, __FUNCTION__))->typed.type))->type_common.mode)
]) == MODE_VECTOR_UACCUM)
2172 && TYPE_MODE (TREE_TYPE (rhs1))((((enum tree_code) ((tree_class_check ((((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2172, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2172, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2172, __FUNCTION__))->typed.type)) : (((contains_struct_check
((rhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2172, __FUNCTION__))->typed.type))->type_common.mode)
!= BLKmode((void) 0, E_BLKmode))))
2173 return;
2174
2175 /* If the vector operation is operating on all same vector elements
2176 implement it with a scalar operation and a splat if the target
2177 supports the scalar operation. */
2178 tree srhs1, srhs2 = NULL_TREE(tree) nullptr;
2179 if ((srhs1 = ssa_uniform_vector_p (rhs1)) != NULL_TREE(tree) nullptr
2180 && (rhs2 == NULL_TREE(tree) nullptr
2181 || (! VECTOR_TYPE_P (TREE_TYPE (rhs2))(((enum tree_code) (((contains_struct_check ((rhs2), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2181, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
)
2182 && (srhs2 = rhs2))
2183 || (srhs2 = ssa_uniform_vector_p (rhs2)) != NULL_TREE(tree) nullptr)
2184 /* As we query direct optabs restrict to non-convert operations. */
2185 && TYPE_MODE (TREE_TYPE (type))((((enum tree_code) ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2185, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2185, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2185, __FUNCTION__))->typed.type)) : (((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2185, __FUNCTION__))->typed.type))->type_common.mode)
== TYPE_MODE (TREE_TYPE (srhs1))((((enum tree_code) ((tree_class_check ((((contains_struct_check
((srhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2185, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2185, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((srhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2185, __FUNCTION__))->typed.type)) : (((contains_struct_check
((srhs1), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2185, __FUNCTION__))->typed.type))->type_common.mode)
)
2186 {
2187 op = optab_for_tree_code (code, TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2187, __FUNCTION__))->typed.type)
, optab_scalar);
2188 if (op >= FIRST_NORM_OPTAB && op <= LAST_NORM_OPTAB
2189 && optab_handler (op, TYPE_MODE (TREE_TYPE (type))((((enum tree_code) ((tree_class_check ((((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2189, __FUNCTION__))->typed.type)), (tcc_type), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2189, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2189, __FUNCTION__))->typed.type)) : (((contains_struct_check
((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2189, __FUNCTION__))->typed.type))->type_common.mode)
) != CODE_FOR_nothing)
2190 {
2191 tree stype = TREE_TYPE (TREE_TYPE (lhs))((contains_struct_check ((((contains_struct_check ((lhs), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2191, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2191, __FUNCTION__))->typed.type)
;
2192 tree slhs = (rhs2 != NULL_TREE(tree) nullptr)
2193 ? gimplify_build2 (gsi, code, stype, srhs1, srhs2)
2194 : gimplify_build1 (gsi, code, stype, srhs1);
2195 gimple_assign_set_rhs_from_tree (gsi,
2196 build_vector_from_val (type, slhs));
2197 update_stmt (stmt);
2198 return;
2199 }
2200 }
2201
2202 if (CONVERT_EXPR_CODE_P (code)((code) == NOP_EXPR || (code) == CONVERT_EXPR)
2203 || code == FLOAT_EXPR
2204 || code == FIX_TRUNC_EXPR
2205 || code == VIEW_CONVERT_EXPR)
2206 return;
2207
2208 /* The signedness is determined from input argument. */
2209 if (code == VEC_UNPACK_FLOAT_HI_EXPR
2210 || code == VEC_UNPACK_FLOAT_LO_EXPR
2211 || code == VEC_PACK_FLOAT_EXPR)
2212 {
2213 /* We do not know how to scalarize those. */
2214 return;
2215 }
2216
2217 /* For widening/narrowing vector operations, the relevant type is of the
2218 arguments, not the widened result. VEC_UNPACK_FLOAT_*_EXPR is
2219 calculated in the same way above. */
2220 if (code == WIDEN_SUM_EXPR
2221 || code == VEC_WIDEN_PLUS_HI_EXPR
2222 || code == VEC_WIDEN_PLUS_LO_EXPR
2223 || code == VEC_WIDEN_MINUS_HI_EXPR
2224 || code == VEC_WIDEN_MINUS_LO_EXPR
2225 || code == VEC_WIDEN_MULT_HI_EXPR
2226 || code == VEC_WIDEN_MULT_LO_EXPR
2227 || code == VEC_WIDEN_MULT_EVEN_EXPR
2228 || code == VEC_WIDEN_MULT_ODD_EXPR
2229 || code == VEC_UNPACK_HI_EXPR
2230 || code == VEC_UNPACK_LO_EXPR
2231 || code == VEC_UNPACK_FIX_TRUNC_HI_EXPR
2232 || code == VEC_UNPACK_FIX_TRUNC_LO_EXPR
2233 || code == VEC_PACK_TRUNC_EXPR
2234 || code == VEC_PACK_SAT_EXPR
2235 || code == VEC_PACK_FIX_TRUNC_EXPR
2236 || code == VEC_WIDEN_LSHIFT_HI_EXPR
2237 || code == VEC_WIDEN_LSHIFT_LO_EXPR)
2238 {
2239 /* We do not know how to scalarize those. */
2240 return;
2241 }
2242
2243 /* Choose between vector shift/rotate by vector and vector shift/rotate by
2244 scalar */
2245 if (code == LSHIFT_EXPR
2246 || code == RSHIFT_EXPR
2247 || code == LROTATE_EXPR
2248 || code == RROTATE_EXPR)
2249 {
2250 optab opv;
2251
2252 /* Check whether we have vector <op> {x,x,x,x} where x
2253 could be a scalar variable or a constant. Transform
2254 vector <op> {x,x,x,x} ==> vector <op> scalar. */
2255 if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2))((((enum tree_code) (((contains_struct_check ((rhs2), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2255, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
) && ((enum tree_code) (((contains_struct_check ((((contains_struct_check
((rhs2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2255, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2255, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
)
2256 {
2257 tree first;
2258
2259 if ((first = ssa_uniform_vector_p (rhs2)) != NULL_TREE(tree) nullptr)
2260 {
2261 gimple_assign_set_rhs2 (stmt, first);
2262 update_stmt (stmt);
2263 rhs2 = first;
2264 }
2265 }
2266
2267 opv = optab_for_tree_code (code, type, optab_vector);
2268 if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2))((((enum tree_code) (((contains_struct_check ((rhs2), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2268, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
) && ((enum tree_code) (((contains_struct_check ((((contains_struct_check
((rhs2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2268, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2268, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
)
2269 op = opv;
2270 else
2271 {
2272 op = optab_for_tree_code (code, type, optab_scalar);
2273
2274 compute_type = get_compute_type (code, op, type);
2275 if (compute_type == type)
2276 return;
2277 /* The rtl expander will expand vector/scalar as vector/vector
2278 if necessary. Pick one with wider vector type. */
2279 tree compute_vtype = get_compute_type (code, opv, type);
2280 if (subparts_gt (compute_vtype, compute_type))
2281 {
2282 compute_type = compute_vtype;
2283 op = opv;
2284 }
2285 }
2286
2287 if (code == LROTATE_EXPR || code == RROTATE_EXPR)
2288 {
2289 if (compute_type == NULL_TREE(tree) nullptr)
2290 compute_type = get_compute_type (code, op, type);
2291 if (compute_type == type)
2292 return;
2293 /* Before splitting vector rotates into scalar rotates,
2294 see if we can't use vector shifts and BIT_IOR_EXPR
2295 instead. For vector by vector rotates we'd also
2296 need to check BIT_AND_EXPR and NEGATE_EXPR, punt there
2297 for now, fold doesn't seem to create such rotates anyway. */
2298 if (compute_type == TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2298, __FUNCTION__))->typed.type)
2299 && !VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2))((((enum tree_code) (((contains_struct_check ((rhs2), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2299, __FUNCTION__))->typed.type))->base.code) == VECTOR_TYPE
) && ((enum tree_code) (((contains_struct_check ((((contains_struct_check
((rhs2), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2299, __FUNCTION__))->typed.type)), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2299, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
)
2300 {
2301 optab oplv = vashl_optab, opl = ashl_optab;
2302 optab oprv = vlshr_optab, opr = lshr_optab, opo = ior_optab;
2303 tree compute_lvtype = get_compute_type (LSHIFT_EXPR, oplv, type);
2304 tree compute_rvtype = get_compute_type (RSHIFT_EXPR, oprv, type);
2305 tree compute_otype = get_compute_type (BIT_IOR_EXPR, opo, type);
2306 tree compute_ltype = get_compute_type (LSHIFT_EXPR, opl, type);
2307 tree compute_rtype = get_compute_type (RSHIFT_EXPR, opr, type);
2308 /* The rtl expander will expand vector/scalar as vector/vector
2309 if necessary. Pick one with wider vector type. */
2310 if (subparts_gt (compute_lvtype, compute_ltype))
2311 {
2312 compute_ltype = compute_lvtype;
2313 opl = oplv;
2314 }
2315 if (subparts_gt (compute_rvtype, compute_rtype))
2316 {
2317 compute_rtype = compute_rvtype;
2318 opr = oprv;
2319 }
2320 /* Pick the narrowest type from LSHIFT_EXPR, RSHIFT_EXPR and
2321 BIT_IOR_EXPR. */
2322 compute_type = compute_ltype;
2323 if (subparts_gt (compute_type, compute_rtype))
2324 compute_type = compute_rtype;
2325 if (subparts_gt (compute_type, compute_otype))
2326 compute_type = compute_otype;
2327 /* Verify all 3 operations can be performed in that type. */
2328 if (compute_type != TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2328, __FUNCTION__))->typed.type)
)
2329 {
2330 if (optab_handler (opl, TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2330, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
)
2331 == CODE_FOR_nothing
2332 || optab_handler (opr, TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2332, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
)
2333 == CODE_FOR_nothing
2334 || optab_handler (opo, TYPE_MODE (compute_type)((((enum tree_code) ((tree_class_check ((compute_type), (tcc_type
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2334, __FUNCTION__)))->base.code) == VECTOR_TYPE) ? vector_type_mode
(compute_type) : (compute_type)->type_common.mode)
)
2335 == CODE_FOR_nothing)
2336 compute_type = TREE_TYPE (type)((contains_struct_check ((type), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2336, __FUNCTION__))->typed.type)
;
2337 }
2338 }
2339 }
2340 }
2341 else
2342 op = optab_for_tree_code (code, type, optab_default);
2343
2344 /* Optabs will try converting a negation into a subtraction, so
2345 look for it as well. TODO: negation of floating-point vectors
2346 might be turned into an exclusive OR toggling the sign bit. */
2347 if (op == unknown_optab
2348 && code == NEGATE_EXPR
2349 && INTEGRAL_TYPE_P (TREE_TYPE (type))(((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2349, __FUNCTION__))->typed.type))->base.code) == ENUMERAL_TYPE
|| ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2349, __FUNCTION__))->typed.type))->base.code) == BOOLEAN_TYPE
|| ((enum tree_code) (((contains_struct_check ((type), (TS_TYPED
), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2349, __FUNCTION__))->typed.type))->base.code) == INTEGER_TYPE
)
)
2350 op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
2351
2352 if (compute_type == NULL_TREE(tree) nullptr)
2353 compute_type = get_compute_type (code, op, type);
2354 if (compute_type == type)
2355 return;
2356
2357 new_rhs = expand_vector_operation (gsi, type, compute_type, stmt, code,
2358 dce_ssa_names);
2359
2360 /* Leave expression untouched for later expansion. */
2361 if (new_rhs == NULL_TREE(tree) nullptr)
2362 return;
2363
2364 if (!useless_type_conversion_p (TREE_TYPE (lhs)((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2364, __FUNCTION__))->typed.type)
, TREE_TYPE (new_rhs)((contains_struct_check ((new_rhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2364, __FUNCTION__))->typed.type)
))
2365 new_rhs = gimplify_build1 (gsi, VIEW_CONVERT_EXPR, TREE_TYPE (lhs)((contains_struct_check ((lhs), (TS_TYPED), "/buildworker/marxinbox-gcc-clang-static-analyzer/build/gcc/tree-vect-generic.cc"
, 2365, __FUNCTION__))->typed.type)
,
2366 new_rhs);
2367
2368 /* NOTE: We should avoid using gimple_assign_set_rhs_from_tree. One
2369 way to do it is change expand_vector_operation and its callees to
2370 return a tree_code, RHS1 and RHS2 instead of a tree. */
2371 gimple_assign_set_rhs_from_tree (gsi, new_rhs);
2372 update_stmt (gsi_stmt (*gsi));
2373}
2374
2375/* Use this to lower vector operations introduced by the vectorizer,
2376 if it may need the bit-twiddling tricks implemented in this file. */
2377
2378static unsigned int
2379expand_vector_operations (void)
2380{
2381 gimple_stmt_iterator gsi;
2382 basic_block bb;
2383 bool cfg_changed = false;
2384
2385 auto_bitmap dce_ssa_names;
2386
2387 FOR_EACH_BB_FN (bb, cfun)for (bb = ((cfun + 0))->cfg->x_entry_block_ptr->next_bb
; bb != ((cfun + 0))->cfg->x_exit_block_ptr; bb = bb->
next_bb)
2388 {
2389 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2390 {
2391 expand_vector_operations_1 (&gsi, dce_ssa_names);
2392 /* ??? If we do not cleanup EH then we will ICE in
2393 verification. But in reality we have created wrong-code
2394 as we did not properly transition EH info and edges to
2395 the piecewise computations. */
2396 if (maybe_clean_eh_stmt (gsi_stmt (gsi))
2397 && gimple_purge_dead_eh_edges (bb))
2398 cfg_changed = true;
2399 /* If a .LOOP_DIST_ALIAS call prevailed loops got elided
2400 before vectorization got a chance to get at them. Simply
2401 fold as if loop distribution wasn't performed. */
2402 if (gimple_call_internal_p (gsi_stmt (gsi), IFN_LOOP_DIST_ALIAS))
2403 {
2404 fold_loop_internal_call (gsi_stmt (gsi), boolean_false_nodeglobal_trees[TI_BOOLEAN_FALSE]);
2405 cfg_changed = true;
2406 }
2407 }
2408 }
2409
2410 simple_dce_from_worklist (dce_ssa_names);
2411
2412 return cfg_changed ? TODO_cleanup_cfg(1 << 5) : 0;
2413}
2414
2415namespace {
2416
2417const pass_data pass_data_lower_vector =
2418{
2419 GIMPLE_PASS, /* type */
2420 "veclower", /* name */
2421 OPTGROUP_VEC, /* optinfo_flags */
2422 TV_NONE, /* tv_id */
2423 PROP_cfg(1 << 3), /* properties_required */
2424 PROP_gimple_lvec(1 << 12), /* properties_provided */
2425 0, /* properties_destroyed */
2426 0, /* todo_flags_start */
2427 TODO_update_ssa(1 << 11), /* todo_flags_finish */
2428};
2429
2430class pass_lower_vector : public gimple_opt_pass
2431{
2432public:
2433 pass_lower_vector (gcc::context *ctxt)
2434 : gimple_opt_pass (pass_data_lower_vector, ctxt)
2435 {}
2436
2437 /* opt_pass methods: */
2438 bool gate (function *fun) final override
2439 {
2440 return !(fun->curr_properties & PROP_gimple_lvec(1 << 12));
2441 }
2442
2443 unsigned int execute (function *) final override
2444 {
2445 return expand_vector_operations ();
2446 }
2447
2448}; // class pass_lower_vector
2449
2450} // anon namespace
2451
2452gimple_opt_pass *
2453make_pass_lower_vector (gcc::context *ctxt)
2454{
2455 return new pass_lower_vector (ctxt);
2456}
2457
2458namespace {
2459
2460const pass_data pass_data_lower_vector_ssa =
2461{
2462 GIMPLE_PASS, /* type */
2463 "veclower2", /* name */
2464 OPTGROUP_VEC, /* optinfo_flags */
2465 TV_NONE, /* tv_id */
2466 PROP_cfg(1 << 3), /* properties_required */
2467 PROP_gimple_lvec(1 << 12), /* properties_provided */
2468 0, /* properties_destroyed */
2469 0, /* todo_flags_start */
2470 ( TODO_update_ssa(1 << 11)
2471 | TODO_cleanup_cfg(1 << 5) ), /* todo_flags_finish */
2472};
2473
2474class pass_lower_vector_ssa : public gimple_opt_pass
2475{
2476public:
2477 pass_lower_vector_ssa (gcc::context *ctxt)
2478 : gimple_opt_pass (pass_data_lower_vector_ssa, ctxt)
2479 {}
2480
2481 /* opt_pass methods: */
2482 opt_pass * clone () final override
2483 {
2484 return new pass_lower_vector_ssa (m_ctxt);
2485 }
2486 unsigned int execute (function *) final override
2487 {
2488 return expand_vector_operations ();
2489 }
2490
2491}; // class pass_lower_vector_ssa
2492
2493} // anon namespace
2494
2495gimple_opt_pass *
2496make_pass_lower_vector_ssa (gcc::context *ctxt)
2497{
2498 return new pass_lower_vector_ssa (ctxt);
2499}
2500
2501#include "gt-tree-vect-generic.h"