diff options
author | Khem Raj <raj.khem@gmail.com> | 2012-06-28 12:19:53 -0700 |
---|---|---|
committer | Koen Kooi <koen@dominion.thruhere.net> | 2012-07-09 18:40:21 +0200 |
commit | 6b278fbb02d818b54b5a9fa2716fc49e896b72a8 (patch) | |
tree | 833783fb738ff7abf3d0e3029c9a468e73b06e28 /toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106846.patch | |
parent | 680af24d1ff95533db610176e6b01fcc9dcf6699 (diff) | |
download | meta-openembedded-6b278fbb02d818b54b5a9fa2716fc49e896b72a8.tar.gz |
gcc-4.6: Migrate recipes from OE-Core
Remove linaro patches. If one needs to use linaro
modified gcc they should use meta-linaro
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Diffstat (limited to 'toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106846.patch')
-rw-r--r-- | toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106846.patch | 487 |
1 files changed, 0 insertions, 487 deletions
diff --git a/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106846.patch b/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106846.patch deleted file mode 100644 index 88d74c72f3..0000000000 --- a/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/gcc-4.6-linaro-r106846.patch +++ /dev/null | |||
@@ -1,487 +0,0 @@ | |||
1 | 2011-11-27 Ira Rosen <ira.rosen@linaro.org> | ||
2 | |||
3 | Needs to be merged upstream: | ||
4 | |||
5 | gcc/ | ||
6 | * tree-vect-patterns.c (widened_name_p): Rename to ... | ||
7 | (type_conversion_p): ... this. Add new argument to determine | ||
8 | if it's a promotion or demotion operation. Check for | ||
9 | CONVERT_EXPR_CODE_P instead of NOP_EXPR. | ||
10 | (vect_recog_dot_prod_pattern): Call type_conversion_p instead | ||
11 | widened_name_p. | ||
12 | (vect_recog_widen_mult_pattern, vect_recog_widen_sum_pattern, | ||
13 | vect_operation_fits_smaller_type, vect_recog_widen_shift_pattern): | ||
14 | Likewise. | ||
15 | (vect_recog_mixed_size_cond_pattern): Likewise and allow | ||
16 | non-constant then and else clauses. | ||
17 | |||
18 | gcc/testsuite/ | ||
19 | * gcc.dg/vect/bb-slp-cond-3.c: New test. | ||
20 | * gcc.dg/vect/bb-slp-cond-4.c: New test. | ||
21 | |||
22 | === added file 'gcc/testsuite/gcc.dg/vect/bb-slp-cond-3.c' | ||
23 | --- old/gcc/testsuite/gcc.dg/vect/bb-slp-cond-3.c 1970-01-01 00:00:00 +0000 | ||
24 | +++ new/gcc/testsuite/gcc.dg/vect/bb-slp-cond-3.c 2011-11-27 11:29:32 +0000 | ||
25 | @@ -0,0 +1,85 @@ | ||
26 | +/* { dg-require-effective-target vect_condition } */ | ||
27 | + | ||
28 | +#include "tree-vect.h" | ||
29 | + | ||
30 | +#define N 64 | ||
31 | + | ||
32 | +/* Comparison in int, then/else and result in unsigned char. */ | ||
33 | + | ||
34 | +static inline unsigned char | ||
35 | +foo (int x, int y, int a, int b) | ||
36 | +{ | ||
37 | + if (x >= y) | ||
38 | + return a; | ||
39 | + else | ||
40 | + return b; | ||
41 | +} | ||
42 | + | ||
43 | +__attribute__((noinline, noclone)) void | ||
44 | +bar (unsigned char * __restrict__ a, unsigned char * __restrict__ b, | ||
45 | + unsigned char * __restrict__ c, unsigned char * __restrict__ d, | ||
46 | + unsigned char * __restrict__ e, int stride, int w) | ||
47 | +{ | ||
48 | + int i; | ||
49 | + for (i = 0; i < N/stride; i++, a += stride, b += stride, c += stride, | ||
50 | + d += stride, e += stride) | ||
51 | + { | ||
52 | + e[0] = foo (c[0], d[0], a[0] * w, b[0] * w); | ||
53 | + e[1] = foo (c[1], d[1], a[1] * w, b[1] * w); | ||
54 | + e[2] = foo (c[2], d[2], a[2] * w, b[2] * w); | ||
55 | + e[3] = foo (c[3], d[3], a[3] * w, b[3] * w); | ||
56 | + e[4] = foo (c[4], d[4], a[4] * w, b[4] * w); | ||
57 | + e[5] = foo (c[5], d[5], a[5] * w, b[5] * w); | ||
58 | + e[6] = foo (c[6], d[6], a[6] * w, b[6] * w); | ||
59 | + e[7] = foo (c[7], d[7], a[7] * w, b[7] * w); | ||
60 | + e[8] = foo (c[8], d[8], a[8] * w, b[8] * w); | ||
61 | + e[9] = foo (c[9], d[9], a[9] * w, b[9] * w); | ||
62 | + e[10] = foo (c[10], d[10], a[10] * w, b[10] * w); | ||
63 | + e[11] = foo (c[11], d[11], a[11] * w, b[11] * w); | ||
64 | + e[12] = foo (c[12], d[12], a[12] * w, b[12] * w); | ||
65 | + e[13] = foo (c[13], d[13], a[13] * w, b[13] * w); | ||
66 | + e[14] = foo (c[14], d[14], a[14] * w, b[14] * w); | ||
67 | + e[15] = foo (c[15], d[15], a[15] * w, b[15] * w); | ||
68 | + } | ||
69 | +} | ||
70 | + | ||
71 | + | ||
72 | +unsigned char a[N], b[N], c[N], d[N], e[N]; | ||
73 | + | ||
74 | +int main () | ||
75 | +{ | ||
76 | + int i; | ||
77 | + | ||
78 | + check_vect (); | ||
79 | + | ||
80 | + for (i = 0; i < N; i++) | ||
81 | + { | ||
82 | + a[i] = i; | ||
83 | + b[i] = 5; | ||
84 | + e[i] = 0; | ||
85 | + | ||
86 | + switch (i % 9) | ||
87 | + { | ||
88 | + case 0: asm (""); c[i] = i; d[i] = i + 1; break; | ||
89 | + case 1: c[i] = 0; d[i] = 0; break; | ||
90 | + case 2: c[i] = i + 1; d[i] = i - 1; break; | ||
91 | + case 3: c[i] = i; d[i] = i + 7; break; | ||
92 | + case 4: c[i] = i; d[i] = i; break; | ||
93 | + case 5: c[i] = i + 16; d[i] = i + 3; break; | ||
94 | + case 6: c[i] = i - 5; d[i] = i; break; | ||
95 | + case 7: c[i] = i; d[i] = i; break; | ||
96 | + case 8: c[i] = i; d[i] = i - 7; break; | ||
97 | + } | ||
98 | + } | ||
99 | + | ||
100 | + bar (a, b, c, d, e, 16, 2); | ||
101 | + for (i = 0; i < N; i++) | ||
102 | + if (e[i] != ((i % 3) == 0 ? 10 : 2 * i)) | ||
103 | + abort (); | ||
104 | + | ||
105 | + return 0; | ||
106 | +} | ||
107 | + | ||
108 | +/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp" { target { vect_element_align && vect_int_mult } } } } */ | ||
109 | +/* { dg-final { cleanup-tree-dump "slp" } } */ | ||
110 | + | ||
111 | |||
112 | === added file 'gcc/testsuite/gcc.dg/vect/bb-slp-cond-4.c' | ||
113 | --- old/gcc/testsuite/gcc.dg/vect/bb-slp-cond-4.c 1970-01-01 00:00:00 +0000 | ||
114 | +++ new/gcc/testsuite/gcc.dg/vect/bb-slp-cond-4.c 2011-11-27 11:29:32 +0000 | ||
115 | @@ -0,0 +1,85 @@ | ||
116 | +/* { dg-require-effective-target vect_condition } */ | ||
117 | + | ||
118 | +#include "tree-vect.h" | ||
119 | + | ||
120 | +#define N 64 | ||
121 | + | ||
122 | +/* Comparison in short, then/else and result in int. */ | ||
123 | +static inline int | ||
124 | +foo (short x, short y, int a, int b) | ||
125 | +{ | ||
126 | + if (x >= y) | ||
127 | + return a; | ||
128 | + else | ||
129 | + return b; | ||
130 | +} | ||
131 | + | ||
132 | +__attribute__((noinline, noclone)) void | ||
133 | +bar (short * __restrict__ a, short * __restrict__ b, | ||
134 | + short * __restrict__ c, short * __restrict__ d, | ||
135 | + int * __restrict__ e, int stride, int w) | ||
136 | +{ | ||
137 | + int i; | ||
138 | + for (i = 0; i < N/stride; i++, a += stride, b += stride, c += stride, | ||
139 | + d += stride, e += stride) | ||
140 | + { | ||
141 | + e[0] = foo (c[0], d[0], a[0], b[0]); | ||
142 | + e[1] = foo (c[1], d[1], a[1], b[1]); | ||
143 | + e[2] = foo (c[2], d[2], a[2], b[2]); | ||
144 | + e[3] = foo (c[3], d[3], a[3], b[3]); | ||
145 | + e[4] = foo (c[4], d[4], a[4], b[4]); | ||
146 | + e[5] = foo (c[5], d[5], a[5], b[5]); | ||
147 | + e[6] = foo (c[6], d[6], a[6], b[6]); | ||
148 | + e[7] = foo (c[7], d[7], a[7], b[7]); | ||
149 | + e[8] = foo (c[8], d[8], a[8], b[8]); | ||
150 | + e[9] = foo (c[9], d[9], a[9], b[9]); | ||
151 | + e[10] = foo (c[10], d[10], a[10], b[10]); | ||
152 | + e[11] = foo (c[11], d[11], a[11], b[11]); | ||
153 | + e[12] = foo (c[12], d[12], a[12], b[12]); | ||
154 | + e[13] = foo (c[13], d[13], a[13], b[13]); | ||
155 | + e[14] = foo (c[14], d[14], a[14], b[14]); | ||
156 | + e[15] = foo (c[15], d[15], a[15], b[15]); | ||
157 | + } | ||
158 | +} | ||
159 | + | ||
160 | + | ||
161 | +short a[N], b[N], c[N], d[N]; | ||
162 | +int e[N]; | ||
163 | + | ||
164 | +int main () | ||
165 | +{ | ||
166 | + int i; | ||
167 | + | ||
168 | + check_vect (); | ||
169 | + | ||
170 | + for (i = 0; i < N; i++) | ||
171 | + { | ||
172 | + a[i] = i; | ||
173 | + b[i] = 5; | ||
174 | + e[i] = 0; | ||
175 | + | ||
176 | + switch (i % 9) | ||
177 | + { | ||
178 | + case 0: asm (""); c[i] = - i - 1; d[i] = i + 1; break; | ||
179 | + case 1: c[i] = 0; d[i] = 0; break; | ||
180 | + case 2: c[i] = i + 1; d[i] = - i - 1; break; | ||
181 | + case 3: c[i] = i; d[i] = i + 7; break; | ||
182 | + case 4: c[i] = i; d[i] = i; break; | ||
183 | + case 5: c[i] = i + 16; d[i] = i + 3; break; | ||
184 | + case 6: c[i] = - i - 5; d[i] = - i; break; | ||
185 | + case 7: c[i] = - i; d[i] = - i; break; | ||
186 | + case 8: c[i] = - i; d[i] = - i - 7; break; | ||
187 | + } | ||
188 | + } | ||
189 | + | ||
190 | + bar (a, b, c, d, e, 16, 2); | ||
191 | + for (i = 0; i < N; i++) | ||
192 | + if (e[i] != ((i % 3) == 0 ? 5 : i)) | ||
193 | + abort (); | ||
194 | + | ||
195 | + return 0; | ||
196 | +} | ||
197 | + | ||
198 | +/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp" { target vect_element_align } } } */ | ||
199 | +/* { dg-final { cleanup-tree-dump "slp" } } */ | ||
200 | + | ||
201 | |||
202 | === modified file 'gcc/tree-vect-patterns.c' | ||
203 | --- old/gcc/tree-vect-patterns.c 2011-11-23 07:49:33 +0000 | ||
204 | +++ new/gcc/tree-vect-patterns.c 2011-11-27 12:17:31 +0000 | ||
205 | @@ -62,18 +62,16 @@ | ||
206 | vect_recog_mixed_size_cond_pattern}; | ||
207 | |||
208 | |||
209 | -/* Function widened_name_p | ||
210 | - | ||
211 | - Check whether NAME, an ssa-name used in USE_STMT, | ||
212 | - is a result of a type-promotion, such that: | ||
213 | - DEF_STMT: NAME = NOP (name0) | ||
214 | - where the type of name0 (HALF_TYPE) is smaller than the type of NAME. | ||
215 | +/* Check whether NAME, an ssa-name used in USE_STMT, | ||
216 | + is a result of a type promotion or demotion, such that: | ||
217 | + DEF_STMT: NAME = NOP (name0) | ||
218 | + where the type of name0 (ORIG_TYPE) is smaller/bigger than the type of NAME. | ||
219 | If CHECK_SIGN is TRUE, check that either both types are signed or both are | ||
220 | unsigned. */ | ||
221 | |||
222 | static bool | ||
223 | -widened_name_p (tree name, gimple use_stmt, tree *half_type, gimple *def_stmt, | ||
224 | - bool check_sign) | ||
225 | +type_conversion_p (tree name, gimple use_stmt, bool check_sign, | ||
226 | + tree *orig_type, gimple *def_stmt, bool *promotion) | ||
227 | { | ||
228 | tree dummy; | ||
229 | gimple dummy_gimple; | ||
230 | @@ -96,21 +94,27 @@ | ||
231 | && dt != vect_external_def && dt != vect_constant_def) | ||
232 | return false; | ||
233 | |||
234 | - if (! *def_stmt) | ||
235 | + if (!*def_stmt) | ||
236 | return false; | ||
237 | |||
238 | if (!is_gimple_assign (*def_stmt)) | ||
239 | return false; | ||
240 | |||
241 | - if (gimple_assign_rhs_code (*def_stmt) != NOP_EXPR) | ||
242 | + if (!CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (*def_stmt))) | ||
243 | return false; | ||
244 | |||
245 | oprnd0 = gimple_assign_rhs1 (*def_stmt); | ||
246 | |||
247 | - *half_type = TREE_TYPE (oprnd0); | ||
248 | - if (!INTEGRAL_TYPE_P (type) || !INTEGRAL_TYPE_P (*half_type) | ||
249 | - || ((TYPE_UNSIGNED (type) != TYPE_UNSIGNED (*half_type)) && check_sign) | ||
250 | - || (TYPE_PRECISION (type) < (TYPE_PRECISION (*half_type) * 2))) | ||
251 | + *orig_type = TREE_TYPE (oprnd0); | ||
252 | + if (!INTEGRAL_TYPE_P (type) || !INTEGRAL_TYPE_P (*orig_type) | ||
253 | + || ((TYPE_UNSIGNED (type) != TYPE_UNSIGNED (*orig_type)) && check_sign)) | ||
254 | + return false; | ||
255 | + | ||
256 | + if (TYPE_PRECISION (type) >= (TYPE_PRECISION (*orig_type) * 2)) | ||
257 | + *promotion = true; | ||
258 | + else if (TYPE_PRECISION (*orig_type) >= (TYPE_PRECISION (type) * 2)) | ||
259 | + *promotion = false; | ||
260 | + else | ||
261 | return false; | ||
262 | |||
263 | if (!vect_is_simple_use (oprnd0, loop_vinfo, bb_vinfo, &dummy_gimple, &dummy, | ||
264 | @@ -192,6 +196,7 @@ | ||
265 | loop_vec_info loop_info = STMT_VINFO_LOOP_VINFO (stmt_vinfo); | ||
266 | struct loop *loop; | ||
267 | tree var, rhs; | ||
268 | + bool promotion; | ||
269 | |||
270 | if (!loop_info) | ||
271 | return NULL; | ||
272 | @@ -255,7 +260,9 @@ | ||
273 | return NULL; | ||
274 | stmt = last_stmt; | ||
275 | |||
276 | - if (widened_name_p (oprnd0, stmt, &half_type, &def_stmt, true)) | ||
277 | + if (type_conversion_p (oprnd0, stmt, true, &half_type, &def_stmt, | ||
278 | + &promotion) | ||
279 | + && promotion) | ||
280 | { | ||
281 | stmt = def_stmt; | ||
282 | oprnd0 = gimple_assign_rhs1 (stmt); | ||
283 | @@ -310,10 +317,14 @@ | ||
284 | if (!types_compatible_p (TREE_TYPE (oprnd0), prod_type) | ||
285 | || !types_compatible_p (TREE_TYPE (oprnd1), prod_type)) | ||
286 | return NULL; | ||
287 | - if (!widened_name_p (oprnd0, stmt, &half_type0, &def_stmt, true)) | ||
288 | + if (!type_conversion_p (oprnd0, stmt, true, &half_type0, &def_stmt, | ||
289 | + &promotion) | ||
290 | + || !promotion) | ||
291 | return NULL; | ||
292 | oprnd00 = gimple_assign_rhs1 (def_stmt); | ||
293 | - if (!widened_name_p (oprnd1, stmt, &half_type1, &def_stmt, true)) | ||
294 | + if (!type_conversion_p (oprnd0, stmt, true, &half_type1, &def_stmt, | ||
295 | + &promotion) | ||
296 | + || !promotion) | ||
297 | return NULL; | ||
298 | oprnd01 = gimple_assign_rhs1 (def_stmt); | ||
299 | if (!types_compatible_p (half_type0, half_type1)) | ||
300 | @@ -526,7 +537,7 @@ | ||
301 | enum tree_code dummy_code; | ||
302 | int dummy_int; | ||
303 | VEC (tree, heap) *dummy_vec; | ||
304 | - bool op1_ok; | ||
305 | + bool op1_ok, promotion; | ||
306 | |||
307 | if (!is_gimple_assign (last_stmt)) | ||
308 | return NULL; | ||
309 | @@ -546,12 +557,14 @@ | ||
310 | return NULL; | ||
311 | |||
312 | /* Check argument 0. */ | ||
313 | - if (!widened_name_p (oprnd0, last_stmt, &half_type0, &def_stmt0, false)) | ||
314 | + if (!type_conversion_p (oprnd0, last_stmt, false, &half_type0, &def_stmt0, | ||
315 | + &promotion) | ||
316 | + || !promotion) | ||
317 | return NULL; | ||
318 | - /* Check argument 1. */ | ||
319 | - op1_ok = widened_name_p (oprnd1, last_stmt, &half_type1, &def_stmt1, false); | ||
320 | - | ||
321 | - if (op1_ok) | ||
322 | + /* Check argument 1. */ | ||
323 | + op1_ok = type_conversion_p (oprnd1, last_stmt, false, &half_type1, | ||
324 | + &def_stmt1, &promotion); | ||
325 | + if (op1_ok && promotion) | ||
326 | { | ||
327 | oprnd0 = gimple_assign_rhs1 (def_stmt0); | ||
328 | oprnd1 = gimple_assign_rhs1 (def_stmt1); | ||
329 | @@ -793,6 +806,7 @@ | ||
330 | loop_vec_info loop_info = STMT_VINFO_LOOP_VINFO (stmt_vinfo); | ||
331 | struct loop *loop; | ||
332 | tree var; | ||
333 | + bool promotion; | ||
334 | |||
335 | if (!loop_info) | ||
336 | return NULL; | ||
337 | @@ -832,8 +846,10 @@ | ||
338 | Left to check that oprnd0 is defined by a cast from type 'type' to type | ||
339 | 'TYPE'. */ | ||
340 | |||
341 | - if (!widened_name_p (oprnd0, last_stmt, &half_type, &stmt, true)) | ||
342 | - return NULL; | ||
343 | + if (!type_conversion_p (oprnd0, last_stmt, true, &half_type, &stmt, | ||
344 | + &promotion) | ||
345 | + || !promotion) | ||
346 | + return NULL; | ||
347 | |||
348 | oprnd0 = gimple_assign_rhs1 (stmt); | ||
349 | *type_in = half_type; | ||
350 | @@ -899,6 +915,7 @@ | ||
351 | gimple def_stmt, new_stmt; | ||
352 | bool first = false; | ||
353 | loop_vec_info loop_info = STMT_VINFO_LOOP_VINFO (vinfo_for_stmt (stmt)); | ||
354 | + bool promotion; | ||
355 | bb_vec_info bb_info = STMT_VINFO_BB_VINFO (vinfo_for_stmt (stmt)); | ||
356 | struct loop *loop = NULL; | ||
357 | |||
358 | @@ -933,7 +950,9 @@ | ||
359 | else | ||
360 | { | ||
361 | first = true; | ||
362 | - if (!widened_name_p (oprnd, stmt, &half_type, &def_stmt, false) | ||
363 | + if (!type_conversion_p (oprnd, stmt, false, &half_type, &def_stmt, | ||
364 | + &promotion) | ||
365 | + || !promotion | ||
366 | || !gimple_bb (def_stmt) | ||
367 | || (loop && !flow_bb_inside_loop_p (loop, gimple_bb (def_stmt))) | ||
368 | || (!loop && gimple_bb (def_stmt) != BB_VINFO_BB (bb_info) | ||
369 | @@ -1327,6 +1346,7 @@ | ||
370 | VEC (tree, heap) * dummy_vec; | ||
371 | gimple use_stmt = NULL; | ||
372 | bool over_widen = false; | ||
373 | + bool promotion; | ||
374 | |||
375 | if (!is_gimple_assign (last_stmt) || !vinfo_for_stmt (last_stmt)) | ||
376 | return NULL; | ||
377 | @@ -1381,8 +1401,10 @@ | ||
378 | return NULL; | ||
379 | |||
380 | /* Check operand 0: it has to be defined by a type promotion. */ | ||
381 | - if (!widened_name_p (oprnd0, last_stmt, &half_type0, &def_stmt0, false)) | ||
382 | - return NULL; | ||
383 | + if (!type_conversion_p (oprnd0, last_stmt, false, &half_type0, &def_stmt0, | ||
384 | + &promotion) | ||
385 | + || !promotion) | ||
386 | + return NULL; | ||
387 | |||
388 | /* Check operand 1: has to be positive. We check that it fits the type | ||
389 | in vect_handle_widen_op_by_const (). */ | ||
390 | @@ -1492,9 +1514,9 @@ | ||
391 | S1 a_T = x_t CMP y_t ? b_T : c_T; | ||
392 | |||
393 | where type 'TYPE' is an integral type which has different size | ||
394 | - from 'type'. b_T and c_T are constants and if 'TYPE' is wider | ||
395 | + from 'type'. b_T and c_T are either constants (and if 'TYPE' is wider | ||
396 | than 'type', the constants need to fit into an integer type | ||
397 | - with the same width as 'type'. | ||
398 | + with the same width as 'type') or results of conversion from 'type'. | ||
399 | |||
400 | Input: | ||
401 | |||
402 | @@ -1523,6 +1545,9 @@ | ||
403 | enum machine_mode cmpmode; | ||
404 | gimple pattern_stmt, def_stmt; | ||
405 | loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo); | ||
406 | + tree orig_type0 = NULL_TREE, orig_type1 = NULL_TREE; | ||
407 | + gimple def_stmt0 = NULL, def_stmt1 = NULL; | ||
408 | + bool promotion; | ||
409 | bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_vinfo); | ||
410 | |||
411 | if (!is_gimple_assign (last_stmt) | ||
412 | @@ -1535,25 +1560,40 @@ | ||
413 | then_clause = TREE_OPERAND (op, 1); | ||
414 | else_clause = TREE_OPERAND (op, 2); | ||
415 | |||
416 | - if (TREE_CODE (then_clause) != INTEGER_CST | ||
417 | - || TREE_CODE (else_clause) != INTEGER_CST) | ||
418 | - return NULL; | ||
419 | - | ||
420 | if (!COMPARISON_CLASS_P (cond_expr)) | ||
421 | return NULL; | ||
422 | |||
423 | type = gimple_expr_type (last_stmt); | ||
424 | comp_type = TREE_TYPE (TREE_OPERAND (cond_expr, 0)); | ||
425 | - if (!INTEGRAL_TYPE_P (comp_type) | ||
426 | - || !INTEGRAL_TYPE_P (type)) | ||
427 | - return NULL; | ||
428 | - | ||
429 | comp_vectype = get_vectype_for_scalar_type (comp_type); | ||
430 | if (comp_vectype == NULL_TREE) | ||
431 | return NULL; | ||
432 | |||
433 | + if (types_compatible_p (type, comp_type) | ||
434 | + || !INTEGRAL_TYPE_P (comp_type) | ||
435 | + || !INTEGRAL_TYPE_P (type)) | ||
436 | + return NULL; | ||
437 | + | ||
438 | + if ((TREE_CODE (then_clause) != INTEGER_CST | ||
439 | + && !type_conversion_p (then_clause, last_stmt, false, &orig_type0, | ||
440 | + &def_stmt0, &promotion)) | ||
441 | + || (TREE_CODE (else_clause) != INTEGER_CST | ||
442 | + && !type_conversion_p (else_clause, last_stmt, false, &orig_type1, | ||
443 | + &def_stmt1, &promotion))) | ||
444 | + return NULL; | ||
445 | + | ||
446 | + if (orig_type0 && orig_type1 | ||
447 | + && (!types_compatible_p (orig_type0, orig_type1) | ||
448 | + || !types_compatible_p (orig_type0, comp_type))) | ||
449 | + return NULL; | ||
450 | + | ||
451 | + if (orig_type0) | ||
452 | + then_clause = gimple_assign_rhs1 (def_stmt0); | ||
453 | + | ||
454 | + if (orig_type1) | ||
455 | + else_clause = gimple_assign_rhs1 (def_stmt1); | ||
456 | + | ||
457 | cmpmode = GET_MODE_INNER (TYPE_MODE (comp_vectype)); | ||
458 | - | ||
459 | if (GET_MODE_BITSIZE (TYPE_MODE (type)) == GET_MODE_BITSIZE (cmpmode)) | ||
460 | return NULL; | ||
461 | |||
462 | @@ -1561,18 +1601,15 @@ | ||
463 | if (vectype == NULL_TREE) | ||
464 | return NULL; | ||
465 | |||
466 | - if (types_compatible_p (vectype, comp_vectype)) | ||
467 | - return NULL; | ||
468 | - | ||
469 | if (!expand_vec_cond_expr_p (comp_vectype, TYPE_MODE (comp_vectype))) | ||
470 | return NULL; | ||
471 | |||
472 | - if (GET_MODE_BITSIZE (TYPE_MODE (type)) > GET_MODE_BITSIZE (cmpmode)) | ||
473 | - { | ||
474 | - if (!int_fits_type_p (then_clause, comp_type) | ||
475 | - || !int_fits_type_p (else_clause, comp_type)) | ||
476 | - return NULL; | ||
477 | - } | ||
478 | + if (GET_MODE_BITSIZE (TYPE_MODE (type)) > GET_MODE_BITSIZE (cmpmode) | ||
479 | + && ((TREE_CODE (then_clause) == INTEGER_CST | ||
480 | + && !int_fits_type_p (then_clause, comp_type)) | ||
481 | + || (TREE_CODE (else_clause) == INTEGER_CST | ||
482 | + && !int_fits_type_p (else_clause, comp_type)))) | ||
483 | + return NULL; | ||
484 | |||
485 | tmp = build3 (COND_EXPR, comp_type, unshare_expr (cond_expr), | ||
486 | fold_convert (comp_type, then_clause), | ||
487 | |||