Contents of /trunk/gcc/patches/gcc-5.1.0-gomp-fixes.patch
Parent Directory | Revision Log
Revision 2571 -
(show annotations)
(download)
Wed Jun 10 08:34:21 2015 UTC (9 years, 3 months ago) by niro
File size: 72838 byte(s)
Wed Jun 10 08:34:21 2015 UTC (9 years, 3 months ago) by niro
File size: 72838 byte(s)
-upstream gomp fixes
1 | Submitted By: Bruce Dubbs <bdubbs@liinuxfromscratch.org> |
2 | Date: 2015-05-23 |
3 | Initial Package Version: 5.1.0 |
4 | Upstream Status: Committed |
5 | Origin: https://patchwork.ozlabs.org/patch/469768/raw/ and |
6 | gcc git |
7 | Description: Fix acc_device_type not distinguishing between |
8 | "offloaded" and host code with the host_nonshm plugin. |
9 | Fix inline issues. |
10 | |
11 | commit adccf2e7d313263d585f63e752a4d36653d47811 |
12 | Author: Julian Brown <julian@codesourcery.com> |
13 | Date: Tue Apr 21 12:40:45 2015 -0700 |
14 | |
15 | Non-SHM acc_on_device fixes |
16 | |
17 | diff --git a/gcc/builtins.c b/gcc/builtins.c |
18 | index 6fe1456..5930fe4 100644 |
19 | --- a/gcc/builtins.c |
20 | +++ b/gcc/builtins.c |
21 | @@ -5917,6 +5917,7 @@ expand_stack_save (void) |
22 | static rtx |
23 | expand_builtin_acc_on_device (tree exp, rtx target) |
24 | { |
25 | +#ifdef ACCEL_COMPILER |
26 | if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE)) |
27 | return NULL_RTX; |
28 | |
29 | @@ -5925,13 +5926,8 @@ expand_builtin_acc_on_device (tree exp, rtx target) |
30 | /* Return (arg == v1 || arg == v2) ? 1 : 0. */ |
31 | machine_mode v_mode = TYPE_MODE (TREE_TYPE (arg)); |
32 | rtx v = expand_normal (arg), v1, v2; |
33 | -#ifdef ACCEL_COMPILER |
34 | v1 = GEN_INT (GOMP_DEVICE_NOT_HOST); |
35 | v2 = GEN_INT (ACCEL_COMPILER_acc_device); |
36 | -#else |
37 | - v1 = GEN_INT (GOMP_DEVICE_NONE); |
38 | - v2 = GEN_INT (GOMP_DEVICE_HOST); |
39 | -#endif |
40 | machine_mode target_mode = TYPE_MODE (integer_type_node); |
41 | if (!target || !register_operand (target, target_mode)) |
42 | target = gen_reg_rtx (target_mode); |
43 | @@ -5945,6 +5941,9 @@ expand_builtin_acc_on_device (tree exp, rtx target) |
44 | emit_label (done_label); |
45 | |
46 | return target; |
47 | +#else |
48 | + return NULL; |
49 | +#endif |
50 | } |
51 | |
52 | |
53 | diff --git a/libgomp/oacc-init.c b/libgomp/oacc-init.c |
54 | index 335ffd4..157147a 100644 |
55 | --- a/libgomp/oacc-init.c |
56 | +++ b/libgomp/oacc-init.c |
57 | @@ -29,6 +29,7 @@ |
58 | #include "libgomp.h" |
59 | #include "oacc-int.h" |
60 | #include "openacc.h" |
61 | +#include "plugin/plugin-host.h" |
62 | #include <assert.h> |
63 | #include <stdlib.h> |
64 | #include <strings.h> |
65 | @@ -611,11 +612,18 @@ ialias (acc_set_device_num) |
66 | int |
67 | acc_on_device (acc_device_t dev) |
68 | { |
69 | - if (acc_get_device_type () == acc_device_host_nonshm) |
70 | + struct goacc_thread *thr = goacc_thread (); |
71 | + |
72 | + /* We only want to appear to be the "host_nonshm" plugin from "offloaded" |
73 | + code -- i.e. within a parallel region. Test a flag set by the |
74 | + openacc_parallel hook of the host_nonshm plugin to determine that. */ |
75 | + if (acc_get_device_type () == acc_device_host_nonshm |
76 | + && thr && thr->target_tls |
77 | + && ((struct nonshm_thread *)thr->target_tls)->nonshm_exec) |
78 | return dev == acc_device_host_nonshm || dev == acc_device_not_host; |
79 | |
80 | - /* Just rely on the compiler builtin. */ |
81 | - return __builtin_acc_on_device (dev); |
82 | + /* For OpenACC, libgomp is only built for the host, so this is sufficient. */ |
83 | + return dev == acc_device_host || dev == acc_device_none; |
84 | } |
85 | |
86 | ialias (acc_on_device) |
87 | diff --git a/libgomp/plugin/plugin-host.c b/libgomp/plugin/plugin-host.c |
88 | index 1faf5bc..3cb4dab 100644 |
89 | --- a/libgomp/plugin/plugin-host.c |
90 | +++ b/libgomp/plugin/plugin-host.c |
91 | @@ -44,6 +44,7 @@ |
92 | #include <stdlib.h> |
93 | #include <string.h> |
94 | #include <stdio.h> |
95 | +#include <stdbool.h> |
96 | |
97 | #ifdef HOST_NONSHM_PLUGIN |
98 | #define STATIC |
99 | @@ -55,6 +56,10 @@ |
100 | #define SELF "host: " |
101 | #endif |
102 | |
103 | +#ifdef HOST_NONSHM_PLUGIN |
104 | +#include "plugin-host.h" |
105 | +#endif |
106 | + |
107 | STATIC const char * |
108 | GOMP_OFFLOAD_get_name (void) |
109 | { |
110 | @@ -174,7 +179,10 @@ GOMP_OFFLOAD_openacc_parallel (void (*fn) (void *), |
111 | void *targ_mem_desc __attribute__ ((unused))) |
112 | { |
113 | #ifdef HOST_NONSHM_PLUGIN |
114 | + struct nonshm_thread *thd = GOMP_PLUGIN_acc_thread (); |
115 | + thd->nonshm_exec = true; |
116 | fn (devaddrs); |
117 | + thd->nonshm_exec = false; |
118 | #else |
119 | fn (hostaddrs); |
120 | #endif |
121 | @@ -232,11 +240,20 @@ STATIC void * |
122 | GOMP_OFFLOAD_openacc_create_thread_data (int ord |
123 | __attribute__ ((unused))) |
124 | { |
125 | +#ifdef HOST_NONSHM_PLUGIN |
126 | + struct nonshm_thread *thd |
127 | + = GOMP_PLUGIN_malloc (sizeof (struct nonshm_thread)); |
128 | + thd->nonshm_exec = false; |
129 | + return thd; |
130 | +#else |
131 | return NULL; |
132 | +#endif |
133 | } |
134 | |
135 | STATIC void |
136 | -GOMP_OFFLOAD_openacc_destroy_thread_data (void *tls_data |
137 | - __attribute__ ((unused))) |
138 | +GOMP_OFFLOAD_openacc_destroy_thread_data (void *tls_data) |
139 | { |
140 | +#ifdef HOST_NONSHM_PLUGIN |
141 | + free (tls_data); |
142 | +#endif |
143 | } |
144 | diff --git a/libgomp/plugin/plugin-host.h b/libgomp/plugin/plugin-host.h |
145 | new file mode 100644 |
146 | index 0000000..96955d1 |
147 | --- /dev/null |
148 | +++ b/libgomp/plugin/plugin-host.h |
149 | @@ -0,0 +1,37 @@ |
150 | +/* OpenACC Runtime Library: acc_device_host, acc_device_host_nonshm. |
151 | + |
152 | + Copyright (C) 2015 Free Software Foundation, Inc. |
153 | + |
154 | + Contributed by Mentor Embedded. |
155 | + |
156 | + This file is part of the GNU Offloading and Multi Processing Library |
157 | + (libgomp). |
158 | + |
159 | + Libgomp is free software; you can redistribute it and/or modify it |
160 | + under the terms of the GNU General Public License as published by |
161 | + the Free Software Foundation; either version 3, or (at your option) |
162 | + any later version. |
163 | + |
164 | + Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY |
165 | + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
166 | + FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
167 | + more details. |
168 | + |
169 | + Under Section 7 of GPL version 3, you are granted additional |
170 | + permissions described in the GCC Runtime Library Exception, version |
171 | + 3.1, as published by the Free Software Foundation. |
172 | + |
173 | + You should have received a copy of the GNU General Public License and |
174 | + a copy of the GCC Runtime Library Exception along with this program; |
175 | + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
176 | + <http://www.gnu.org/licenses/>. */ |
177 | + |
178 | +#ifndef PLUGIN_HOST_H |
179 | +#define PLUGIN_HOST_H |
180 | + |
181 | +struct nonshm_thread |
182 | +{ |
183 | + bool nonshm_exec; |
184 | +}; |
185 | + |
186 | +#endif |
187 | diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c |
188 | index 81ea476..25cc15a 100644 |
189 | --- a/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c |
190 | +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_on_device-1.c |
191 | @@ -1,7 +1,3 @@ |
192 | -/* Disable the acc_on_device builtin; we want to test the libgomp library |
193 | - function. */ |
194 | -/* { dg-additional-options "-fno-builtin-acc_on_device" } */ |
195 | - |
196 | #include <stdlib.h> |
197 | #include <openacc.h> |
198 | |
199 | diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/if-1.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/if-1.c |
200 | index 184b355..6aa3bb7 100644 |
201 | --- a/libgomp/testsuite/libgomp.oacc-c-c++-common/if-1.c |
202 | +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/if-1.c |
203 | @@ -1,5 +1,4 @@ |
204 | /* { dg-do run } */ |
205 | -/* { dg-additional-options "-fno-builtin-acc_on_device" } */ |
206 | |
207 | #include <openacc.h> |
208 | #include <stdlib.h> |
209 | diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90 |
210 | index 4488818..729b685 100644 |
211 | --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90 |
212 | +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-1.f90 |
213 | @@ -1,8 +1,4 @@ |
214 | ! { dg-additional-options "-cpp" } |
215 | -! TODO: Have to disable the acc_on_device builtin for we want to test the |
216 | -! libgomp library function? The command line option |
217 | -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not for |
218 | -! Fortran. |
219 | |
220 | use openacc |
221 | implicit none |
222 | diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f |
223 | index 0047a19..19ff4a5 100644 |
224 | --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f |
225 | +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-2.f |
226 | @@ -1,8 +1,4 @@ |
227 | ! { dg-additional-options "-cpp" } |
228 | -! TODO: Have to disable the acc_on_device builtin for we want to test |
229 | -! the libgomp library function? The command line option |
230 | -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not |
231 | -! for Fortran. |
232 | |
233 | USE OPENACC |
234 | IMPLICIT NONE |
235 | diff --git a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f |
236 | index 49d7a72..b01c553 100644 |
237 | --- a/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f |
238 | +++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_on_device-1-3.f |
239 | @@ -1,8 +1,4 @@ |
240 | ! { dg-additional-options "-cpp" } |
241 | -! TODO: Have to disable the acc_on_device builtin for we want to test |
242 | -! the libgomp library function? The command line option |
243 | -! '-fno-builtin-acc_on_device' is valid for C/C++/ObjC/ObjC++ but not |
244 | -! for Fortran. |
245 | |
246 | IMPLICIT NONE |
247 | INCLUDE "openacc_lib.h" |
248 | |
249 | --- a/gcc/c/c-parser.c 2015-04-20 18:55:33.000000000 +0200 |
250 | +++ b/gcc/c/c-parser.c 2015-05-23 11:32:41.664037866 +0200 |
251 | @@ -13069,12 +13069,9 @@ |
252 | } |
253 | else |
254 | { |
255 | - /* Copy lastprivate (decl) clause to OMP_FOR_CLAUSES, |
256 | - change it to shared (decl) in |
257 | - OMP_PARALLEL_CLAUSES. */ |
258 | - tree l = build_omp_clause (OMP_CLAUSE_LOCATION (*c), |
259 | - OMP_CLAUSE_LASTPRIVATE); |
260 | - OMP_CLAUSE_DECL (l) = OMP_CLAUSE_DECL (*c); |
261 | + /* Move lastprivate (decl) clause to OMP_FOR_CLAUSES. */ |
262 | + tree l = *c; |
263 | + *c = OMP_CLAUSE_CHAIN (*c); |
264 | if (code == OMP_SIMD) |
265 | { |
266 | OMP_CLAUSE_CHAIN (l) |
267 | @@ -13086,7 +13083,6 @@ |
268 | OMP_CLAUSE_CHAIN (l) = clauses; |
269 | clauses = l; |
270 | } |
271 | - OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED); |
272 | } |
273 | } |
274 | } |
275 | @@ -13771,6 +13767,7 @@ |
276 | TREE_TYPE (ret) = void_type_node; |
277 | OMP_TEAMS_CLAUSES (ret) = clauses; |
278 | OMP_TEAMS_BODY (ret) = block; |
279 | + OMP_TEAMS_COMBINED (ret) = 1; |
280 | return add_stmt (ret); |
281 | } |
282 | } |
283 | --- a/gcc/calls.c 2015-04-07 23:02:12.000000000 +0200 |
284 | +++ b/gcc/calls.c 2015-05-23 11:18:33.952634193 +0200 |
285 | @@ -2099,6 +2099,26 @@ |
286 | (XEXP (args[i].value, 0), size))) |
287 | *sibcall_failure = 1; |
288 | |
289 | + if (size % UNITS_PER_WORD == 0 |
290 | + || MEM_ALIGN (mem) % BITS_PER_WORD == 0) |
291 | + move_block_to_reg (REGNO (reg), mem, nregs, args[i].mode); |
292 | + else |
293 | + { |
294 | + if (nregs > 1) |
295 | + move_block_to_reg (REGNO (reg), mem, nregs - 1, |
296 | + args[i].mode); |
297 | + rtx dest = gen_rtx_REG (word_mode, REGNO (reg) + nregs - 1); |
298 | + unsigned int bitoff = (nregs - 1) * BITS_PER_WORD; |
299 | + unsigned int bitsize = size * BITS_PER_UNIT - bitoff; |
300 | + rtx x = extract_bit_field (mem, bitsize, bitoff, 1, |
301 | + dest, word_mode, word_mode); |
302 | + if (BYTES_BIG_ENDIAN) |
303 | + x = expand_shift (LSHIFT_EXPR, word_mode, x, |
304 | + BITS_PER_WORD - bitsize, dest, 1); |
305 | + if (x != dest) |
306 | + emit_move_insn (dest, x); |
307 | + } |
308 | + |
309 | /* Handle a BLKmode that needs shifting. */ |
310 | if (nregs == 1 && size < UNITS_PER_WORD |
311 | #ifdef BLOCK_REG_PADDING |
312 | @@ -2106,22 +2126,18 @@ |
313 | #else |
314 | && BYTES_BIG_ENDIAN |
315 | #endif |
316 | - ) |
317 | + ) |
318 | { |
319 | - rtx tem = operand_subword_force (mem, 0, args[i].mode); |
320 | - rtx ri = gen_rtx_REG (word_mode, REGNO (reg)); |
321 | - rtx x = gen_reg_rtx (word_mode); |
322 | + rtx dest = gen_rtx_REG (word_mode, REGNO (reg)); |
323 | int shift = (UNITS_PER_WORD - size) * BITS_PER_UNIT; |
324 | - enum tree_code dir = BYTES_BIG_ENDIAN ? RSHIFT_EXPR |
325 | - : LSHIFT_EXPR; |
326 | + enum tree_code dir = (BYTES_BIG_ENDIAN |
327 | + ? RSHIFT_EXPR : LSHIFT_EXPR); |
328 | + rtx x; |
329 | |
330 | - emit_move_insn (x, tem); |
331 | - x = expand_shift (dir, word_mode, x, shift, ri, 1); |
332 | - if (x != ri) |
333 | - emit_move_insn (ri, x); |
334 | + x = expand_shift (dir, word_mode, dest, shift, dest, 1); |
335 | + if (x != dest) |
336 | + emit_move_insn (dest, x); |
337 | } |
338 | - else |
339 | - move_block_to_reg (REGNO (reg), mem, nregs, args[i].mode); |
340 | } |
341 | |
342 | /* When a parameter is a block, and perhaps in other cases, it is |
343 | --- a/gcc/config/i386/i386.c 2015-04-17 23:55:05.000000000 +0200 |
344 | +++ b/gcc/config/i386/i386.c 2015-05-23 11:27:55.981186322 +0200 |
345 | @@ -2988,6 +2988,17 @@ |
346 | return; |
347 | } |
348 | |
349 | + if ((stringop_alg) i == rep_prefix_8_byte |
350 | + && !TARGET_64BIT) |
351 | + { |
352 | + /* rep; movq isn't available in 32-bit code. */ |
353 | + error ("stringop strategy name %s specified for option %s " |
354 | + "not supported for 32-bit code", |
355 | + alg_name, |
356 | + is_memset ? "-mmemset_strategy=" : "-mmemcpy_strategy="); |
357 | + return; |
358 | + } |
359 | + |
360 | input_ranges[n].max = maxs; |
361 | input_ranges[n].alg = (stringop_alg) i; |
362 | if (!strcmp (align, "align")) |
363 | @@ -5867,7 +5878,10 @@ |
364 | /* Return 1 or 2, if we can pass up to SSE_REGPARM_MAX SFmode (1) and |
365 | DFmode (2) arguments in SSE registers for a function with the |
366 | indicated TYPE and DECL. DECL may be NULL when calling function |
367 | - indirectly or considering a libcall. Otherwise return 0. */ |
368 | + indirectly or considering a libcall. Return -1 if any FP parameter |
369 | + should be rejected by error. This is used in siutation we imply SSE |
370 | + calling convetion but the function is called from another function with |
371 | + SSE disabled. Otherwise return 0. */ |
372 | |
373 | static int |
374 | ix86_function_sseregparm (const_tree type, const_tree decl, bool warn) |
375 | @@ -5916,14 +5930,13 @@ |
376 | { |
377 | /* Refuse to produce wrong code when local function with SSE enabled |
378 | is called from SSE disabled function. |
379 | - We may work hard to work out these scenarios but hopefully |
380 | - it doesnot matter in practice. */ |
381 | + FIXME: We need a way to detect these cases cross-ltrans partition |
382 | + and avoid using SSE calling conventions on local functions called |
383 | + from function with SSE disabled. For now at least delay the |
384 | + warning until we know we are going to produce wrong code. |
385 | + See PR66047 */ |
386 | if (!TARGET_SSE && warn) |
387 | - { |
388 | - error ("calling %qD with SSE caling convention without " |
389 | - "SSE/SSE2 enabled", decl); |
390 | - return 0; |
391 | - } |
392 | + return -1; |
393 | return TARGET_SSE2_P (target_opts_for_fn (target->decl) |
394 | ->x_ix86_isa_flags) ? 2 : 1; |
395 | } |
396 | @@ -6479,6 +6492,7 @@ |
397 | cum->bnd_regno = FIRST_BND_REG; |
398 | cum->bnds_in_bt = 0; |
399 | cum->force_bnd_pass = 0; |
400 | + cum->decl = fndecl; |
401 | |
402 | if (!TARGET_64BIT) |
403 | { |
404 | @@ -7424,6 +7438,7 @@ |
405 | HOST_WIDE_INT words) |
406 | { |
407 | int res = 0; |
408 | + bool error_p = NULL; |
409 | |
410 | switch (mode) |
411 | { |
412 | @@ -7456,9 +7471,13 @@ |
413 | gcc_unreachable (); |
414 | |
415 | case DFmode: |
416 | + if (cum->float_in_sse == -1) |
417 | + error_p = 1; |
418 | if (cum->float_in_sse < 2) |
419 | break; |
420 | case SFmode: |
421 | + if (cum->float_in_sse == -1) |
422 | + error_p = 1; |
423 | if (cum->float_in_sse < 1) |
424 | break; |
425 | /* FALLTHRU */ |
426 | @@ -7514,6 +7533,14 @@ |
427 | } |
428 | break; |
429 | } |
430 | + if (error_p) |
431 | + { |
432 | + cum->float_in_sse = 0; |
433 | + error ("calling %qD with SSE calling convention without " |
434 | + "SSE/SSE2 enabled", cum->decl); |
435 | + sorry ("this is a GCC bug that can be worked around by adding " |
436 | + "attribute used to function called"); |
437 | + } |
438 | |
439 | return res; |
440 | } |
441 | @@ -7646,10 +7673,11 @@ |
442 | (otherwise it is an extra parameter matching an ellipsis). */ |
443 | |
444 | static rtx |
445 | -function_arg_32 (const CUMULATIVE_ARGS *cum, machine_mode mode, |
446 | +function_arg_32 (CUMULATIVE_ARGS *cum, machine_mode mode, |
447 | machine_mode orig_mode, const_tree type, |
448 | HOST_WIDE_INT bytes, HOST_WIDE_INT words) |
449 | { |
450 | + bool error_p = false; |
451 | /* Avoid the AL settings for the Unix64 ABI. */ |
452 | if (mode == VOIDmode) |
453 | return constm1_rtx; |
454 | @@ -7690,9 +7718,13 @@ |
455 | break; |
456 | |
457 | case DFmode: |
458 | + if (cum->float_in_sse == -1) |
459 | + error_p = 1; |
460 | if (cum->float_in_sse < 2) |
461 | break; |
462 | case SFmode: |
463 | + if (cum->float_in_sse == -1) |
464 | + error_p = 1; |
465 | if (cum->float_in_sse < 1) |
466 | break; |
467 | /* FALLTHRU */ |
468 | @@ -7751,6 +7783,14 @@ |
469 | } |
470 | break; |
471 | } |
472 | + if (error_p) |
473 | + { |
474 | + cum->float_in_sse = 0; |
475 | + error ("calling %qD with SSE calling convention without " |
476 | + "SSE/SSE2 enabled", cum->decl); |
477 | + sorry ("this is a GCC bug that can be worked around by adding " |
478 | + "attribute used to function called"); |
479 | + } |
480 | |
481 | return NULL_RTX; |
482 | } |
483 | @@ -8230,8 +8270,15 @@ |
484 | if ((fn || fntype) && (mode == SFmode || mode == DFmode)) |
485 | { |
486 | int sse_level = ix86_function_sseregparm (fntype, fn, false); |
487 | - if ((sse_level >= 1 && mode == SFmode) |
488 | - || (sse_level == 2 && mode == DFmode)) |
489 | + if (sse_level == -1) |
490 | + { |
491 | + error ("calling %qD with SSE caling convention without " |
492 | + "SSE/SSE2 enabled", fn); |
493 | + sorry ("this is a GCC bug that can be worked around by adding " |
494 | + "attribute used to function called"); |
495 | + } |
496 | + else if ((sse_level >= 1 && mode == SFmode) |
497 | + || (sse_level == 2 && mode == DFmode)) |
498 | regno = FIRST_SSE_REG; |
499 | } |
500 | |
501 | @@ -46892,15 +46939,16 @@ |
502 | static bool |
503 | expand_vec_perm_blend (struct expand_vec_perm_d *d) |
504 | { |
505 | - machine_mode vmode = d->vmode; |
506 | + machine_mode mmode, vmode = d->vmode; |
507 | unsigned i, mask, nelt = d->nelt; |
508 | - rtx target, op0, op1, x; |
509 | + rtx target, op0, op1, maskop, x; |
510 | rtx rperm[32], vperm; |
511 | |
512 | if (d->one_operand_p) |
513 | return false; |
514 | if (TARGET_AVX512F && GET_MODE_SIZE (vmode) == 64 |
515 | - && GET_MODE_SIZE (GET_MODE_INNER (vmode)) >= 4) |
516 | + && (TARGET_AVX512BW |
517 | + || GET_MODE_SIZE (GET_MODE_INNER (vmode)) >= 4)) |
518 | ; |
519 | else if (TARGET_AVX2 && GET_MODE_SIZE (vmode) == 32) |
520 | ; |
521 | @@ -47074,8 +47122,33 @@ |
522 | gcc_unreachable (); |
523 | } |
524 | |
525 | + switch (vmode) |
526 | + { |
527 | + case V8DFmode: |
528 | + case V8DImode: |
529 | + mmode = QImode; |
530 | + break; |
531 | + case V16SFmode: |
532 | + case V16SImode: |
533 | + mmode = HImode; |
534 | + break; |
535 | + case V32HImode: |
536 | + mmode = SImode; |
537 | + break; |
538 | + case V64QImode: |
539 | + mmode = DImode; |
540 | + break; |
541 | + default: |
542 | + mmode = VOIDmode; |
543 | + } |
544 | + |
545 | + if (mmode != VOIDmode) |
546 | + maskop = force_reg (mmode, gen_int_mode (mask, mmode)); |
547 | + else |
548 | + maskop = GEN_INT (mask); |
549 | + |
550 | /* This matches five different patterns with the different modes. */ |
551 | - x = gen_rtx_VEC_MERGE (vmode, op1, op0, GEN_INT (mask)); |
552 | + x = gen_rtx_VEC_MERGE (vmode, op1, op0, maskop); |
553 | x = gen_rtx_SET (VOIDmode, target, x); |
554 | emit_insn (x); |
555 | if (target != d->target) |
556 | @@ -51606,7 +51679,7 @@ |
557 | for (i = 0; i < loop->num_nodes; i++) |
558 | FOR_BB_INSNS (bbs[i], insn) |
559 | if (NONDEBUG_INSN_P (insn)) |
560 | - FOR_EACH_SUBRTX (iter, array, insn, NONCONST) |
561 | + FOR_EACH_SUBRTX (iter, array, PATTERN (insn), NONCONST) |
562 | if (const_rtx x = *iter) |
563 | if (MEM_P (x)) |
564 | { |
565 | --- a/gcc/config/i386/i386.h 2015-02-21 01:06:53.000000000 +0100 |
566 | +++ b/gcc/config/i386/i386.h 2015-05-23 11:26:56.002281385 +0200 |
567 | @@ -1682,6 +1682,7 @@ |
568 | int stdarg; /* Set to 1 if function is stdarg. */ |
569 | enum calling_abi call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise |
570 | MS_ABI for ms abi. */ |
571 | + tree decl; /* Callee decl. */ |
572 | } CUMULATIVE_ARGS; |
573 | |
574 | /* Initialize a variable CUM of type CUMULATIVE_ARGS |
575 | --- a/gcc/config/i386/sse.md 2015-04-09 23:37:28.000000000 +0200 |
576 | +++ b/gcc/config/i386/sse.md 2015-05-23 11:18:33.954634308 +0200 |
577 | @@ -9523,7 +9523,7 @@ |
578 | (mult:V4DI |
579 | (sign_extend:V4DI |
580 | (vec_select:V4SI |
581 | - (match_operand:V8SI 1 "nonimmediate_operand" "v") |
582 | + (match_operand:V8SI 1 "nonimmediate_operand" "%v") |
583 | (parallel [(const_int 0) (const_int 2) |
584 | (const_int 4) (const_int 6)]))) |
585 | (sign_extend:V4DI |
586 | --- a/gcc/cp/constexpr.c 2015-04-12 21:10:58.000000000 +0200 |
587 | +++ b/gcc/cp/constexpr.c 2015-05-23 11:18:33.955634365 +0200 |
588 | @@ -1355,7 +1355,14 @@ |
589 | fun = DECL_CHAIN (fun)) |
590 | if (DECL_SAVED_TREE (fun)) |
591 | break; |
592 | - gcc_assert (DECL_SAVED_TREE (fun)); |
593 | + if (!DECL_SAVED_TREE (fun)) |
594 | + { |
595 | + /* cgraph/gimplification have released the DECL_SAVED_TREE |
596 | + for this function. Fail gracefully. */ |
597 | + gcc_assert (ctx->quiet); |
598 | + *non_constant_p = true; |
599 | + return t; |
600 | + } |
601 | tree parms, res; |
602 | |
603 | /* Unshare the whole function body. */ |
604 | @@ -2603,14 +2610,29 @@ |
605 | { |
606 | constexpr_ctx new_ctx = *ctx; |
607 | |
608 | + tree init = TREE_OPERAND (t, 1); |
609 | + |
610 | /* First we figure out where we're storing to. */ |
611 | tree target = TREE_OPERAND (t, 0); |
612 | + tree type = TREE_TYPE (target); |
613 | target = cxx_eval_constant_expression (ctx, target, |
614 | true, |
615 | non_constant_p, overflow_p); |
616 | if (*non_constant_p) |
617 | return t; |
618 | |
619 | + if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (target), type) |
620 | + && is_empty_class (type)) |
621 | + { |
622 | + /* For initialization of an empty base, the original target will be |
623 | + *(base*)this, which the above evaluation resolves to the object |
624 | + argument, which has the derived type rather than the base type. In |
625 | + this situation, just evaluate the initializer and return, since |
626 | + there's no actual data to store. */ |
627 | + return cxx_eval_constant_expression (ctx, init, false, |
628 | + non_constant_p, overflow_p); |
629 | + } |
630 | + |
631 | /* And then find the underlying variable. */ |
632 | vec<tree,va_gc> *refs = make_tree_vector(); |
633 | tree object = NULL_TREE; |
634 | @@ -2647,7 +2669,7 @@ |
635 | *non_constant_p = true; |
636 | return t; |
637 | } |
638 | - tree type = TREE_TYPE (object); |
639 | + type = TREE_TYPE (object); |
640 | while (!refs->is_empty()) |
641 | { |
642 | if (*valp == NULL_TREE) |
643 | @@ -2684,9 +2706,8 @@ |
644 | new_ctx.object = target; |
645 | } |
646 | |
647 | - tree init = cxx_eval_constant_expression (&new_ctx, TREE_OPERAND (t, 1), |
648 | - false, |
649 | - non_constant_p, overflow_p); |
650 | + init = cxx_eval_constant_expression (&new_ctx, init, false, |
651 | + non_constant_p, overflow_p); |
652 | if (target == object) |
653 | /* The hash table might have moved since the get earlier. */ |
654 | ctx->values->put (object, init); |
655 | --- a/gcc/cp/cvt.c 2015-01-09 21:18:42.000000000 +0100 |
656 | +++ b/gcc/cp/cvt.c 2015-05-23 11:18:33.956634423 +0200 |
657 | @@ -603,8 +603,20 @@ |
658 | tree |
659 | cp_fold_convert (tree type, tree expr) |
660 | { |
661 | - tree conv = fold_convert (type, expr); |
662 | - conv = ignore_overflows (conv, expr); |
663 | + tree conv; |
664 | + if (TREE_TYPE (expr) == type) |
665 | + conv = expr; |
666 | + else if (TREE_CODE (expr) == PTRMEM_CST) |
667 | + { |
668 | + /* Avoid wrapping a PTRMEM_CST in NOP_EXPR. */ |
669 | + conv = copy_node (expr); |
670 | + TREE_TYPE (conv) = type; |
671 | + } |
672 | + else |
673 | + { |
674 | + conv = fold_convert (type, expr); |
675 | + conv = ignore_overflows (conv, expr); |
676 | + } |
677 | return conv; |
678 | } |
679 | |
680 | --- a/gcc/cp/decl2.c 2015-03-19 20:12:43.000000000 +0100 |
681 | +++ b/gcc/cp/decl2.c 2015-05-23 11:24:52.397411028 +0200 |
682 | @@ -1175,6 +1175,10 @@ |
683 | && is_attribute_p ("omp declare simd", name)) |
684 | return true; |
685 | |
686 | + /* An attribute pack is clearly dependent. */ |
687 | + if (args && PACK_EXPANSION_P (args)) |
688 | + return true; |
689 | + |
690 | /* If any of the arguments are dependent expressions, we can't evaluate |
691 | the attribute until instantiation time. */ |
692 | for (arg = args; arg; arg = TREE_CHAIN (arg)) |
693 | --- a/gcc/cp/decl.c 2015-04-02 18:43:02.000000000 +0200 |
694 | +++ b/gcc/cp/decl.c 2015-05-23 11:23:34.737303073 +0200 |
695 | @@ -4825,8 +4825,11 @@ |
696 | |
697 | was_public = TREE_PUBLIC (decl); |
698 | |
699 | - /* Enter this declaration into the symbol table. */ |
700 | - decl = maybe_push_decl (decl); |
701 | + /* Enter this declaration into the symbol table. Don't push the plain |
702 | + VAR_DECL for a variable template. */ |
703 | + if (!template_parm_scope_p () |
704 | + || TREE_CODE (decl) != VAR_DECL) |
705 | + decl = maybe_push_decl (decl); |
706 | |
707 | if (processing_template_decl) |
708 | decl = push_template_decl (decl); |
709 | @@ -10628,7 +10631,7 @@ |
710 | } |
711 | else if (decl_context == FIELD) |
712 | { |
713 | - if (!staticp && TREE_CODE (type) != METHOD_TYPE |
714 | + if (!staticp && !friendp && TREE_CODE (type) != METHOD_TYPE |
715 | && type_uses_auto (type)) |
716 | { |
717 | error ("non-static data member declared %<auto%>"); |
718 | --- a/gcc/cp/lambda.c 2015-04-03 19:23:27.000000000 +0200 |
719 | +++ b/gcc/cp/lambda.c 2015-05-23 11:18:33.958634538 +0200 |
720 | @@ -787,7 +787,7 @@ |
721 | /* In a lambda, need to go through 'this' capture. */ |
722 | tree lam = CLASSTYPE_LAMBDA_EXPR (current_class_type); |
723 | tree cap = lambda_expr_this_capture (lam, add_capture_p); |
724 | - if (cap != error_mark_node) |
725 | + if (cap && cap != error_mark_node) |
726 | object = build_x_indirect_ref (EXPR_LOCATION (object), cap, |
727 | RO_NULL, tf_warning_or_error); |
728 | } |
729 | --- a/gcc/cp/name-lookup.c 2015-04-01 23:27:55.000000000 +0200 |
730 | +++ b/gcc/cp/name-lookup.c 2015-05-23 11:18:33.958634538 +0200 |
731 | @@ -3408,7 +3408,7 @@ |
732 | tf_warning_or_error); |
733 | if (b_kind < bk_proper_base) |
734 | { |
735 | - if (!bases_dependent_p) |
736 | + if (!bases_dependent_p || b_kind == bk_same_type) |
737 | { |
738 | error_not_base_type (scope, current_class_type); |
739 | return NULL_TREE; |
740 | --- a/gcc/cp/parser.c 2015-04-20 18:55:33.000000000 +0200 |
741 | +++ b/gcc/cp/parser.c 2015-05-23 11:32:41.668037917 +0200 |
742 | @@ -22500,6 +22500,13 @@ |
743 | attributes = attribute; |
744 | } |
745 | token = cp_lexer_peek_token (parser->lexer); |
746 | + if (token->type == CPP_ELLIPSIS) |
747 | + { |
748 | + cp_lexer_consume_token (parser->lexer); |
749 | + TREE_VALUE (attribute) |
750 | + = make_pack_expansion (TREE_VALUE (attribute)); |
751 | + token = cp_lexer_peek_token (parser->lexer); |
752 | + } |
753 | if (token->type != CPP_COMMA) |
754 | break; |
755 | cp_lexer_consume_token (parser->lexer); |
756 | @@ -22578,20 +22585,27 @@ |
757 | return alignas_expr; |
758 | } |
759 | |
760 | + alignas_expr = cxx_alignas_expr (alignas_expr); |
761 | + alignas_expr = build_tree_list (NULL_TREE, alignas_expr); |
762 | + |
763 | + if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)) |
764 | + { |
765 | + cp_lexer_consume_token (parser->lexer); |
766 | + alignas_expr = make_pack_expansion (alignas_expr); |
767 | + } |
768 | + |
769 | if (cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN) == NULL) |
770 | { |
771 | cp_parser_error (parser, "expected %<)%>"); |
772 | return error_mark_node; |
773 | } |
774 | |
775 | - alignas_expr = cxx_alignas_expr (alignas_expr); |
776 | - |
777 | /* Build the C++-11 representation of an 'aligned' |
778 | attribute. */ |
779 | attributes = |
780 | build_tree_list (build_tree_list (get_identifier ("gnu"), |
781 | get_identifier ("aligned")), |
782 | - build_tree_list (NULL_TREE, alignas_expr)); |
783 | + alignas_expr); |
784 | } |
785 | |
786 | return attributes; |
787 | @@ -30466,11 +30480,9 @@ |
788 | else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_LASTPRIVATE |
789 | && OMP_CLAUSE_DECL (*c) == real_decl) |
790 | { |
791 | - /* Add lastprivate (decl) clause to OMP_FOR_CLAUSES, |
792 | - change it to shared (decl) in OMP_PARALLEL_CLAUSES. */ |
793 | - tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE); |
794 | - OMP_CLAUSE_DECL (l) = real_decl; |
795 | - CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c); |
796 | + /* Move lastprivate (decl) clause to OMP_FOR_CLAUSES. */ |
797 | + tree l = *c; |
798 | + *c = OMP_CLAUSE_CHAIN (*c); |
799 | if (code == OMP_SIMD) |
800 | { |
801 | OMP_CLAUSE_CHAIN (l) = cclauses[C_OMP_CLAUSE_SPLIT_FOR]; |
802 | @@ -30481,8 +30493,6 @@ |
803 | OMP_CLAUSE_CHAIN (l) = clauses; |
804 | clauses = l; |
805 | } |
806 | - OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED); |
807 | - CP_OMP_CLAUSE_INFO (*c) = NULL; |
808 | add_private_clause = false; |
809 | } |
810 | else |
811 | @@ -31316,6 +31326,7 @@ |
812 | TREE_TYPE (ret) = void_type_node; |
813 | OMP_TEAMS_CLAUSES (ret) = clauses; |
814 | OMP_TEAMS_BODY (ret) = body; |
815 | + OMP_TEAMS_COMBINED (ret) = 1; |
816 | return add_stmt (ret); |
817 | } |
818 | } |
819 | --- a/gcc/cp/pt.c 2015-04-01 23:27:55.000000000 +0200 |
820 | +++ b/gcc/cp/pt.c 2015-05-23 11:27:30.146802454 +0200 |
821 | @@ -1919,7 +1919,13 @@ |
822 | ++header_count; |
823 | |
824 | if (variable_template_p (fns)) |
825 | - templates = tree_cons (explicit_targs, fns, templates); |
826 | + { |
827 | + tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (fns)); |
828 | + targs = coerce_template_parms (parms, explicit_targs, fns, |
829 | + tf_warning_or_error, |
830 | + /*req_all*/true, /*use_defarg*/true); |
831 | + templates = tree_cons (targs, fns, templates); |
832 | + } |
833 | else for (; fns; fns = OVL_NEXT (fns)) |
834 | { |
835 | tree fn = OVL_CURRENT (fns); |
836 | @@ -3338,9 +3344,9 @@ |
837 | if (!arg || arg == error_mark_node) |
838 | return arg; |
839 | |
840 | - if (TREE_CODE (arg) == TREE_LIST) |
841 | + if (TREE_CODE (arg) == TREE_LIST && TREE_PURPOSE (arg)) |
842 | { |
843 | - /* The only time we will see a TREE_LIST here is for a base |
844 | + /* A TREE_LIST with a non-null TREE_PURPOSE is for a base |
845 | class initializer. In this case, the TREE_PURPOSE will be a |
846 | _TYPE node (representing the base class expansion we're |
847 | initializing) and the TREE_VALUE will be a TREE_LIST |
848 | @@ -9065,6 +9071,21 @@ |
849 | = tree_cons (NULL_TREE, TREE_VALUE (TREE_VALUE (t)), |
850 | chain); |
851 | } |
852 | + else if (TREE_VALUE (t) && PACK_EXPANSION_P (TREE_VALUE (t))) |
853 | + { |
854 | + /* An attribute pack expansion. */ |
855 | + tree purp = TREE_PURPOSE (t); |
856 | + tree pack = (tsubst_pack_expansion |
857 | + (TREE_VALUE (t), args, complain, in_decl)); |
858 | + int len = TREE_VEC_LENGTH (pack); |
859 | + for (int i = 0; i < len; ++i) |
860 | + { |
861 | + tree elt = TREE_VEC_ELT (pack, i); |
862 | + *q = build_tree_list (purp, elt); |
863 | + q = &TREE_CHAIN (*q); |
864 | + } |
865 | + continue; |
866 | + } |
867 | else |
868 | TREE_VALUE (t) |
869 | = tsubst_expr (TREE_VALUE (t), args, complain, in_decl, |
870 | @@ -11302,6 +11323,11 @@ |
871 | tmpl = DECL_TI_TEMPLATE (t); |
872 | gen_tmpl = most_general_template (tmpl); |
873 | argvec = tsubst (DECL_TI_ARGS (t), args, complain, in_decl); |
874 | + if (argvec != error_mark_node) |
875 | + argvec = (coerce_innermost_template_parms |
876 | + (DECL_TEMPLATE_PARMS (gen_tmpl), |
877 | + argvec, t, complain, |
878 | + /*all*/true, /*defarg*/true)); |
879 | if (argvec == error_mark_node) |
880 | RETURN (error_mark_node); |
881 | hash = hash_tmpl_and_args (gen_tmpl, argvec); |
882 | @@ -14249,7 +14275,7 @@ |
883 | tmp = tsubst_omp_clauses (OMP_TARGET_UPDATE_CLAUSES (t), false, |
884 | args, complain, in_decl); |
885 | t = copy_node (t); |
886 | - OMP_CLAUSES (t) = tmp; |
887 | + OMP_TARGET_UPDATE_CLAUSES (t) = tmp; |
888 | add_stmt (t); |
889 | break; |
890 | |
891 | --- a/gcc/cp/tree.c 2015-04-09 22:11:44.000000000 +0200 |
892 | +++ b/gcc/cp/tree.c 2015-05-23 11:27:15.316578155 +0200 |
893 | @@ -1207,6 +1207,7 @@ |
894 | { |
895 | bool changed = false; |
896 | vec<tree,va_gc> *vec = make_tree_vector (); |
897 | + tree r = t; |
898 | for (; t; t = TREE_CHAIN (t)) |
899 | { |
900 | gcc_assert (!TREE_PURPOSE (t)); |
901 | @@ -1215,7 +1216,6 @@ |
902 | changed = true; |
903 | vec_safe_push (vec, elt); |
904 | } |
905 | - tree r = t; |
906 | if (changed) |
907 | r = build_tree_list_vec (vec); |
908 | release_tree_vector (vec); |
909 | @@ -1350,7 +1350,7 @@ |
910 | case DECLTYPE_TYPE: |
911 | result = strip_typedefs_expr (DECLTYPE_TYPE_EXPR (t)); |
912 | if (result == DECLTYPE_TYPE_EXPR (t)) |
913 | - return t; |
914 | + result = NULL_TREE; |
915 | else |
916 | result = (finish_decltype_type |
917 | (result, |
918 | @@ -1424,8 +1424,8 @@ |
919 | && type2 == TRAIT_EXPR_TYPE2 (t)) |
920 | return t; |
921 | r = copy_node (t); |
922 | - TRAIT_EXPR_TYPE1 (t) = type1; |
923 | - TRAIT_EXPR_TYPE2 (t) = type2; |
924 | + TRAIT_EXPR_TYPE1 (r) = type1; |
925 | + TRAIT_EXPR_TYPE2 (r) = type2; |
926 | return r; |
927 | } |
928 | |
929 | --- a/gcc/cp/typeck2.c 2015-01-23 17:30:00.000000000 +0100 |
930 | +++ b/gcc/cp/typeck2.c 2015-05-23 11:24:32.144136275 +0200 |
931 | @@ -957,9 +957,16 @@ |
932 | } |
933 | } |
934 | else if (complain & tf_error) |
935 | - error_at (EXPR_LOC_OR_LOC (init, input_location), |
936 | - "narrowing conversion of %qE from %qT to %qT inside { }", |
937 | - init, ftype, type); |
938 | + { |
939 | + int savederrorcount = errorcount; |
940 | + global_dc->pedantic_errors = 1; |
941 | + pedwarn (EXPR_LOC_OR_LOC (init, input_location), OPT_Wnarrowing, |
942 | + "narrowing conversion of %qE from %qT to %qT " |
943 | + "inside { }", init, ftype, type); |
944 | + if (errorcount == savederrorcount) |
945 | + ok = true; |
946 | + global_dc->pedantic_errors = flag_pedantic_errors; |
947 | + } |
948 | } |
949 | |
950 | return cxx_dialect == cxx98 || ok; |
951 | @@ -1089,6 +1096,19 @@ |
952 | || TREE_CODE (type) == UNION_TYPE |
953 | || TREE_CODE (type) == COMPLEX_TYPE); |
954 | |
955 | + /* "If T is a class type and the initializer list has a single |
956 | + element of type cv U, where U is T or a class derived from T, |
957 | + the object is initialized from that element." */ |
958 | + if (cxx_dialect >= cxx11 |
959 | + && BRACE_ENCLOSED_INITIALIZER_P (init) |
960 | + && CONSTRUCTOR_NELTS (init) == 1 |
961 | + && (CLASS_TYPE_P (type) || VECTOR_TYPE_P (type))) |
962 | + { |
963 | + tree elt = CONSTRUCTOR_ELT (init, 0)->value; |
964 | + if (reference_related_p (type, TREE_TYPE (elt))) |
965 | + init = elt; |
966 | + } |
967 | + |
968 | if (BRACE_ENCLOSED_INITIALIZER_P (init) |
969 | && !TYPE_NON_AGGREGATE_CLASS (type)) |
970 | return process_init_constructor (type, init, complain); |
971 | --- a/gcc/fortran/check.c 2015-03-02 19:56:51.000000000 +0100 |
972 | +++ b/gcc/fortran/check.c 2015-05-23 11:29:30.690530828 +0200 |
973 | @@ -6213,6 +6213,15 @@ |
974 | bool |
975 | gfc_check_storage_size (gfc_expr *a, gfc_expr *kind) |
976 | { |
977 | + |
978 | + if (a->expr_type == EXPR_NULL) |
979 | + { |
980 | + gfc_error ("Intrinsic function NULL at %L cannot be an actual " |
981 | + "argument to STORAGE_SIZE, because it returns a " |
982 | + "disassociated pointer", &a->where); |
983 | + return false; |
984 | + } |
985 | + |
986 | if (a->ts.type == BT_ASSUMED) |
987 | { |
988 | gfc_error ("%qs argument of %qs intrinsic at %L shall not be TYPE(*)", |
989 | --- a/gcc/fortran/decl.c 2015-04-10 13:29:53.000000000 +0200 |
990 | +++ b/gcc/fortran/decl.c 2015-05-23 11:30:42.240495466 +0200 |
991 | @@ -1404,9 +1404,7 @@ |
992 | } |
993 | else if (init->expr_type == EXPR_ARRAY) |
994 | { |
995 | - gfc_constructor *c; |
996 | - c = gfc_constructor_first (init->value.constructor); |
997 | - clen = c->expr->value.character.length; |
998 | + clen = mpz_get_si (init->ts.u.cl->length->value.integer); |
999 | sym->ts.u.cl->length |
1000 | = gfc_get_int_expr (gfc_default_integer_kind, |
1001 | NULL, clen); |
1002 | @@ -5594,7 +5592,7 @@ |
1003 | "a contained subprogram"); |
1004 | break; |
1005 | default: |
1006 | - gfc_internal_error ("gfc_match_entry(): Bad state"); |
1007 | + gfc_error ("Unexpected ENTRY statement at %C"); |
1008 | } |
1009 | return MATCH_ERROR; |
1010 | } |
1011 | @@ -6970,7 +6968,8 @@ |
1012 | gfc_symbol *sym; |
1013 | match m; |
1014 | |
1015 | - if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE) |
1016 | + if (!gfc_current_ns->proc_name |
1017 | + || gfc_current_ns->proc_name->attr.flavor != FL_MODULE) |
1018 | { |
1019 | gfc_error ("PROTECTED at %C only allowed in specification " |
1020 | "part of a module"); |
1021 | @@ -8512,6 +8511,11 @@ |
1022 | gfc_op2string (op)); |
1023 | break; |
1024 | |
1025 | + case INTERFACE_NAMELESS: |
1026 | + gfc_error ("Malformed GENERIC statement at %C"); |
1027 | + goto error; |
1028 | + break; |
1029 | + |
1030 | default: |
1031 | gcc_unreachable (); |
1032 | } |
1033 | --- a/gcc/fortran/expr.c 2015-02-06 19:15:01.000000000 +0100 |
1034 | +++ b/gcc/fortran/expr.c 2015-05-23 11:30:07.135026771 +0200 |
1035 | @@ -3118,19 +3118,22 @@ |
1036 | bad_proc = true; |
1037 | |
1038 | /* (ii) The assignment is in the main program; or */ |
1039 | - if (gfc_current_ns->proc_name->attr.is_main_program) |
1040 | + if (gfc_current_ns->proc_name |
1041 | + && gfc_current_ns->proc_name->attr.is_main_program) |
1042 | bad_proc = true; |
1043 | |
1044 | /* (iii) A module or internal procedure... */ |
1045 | - if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL |
1046 | - || gfc_current_ns->proc_name->attr.proc == PROC_MODULE) |
1047 | + if (gfc_current_ns->proc_name |
1048 | + && (gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL |
1049 | + || gfc_current_ns->proc_name->attr.proc == PROC_MODULE) |
1050 | && gfc_current_ns->parent |
1051 | && (!(gfc_current_ns->parent->proc_name->attr.function |
1052 | || gfc_current_ns->parent->proc_name->attr.subroutine) |
1053 | || gfc_current_ns->parent->proc_name->attr.is_main_program)) |
1054 | { |
1055 | /* ... that is not a function... */ |
1056 | - if (!gfc_current_ns->proc_name->attr.function) |
1057 | + if (gfc_current_ns->proc_name |
1058 | + && !gfc_current_ns->proc_name->attr.function) |
1059 | bad_proc = true; |
1060 | |
1061 | /* ... or is not an entry and has a different name. */ |
1062 | --- a/gcc/fortran/interface.c 2015-02-01 01:29:54.000000000 +0100 |
1063 | +++ b/gcc/fortran/interface.c 2015-05-23 11:30:58.232706361 +0200 |
1064 | @@ -346,8 +346,12 @@ |
1065 | break; |
1066 | |
1067 | m = MATCH_ERROR; |
1068 | - gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> at %C, " |
1069 | - "but got %s", s1, s2); |
1070 | + if (strcmp(s2, "none") == 0) |
1071 | + gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> " |
1072 | + "at %C, ", s1); |
1073 | + else |
1074 | + gfc_error ("Expecting %<END INTERFACE OPERATOR (%s)%> at %C, " |
1075 | + "but got %s", s1, s2); |
1076 | } |
1077 | |
1078 | } |
1079 | --- a/gcc/fortran/io.c 2015-02-01 01:29:54.000000000 +0100 |
1080 | +++ b/gcc/fortran/io.c 2015-05-23 11:31:18.785975216 +0200 |
1081 | @@ -385,7 +385,7 @@ |
1082 | |
1083 | if (c == delim) |
1084 | { |
1085 | - c = next_char (INSTRING_NOWARN); |
1086 | + c = next_char (NONSTRING); |
1087 | |
1088 | if (c == '\0') |
1089 | { |
1090 | @@ -2382,9 +2382,7 @@ |
1091 | if (m == MATCH_NO) |
1092 | { |
1093 | m = gfc_match_expr (&fp->unit); |
1094 | - if (m == MATCH_ERROR) |
1095 | - goto done; |
1096 | - if (m == MATCH_NO) |
1097 | + if (m == MATCH_ERROR || m == MATCH_NO) |
1098 | goto syntax; |
1099 | } |
1100 | |
1101 | --- a/gcc/fortran/match.c 2015-01-15 21:11:12.000000000 +0100 |
1102 | +++ b/gcc/fortran/match.c 2015-05-23 11:30:58.232706361 +0200 |
1103 | @@ -110,6 +110,9 @@ |
1104 | case INTRINSIC_PARENTHESES: |
1105 | return "parens"; |
1106 | |
1107 | + case INTRINSIC_NONE: |
1108 | + return "none"; |
1109 | + |
1110 | default: |
1111 | break; |
1112 | } |
1113 | --- a/gcc/fortran/parse.c 2015-02-01 01:29:54.000000000 +0100 |
1114 | +++ b/gcc/fortran/parse.c 2015-05-23 11:29:15.011314175 +0200 |
1115 | @@ -2425,8 +2425,7 @@ |
1116 | break; |
1117 | |
1118 | default: |
1119 | - gfc_internal_error ("Unexpected %s statement in verify_st_order() at %C", |
1120 | - gfc_ascii_statement (st)); |
1121 | + return false; |
1122 | } |
1123 | |
1124 | /* All is well, record the statement in case we need it next time. */ |
1125 | --- a/gcc/fortran/scanner.c 2015-02-13 17:57:28.000000000 +0100 |
1126 | +++ b/gcc/fortran/scanner.c 2015-05-23 11:31:18.785975216 +0200 |
1127 | @@ -1272,21 +1272,11 @@ |
1128 | are still in a string and we are looking for a possible |
1129 | doubled quote and we end up here. See PR64506. */ |
1130 | |
1131 | - if (in_string) |
1132 | + if (in_string && c != '\n') |
1133 | { |
1134 | gfc_current_locus = old_loc; |
1135 | - |
1136 | - if (c == '!') |
1137 | - { |
1138 | - skip_comment_line (); |
1139 | - goto restart; |
1140 | - } |
1141 | - |
1142 | - if (c != '\n') |
1143 | - { |
1144 | - c = '&'; |
1145 | - goto done; |
1146 | - } |
1147 | + c = '&'; |
1148 | + goto done; |
1149 | } |
1150 | |
1151 | if (c != '!' && c != '\n') |
1152 | @@ -1392,6 +1382,8 @@ |
1153 | "Missing %<&%> in continued character " |
1154 | "constant at %C"); |
1155 | } |
1156 | + else if (!in_string && (c == '\'' || c == '"')) |
1157 | + goto done; |
1158 | /* Both !$omp and !$ -fopenmp continuation lines have & on the |
1159 | continuation line only optionally. */ |
1160 | else if (openmp_flag || openacc_flag || openmp_cond_flag) |
1161 | --- a/gcc/fortran/symbol.c 2015-04-10 13:29:53.000000000 +0200 |
1162 | +++ b/gcc/fortran/symbol.c 2015-05-23 11:28:41.895849323 +0200 |
1163 | @@ -458,6 +458,11 @@ |
1164 | } |
1165 | } |
1166 | |
1167 | + if (attr->dummy && ((attr->function || attr->subroutine) && |
1168 | + gfc_current_state () == COMP_CONTAINS)) |
1169 | + gfc_error_now ("internal procedure '%s' at %L conflicts with " |
1170 | + "DUMMY argument", name, where); |
1171 | + |
1172 | conf (dummy, entry); |
1173 | conf (dummy, intrinsic); |
1174 | conf (dummy, threadprivate); |
1175 | --- a/gcc/fortran/trans-openmp.c 2015-03-30 19:54:05.000000000 +0200 |
1176 | +++ b/gcc/fortran/trans-openmp.c 2015-05-23 11:32:41.669037929 +0200 |
1177 | @@ -4114,6 +4114,7 @@ |
1178 | stmtblock_t block; |
1179 | gfc_omp_clauses clausesa_buf[GFC_OMP_SPLIT_NUM]; |
1180 | tree stmt, omp_clauses = NULL_TREE; |
1181 | + bool combined = true; |
1182 | |
1183 | gfc_start_block (&block); |
1184 | if (clausesa == NULL) |
1185 | @@ -4130,6 +4131,7 @@ |
1186 | case EXEC_OMP_TARGET_TEAMS: |
1187 | case EXEC_OMP_TEAMS: |
1188 | stmt = gfc_trans_omp_code (code->block->next, true); |
1189 | + combined = false; |
1190 | break; |
1191 | case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE: |
1192 | case EXEC_OMP_TEAMS_DISTRIBUTE: |
1193 | @@ -4143,6 +4145,8 @@ |
1194 | } |
1195 | stmt = build2_loc (input_location, OMP_TEAMS, void_type_node, stmt, |
1196 | omp_clauses); |
1197 | + if (combined) |
1198 | + OMP_TEAMS_COMBINED (stmt) = 1; |
1199 | gfc_add_expr_to_block (&block, stmt); |
1200 | return gfc_finish_block (&block); |
1201 | } |
1202 | @@ -4163,9 +4167,14 @@ |
1203 | if (code->op == EXEC_OMP_TARGET) |
1204 | stmt = gfc_trans_omp_code (code->block->next, true); |
1205 | else |
1206 | - stmt = gfc_trans_omp_teams (code, clausesa); |
1207 | - if (TREE_CODE (stmt) != BIND_EXPR) |
1208 | - stmt = build3_v (BIND_EXPR, NULL, stmt, NULL_TREE); |
1209 | + { |
1210 | + pushlevel (); |
1211 | + stmt = gfc_trans_omp_teams (code, clausesa); |
1212 | + if (TREE_CODE (stmt) != BIND_EXPR) |
1213 | + stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0)); |
1214 | + else |
1215 | + poplevel (0, 0); |
1216 | + } |
1217 | if (flag_openmp) |
1218 | stmt = build2_loc (input_location, OMP_TARGET, void_type_node, stmt, |
1219 | omp_clauses); |
1220 | --- a/gcc/gimplify.c 2015-03-20 13:39:32.000000000 +0100 |
1221 | +++ b/gcc/gimplify.c 2015-05-23 11:32:41.671037954 +0200 |
1222 | @@ -111,6 +111,9 @@ |
1223 | /* Flag for GOVD_MAP: don't copy back. */ |
1224 | GOVD_MAP_TO_ONLY = 8192, |
1225 | |
1226 | + /* Flag for GOVD_LINEAR or GOVD_LASTPRIVATE: no outer reference. */ |
1227 | + GOVD_LINEAR_LASTPRIVATE_NO_OUTER = 16384, |
1228 | + |
1229 | GOVD_DATA_SHARE_CLASS = (GOVD_SHARED | GOVD_PRIVATE | GOVD_FIRSTPRIVATE |
1230 | | GOVD_LASTPRIVATE | GOVD_REDUCTION | GOVD_LINEAR |
1231 | | GOVD_LOCAL) |
1232 | @@ -126,6 +129,7 @@ |
1233 | ORT_TASK = 4, |
1234 | ORT_UNTIED_TASK = 5, |
1235 | ORT_TEAMS = 8, |
1236 | + ORT_COMBINED_TEAMS = 9, |
1237 | /* Data region. */ |
1238 | ORT_TARGET_DATA = 16, |
1239 | /* Data region with offloading. */ |
1240 | @@ -5842,7 +5846,7 @@ |
1241 | DECL_NAME (lang_hooks.decls.omp_report_decl (decl))); |
1242 | error_at (ctx->location, "enclosing task"); |
1243 | } |
1244 | - else if (ctx->region_type == ORT_TEAMS) |
1245 | + else if (ctx->region_type & ORT_TEAMS) |
1246 | { |
1247 | error ("%qE not specified in enclosing teams construct", |
1248 | DECL_NAME (lang_hooks.decls.omp_report_decl (decl))); |
1249 | @@ -5935,6 +5939,13 @@ |
1250 | need to propagate anything to an outer context. */ |
1251 | if ((flags & GOVD_PRIVATE) && !(flags & GOVD_PRIVATE_OUTER_REF)) |
1252 | return ret; |
1253 | + if ((flags & (GOVD_LINEAR | GOVD_LINEAR_LASTPRIVATE_NO_OUTER)) |
1254 | + == (GOVD_LINEAR | GOVD_LINEAR_LASTPRIVATE_NO_OUTER)) |
1255 | + return ret; |
1256 | + if ((flags & (GOVD_FIRSTPRIVATE | GOVD_LASTPRIVATE |
1257 | + | GOVD_LINEAR_LASTPRIVATE_NO_OUTER)) |
1258 | + == (GOVD_LASTPRIVATE | GOVD_LINEAR_LASTPRIVATE_NO_OUTER)) |
1259 | + return ret; |
1260 | if (ctx->outer_context |
1261 | && omp_notice_variable (ctx->outer_context, decl, in_code)) |
1262 | return true; |
1263 | @@ -6034,6 +6045,36 @@ |
1264 | return false; |
1265 | } |
1266 | |
1267 | +/* Return true if the CTX is combined with distribute and thus |
1268 | + lastprivate can't be supported. */ |
1269 | + |
1270 | +static bool |
1271 | +omp_no_lastprivate (struct gimplify_omp_ctx *ctx) |
1272 | +{ |
1273 | + do |
1274 | + { |
1275 | + if (ctx->outer_context == NULL) |
1276 | + return false; |
1277 | + ctx = ctx->outer_context; |
1278 | + switch (ctx->region_type) |
1279 | + { |
1280 | + case ORT_WORKSHARE: |
1281 | + if (!ctx->combined_loop) |
1282 | + return false; |
1283 | + if (ctx->distribute) |
1284 | + return true; |
1285 | + break; |
1286 | + case ORT_COMBINED_PARALLEL: |
1287 | + break; |
1288 | + case ORT_COMBINED_TEAMS: |
1289 | + return true; |
1290 | + default: |
1291 | + return false; |
1292 | + } |
1293 | + } |
1294 | + while (1); |
1295 | +} |
1296 | + |
1297 | /* Scan the OMP clauses in *LIST_P, installing mappings into a new |
1298 | and previous omp contexts. */ |
1299 | |
1300 | @@ -6077,6 +6118,35 @@ |
1301 | case OMP_CLAUSE_LASTPRIVATE: |
1302 | flags = GOVD_LASTPRIVATE | GOVD_SEEN | GOVD_EXPLICIT; |
1303 | check_non_private = "lastprivate"; |
1304 | + decl = OMP_CLAUSE_DECL (c); |
1305 | + if (omp_no_lastprivate (ctx)) |
1306 | + { |
1307 | + notice_outer = false; |
1308 | + flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER; |
1309 | + } |
1310 | + else if (error_operand_p (decl)) |
1311 | + goto do_add; |
1312 | + else if (outer_ctx |
1313 | + && outer_ctx->region_type == ORT_COMBINED_PARALLEL |
1314 | + && splay_tree_lookup (outer_ctx->variables, |
1315 | + (splay_tree_key) decl) == NULL) |
1316 | + omp_add_variable (outer_ctx, decl, GOVD_SHARED | GOVD_SEEN); |
1317 | + else if (outer_ctx |
1318 | + && outer_ctx->region_type == ORT_WORKSHARE |
1319 | + && outer_ctx->combined_loop |
1320 | + && splay_tree_lookup (outer_ctx->variables, |
1321 | + (splay_tree_key) decl) == NULL |
1322 | + && !omp_check_private (outer_ctx, decl, false)) |
1323 | + { |
1324 | + omp_add_variable (outer_ctx, decl, GOVD_LASTPRIVATE | GOVD_SEEN); |
1325 | + if (outer_ctx->outer_context |
1326 | + && (outer_ctx->outer_context->region_type |
1327 | + == ORT_COMBINED_PARALLEL) |
1328 | + && splay_tree_lookup (outer_ctx->outer_context->variables, |
1329 | + (splay_tree_key) decl) == NULL) |
1330 | + omp_add_variable (outer_ctx->outer_context, decl, |
1331 | + GOVD_SHARED | GOVD_SEEN); |
1332 | + } |
1333 | goto do_add; |
1334 | case OMP_CLAUSE_REDUCTION: |
1335 | flags = GOVD_REDUCTION | GOVD_SEEN | GOVD_EXPLICIT; |
1336 | @@ -6089,7 +6159,68 @@ |
1337 | remove = true; |
1338 | break; |
1339 | } |
1340 | + else |
1341 | + { |
1342 | + /* For combined #pragma omp parallel for simd, need to put |
1343 | + lastprivate and perhaps firstprivate too on the |
1344 | + parallel. Similarly for #pragma omp for simd. */ |
1345 | + struct gimplify_omp_ctx *octx = outer_ctx; |
1346 | + decl = NULL_TREE; |
1347 | + if (omp_no_lastprivate (ctx)) |
1348 | + OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1; |
1349 | + do |
1350 | + { |
1351 | + if (OMP_CLAUSE_LINEAR_NO_COPYIN (c) |
1352 | + && OMP_CLAUSE_LINEAR_NO_COPYOUT (c)) |
1353 | + break; |
1354 | + decl = OMP_CLAUSE_DECL (c); |
1355 | + if (error_operand_p (decl)) |
1356 | + { |
1357 | + decl = NULL_TREE; |
1358 | + break; |
1359 | + } |
1360 | + if (octx |
1361 | + && octx->region_type == ORT_WORKSHARE |
1362 | + && octx->combined_loop) |
1363 | + { |
1364 | + if (octx->outer_context |
1365 | + && (octx->outer_context->region_type |
1366 | + == ORT_COMBINED_PARALLEL |
1367 | + || (octx->outer_context->region_type |
1368 | + == ORT_COMBINED_TEAMS))) |
1369 | + octx = octx->outer_context; |
1370 | + else if (omp_check_private (octx, decl, false)) |
1371 | + break; |
1372 | + } |
1373 | + else |
1374 | + break; |
1375 | + gcc_checking_assert (splay_tree_lookup (octx->variables, |
1376 | + (splay_tree_key) |
1377 | + decl) == NULL); |
1378 | + flags = GOVD_SEEN; |
1379 | + if (!OMP_CLAUSE_LINEAR_NO_COPYIN (c)) |
1380 | + flags |= GOVD_FIRSTPRIVATE; |
1381 | + if (!OMP_CLAUSE_LINEAR_NO_COPYOUT (c)) |
1382 | + flags |= GOVD_LASTPRIVATE; |
1383 | + omp_add_variable (octx, decl, flags); |
1384 | + if (octx->outer_context == NULL) |
1385 | + break; |
1386 | + octx = octx->outer_context; |
1387 | + } |
1388 | + while (1); |
1389 | + if (octx |
1390 | + && decl |
1391 | + && (!OMP_CLAUSE_LINEAR_NO_COPYIN (c) |
1392 | + || !OMP_CLAUSE_LINEAR_NO_COPYOUT (c))) |
1393 | + omp_notice_variable (octx, decl, true); |
1394 | + } |
1395 | flags = GOVD_LINEAR | GOVD_EXPLICIT; |
1396 | + if (OMP_CLAUSE_LINEAR_NO_COPYIN (c) |
1397 | + && OMP_CLAUSE_LINEAR_NO_COPYOUT (c)) |
1398 | + { |
1399 | + notice_outer = false; |
1400 | + flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER; |
1401 | + } |
1402 | goto do_add; |
1403 | |
1404 | case OMP_CLAUSE_MAP: |
1405 | @@ -6543,34 +6674,6 @@ |
1406 | OMP_CLAUSE_SET_CODE (c, OMP_CLAUSE_PRIVATE); |
1407 | OMP_CLAUSE_PRIVATE_DEBUG (c) = 1; |
1408 | } |
1409 | - if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR |
1410 | - && ctx->outer_context |
1411 | - && !(OMP_CLAUSE_LINEAR_NO_COPYIN (c) |
1412 | - && OMP_CLAUSE_LINEAR_NO_COPYOUT (c))) |
1413 | - { |
1414 | - if (ctx->outer_context->combined_loop |
1415 | - && !OMP_CLAUSE_LINEAR_NO_COPYIN (c)) |
1416 | - { |
1417 | - n = splay_tree_lookup (ctx->outer_context->variables, |
1418 | - (splay_tree_key) decl); |
1419 | - if (n == NULL |
1420 | - || (n->value & GOVD_DATA_SHARE_CLASS) == 0) |
1421 | - { |
1422 | - int flags = GOVD_FIRSTPRIVATE; |
1423 | - /* #pragma omp distribute does not allow |
1424 | - lastprivate clause. */ |
1425 | - if (!ctx->outer_context->distribute) |
1426 | - flags |= GOVD_LASTPRIVATE; |
1427 | - if (n == NULL) |
1428 | - omp_add_variable (ctx->outer_context, decl, |
1429 | - flags | GOVD_SEEN); |
1430 | - else |
1431 | - n->value |= flags | GOVD_SEEN; |
1432 | - } |
1433 | - } |
1434 | - else if (!is_global_var (decl)) |
1435 | - omp_notice_variable (ctx->outer_context, decl, true); |
1436 | - } |
1437 | } |
1438 | break; |
1439 | |
1440 | @@ -6581,6 +6684,13 @@ |
1441 | n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl); |
1442 | OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c) |
1443 | = (n->value & GOVD_FIRSTPRIVATE) != 0; |
1444 | + if (omp_no_lastprivate (ctx)) |
1445 | + { |
1446 | + if (OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c)) |
1447 | + remove = true; |
1448 | + else |
1449 | + OMP_CLAUSE_CODE (c) = OMP_CLAUSE_PRIVATE; |
1450 | + } |
1451 | break; |
1452 | |
1453 | case OMP_CLAUSE_ALIGNED: |
1454 | @@ -6895,6 +7005,22 @@ |
1455 | gcc_unreachable (); |
1456 | } |
1457 | |
1458 | + /* Set OMP_CLAUSE_LINEAR_NO_COPYIN flag on explicit linear |
1459 | + clause for the IV. */ |
1460 | + if (simd && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) == 1) |
1461 | + { |
1462 | + t = TREE_VEC_ELT (OMP_FOR_INIT (for_stmt), 0); |
1463 | + gcc_assert (TREE_CODE (t) == MODIFY_EXPR); |
1464 | + decl = TREE_OPERAND (t, 0); |
1465 | + for (tree c = OMP_FOR_CLAUSES (for_stmt); c; c = OMP_CLAUSE_CHAIN (c)) |
1466 | + if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR |
1467 | + && OMP_CLAUSE_DECL (c) == decl) |
1468 | + { |
1469 | + OMP_CLAUSE_LINEAR_NO_COPYIN (c) = 1; |
1470 | + break; |
1471 | + } |
1472 | + } |
1473 | + |
1474 | gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p, |
1475 | simd ? ORT_SIMD : ORT_WORKSHARE); |
1476 | if (TREE_CODE (for_stmt) == OMP_DISTRIBUTE) |
1477 | @@ -6969,38 +7095,67 @@ |
1478 | { |
1479 | c = build_omp_clause (input_location, OMP_CLAUSE_LINEAR); |
1480 | OMP_CLAUSE_LINEAR_NO_COPYIN (c) = 1; |
1481 | - if (has_decl_expr |
1482 | - && bitmap_bit_p (has_decl_expr, DECL_UID (decl))) |
1483 | - OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1; |
1484 | + unsigned int flags = GOVD_LINEAR | GOVD_EXPLICIT | GOVD_SEEN; |
1485 | + if ((has_decl_expr |
1486 | + && bitmap_bit_p (has_decl_expr, DECL_UID (decl))) |
1487 | + || omp_no_lastprivate (gimplify_omp_ctxp)) |
1488 | + { |
1489 | + OMP_CLAUSE_LINEAR_NO_COPYOUT (c) = 1; |
1490 | + flags |= GOVD_LINEAR_LASTPRIVATE_NO_OUTER; |
1491 | + } |
1492 | OMP_CLAUSE_DECL (c) = decl; |
1493 | OMP_CLAUSE_CHAIN (c) = OMP_FOR_CLAUSES (for_stmt); |
1494 | OMP_FOR_CLAUSES (for_stmt) = c; |
1495 | - omp_add_variable (gimplify_omp_ctxp, decl, |
1496 | - GOVD_LINEAR | GOVD_EXPLICIT | GOVD_SEEN); |
1497 | + |
1498 | + omp_add_variable (gimplify_omp_ctxp, decl, flags); |
1499 | + struct gimplify_omp_ctx *outer |
1500 | + = gimplify_omp_ctxp->outer_context; |
1501 | + if (outer && !OMP_CLAUSE_LINEAR_NO_COPYOUT (c)) |
1502 | + { |
1503 | + if (outer->region_type == ORT_WORKSHARE |
1504 | + && outer->combined_loop) |
1505 | + { |
1506 | + if (outer->outer_context |
1507 | + && (outer->outer_context->region_type |
1508 | + == ORT_COMBINED_PARALLEL)) |
1509 | + outer = outer->outer_context; |
1510 | + else if (omp_check_private (outer, decl, false)) |
1511 | + outer = NULL; |
1512 | + } |
1513 | + else if (outer->region_type != ORT_COMBINED_PARALLEL) |
1514 | + outer = NULL; |
1515 | + if (outer) |
1516 | + { |
1517 | + omp_add_variable (outer, decl, |
1518 | + GOVD_LASTPRIVATE | GOVD_SEEN); |
1519 | + if (outer->outer_context) |
1520 | + omp_notice_variable (outer->outer_context, decl, true); |
1521 | + } |
1522 | + } |
1523 | } |
1524 | else |
1525 | { |
1526 | bool lastprivate |
1527 | = (!has_decl_expr |
1528 | - || !bitmap_bit_p (has_decl_expr, DECL_UID (decl))); |
1529 | - if (lastprivate |
1530 | - && gimplify_omp_ctxp->outer_context |
1531 | - && gimplify_omp_ctxp->outer_context->region_type |
1532 | - == ORT_WORKSHARE |
1533 | - && gimplify_omp_ctxp->outer_context->combined_loop |
1534 | - && !gimplify_omp_ctxp->outer_context->distribute) |
1535 | + || !bitmap_bit_p (has_decl_expr, DECL_UID (decl))) |
1536 | + && !omp_no_lastprivate (gimplify_omp_ctxp); |
1537 | + struct gimplify_omp_ctx *outer |
1538 | + = gimplify_omp_ctxp->outer_context; |
1539 | + if (outer && lastprivate) |
1540 | { |
1541 | - struct gimplify_omp_ctx *outer |
1542 | - = gimplify_omp_ctxp->outer_context; |
1543 | - n = splay_tree_lookup (outer->variables, |
1544 | - (splay_tree_key) decl); |
1545 | - if (n != NULL |
1546 | - && (n->value & GOVD_DATA_SHARE_CLASS) == GOVD_LOCAL) |
1547 | - lastprivate = false; |
1548 | - else if (omp_check_private (outer, decl, false)) |
1549 | - error ("lastprivate variable %qE is private in outer " |
1550 | - "context", DECL_NAME (decl)); |
1551 | - else |
1552 | + if (outer->region_type == ORT_WORKSHARE |
1553 | + && outer->combined_loop) |
1554 | + { |
1555 | + if (outer->outer_context |
1556 | + && (outer->outer_context->region_type |
1557 | + == ORT_COMBINED_PARALLEL)) |
1558 | + outer = outer->outer_context; |
1559 | + else if (omp_check_private (outer, decl, false)) |
1560 | + outer = NULL; |
1561 | + } |
1562 | + else if (outer->region_type != ORT_COMBINED_PARALLEL) |
1563 | + outer = NULL; |
1564 | + if (outer) |
1565 | { |
1566 | omp_add_variable (outer, decl, |
1567 | GOVD_LASTPRIVATE | GOVD_SEEN); |
1568 | @@ -7008,6 +7163,7 @@ |
1569 | omp_notice_variable (outer->outer_context, decl, true); |
1570 | } |
1571 | } |
1572 | + |
1573 | c = build_omp_clause (input_location, |
1574 | lastprivate ? OMP_CLAUSE_LASTPRIVATE |
1575 | : OMP_CLAUSE_PRIVATE); |
1576 | @@ -7299,7 +7455,7 @@ |
1577 | ort = ORT_TARGET_DATA; |
1578 | break; |
1579 | case OMP_TEAMS: |
1580 | - ort = ORT_TEAMS; |
1581 | + ort = OMP_TEAMS_COMBINED (expr) ? ORT_COMBINED_TEAMS : ORT_TEAMS; |
1582 | break; |
1583 | default: |
1584 | gcc_unreachable (); |
1585 | --- a/gcc/ipa-chkp.c 2015-04-06 12:41:55.000000000 +0200 |
1586 | +++ b/gcc/ipa-chkp.c 2015-05-23 11:31:36.800208969 +0200 |
1587 | @@ -264,7 +264,7 @@ |
1588 | if (!arg_type) |
1589 | return orig_type; |
1590 | |
1591 | - type = copy_node (orig_type); |
1592 | + type = build_distinct_type_copy (orig_type); |
1593 | TYPE_ARG_TYPES (type) = copy_list (TYPE_ARG_TYPES (type)); |
1594 | |
1595 | for (arg_type = TYPE_ARG_TYPES (type); |
1596 | --- a/gcc/ipa-inline.c 2015-04-03 20:09:13.000000000 +0200 |
1597 | +++ b/gcc/ipa-inline.c 2015-05-23 11:26:42.303067491 +0200 |
1598 | @@ -427,49 +427,55 @@ |
1599 | && lookup_attribute ("always_inline", |
1600 | DECL_ATTRIBUTES (callee->decl))); |
1601 | |
1602 | + /* Until GCC 4.9 we did not check the semantics alterning flags |
1603 | + bellow and inline across optimization boundry. |
1604 | + Enabling checks bellow breaks several packages by refusing |
1605 | + to inline library always_inline functions. See PR65873. |
1606 | + Disable the check for early inlining for now until better solution |
1607 | + is found. */ |
1608 | + if (always_inline && early) |
1609 | + ; |
1610 | /* There are some options that change IL semantics which means |
1611 | we cannot inline in these cases for correctness reason. |
1612 | Not even for always_inline declared functions. */ |
1613 | /* Strictly speaking only when the callee contains signed integer |
1614 | math where overflow is undefined. */ |
1615 | - if ((check_maybe_up (flag_strict_overflow) |
1616 | - /* this flag is set by optimize. Allow inlining across |
1617 | - optimize boundary. */ |
1618 | - && (!opt_for_fn (caller->decl, optimize) |
1619 | - == !opt_for_fn (callee->decl, optimize) || !always_inline)) |
1620 | - || check_match (flag_wrapv) |
1621 | - || check_match (flag_trapv) |
1622 | - /* Strictly speaking only when the callee contains memory |
1623 | - accesses that are not using alias-set zero anyway. */ |
1624 | - || check_maybe_down (flag_strict_aliasing) |
1625 | - /* Strictly speaking only when the callee uses FP math. */ |
1626 | - || check_maybe_up (flag_rounding_math) |
1627 | - || check_maybe_up (flag_trapping_math) |
1628 | - || check_maybe_down (flag_unsafe_math_optimizations) |
1629 | - || check_maybe_down (flag_finite_math_only) |
1630 | - || check_maybe_up (flag_signaling_nans) |
1631 | - || check_maybe_down (flag_cx_limited_range) |
1632 | - || check_maybe_up (flag_signed_zeros) |
1633 | - || check_maybe_down (flag_associative_math) |
1634 | - || check_maybe_down (flag_reciprocal_math) |
1635 | - /* We do not want to make code compiled with exceptions to be brought |
1636 | - into a non-EH function unless we know that the callee does not |
1637 | - throw. This is tracked by DECL_FUNCTION_PERSONALITY. */ |
1638 | - || (check_match (flag_non_call_exceptions) |
1639 | - /* TODO: We also may allow bringing !flag_non_call_exceptions |
1640 | - to flag_non_call_exceptions function, but that may need |
1641 | - extra work in tree-inline to add the extra EH edges. */ |
1642 | - && (!opt_for_fn (callee->decl, flag_non_call_exceptions) |
1643 | - || DECL_FUNCTION_PERSONALITY (callee->decl))) |
1644 | - || (check_maybe_up (flag_exceptions) |
1645 | - && DECL_FUNCTION_PERSONALITY (callee->decl)) |
1646 | - /* Strictly speaking only when the callee contains function |
1647 | - calls that may end up setting errno. */ |
1648 | - || check_maybe_up (flag_errno_math) |
1649 | - /* When devirtualization is diabled for callee, it is not safe |
1650 | - to inline it as we possibly mangled the type info. |
1651 | - Allow early inlining of always inlines. */ |
1652 | - || (!early && check_maybe_down (flag_devirtualize))) |
1653 | + else if ((check_maybe_up (flag_strict_overflow) |
1654 | + /* this flag is set by optimize. Allow inlining across |
1655 | + optimize boundary. */ |
1656 | + && (!opt_for_fn (caller->decl, optimize) |
1657 | + == !opt_for_fn (callee->decl, optimize) || !always_inline)) |
1658 | + || check_match (flag_wrapv) |
1659 | + || check_match (flag_trapv) |
1660 | + /* Strictly speaking only when the callee uses FP math. */ |
1661 | + || check_maybe_up (flag_rounding_math) |
1662 | + || check_maybe_up (flag_trapping_math) |
1663 | + || check_maybe_down (flag_unsafe_math_optimizations) |
1664 | + || check_maybe_down (flag_finite_math_only) |
1665 | + || check_maybe_up (flag_signaling_nans) |
1666 | + || check_maybe_down (flag_cx_limited_range) |
1667 | + || check_maybe_up (flag_signed_zeros) |
1668 | + || check_maybe_down (flag_associative_math) |
1669 | + || check_maybe_down (flag_reciprocal_math) |
1670 | + /* We do not want to make code compiled with exceptions to be |
1671 | + brought into a non-EH function unless we know that the callee |
1672 | + does not throw. |
1673 | + This is tracked by DECL_FUNCTION_PERSONALITY. */ |
1674 | + || (check_match (flag_non_call_exceptions) |
1675 | + /* TODO: We also may allow bringing !flag_non_call_exceptions |
1676 | + to flag_non_call_exceptions function, but that may need |
1677 | + extra work in tree-inline to add the extra EH edges. */ |
1678 | + && (!opt_for_fn (callee->decl, flag_non_call_exceptions) |
1679 | + || DECL_FUNCTION_PERSONALITY (callee->decl))) |
1680 | + || (check_maybe_up (flag_exceptions) |
1681 | + && DECL_FUNCTION_PERSONALITY (callee->decl)) |
1682 | + /* Strictly speaking only when the callee contains function |
1683 | + calls that may end up setting errno. */ |
1684 | + || check_maybe_up (flag_errno_math) |
1685 | + /* When devirtualization is diabled for callee, it is not safe |
1686 | + to inline it as we possibly mangled the type info. |
1687 | + Allow early inlining of always inlines. */ |
1688 | + || (!early && check_maybe_down (flag_devirtualize))) |
1689 | { |
1690 | e->inline_failed = CIF_OPTIMIZATION_MISMATCH; |
1691 | inlinable = false; |
1692 | @@ -484,6 +490,17 @@ |
1693 | e->inline_failed = CIF_OPTIMIZATION_MISMATCH; |
1694 | inlinable = false; |
1695 | } |
1696 | + /* If explicit optimize attribute are not used, the mismatch is caused |
1697 | + by different command line options used to build different units. |
1698 | + Do not care about COMDAT functions - those are intended to be |
1699 | + optimized with the optimization flags of module they are used in. |
1700 | + Also do not care about mixing up size/speed optimization when |
1701 | + DECL_DISREGARD_INLINE_LIMITS is set. */ |
1702 | + else if ((callee->merged |
1703 | + && !lookup_attribute ("optimize", |
1704 | + DECL_ATTRIBUTES (caller->decl))) |
1705 | + || DECL_DISREGARD_INLINE_LIMITS (callee->decl)) |
1706 | + ; |
1707 | /* If mismatch is caused by merging two LTO units with different |
1708 | optimizationflags we want to be bit nicer. However never inline |
1709 | if one of functions is not optimized at all. */ |
1710 | @@ -515,7 +532,7 @@ |
1711 | else if (opt_for_fn (callee->decl, optimize_size) |
1712 | < opt_for_fn (caller->decl, optimize_size) |
1713 | || (opt_for_fn (callee->decl, optimize) |
1714 | - >= opt_for_fn (caller->decl, optimize))) |
1715 | + > opt_for_fn (caller->decl, optimize))) |
1716 | { |
1717 | if (estimate_edge_time (e) |
1718 | >= 20 + inline_edge_summary (e)->call_stmt_time) |
1719 | --- a/gcc/lra-constraints.c 2015-04-10 18:05:26.000000000 +0200 |
1720 | +++ b/gcc/lra-constraints.c 2015-05-23 11:18:33.964634884 +0200 |
1721 | @@ -533,7 +533,7 @@ |
1722 | if (x == res || CONSTANT_P (res)) |
1723 | return res; |
1724 | return lra_eliminate_regs_1 (insn, res, GET_MODE (res), |
1725 | - 0, false, false, true); |
1726 | + false, false, 0, true); |
1727 | } |
1728 | |
1729 | /* Set up curr_operand_mode. */ |
1730 | --- a/gcc/lra-eliminations.c 2015-02-04 21:02:21.000000000 +0100 |
1731 | +++ b/gcc/lra-eliminations.c 2015-05-23 11:18:33.965634942 +0200 |
1732 | @@ -318,7 +318,9 @@ |
1733 | substitution if UPDATE_P, or the full offset if FULL_P, or |
1734 | otherwise zero. If FULL_P, we also use the SP offsets for |
1735 | elimination to SP. If UPDATE_P, use UPDATE_SP_OFFSET for updating |
1736 | - offsets of register elimnable to SP. |
1737 | + offsets of register elimnable to SP. If UPDATE_SP_OFFSET is |
1738 | + non-zero, don't use difference of the offset and the previous |
1739 | + offset. |
1740 | |
1741 | MEM_MODE is the mode of an enclosing MEM. We need this to know how |
1742 | much to adjust a register for, e.g., PRE_DEC. Also, if we are |
1743 | @@ -341,7 +343,8 @@ |
1744 | const char *fmt; |
1745 | int copied = 0; |
1746 | |
1747 | - gcc_assert (!update_p || !full_p); |
1748 | + lra_assert (!update_p || !full_p); |
1749 | + lra_assert (update_sp_offset == 0 || (!subst_p && update_p && !full_p)); |
1750 | if (! current_function_decl) |
1751 | return x; |
1752 | |
1753 | @@ -366,11 +369,14 @@ |
1754 | { |
1755 | rtx to = subst_p ? ep->to_rtx : ep->from_rtx; |
1756 | |
1757 | - if (update_p) |
1758 | - return plus_constant (Pmode, to, |
1759 | - ep->offset - ep->previous_offset |
1760 | - + (ep->to_rtx == stack_pointer_rtx |
1761 | - ? update_sp_offset : 0)); |
1762 | + if (update_sp_offset != 0) |
1763 | + { |
1764 | + if (ep->to_rtx == stack_pointer_rtx) |
1765 | + return plus_constant (Pmode, to, update_sp_offset); |
1766 | + return to; |
1767 | + } |
1768 | + else if (update_p) |
1769 | + return plus_constant (Pmode, to, ep->offset - ep->previous_offset); |
1770 | else if (full_p) |
1771 | return plus_constant (Pmode, to, |
1772 | ep->offset |
1773 | @@ -395,16 +401,15 @@ |
1774 | |
1775 | if (! update_p && ! full_p) |
1776 | return gen_rtx_PLUS (Pmode, to, XEXP (x, 1)); |
1777 | - |
1778 | - offset = (update_p |
1779 | - ? ep->offset - ep->previous_offset |
1780 | - + (ep->to_rtx == stack_pointer_rtx |
1781 | - ? update_sp_offset : 0) |
1782 | - : ep->offset); |
1783 | + |
1784 | + if (update_sp_offset != 0) |
1785 | + offset = ep->to_rtx == stack_pointer_rtx ? update_sp_offset : 0; |
1786 | + else |
1787 | + offset = (update_p |
1788 | + ? ep->offset - ep->previous_offset : ep->offset); |
1789 | if (full_p && insn != NULL_RTX && ep->to_rtx == stack_pointer_rtx) |
1790 | offset -= lra_get_insn_recog_data (insn)->sp_offset; |
1791 | - if (CONST_INT_P (XEXP (x, 1)) |
1792 | - && INTVAL (XEXP (x, 1)) == -offset) |
1793 | + if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) == -offset) |
1794 | return to; |
1795 | else |
1796 | return gen_rtx_PLUS (Pmode, to, |
1797 | @@ -451,12 +456,18 @@ |
1798 | { |
1799 | rtx to = subst_p ? ep->to_rtx : ep->from_rtx; |
1800 | |
1801 | - if (update_p) |
1802 | + if (update_sp_offset != 0) |
1803 | + { |
1804 | + if (ep->to_rtx == stack_pointer_rtx) |
1805 | + return plus_constant (Pmode, |
1806 | + gen_rtx_MULT (Pmode, to, XEXP (x, 1)), |
1807 | + update_sp_offset * INTVAL (XEXP (x, 1))); |
1808 | + return gen_rtx_MULT (Pmode, to, XEXP (x, 1)); |
1809 | + } |
1810 | + else if (update_p) |
1811 | return plus_constant (Pmode, |
1812 | gen_rtx_MULT (Pmode, to, XEXP (x, 1)), |
1813 | - (ep->offset - ep->previous_offset |
1814 | - + (ep->to_rtx == stack_pointer_rtx |
1815 | - ? update_sp_offset : 0)) |
1816 | + (ep->offset - ep->previous_offset) |
1817 | * INTVAL (XEXP (x, 1))); |
1818 | else if (full_p) |
1819 | { |
1820 | @@ -889,11 +900,12 @@ |
1821 | |
1822 | If REPLACE_P is false, just update the offsets while keeping the |
1823 | base register the same. If FIRST_P, use the sp offset for |
1824 | - elimination to sp. Otherwise, use UPDATE_SP_OFFSET for this. |
1825 | - Attach the note about used elimination for insns setting frame |
1826 | - pointer to update elimination easy (without parsing already |
1827 | - generated elimination insns to find offset previously used) in |
1828 | - future. */ |
1829 | + elimination to sp. Otherwise, use UPDATE_SP_OFFSET for this. If |
1830 | + UPDATE_SP_OFFSET is non-zero, don't use difference of the offset |
1831 | + and the previous offset. Attach the note about used elimination |
1832 | + for insns setting frame pointer to update elimination easy (without |
1833 | + parsing already generated elimination insns to find offset |
1834 | + previously used) in future. */ |
1835 | |
1836 | void |
1837 | eliminate_regs_in_insn (rtx_insn *insn, bool replace_p, bool first_p, |
1838 | @@ -940,6 +952,10 @@ |
1839 | rtx src = SET_SRC (old_set); |
1840 | rtx off = remove_reg_equal_offset_note (insn, ep->to_rtx); |
1841 | |
1842 | + /* We should never process such insn with non-zero |
1843 | + UPDATE_SP_OFFSET. */ |
1844 | + lra_assert (update_sp_offset == 0); |
1845 | + |
1846 | if (off != NULL_RTX |
1847 | || src == ep->to_rtx |
1848 | || (GET_CODE (src) == PLUS |
1849 | @@ -1026,7 +1042,8 @@ |
1850 | |
1851 | if (! replace_p) |
1852 | { |
1853 | - offset += (ep->offset - ep->previous_offset); |
1854 | + if (update_sp_offset == 0) |
1855 | + offset += (ep->offset - ep->previous_offset); |
1856 | if (ep->to_rtx == stack_pointer_rtx) |
1857 | { |
1858 | if (first_p) |
1859 | --- a/gcc/lra-spills.c 2015-01-15 14:28:42.000000000 +0100 |
1860 | +++ b/gcc/lra-spills.c 2015-05-23 11:18:33.965634942 +0200 |
1861 | @@ -461,7 +461,7 @@ |
1862 | { |
1863 | rtx x = lra_eliminate_regs_1 (insn, pseudo_slots[i].mem, |
1864 | GET_MODE (pseudo_slots[i].mem), |
1865 | - 0, false, false, true); |
1866 | + false, false, 0, true); |
1867 | *loc = x != pseudo_slots[i].mem ? x : copy_rtx (x); |
1868 | } |
1869 | return; |
1870 | --- a/gcc/lto-wrapper.c 2015-01-30 17:15:00.000000000 +0100 |
1871 | +++ b/gcc/lto-wrapper.c 2015-05-23 11:21:27.938957086 +0200 |
1872 | @@ -934,7 +934,7 @@ |
1873 | filename[p - argv[i]] = '\0'; |
1874 | file_offset = (off_t) loffset; |
1875 | } |
1876 | - fd = open (argv[i], O_RDONLY); |
1877 | + fd = open (filename, O_RDONLY | O_BINARY); |
1878 | if (fd == -1) |
1879 | { |
1880 | lto_argv[lto_argc++] = argv[i]; |
1881 | --- a/gcc/match.pd 2015-02-13 21:17:55.000000000 +0100 |
1882 | +++ b/gcc/match.pd 2015-05-23 11:33:11.742416376 +0200 |
1883 | @@ -702,16 +702,12 @@ |
1884 | (for integers). Avoid this if the final type is a pointer since |
1885 | then we sometimes need the middle conversion. Likewise if the |
1886 | final type has a precision not equal to the size of its mode. */ |
1887 | - (if (((inter_int && inside_int) |
1888 | - || (inter_float && inside_float) |
1889 | - || (inter_vec && inside_vec)) |
1890 | + (if (((inter_int && inside_int) || (inter_float && inside_float)) |
1891 | + && (final_int || final_float) |
1892 | && inter_prec >= inside_prec |
1893 | - && (inter_float || inter_vec |
1894 | - || inter_unsignedp == inside_unsignedp) |
1895 | - && ! (final_prec != GET_MODE_PRECISION (element_mode (type)) |
1896 | - && element_mode (type) == element_mode (inter_type)) |
1897 | - && ! final_ptr |
1898 | - && (! final_vec || inter_prec == inside_prec)) |
1899 | + && (inter_float || inter_unsignedp == inside_unsignedp) |
1900 | + && ! (final_prec != GET_MODE_PRECISION (TYPE_MODE (type)) |
1901 | + && TYPE_MODE (type) == TYPE_MODE (inter_type))) |
1902 | (ocvt @0)) |
1903 | |
1904 | /* If we have a sign-extension of a zero-extended value, we can |
1905 | --- a/gcc/omp-low.c 2015-04-03 15:35:49.000000000 +0200 |
1906 | +++ b/gcc/omp-low.c 2015-05-23 11:32:41.672037967 +0200 |
1907 | @@ -5377,7 +5377,10 @@ |
1908 | child_cfun = DECL_STRUCT_FUNCTION (child_fn); |
1909 | |
1910 | entry_bb = region->entry; |
1911 | - exit_bb = region->exit; |
1912 | + if (gimple_code (entry_stmt) == GIMPLE_OMP_TASK) |
1913 | + exit_bb = region->cont; |
1914 | + else |
1915 | + exit_bb = region->exit; |
1916 | |
1917 | bool is_cilk_for |
1918 | = (flag_cilkplus |
1919 | @@ -5436,7 +5439,9 @@ |
1920 | variable. In which case, we need to keep the assignment. */ |
1921 | if (gimple_omp_taskreg_data_arg (entry_stmt)) |
1922 | { |
1923 | - basic_block entry_succ_bb = single_succ (entry_bb); |
1924 | + basic_block entry_succ_bb |
1925 | + = single_succ_p (entry_bb) ? single_succ (entry_bb) |
1926 | + : FALLTHRU_EDGE (entry_bb)->dest; |
1927 | tree arg, narg; |
1928 | gimple parcopy_stmt = NULL; |
1929 | |
1930 | @@ -5524,14 +5529,28 @@ |
1931 | e = split_block (entry_bb, stmt); |
1932 | gsi_remove (&gsi, true); |
1933 | entry_bb = e->dest; |
1934 | - single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU; |
1935 | + edge e2 = NULL; |
1936 | + if (gimple_code (entry_stmt) == GIMPLE_OMP_PARALLEL) |
1937 | + single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU; |
1938 | + else |
1939 | + { |
1940 | + e2 = make_edge (e->src, BRANCH_EDGE (entry_bb)->dest, EDGE_ABNORMAL); |
1941 | + gcc_assert (e2->dest == region->exit); |
1942 | + remove_edge (BRANCH_EDGE (entry_bb)); |
1943 | + set_immediate_dominator (CDI_DOMINATORS, e2->dest, e->src); |
1944 | + gsi = gsi_last_bb (region->exit); |
1945 | + gcc_assert (!gsi_end_p (gsi) |
1946 | + && gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_RETURN); |
1947 | + gsi_remove (&gsi, true); |
1948 | + } |
1949 | |
1950 | - /* Convert GIMPLE_OMP_RETURN into a RETURN_EXPR. */ |
1951 | + /* Convert GIMPLE_OMP_{RETURN,CONTINUE} into a RETURN_EXPR. */ |
1952 | if (exit_bb) |
1953 | { |
1954 | gsi = gsi_last_bb (exit_bb); |
1955 | gcc_assert (!gsi_end_p (gsi) |
1956 | - && gimple_code (gsi_stmt (gsi)) == GIMPLE_OMP_RETURN); |
1957 | + && (gimple_code (gsi_stmt (gsi)) |
1958 | + == (e2 ? GIMPLE_OMP_CONTINUE : GIMPLE_OMP_RETURN))); |
1959 | stmt = gimple_build_return (NULL); |
1960 | gsi_insert_after (&gsi, stmt, GSI_SAME_STMT); |
1961 | gsi_remove (&gsi, true); |
1962 | @@ -5552,6 +5571,14 @@ |
1963 | new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb, block); |
1964 | if (exit_bb) |
1965 | single_succ_edge (new_bb)->flags = EDGE_FALLTHRU; |
1966 | + if (e2) |
1967 | + { |
1968 | + basic_block dest_bb = e2->dest; |
1969 | + if (!exit_bb) |
1970 | + make_edge (new_bb, dest_bb, EDGE_FALLTHRU); |
1971 | + remove_edge (e2); |
1972 | + set_immediate_dominator (CDI_DOMINATORS, dest_bb, new_bb); |
1973 | + } |
1974 | /* When the OMP expansion process cannot guarantee an up-to-date |
1975 | loop tree arrange for the child function to fixup loops. */ |
1976 | if (loops_state_satisfies_p (LOOPS_NEED_FIXUP)) |
1977 | @@ -10511,7 +10538,21 @@ |
1978 | cond_code = EQ_EXPR; |
1979 | } |
1980 | |
1981 | - cond = build2 (cond_code, boolean_type_node, fd->loop.v, fd->loop.n2); |
1982 | + tree n2 = fd->loop.n2; |
1983 | + if (fd->collapse > 1 |
1984 | + && TREE_CODE (n2) != INTEGER_CST |
1985 | + && gimple_omp_for_combined_into_p (fd->for_stmt) |
1986 | + && gimple_code (ctx->outer->stmt) == GIMPLE_OMP_FOR) |
1987 | + { |
1988 | + gomp_for *gfor = as_a <gomp_for *> (ctx->outer->stmt); |
1989 | + if (gimple_omp_for_kind (gfor) == GF_OMP_FOR_KIND_FOR) |
1990 | + { |
1991 | + struct omp_for_data outer_fd; |
1992 | + extract_omp_for_data (gfor, &outer_fd, NULL); |
1993 | + n2 = fold_convert (TREE_TYPE (n2), outer_fd.loop.n2); |
1994 | + } |
1995 | + } |
1996 | + cond = build2 (cond_code, boolean_type_node, fd->loop.v, n2); |
1997 | |
1998 | clauses = gimple_omp_for_clauses (fd->for_stmt); |
1999 | stmts = NULL; |
2000 | @@ -11158,6 +11199,10 @@ |
2001 | gimple_seq_add_stmt (&new_body, gimple_build_label (ctx->cancel_label)); |
2002 | gimple_seq_add_seq (&new_body, par_olist); |
2003 | new_body = maybe_catch_exception (new_body); |
2004 | + if (gimple_code (stmt) == GIMPLE_OMP_TASK) |
2005 | + gimple_seq_add_stmt (&new_body, |
2006 | + gimple_build_omp_continue (integer_zero_node, |
2007 | + integer_zero_node)); |
2008 | gimple_seq_add_stmt (&new_body, gimple_build_omp_return (false)); |
2009 | gimple_omp_set_body (stmt, new_body); |
2010 | |
2011 | @@ -12272,6 +12317,10 @@ |
2012 | somewhere other than the next block. This will be |
2013 | created later. */ |
2014 | cur_region->exit = bb; |
2015 | + if (cur_region->type == GIMPLE_OMP_TASK) |
2016 | + /* Add an edge corresponding to not scheduling the task |
2017 | + immediately. */ |
2018 | + make_edge (cur_region->entry, bb, EDGE_ABNORMAL); |
2019 | fallthru = cur_region->type != GIMPLE_OMP_SECTION; |
2020 | cur_region = cur_region->outer; |
2021 | break; |
2022 | @@ -12320,6 +12369,10 @@ |
2023 | } |
2024 | break; |
2025 | |
2026 | + case GIMPLE_OMP_TASK: |
2027 | + fallthru = true; |
2028 | + break; |
2029 | + |
2030 | default: |
2031 | gcc_unreachable (); |
2032 | } |
2033 | --- a/gcc/tree.h 2015-04-08 20:41:55.000000000 +0200 |
2034 | +++ b/gcc/tree.h 2015-05-23 11:32:41.673037980 +0200 |
2035 | @@ -1320,6 +1320,11 @@ |
2036 | #define OMP_PARALLEL_COMBINED(NODE) \ |
2037 | (OMP_PARALLEL_CHECK (NODE)->base.private_flag) |
2038 | |
2039 | +/* True on an OMP_TEAMS statement if it represents an explicit |
2040 | + combined teams distribute constructs. */ |
2041 | +#define OMP_TEAMS_COMBINED(NODE) \ |
2042 | + (OMP_TEAMS_CHECK (NODE)->base.private_flag) |
2043 | + |
2044 | /* True if OMP_ATOMIC* is supposed to be sequentially consistent |
2045 | as opposed to relaxed. */ |
2046 | #define OMP_ATOMIC_SEQ_CST(NODE) \ |
2047 | --- a/gcc/tree-vrp.c 2015-02-17 16:32:05.000000000 +0100 |
2048 | +++ b/gcc/tree-vrp.c 2015-05-23 11:18:33.967635057 +0200 |
2049 | @@ -874,13 +874,18 @@ |
2050 | if (is_new) |
2051 | { |
2052 | /* Do not allow transitions up the lattice. The following |
2053 | - is slightly more awkward than just new_vr->type < old_vr->type |
2054 | + is slightly more awkward than just new_vr->type < old_vr->type |
2055 | because VR_RANGE and VR_ANTI_RANGE need to be considered |
2056 | the same. We may not have is_new when transitioning to |
2057 | - UNDEFINED or from VARYING. */ |
2058 | - if (new_vr->type == VR_UNDEFINED |
2059 | - || old_vr->type == VR_VARYING) |
2060 | - set_value_range_to_varying (old_vr); |
2061 | + UNDEFINED. If old_vr->type is VARYING, we shouldn't be |
2062 | + called. */ |
2063 | + if (new_vr->type == VR_UNDEFINED) |
2064 | + { |
2065 | + BITMAP_FREE (new_vr->equiv); |
2066 | + set_value_range_to_varying (old_vr); |
2067 | + set_value_range_to_varying (new_vr); |
2068 | + return true; |
2069 | + } |
2070 | else |
2071 | set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max, |
2072 | new_vr->equiv); |
2073 | @@ -8949,6 +8954,9 @@ |
2074 | fprintf (dump_file, "\n"); |
2075 | } |
2076 | |
2077 | + if (vr_result.type == VR_VARYING) |
2078 | + return SSA_PROP_VARYING; |
2079 | + |
2080 | return SSA_PROP_INTERESTING; |
2081 | } |
2082 | |
2083 | --- a/gcc/ubsan.c 2015-04-09 21:51:08.000000000 +0200 |
2084 | +++ b/gcc/ubsan.c 2015-05-23 11:22:23.302098186 +0200 |
2085 | @@ -87,6 +87,7 @@ |
2086 | #include "builtins.h" |
2087 | #include "tree-object-size.h" |
2088 | #include "tree-eh.h" |
2089 | +#include "tree-cfg.h" |
2090 | |
2091 | /* Map from a tree to a VAR_DECL tree. */ |
2092 | |
2093 | @@ -1420,7 +1421,7 @@ |
2094 | || TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME) |
2095 | return; |
2096 | |
2097 | - bool can_throw = stmt_could_throw_p (stmt); |
2098 | + bool ends_bb = stmt_ends_bb_p (stmt); |
2099 | location_t loc = gimple_location (stmt); |
2100 | tree lhs = gimple_assign_lhs (stmt); |
2101 | tree ptype = build_pointer_type (TREE_TYPE (rhs)); |
2102 | @@ -1432,7 +1433,7 @@ |
2103 | tree mem = build2 (MEM_REF, utype, gimple_assign_lhs (g), |
2104 | build_int_cst (atype, 0)); |
2105 | tree urhs = make_ssa_name (utype); |
2106 | - if (can_throw) |
2107 | + if (ends_bb) |
2108 | { |
2109 | gimple_assign_set_lhs (stmt, urhs); |
2110 | g = gimple_build_assign (lhs, NOP_EXPR, urhs); |
2111 | @@ -1469,7 +1470,7 @@ |
2112 | gimple_set_location (g, loc); |
2113 | gsi_insert_after (gsi, g, GSI_NEW_STMT); |
2114 | |
2115 | - if (!can_throw) |
2116 | + if (!ends_bb) |
2117 | { |
2118 | gimple_assign_set_rhs_with_ops (&gsi2, NOP_EXPR, urhs); |
2119 | update_stmt (stmt); |
2120 | --- a/libstdc++-v3/include/debug/vector 2015-01-05 13:33:28.000000000 +0100 |
2121 | +++ b/libstdc++-v3/include/debug/vector 2015-05-23 11:18:33.967635057 +0200 |
2122 | @@ -69,13 +69,17 @@ |
2123 | |
2124 | _Safe_vector& |
2125 | operator=(const _Safe_vector&) noexcept |
2126 | - { _M_update_guaranteed_capacity(); } |
2127 | + { |
2128 | + _M_update_guaranteed_capacity(); |
2129 | + return *this; |
2130 | + } |
2131 | |
2132 | _Safe_vector& |
2133 | operator=(_Safe_vector&& __x) noexcept |
2134 | { |
2135 | _M_update_guaranteed_capacity(); |
2136 | __x._M_guaranteed_capacity = 0; |
2137 | + return *this; |
2138 | } |
2139 | #endif |
2140 | |
2141 | --- a/libstdc++-v3/include/experimental/any 2015-01-05 13:33:28.000000000 +0100 |
2142 | +++ b/libstdc++-v3/include/experimental/any 2015-05-23 11:20:55.285156612 +0200 |
2143 | @@ -94,7 +94,7 @@ |
2144 | std::aligned_storage<sizeof(_M_ptr), sizeof(_M_ptr)>::type _M_buffer; |
2145 | }; |
2146 | |
2147 | - template<typename _Tp, typename _Safe = is_nothrow_move_constructible<_Tp>, |
2148 | + template<typename _Tp, typename _Safe = is_trivially_copyable<_Tp>, |
2149 | bool _Fits = (sizeof(_Tp) <= sizeof(_Storage))> |
2150 | using _Internal = std::integral_constant<bool, _Safe::value && _Fits>; |
2151 | |
2152 | --- a/libstdc++-v3/include/std/limits 2015-01-05 13:33:28.000000000 +0100 |
2153 | +++ b/libstdc++-v3/include/std/limits 2015-05-23 11:22:05.903763794 +0200 |
2154 | @@ -1490,7 +1490,8 @@ |
2155 | min() _GLIBCXX_USE_NOEXCEPT { return 0; } \ |
2156 | \ |
2157 | static _GLIBCXX_CONSTEXPR unsigned TYPE \ |
2158 | - max() _GLIBCXX_USE_NOEXCEPT { return __glibcxx_max_b (TYPE, BITSIZE); } \ |
2159 | + max() _GLIBCXX_USE_NOEXCEPT \ |
2160 | + { return __glibcxx_max_b (unsigned TYPE, BITSIZE); } \ |
2161 | \ |
2162 | UEXT \ |
2163 | \ |