]> git.ipfire.org Git - thirdparty/gcc.git/log
thirdparty/gcc.git
3 years agoAdd support for device-modifiers for 'omp target device'.
Marcel Vollweiler [Tue, 31 Aug 2021 13:56:03 +0000 (06:56 -0700)] 
Add support for device-modifiers for 'omp target device'.

'device_num' and 'ancestor' are now parsed on target device constructs for C,
C++, and Fortran (see OpenMP specification 5.0, p. 170). When 'ancestor' is
 used, then 'sorry, not supported' is output. Moreover, the restrictions for
'ancestor' are implemented (see OpenMP specification 5.0, p. 174f).

gcc/c/ChangeLog:

* c-parser.c (c_parser_omp_clause_device): Parse device-modifiers 'device_num'
and 'ancestor' in 'target device' clauses.

gcc/cp/ChangeLog:

* parser.c (cp_parser_omp_clause_device): Parse device-modifiers 'device_num'
and 'ancestor' in 'target device' clauses.
* semantics.c (finish_omp_clauses): Error handling. Constant device ids must
evaluate to '1' if 'ancestor' is used.

gcc/fortran/ChangeLog:

* gfortran.h: Add variable for 'ancestor' in struct gfc_omp_clauses.
* openmp.c (gfc_match_omp_clauses): Parse device-modifiers 'device_num'
and 'ancestor' in 'target device' clauses.
* trans-openmp.c (gfc_trans_omp_clauses): Set OMP_CLAUSE_DEVICE_ANCESTOR.

gcc/ChangeLog:

* gimplify.c (gimplify_scan_omp_clauses): Error handling. 'ancestor' only
allowed on target constructs and only with particular other clauses.
* omp-expand.c (expand_omp_target): Output of 'sorry, not supported' if
'ancestor' is used.
* omp-low.c (check_omp_nesting_restrictions): Error handling. No nested OpenMP
structs when 'ancestor' is used.
(scan_omp_1_stmt): No usage of OpenMP runtime routines in a target region when
'ancestor' is used.
* tree-pretty-print.c (dump_omp_clause): Append 'ancestor'.
* tree.h (OMP_CLAUSE_DEVICE_ANCESTOR): Define macro.

gcc/testsuite/ChangeLog:

* c-c++-common/gomp/target-device-1.c: New test.
* c-c++-common/gomp/target-device-2.c: New test.
* c-c++-common/gomp/target-device-ancestor-1.c: New test.
* c-c++-common/gomp/target-device-ancestor-2.c: New test.
* c-c++-common/gomp/target-device-ancestor-3.c: New test.
* c-c++-common/gomp/target-device-ancestor-4.c: New test.
* gfortran.dg/gomp/target-device-1.f90: New test.
* gfortran.dg/gomp/target-device-2.f90: New test.
* gfortran.dg/gomp/target-device-ancestor-1.f90: New test.
* gfortran.dg/gomp/target-device-ancestor-2.f90: New test.
* gfortran.dg/gomp/target-device-ancestor-3.f90: New test.
* gfortran.dg/gomp/target-device-ancestor-4.f90: New test.

(cherry picked from commit 03be3cfeef7b3811acb6c4a8da2fc5c1e25d3e4c)

3 years agoopenmp: in_reduction clause support on target construct
Chung-Lin Tang [Wed, 25 Aug 2021 15:03:20 +0000 (23:03 +0800)] 
openmp: in_reduction clause support on target construct

(backport of commit 7619d33471c10fe3d149dcbb701d99ed3dd23528 from mainline)

This patch adds support for in_reduction clause on target construct, though
for now only for synchronous targets (without nowait clause).
The encountering thread in that case runs the target task and blocks until
the target region ends, so it is implemented by remapping it before entering
the target, initializing the private copy if not yet initialized for the
current thread and then using the remapped addresses for the mapping
addresses.
For nowait combined with in_reduction the patch contains a hack where the
nowait clause is ignored.  To implement it correctly, I think we would need
to create a new private variable for the in_reduction and initialize it before
doing the async target and adjust the map addresses to that private variable
and then pass a function pointer to the library routine with code where the callback
would remap the address to the current threads private variable and use in_reduction
combiner to combine the private variable we've created into the thread's copy.
The library would then need to make sure that the routine is called in some thread
participating in the parallel (and not in an unshackeled thread).

2021-06-24  Jakub Jelinek  <jakub@redhat.com>

gcc/
* tree.h (OMP_CLAUSE_MAP_IN_REDUCTION): Document meaning for OpenMP.
* gimplify.c (gimplify_scan_omp_clauses): For OpenMP map clauses
with OMP_CLAUSE_MAP_IN_REDUCTION flag partially defer gimplification
of non-decl OMP_CLAUSE_DECL.  For OMP_CLAUSE_IN_REDUCTION on
OMP_TARGET user outer_ctx instead of ctx for placeholders and
initializer/combiner gimplification.
* omp-low.c (scan_sharing_clauses): Handle OMP_CLAUSE_MAP_IN_REDUCTION
on target constructs.
(lower_rec_input_clauses): Likewise.
(lower_omp_target): Likewise.
* omp-expand.c (expand_omp_target): Temporarily ignore nowait clause
on target if in_reduction is present.
gcc/c-family/
* c-common.h (enum c_omp_region_type): Add C_ORT_TARGET and
C_ORT_OMP_TARGET.
* c-omp.c (c_omp_split_clauses): For OMP_CLAUSE_IN_REDUCTION on
combined target constructs also add map (always, tofrom:) clause.
gcc/c/
* c-parser.c (omp_split_clauses): Pass C_ORT_OMP_TARGET instead of
C_ORT_OMP for clauses on target construct.
(OMP_TARGET_CLAUSE_MASK): Add in_reduction clause.
(c_parser_omp_target): For non-combined target add
map (always, tofrom:) clauses for OMP_CLAUSE_IN_REDUCTION.  Pass
C_ORT_OMP_TARGET to c_finish_omp_clauses.
* c-typeck.c (handle_omp_array_sections): Adjust ort handling
for addition of C_ORT_OMP_TARGET and simplify, mapping clauses are
never present on C_ORT_*DECLARE_SIMD.
(c_finish_omp_clauses): Likewise.  Handle OMP_CLAUSE_IN_REDUCTION
on C_ORT_OMP_TARGET, set OMP_CLAUSE_MAP_IN_REDUCTION on
corresponding map clauses.
gcc/cp/
* parser.c (cp_omp_split_clauses): Pass C_ORT_OMP_TARGET instead of
C_ORT_OMP for clauses on target construct.
(OMP_TARGET_CLAUSE_MASK): Add in_reduction clause.
(cp_parser_omp_target): For non-combined target add
map (always, tofrom:) clauses for OMP_CLAUSE_IN_REDUCTION.  Pass
C_ORT_OMP_TARGET to finish_omp_clauses.
* semantics.c (handle_omp_array_sections_1): Adjust ort handling
for addition of C_ORT_OMP_TARGET and simplify, mapping clauses are
never present on C_ORT_*DECLARE_SIMD.
(handle_omp_array_sections): Likewise.
(finish_omp_clauses): Likewise.  Handle OMP_CLAUSE_IN_REDUCTION
on C_ORT_OMP_TARGET, set OMP_CLAUSE_MAP_IN_REDUCTION on
corresponding map clauses.
* pt.c (tsubst_expr): Pass C_ORT_OMP_TARGET instead of C_ORT_OMP for
clauses on target construct.
gcc/testsuite/
* c-c++-common/gomp/target-in-reduction-1.c: New test.
* c-c++-common/gomp/clauses-1.c: Add in_reduction clauses on
target or combined target constructs.
libgomp/
* testsuite/libgomp.c-c++-common/target-in-reduction-1.c: New test.
* testsuite/libgomp.c-c++-common/target-in-reduction-2.c: New test.
* testsuite/libgomp.c++/target-in-reduction-1.C: New test.
* testsuite/libgomp.c++/target-in-reduction-2.C: New test.

3 years agoMerge remote-tracking branch 'origin/releases/gcc-11' into devel/omp/gcc-11
Tobias Burnus [Mon, 23 Aug 2021 13:45:29 +0000 (15:45 +0200)] 
Merge remote-tracking branch 'origin/releases/gcc-11' into devel/omp/gcc-11

Merge up to r11-8894-g05dbde3bfb91b5a643b68d00609a1aab1a6f47a0 (Aug 23, 2021).

3 years agoFortran/OpenMP: Improve duplicate errors
Tobias Burnus [Mon, 23 Aug 2021 13:38:19 +0000 (15:38 +0200)] 
Fortran/OpenMP: Improve duplicate errors

gcc/fortran/ChangeLog:

* openmp.c (gfc_match_dupl_check, gfc_match_dupl_memorder,
gfc_match_dupl_atomic): New.
(gfc_match_omp_clauses): Use them; remove duplicate
'release'/'relaxed' clause matching; improve error dignostic
for 'default'.

gcc/testsuite/ChangeLog:

* gfortran.dg/goacc/asyncwait-1.f95: Update dg-error.
* gfortran.dg/goacc/default-2.f: Update dg-error.
* gfortran.dg/goacc/enter-exit-data.f95: Update dg-error.
* gfortran.dg/goacc/if.f95: Update dg-error.
* gfortran.dg/goacc/parallel-kernels-clauses.f95: Update dg-error.
* gfortran.dg/goacc/routine-6.f90: Update dg-error.
* gfortran.dg/goacc/sie.f95: Update dg-error.
* gfortran.dg/goacc/update-if_present-2.f90: Update dg-error.
* gfortran.dg/gomp/cancel-2.f90: Update dg-error.
* gfortran.dg/gomp/declare-simd-1.f90: Update dg-error.
* gfortran.dg/gomp/error-3.f90: Update dg-error.
* gfortran.dg/gomp/loop-2.f90: Update dg-error.
* gfortran.dg/gomp/masked-2.f90: Update dg-error.

(cherry picked from commit 57a9e63c96fca56299d7a52f6712e2d9290c197e)

3 years agoFortran/OpenMP: strict modifier on grainsize/num_tasks
Tobias Burnus [Mon, 23 Aug 2021 13:27:27 +0000 (15:27 +0200)] 
Fortran/OpenMP: strict modifier on grainsize/num_tasks

This patch adds support for the 'strict' modifier on grainsize/num_tasks
clauses, an OpenMP 5.1 feature supported in C/C++ since commit
r12-3066-g3bc75533d1f87f0617be6c1af98804f9127ec637

gcc/fortran/ChangeLog:

* dump-parse-tree.c (show_omp_clauses): Handle 'strict' modifier
on grainsize/num_tasks
* gfortran.h (gfc_omp_clauses): Add grainsize_strict
and num_tasks_strict.
* trans-openmp.c (gfc_trans_omp_clauses, gfc_split_omp_clauses):
Handle 'strict' modifier on grainsize/num_tasks.
* openmp.c (gfc_match_omp_clauses): Likewise.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/taskloop-4-a.f90: New test.
* testsuite/libgomp.fortran/taskloop-4.f90: New test.
* testsuite/libgomp.fortran/taskloop-5-a.f90: New test.
* testsuite/libgomp.fortran/taskloop-5.f90: New test.

(cherry picked from commit d4de7e32eff0a6363defa50b052d7a30548b6552)

3 years agoopenmp: Add support for strict modifier on grainsize/num_tasks clauses
Jakub Jelinek [Mon, 23 Aug 2021 13:25:24 +0000 (15:25 +0200)] 
openmp: Add support for strict modifier on grainsize/num_tasks clauses

With strict: modifier on these clauses, the standard is explicit about
how many iterations (and which) each generated task of taskloop directive
should contain.  For num_tasks it actually matches what we were already
implementing, but for grainsize it does not (and even violates the old
rule - without strict it requires that the number of iterations (unspecified
which exactly) handled by each generated task is >= grainsize argument and
< 2 * grainsize argument, with strict: it requires that each generated
task handles exactly == grainsize argument iterations, except for the
generated task handling the last iteration which can handles <= grainsize
iterations).

The following patch implements it for C and C++.

2021-08-23  Jakub Jelinek  <jakub@redhat.com>

gcc/
* tree.h (OMP_CLAUSE_GRAINSIZE_STRICT): Define.
(OMP_CLAUSE_NUM_TASKS_STRICT): Define.
* tree-pretty-print.c (dump_omp_clause) <case OMP_CLAUSE_GRAINSIZE,
case OMP_CLAUSE_NUM_TASKS>: Print strict: modifier.
* omp-expand.c (expand_task_call): Use GOMP_TASK_FLAG_STRICT in iflags
if either grainsize or num_tasks clause has the strict modifier.
gcc/c/
* c-parser.c (c_parser_omp_clause_num_tasks,
c_parser_omp_clause_grainsize): Parse the optional strict: modifier.
gcc/cp/
* parser.c (cp_parser_omp_clause_num_tasks,
cp_parser_omp_clause_grainsize): Parse the optional strict: modifier.
include/
* gomp-constants.h (GOMP_TASK_FLAG_STRICT): Define.
libgomp/
* taskloop.c (GOMP_taskloop): Handle GOMP_TASK_FLAG_STRICT.
* testsuite/libgomp.c-c++-common/taskloop-4.c (main): Fix up comment.
* testsuite/libgomp.c-c++-common/taskloop-5.c: New test.

(cherry picked from commit 3bc75533d1f87f0617be6c1af98804f9127ec637)

3 years agoMake the OpenMP 'error' directive work for nvptx offloading
Thomas Schwinge [Mon, 23 Aug 2021 13:22:38 +0000 (15:22 +0200)] 
Make the OpenMP 'error' directive work for nvptx offloading

... and add a minimum amount of offloading testing.

(Leaving aside that 'fwrite' to 'stderr' probably wouldn't work anyway) the
'fwrite' calls in 'libgomp/error.c:GOMP_warning', 'libgomp/error.c:GOMP_error'
drag in 'isatty', which isn't provided by my nvptx newlib build at present, so
we get, for example:

    [...]
    FAIL: libgomp.c/../libgomp.c-c++-common/declare_target-1.c (test for excess errors)
    Excess errors:
    unresolved symbol isatty
    mkoffload: fatal error: [...]/build-gcc/./gcc/x86_64-pc-linux-gnu-accel-nvptx-none-gcc returned 1 exit status
    [...]

..., and many more.

Fix up for recent commit 0d973c0a0d90a0a302e7eda1a4d9709be3c5b102
"openmp: Implement the error directive".

libgomp/
* config/nvptx/error.c (fwrite, exit): Override, too.
* testsuite/libgomp.c-c++-common/error-1.c: Add a minimum amount
of offloading testing.
* testsuite/libgomp.fortran/error-1.f90: Likewise.

(cherry picked from commit a5416bf369419428fb139c432bcd88f6f8ee4910)

3 years agoarm: Fix __arm_vctp16q return type in arm_mve.h
Christophe Lyon [Mon, 23 Aug 2021 09:47:14 +0000 (09:47 +0000)] 
arm: Fix __arm_vctp16q return type in arm_mve.h

__arm_vctp16q actually returns mve_pred16_t rather than int64_t.

2021-08-23  Christophe Lyon  <christophe.lyon@foss.st.com>

gcc/
* config/arm/arm_mve.h: Fix __arm_vctp16q return type.

(cherry picked from commit ac3bcc813f26e6dc4c3b037d9d5c5a84f7f62cf4)

3 years agodwarf2out: Emit DW_AT_location for global register vars during early dwarf [PR101905]
Jakub Jelinek [Mon, 23 Aug 2021 09:50:14 +0000 (11:50 +0200)] 
dwarf2out: Emit DW_AT_location for global register vars during early dwarf [PR101905]

The following patch emits DW_AT_location for global register variables
already during early dwarf, since usually late_global_decl hook isn't even
called for those, as nothing needs to be emitted for them.

2021-08-23  Jakub Jelinek  <jakub@redhat.com>

PR debug/101905
* dwarf2out.c (gen_variable_die): Add DW_AT_location for global
register variables already during early_dwarf if possible.

* gcc.dg/guality/pr101905.c: New test.

(cherry picked from commit b284053bb75661fc1bf13c275f3ba5364bb17608)

3 years agogcov: fix output location for JSON mode.
Martin Liska [Tue, 17 Aug 2021 14:24:26 +0000 (16:24 +0200)] 
gcov: fix output location for JSON mode.

PR gcov-profile/89961

gcc/ChangeLog:

* gcov.c (make_gcov_file_name): Rewrite using std::string.
(mangle_name): Simplify, do not used the second argument.
(strip_extention): New function.
(get_md5sum): Likewise.
(get_gcov_intermediate_filename): Handle properly -p and -x
options.
(output_gcov_file): Use string type.
(generate_results): Likewise.
(md5sum_to_hex): Remove.

(cherry picked from commit b777f228b481ae881a7fbb09de367a053740932c)

3 years agoDaily bump.
GCC Administrator [Mon, 23 Aug 2021 00:18:05 +0000 (00:18 +0000)] 
Daily bump.

3 years agoDaily bump.
GCC Administrator [Sun, 22 Aug 2021 00:18:16 +0000 (00:18 +0000)] 
Daily bump.

3 years agoDaily bump.
GCC Administrator [Sat, 21 Aug 2021 00:18:05 +0000 (00:18 +0000)] 
Daily bump.

3 years agoFortran: Add OpenMP's error directive
Tobias Burnus [Fri, 20 Aug 2021 12:22:07 +0000 (14:22 +0200)] 
Fortran: Add OpenMP's error directive

Fortran part to the C/C++ implementation of
commit r12-3040-g0d973c0a0d90a0a302e7eda1a4d9709be3c5b102

gcc/fortran/ChangeLog:

* dump-parse-tree.c (show_omp_clauses): Handle 'at', 'severity'
and 'message' clauses.
(show_omp_node, show_code_node): Handle EXEC_OMP_ERROR.
* gfortran.h (gfc_statement): Add ST_OMP_ERROR.
(gfc_omp_severity_type, gfc_omp_at_type): New.
(gfc_omp_clauses): Add 'at', 'severity' and 'message' clause;
use more bitfields + ENUM_BITFIELD.
(gfc_exec_op): Add EXEC_OMP_ERROR.
* match.h (gfc_match_omp_error): New.
* openmp.c (enum omp_mask1): Add OMP_CLAUSE_(AT,SEVERITY,MESSAGE).
(gfc_match_omp_clauses): Handle new clauses.
(OMP_ERROR_CLAUSES, gfc_match_omp_error): New.
(resolve_omp_clauses): Resolve new clauses.
(omp_code_to_statement, gfc_resolve_omp_directive): Handle
EXEC_OMP_ERROR.
* parse.c (decode_omp_directive, next_statement,
gfc_ascii_statement): Handle 'omp error'.
* resolve.c (gfc_resolve_blocks): Likewise.
* st.c (gfc_free_statement): Likewise.
* trans-openmp.c (gfc_trans_omp_error): Likewise.
(gfc_trans_omp_directive): Likewise.
* trans.c (trans_code): Likewise.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/error-1.f90: New test.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/error-1.f90: New test.
* gfortran.dg/gomp/error-2.f90: New test.
* gfortran.dg/gomp/error-3.f90: New test.

(cherry picked from commit 77167196fe8cf840a69913e7739d39ae0df2b074)

3 years agoopenmp: Implement the error directive
Jakub Jelinek [Fri, 20 Aug 2021 12:19:07 +0000 (14:19 +0200)] 
openmp: Implement the error directive

This patch implements the error directive.  Depending on clauses it is either
a compile time diagnostics (in that case diagnosed right away) or runtime
diagnostics (libgomp API call that diagnoses at runtime), and either fatal
or warning (error or warning at compile time or fatal error vs. error at
runtime) and either has no message or user supplied message (this kind of
e.g. deprecated attribute).  The directive is also stand-alone directive
when at runtime while utility (thus disappears from the IL as if it wasn't
there for parsing like nothing directive) at compile time.

There are some clarifications in the works ATM, so this patch doesn't yet
require that for compile time diagnostics the user message must be a constant
string literal, there are uncertainities on what exactly is valid argument
of message clause (whether just const char * type, convertible to const char *,
qualified/unqualified const char * or char * or what else) and what to do
in templates.  Currently even in templates it is diagnosed right away for
compile time diagnostics, if we'll need to substitute it, we'd need to queue
something into the IL, have pt.c handle it and diagnose only later.

2021-08-20  Jakub Jelinek  <jakub@redhat.com>

gcc/
* omp-builtins.def (BUILT_IN_GOMP_WARNING, BUILT_IN_GOMP_ERROR): New
builtins.
gcc/c-family/
* c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_ERROR.
* c-pragma.c (omp_pragmas): Add error directive.
* c-omp.c (omp_directives): Uncomment error directive entry.
gcc/c/
* c-parser.c (c_parser_omp_error): New function.
(c_parser_pragma): Handle PRAGMA_OMP_ERROR.
gcc/cp/
* parser.c (cp_parser_handle_statement_omp_attributes): Determine if
PRAGMA_OMP_ERROR directive is C_OMP_DIR_STANDALONE.
(cp_parser_omp_error): New function.
(cp_parser_pragma): Handle PRAGMA_OMP_ERROR.
gcc/fortran/
* types.def (BT_FN_VOID_CONST_PTR_SIZE): New DEF_FUNCTION_TYPE_2.
* f95-lang.c (ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST): Define.
gcc/testsuite/
* c-c++-common/gomp/error-1.c: New test.
* c-c++-common/gomp/error-2.c: New test.
* c-c++-common/gomp/error-3.c: New test.
* g++.dg/gomp/attrs-1.C (bar): Add error directive test.
* g++.dg/gomp/attrs-2.C (bar): Add error directive test.
* g++.dg/gomp/attrs-13.C: New test.
* g++.dg/gomp/error-1.C: New test.
libgomp/
* libgomp.map (GOMP_5.1): Add GOMP_error and GOMP_warning.
* libgomp_g.h (GOMP_warning, GOMP_error): Declare.
* error.c (GOMP_warning, GOMP_error): New functions.
* testsuite/libgomp.c-c++-common/error-1.c: New test.

(cherry picked from commit 0d973c0a0d90a0a302e7eda1a4d9709be3c5b102)

3 years agoopenmp: Diagnose some superfluous commas in OpenMP parsing
Jakub Jelinek [Fri, 20 Aug 2021 12:13:36 +0000 (14:13 +0200)] 
openmp: Diagnose some superfluous commas in OpenMP parsing

While working on error directive, I've noticed a few spots in OpenMP
parsing where we consume and don't diagnose superfluous commas at the end
(either of depend sink arguments or at the end of requires pragma).

2021-08-20  Jakub Jelinek  <jakub@redhat.com>

gcc/c/
* c-parser.c (c_parser_omp_clause_depend_sink): Reject spurious
comma at the end of list.
(c_parser_omp_requires): Likewise.
gcc/cp/
* parser.c (cp_parser_omp_clause_depend_sink): Reject spurious
comma at the end of list.  Don't parse closing paren here...
(cp_parser_omp_clause_depend): ... but here instead.
gcc/testsuite/
* c-c++-common/gomp/sink-5.c: New test.
* c-c++-common/gomp/requires-3.c: Add test for spurious comma
at the end of pragma line.

(cherry picked from commit f9400e4e4705845f2b0cdc4eab30c214e0e4cbe0)

3 years agoDaily bump.
GCC Administrator [Fri, 20 Aug 2021 00:18:08 +0000 (00:18 +0000)] 
Daily bump.

3 years agoFortran: Fix c_float128 and c_float128_complex definitions.
Sandra Loosemore [Thu, 12 Aug 2021 02:24:17 +0000 (19:24 -0700)] 
Fortran: Fix c_float128 and c_float128_complex definitions.

gfc_float128_type_node is only non-NULL on targets that support a
128-bit type that is not long double.  Use float128_type_node instead
when computing the value of the kind constants c_float128 and
c_float128_complex from the ISO_C_BINDING intrinsic module; this also
ensures it actually corresponds to __float128 (the IEEE encoding) and
not some other 128-bit floating-point type.

2021-08-11  Sandra Loosemore  <sandra@codesourcery.com>

gcc/fortran/
* iso-c-binding.def (c_float128, c_float128_complex): Check
float128_type_node instead of gfc_float128_type_node.
* trans-types.c (gfc_init_kinds, gfc_build_real_type):
Update comments re supported 128-bit floating-point types.

(cherry picked from commit 58340a7cd3670024bafdbbc6ca63a9af841df98a)

3 years agogfortran: Fix in-build-tree testing [PR101305, PR101660]
Tobias Burnus [Thu, 12 Aug 2021 02:18:42 +0000 (19:18 -0700)] 
gfortran: Fix in-build-tree testing [PR101305, PR101660]

ISO_Fortran_binding.h is written in the build dir - hence, a previous commit
added it as include directory for in-build-tree testing.  However,
it turned out that -I$specdir/libgfortran interferes with reading .mod files
as they are then no longer regareded as intrinsic modules.  Solution: Create
an extra include/ directory in the libgfortran build dir and copy
ISO_Fortran_binding.h to that directory.  As -B$specdir/libgfortran already
causes gfortran to read that include subdirectory, the -I flag is no longer
needed.

PR libfortran/101305
PR fortran/101660
PR testsuite/101847

libgfortran/ChangeLog:

* Makefile.am (ISO_Fortran_binding.h): Create include/ in the build dir
and copy the include file to it.
(clean-local): Add for removing the 'include' directory.
* Makefile.in: Regenerate.

gcc/testsuite/ChangeLog:

* lib/gfortran.exp (gfortran_init): Remove -I$specpath/libgfortran
from the string used to set GFORTRAN_UNDER_TEST.

(cherry picked from commit 2ba0376ac40447ce7ee09fcef00511c18db25dfa)

3 years agotestsuite/lib/gfortran.exp: Add -I for ISO*.h [PR101305, PR101660]
Tobias Burnus [Mon, 9 Aug 2021 10:35:23 +0000 (12:35 +0200)] 
testsuite/lib/gfortran.exp: Add -I for ISO*.h [PR101305, PR101660]

This patch adds -I$specdir/libgfortran to GFORTRAN_UNDER_TEST, when
set by proc gfortran_init. As the $specdir depends on the multilib
setting, it has to be re-set for a different multilib; hence, we track
whether a previous call to gfortran_init set that var or whether it
was set differently.

gcc/testsuite/
PR libfortran/101305
PR fortran/101660

* lib/gfortran.exp (gfortran_init): Add -I $specdir/libgfortran to
GFORTRAN_UNDER_TEST; update it when set by previous gfortran_init call.
* gfortran.dg/ISO_Fortran_binding_1.c: Use <...> not "..." for
ISO_Fortran_binding.h's #include.
* gfortran.dg/ISO_Fortran_binding_10.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_11.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_12.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_15.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_16.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_17.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_18.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_3.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_5.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_6.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_7.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_8.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_9.c: Likewise.
* gfortran.dg/PR94327.c: Likewise.
* gfortran.dg/PR94331.c: Likewise.
* gfortran.dg/bind_c_array_params_3_aux.c: Likewise.
* gfortran.dg/iso_fortran_binding_uint8_array_driver.c: Likewise.
* gfortran.dg/pr93524.c: Likewise.

(cherry picked from commit 527a1cf32c27a3fbeaf6be7596241570d864cc4c)

3 years agoBind(c): Improve error checking in CFI_* functions
Sandra Loosemore [Thu, 12 Aug 2021 01:57:34 +0000 (18:57 -0700)] 
Bind(c): Improve error checking in CFI_* functions

This patch adds additional run-time checking for invalid arguments to
CFI_establish and CFI_setpointer.  It also changes existing messages
throughout the CFI_* functions to use PRIiPTR to format CFI_index_t
values instead of casting them to int and using %d (which may not work
on targets where int is a smaller type), simplifies wording of some
messages, and fixes issues with capitalization, typos, and the like.
Additionally some coding standards problems such as >80 character lines
are addressed.

2021-07-24  Sandra Loosemore  <sandra@codesourcery.com>

PR libfortran/101317

libgfortran/
* runtime/ISO_Fortran_binding.c: Include <inttypes.h>.
(CFI_address): Tidy error messages and comments.
(CFI_allocate): Likewise.
(CFI_deallocate): Likewise.
(CFI_establish): Likewise.  Add new checks for validity of
elem_len when it's used, plus type argument and extents.
(CFI_is_contiguous): Tidy error messages and comments.
(CFI_section): Likewise.  Refactor some repetitive code to
make it more understandable.
(CFI_select_part): Likewise.
(CFI_setpointer): Likewise.  Check that source is not an
unallocated allocatable array or an assumed-size array.

gcc/testsuite/
* gfortran.dg/ISO_Fortran_binding_17.f90: Fix typo in error
message patterns.

(cherry picked from commit e78480ad0983cf75813af5e02d68cdad09e441e9)

3 years agoBind(c): Fix bugs in CFI_section
Sandra Loosemore [Thu, 12 Aug 2021 01:54:24 +0000 (18:54 -0700)] 
Bind(c): Fix bugs in CFI_section

CFI_section was incorrectly adjusting the base pointer for the result
array twice in different ways.  It was also overwriting the array
dimension info in the result descriptor before computing the base
address offset from the source descriptor, which caused problems if
the two descriptors are the same.  This patch fixes both problems and
makes the code simpler, too.

A consequence of this patch is that the result array is now 0-based in
all dimensions instead of starting at the numbering to match the first
element of the source array.  The Fortran standard only specifies the
shape of the result array, not its lower bounds, so this is permitted
and probably less confusing for users as well as implementors.

2021-07-17  Sandra Loosemore  <sandra@codesourcery.com>

PR libfortran/101310

libgfortran/
* runtime/ISO_Fortran_binding.c (CFI_section): Fix the base
address computation and simplify the code.

gcc/testsuite/
* gfortran.dg/ISO_Fortran_binding_1.c (section_c): Remove
incorrect assertions.

(cherry picked from commit b4a9bc7856ee1d3ff98b04402334a362540af2cf)

3 years agoFix ISO_Fortran_binding.h paths in gfortran testsuite
Sandra Loosemore [Thu, 12 Aug 2021 01:46:24 +0000 (18:46 -0700)] 
Fix ISO_Fortran_binding.h paths in gfortran testsuite

ISO_Fortran_binding.h is now generated in the libgfortran build
directory where it is on the default include path.  Adjust includes in
the gfortran testsuite not to include an explicit path pointing at the
source directory.

2021-07-27  Sandra Loosemore  <sandra@codesourcery.com>

gcc/testsuite/
PR libfortran/101305
* gfortran.dg/ISO_Fortran_binding_1.c: Adjust include path.
* gfortran.dg/ISO_Fortran_binding_10.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_11.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_12.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_15.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_16.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_17.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_18.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_3.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_5.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_6.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_7.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_8.c: Likewise.
* gfortran.dg/ISO_Fortran_binding_9.c: Likewise.
* gfortran.dg/PR94327.c: Likewise.
* gfortran.dg/PR94331.c: Likewise.
* gfortran.dg/bind_c_array_params_3_aux.c: Likewise.
* gfortran.dg/iso_fortran_binding_uint8_array_driver.c: Likewise.
* gfortran.dg/pr93524.c: Likewise.

(cherry picked from commit a3b350f1799a1c0f9e2ece5b817a537fe42f0d2d)

3 years agoBind(C): Correct sizes of some types in CFI_establish
Sandra Loosemore [Thu, 12 Aug 2021 01:41:44 +0000 (18:41 -0700)] 
Bind(C): Correct sizes of some types in CFI_establish

CFI_establish was failing to set the default elem_len correctly for
CFI_type_cptr, CFI_type_cfunptr, CFI_type_long_double, and
CFI_type_long_double_Complex.

2021-07-13  Sandra Loosemore  <sandra@codesourcery.com>

libgfortran/
PR libfortran/101305
* runtime/ISO_Fortran_binding.c (CFI_establish): Special-case
CFI_type_cptr and CFI_type_cfunptr.  Correct size of long double
on targets where it has kind 10.

(cherry picked from commit c4dc9f590181321c36d3f3ef72c50b3c47bbfe7c)

3 years agoBind(C): Fix type encodings in ISO_Fortran_binding.h
Sandra Loosemore [Thu, 12 Aug 2021 01:33:52 +0000 (18:33 -0700)] 
Bind(C): Fix type encodings in ISO_Fortran_binding.h

ISO_Fortran_binding.h had many incorrect hardwired kind encodings in
the definitions of the CFI_type_* macros.  Additionally, not all
targets support all the defined type encodings, and the Fortran
standard requires those macros to have a negative value.

This patch changes ISO_Fortran_binding.h to use sizeof instead of
hard-coded sizes, and assembles it from fragments that reflect the
set of types supported by the target.

2021-07-22  Sandra Loosemore  <sandra@codesourcery.com>
    Tobias Burnus  <tobias@codesourcery.com>

libgfortran/
PR libfortran/101305
* ISO_Fortran_binding.h: Fix hard-coded sizes and split into...
* ISO_Fortran_binding-1-tmpl.h: New file.
* ISO_Fortran_binding-2-tmpl.h: New file.
* ISO_Fortran_binding-3-tmpl.h: New file.
* Makefile.am: Add rule for generating ISO_Fortran_binding.h.
Adjust pathnames to that file.
* Makefile.in: Regenerated.
* mk-kinds-h.sh: New file.
* runtime/ISO_Fortran_binding.c: Fix include path.

(cherry picked from commit fef67987cf502fe322e92ddce22eea7ac46b4d75)

3 years agoFortran: Assumed and explicit size class arrays [PR46691/99819].
Paul Thomas [Thu, 12 Aug 2021 00:54:14 +0000 (17:54 -0700)] 
Fortran: Assumed and explicit size class arrays [PR46691/99819].

2021-05-06  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran/ChangeLog

PR fortran/46691
PR fortran/99819
* class.c (gfc_build_class_symbol): Remove the error that
disables assumed size class arrays. Class array types that are
not deferred shape or assumed rank are given a unique name and
placed in the procedure namespace.
* trans-array.c (gfc_trans_g77_array): Obtain the data pointer
for class arrays.
(gfc_trans_dummy_array_bias): Suppress the runtime error for
extent violations in explicit shape class arrays because it
always fails.
* trans-expr.c (gfc_conv_procedure_call): Handle assumed size
class actual arguments passed to non-descriptor formal args by
using the data pointer, stored as the symbol's backend decl.

gcc/testsuite/ChangeLog

PR fortran/46691
PR fortran/99819
* gfortran.dg/class_dummy_6.f90: New test.
* gfortran.dg/class_dummy_7.f90: New test.

(cherry picked from commit a2c593009fef1564dbef2237ee71e9fd08f5361e)

3 years agolibstdc++: Move status table entry to be with other ranges papers
Jonathan Wakely [Thu, 19 Aug 2021 14:03:21 +0000 (15:03 +0100)] 
libstdc++: Move status table entry to be with other ranges papers

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* doc/xml/manual/status_cxx2020.xml: Move row  earlier in table.
* doc/html/manual/status.html: Regenerate.

(cherry picked from commit c5e0f954aef8caf4ee54b185e0fbfa88aeab62c6)

3 years agolibstdc++: Document P1739R4 status [PR100139]
Jonathan Wakely [Thu, 19 Aug 2021 10:44:57 +0000 (11:44 +0100)] 
libstdc++: Document P1739R4 status [PR100139]

We should document the status of this unimplemented feature.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

PR libstdc++/100139
* doc/xml/manual/status_cxx2020.xml: Add P1739R4 to status table.
* doc/html/manual/status.html: Regenerate.

(cherry picked from commit 926d4a71c7e5a2f7d17a4f943d6e7fe9f1e3ba55)

3 years agoopenacc: fix ICE for non-decl expression in non-contiguous array base-pointer
Chung-Lin Tang [Thu, 19 Aug 2021 08:17:02 +0000 (16:17 +0800)] 
openacc: fix ICE for non-decl expression in non-contiguous array base-pointer

Currently, we do not support cases like struct-members as the base-pointer
for an OpenACC non-contiguous array. Mark such cases as unsupported in the
C/C++ front-ends, instead of ICEing on them.

gcc/c/ChangeLog:

* c-typeck.c (handle_omp_array_sections_1): Robustify non-contiguous
array check and reject non-DECL base-pointer cases as unsupported.

gcc/cp/ChangeLog:

* semantics.c (handle_omp_array_sections_1): Robustify non-contiguous
array check and reject non-DECL base-pointer cases as unsupported.

3 years agoopenmp: Fix ICE on requires clause with atomic_default_mem_order (
Jakub Jelinek [Thu, 19 Aug 2021 10:05:45 +0000 (12:05 +0200)] 
openmp: Fix ICE on requires clause with atomic_default_mem_order (

When working on error directive, I've noticed the C FE ICEs on
  #pragma omp requires atomic_default_mem_order (
where it tries to peek 2nd token after the CPP_PRAGMA_EOL (or CPP_EOF)
in there in order to improve error-recovery on say
atomic_default_mem_order (acquire)
or
atomic_default_mem_order (seqcst)
etc.  The C++ FE didn't ICE, but it is better to follow the same thing there.

2021-08-19  Jakub Jelinek  <jakub@redhat.com>

gcc/c/
* c-parser.c (c_parser_omp_requires): Don't call
c_parser_peek_2nd_token and optionally consume token if current
token is CPP_EOF, CPP_PRAGMA_EOL or CPP_CLOSE_PAREN.
gcc/cp/
* parser.c (cp_parser_omp_requires): Don't call cp_lexer_nth_token_is
and optionally consume token if current token is CPP_EOF,
CPP_PRAGMA_EOL or CPP_CLOSE_PAREN.
gcc/testsuite/
* c-c++-common/gomp/requires-3.c: Add testcase for
atomic_default_mem_order ( at the end of line without corresponding ).

(cherry picked from commit c04d766942274da89b236c4cb7e954b26da397c7)

3 years agoopenmp: For C++ ensure nothing directive has no operands
Jakub Jelinek [Thu, 19 Aug 2021 10:03:03 +0000 (12:03 +0200)] 
openmp: For C++ ensure nothing directive has no operands

When working on error directive, I've noticed that while C FE diagnosed
clauses on nothing directive which doesn't allow any, the C++ FE silently
accepted it.

2021-08-19  Jakub Jelinek  <jakub@redhat.com>

* parser.c (cp_parser_omp_nothing): Use cp_parser_require_pragma_eol
instead of cp_parser_skip_to_pragma_eol.

* c-c++-common/gomp/nothing-2.c: New test.

(cherry picked from commit 4e6a5fa403782590088b2796261b023963f912af)

3 years agoFortran: Add OpenMP's nothing directive support (con't)
Tobias Burnus [Thu, 19 Aug 2021 10:02:17 +0000 (12:02 +0200)] 
Fortran: Add OpenMP's nothing directive support (con't)

Fix directory to enable -fopenmp processing.

gcc/testsuite/
PR testsuite/101963
* gfortran.dg/nothing-1.f90: Moved to ...
* gfortran.dg/gomp/nothing-1.f90: ... here.
* gfortran.dg/nothing-2.f90: Moved to ...
* gfortran.dg/gomp/nothing-2.f90: ... here;
avoid $ issue in $OMP in dg-error.

(cherry picked from commit f0fca213bc52644ba896da622b35842a6157bd98)

3 years agoFix up 'gcc.dg/pr78213.c' for '--enable-checking=release' etc.
Thomas Schwinge [Thu, 19 Aug 2021 06:25:47 +0000 (08:25 +0200)] 
Fix up 'gcc.dg/pr78213.c' for '--enable-checking=release' etc.

Fix up for r242748 (commit 3615816da830d41f67a5d8955ae588eba7f0b6fb)
"[PR target/78213] Do not ICE on non-empty -fself-test", as made
apparent by recent commit a42467bdb70650cd2f421e67b6c3418f74feaec2
"Restore 'gcc.dg/pr78213.c' testing", after the test case had gotten
disabled in r243681 (commit ecfc21ff34ddc6f8aa517251fb51494c68ff741f)
"Introduce selftest::locate_file" shortly after its original introduction.

gcc/testsuite/
PR testsuite/101969
* gcc.dg/pr78213.c: Fix up for '--enable-checking=release' etc.

(cherry picked from commit b7fc42073c04813f6b63e0641d3f6765424857c9)

3 years agoDaily bump.
GCC Administrator [Thu, 19 Aug 2021 00:18:33 +0000 (00:18 +0000)] 
Daily bump.

3 years agoarm: Fix pr69245.c testcase for reorder assembler architecture directives [PR101723]
Christophe Lyon [Fri, 6 Aug 2021 14:25:47 +0000 (14:25 +0000)] 
arm: Fix pr69245.c testcase for reorder assembler architecture directives [PR101723]

In gcc.target/arm/pr69245.c, to have a .fpu neon-vfpv4 directive, make
sure code for fn1() is emitted, by removing the static keyword.

Fix a typo in gcc.target/arm/pr69245.c, where \s should be \\s.

2021-08-06  Christophe Lyon  <christophe.lyon@foss.st.com>

gcc/testsuite/

PR target/101723
* gcc.target/arm/pr69245.c: Make sure to emit code for fn1, fix
typo.

(cherry picked from commit aff75af3b50f8c039ed6fbfa3f313ba45d44f6e6)

3 years agoarm: Fix typos for reorder assembler architecture directives [PR101723]
Christophe Lyon [Fri, 6 Aug 2021 14:06:44 +0000 (14:06 +0000)] 
arm: Fix typos for reorder assembler architecture directives [PR101723]

Two tests had typos preventing them from passing, committed as obvious.

2021-08-06  Christophe Lyon  <christophe.lyon@foss.st.com>

gcc/testsuite/
PR target/101723
* gcc.target/arm/attr-neon3.c: Fix typo.
* gcc.target/arm/pragma_fpu_attribute_2.c: Fix typo.

(cherry picked from commit a22b3e022c2b45047a28d901042888eb77620499)

3 years agoarm: reorder assembler architecture directives [PR101723]
Richard Earnshaw [Thu, 29 Jul 2021 10:00:31 +0000 (11:00 +0100)] 
arm: reorder assembler architecture directives [PR101723]

A change to the way gas interprets the .fpu directive in binutils-2.34
means that issuing .fpu will clear any features set by .arch_extension
that apply to the floating point or simd units.  This unfortunately
causes problems for more recent versions of the architecture because
we currently emit .arch, .arch_extension and .fpu directives at
different times and try to suppress redundant changes.

This change addresses this by firstly unifying all the places where we
emit these directives to a single block of code and secondly
(re)emitting all the directives if any changes have been made to the
target options.  Whilst this is slightly more than the strict minimum
it should be enough to catch all cases where a change could have
happened.  The new code also emits the directives in the order: .arch,
.fpu, .arch_extension.  This ensures that the additional architectural
extensions are not removed by a later .fpu directive.

Whilst writing this patch I also noticed that in the corner case where
the last function to be compiled had a non-standard set of
architecture flags, the assembler would add an incorrect set of
derived attributes for the file as a whole.  Instead of reflecting the
command-line options it would reflect the flags from the last file in
the function.  To address this I've also added a call to re-emit the
flags from the asm_file_end callback so the assembler will be in the
correct state when it finishes processing the intput.

There's some slight churn to the testsuite as a consequence of this,
because previously we had a hack to suppress emitting a .fpu directive
for one specific case, but with the new order this is no-longer
necessary.

gcc/ChangeLog:

PR target/101723
* config/arm/arm-cpus.in (generic-armv7-a): Add quirk to suppress
writing .cpu directive in asm output.
* config/arm/arm.c (arm_identify_fpu_from_isa): New variable.
(arm_last_printed_arch_string): Delete.
(arm_last-printed_fpu_string): Delete.
(arm_configure_build_target): If use of floating-point/SIMD is
disabled, remove all fp/simd related features from the target ISA.
(last_arm_targ_options): New variable.
(arm_print_asm_arch_directives): Add new parameters.  Change order
of emitted directives and handle all cases here.
(arm_file_start): Always call arm_print_asm_arch_directives, move
all generation of .arch/.arch_extension here.
(arm_file_end): Call arm_print_asm_arch.
(arm_declare_function_name): Call arm_print_asm_arch_directives
instead of printing .arch/.fpu directives directly.

gcc/testsuite/ChangeLog:

PR target/101723
* gcc.target/arm/cortex-m55-nofp-flag-hard.c: Update expected output.
* gcc.target/arm/cortex-m55-nofp-flag-softfp.c: Likewise.
* gcc.target/arm/cortex-m55-nofp-nomve-flag-softfp.c: Likewise.
* gcc.target/arm/mve/intrinsics/mve_fpu1.c: Convert to dg-do assemble.
Add a non-no-op function body.
* gcc.target/arm/mve/intrinsics/mve_fpu2.c: Likewise.
* gcc.target/arm/pr98636.c (dg-options): Add -mfloat-abi=softfp.
* gcc.target/arm/attr-neon.c: Tighten scan-assembler tests.
* gcc.target/arm/attr-neon2.c: Use -Ofast, convert test to use
check-function-bodies.
* gcc.target/arm/attr-neon3.c: Likewise.
* gcc.target/arm/pr69245.c: Tighten scan-assembler match, but allow
multiple instances.
* gcc.target/arm/pragma_fpu_attribute.c: Likewise.
* gcc.target/arm/pragma_fpu_attribute_2.c: Likewise.

(cherry picked from commit c1cdabe3aab817d95a8db00a8b5e9f6bcdea936f)

3 years agoarm: Don't reconfigure globals in arm_configure_build_target
Richard Earnshaw [Tue, 27 Jul 2021 14:44:57 +0000 (15:44 +0100)] 
arm: Don't reconfigure globals in arm_configure_build_target

arm_configure_build_target is usually used to reconfigure the
arm_active_target structure, which is then used to reconfigure a
number of other global variables describing the current target.
Occasionally, however, we need to use arm_configure_build_target to
construct a temporary target structure and in that case it is wrong to
try to reconfigure the global variables (although probably harmless,
since arm_option_reconfigure_globals() only looks at
arm_active_target).  At the very least, however, this is wasted work,
so it is best not to do it unless needed.  What's more, several
callers of arm_configure_build target call
arm_option_reconfigure_globals themselves within a few lines, making
the call from within arm_configure_build_target completely redundant.

So this patch moves the responsibility of calling of
arm_configure_build_target to its callers (only two places needed
updating).

gcc:
* config/arm/arm.c (arm_configure_build_target): Don't call
arm_option_reconfigure_globals.
(arm_option_restore): Call arm_option_reconfigure_globals after
reconfiguring the target.
* config/arm/arm-c.c (arm_pragma_target_parse): Likewise.
(cherry picked from commit 6a37d0331c25f23628d4308e5a75624005c223b2)

3 years agoarm: ensure the arch_name is always set for the build target
Richard Earnshaw [Mon, 26 Jul 2021 16:07:14 +0000 (17:07 +0100)] 
arm: ensure the arch_name is always set for the build target

This should never happen now if GCC is invoked by the driver, but in
the unusual case of calling cc1 (or its ilk) directly from the command
line the build target's arch_name string can remain NULL.  This can
complicate later processing meaning that we need to check for this
case explicitly in some circumstances.  Nothing should rely on this
behaviour, so it's simpler to always set the arch_name when
configuring the build target and be done with it.

gcc:

* config/arm/arm.c (arm_configure_build_target): Ensure the target's
arch_name is always set.

(cherry picked from commit 62e66c6a6cc52dc0e014141d369cff52757cd7ae)

3 years agoFortran: Add OpenMP's nothing directive support
Tobias Burnus [Wed, 18 Aug 2021 13:27:06 +0000 (15:27 +0200)] 
Fortran: Add OpenMP's nothing directive support

Fortran version of commit 5079b7781a2c506dcdfb241347d74c7891268225

gcc/fortran/ChangeLog:

* match.h (gfc_match_omp_nothing): New.
* openmp.c (gfc_match_omp_nothing): New.
* parse.c (decode_omp_directive): Match 'nothing' directive.

gcc/testsuite/ChangeLog:

* gfortran.dg/nothing-1.f90: New test.
* gfortran.dg/nothing-2.f90: New test.

(cherry picked from commit f74433e70ae94a3b5291e45fea488b1cfdee4a34)

3 years agoFortran/OpenMP: Add memory routines existing for C/C++
Tobias Burnus [Wed, 18 Aug 2021 09:21:35 +0000 (11:21 +0200)] 
Fortran/OpenMP: Add memory routines existing for C/C++

This patch adds the Fortran interface for omp_alloc/omp_free
and the omp_target_* memory routines, which were added in
OpenMP 5.0 for C/C++ but only OpenMP 5.1 added them for Fortran.

Those functions use BIND(C), i.e. on the libgomp side, the same
interface as for C/C++ is used.

Note: By using BIND(C) in omp_lib.h, files including this file
no longer compiler with -std=f95 but require at least -std=f2003.

libgomp/ChangeLog:

* omp_lib.f90.in (omp_alloc, omp_free, omp_target_alloc,
omp_target_free. omp_target_is_present, omp_target_memcpy,
omp_target_memcpy_rect, omp_target_associate_ptr,
omp_target_disassociate_ptr): Add interface.
* omp_lib.h.in (omp_alloc, omp_free, omp_target_alloc,
omp_target_free. omp_target_is_present, omp_target_memcpy,
omp_target_memcpy_rect, omp_target_associate_ptr,
omp_target_disassociate_ptr): Add interface.
* testsuite/libgomp.fortran/alloc-1.F90: Remove local
interface block for omp_alloc + omp_free.
* testsuite/libgomp.fortran/alloc-4.f90: Likewise.
* testsuite/libgomp.fortran/refcount-1.f90: New test.
* testsuite/libgomp.fortran/target-12.f90: New test.

(cherry picked from commit 76bb3c50dd43a5f87d4f949cf0d0979144562e6c)

3 years agoopenmp: Add nothing directive support
Jakub Jelinek [Wed, 18 Aug 2021 09:20:10 +0000 (11:20 +0200)] 
openmp: Add nothing directive support

As has been clarified, it is intentional that nothing directive is accepted
in substatements of selection and looping statements and after labels and
is handled as if the directive just isn't there, so that
void
foo (int x)
{
  if (x)
    #pragma omp metadirective when (...:nothing) when (...:parallel)
    bar ();
}
behaves consistently; declarative and stand-alone directives aren't allowed
at that point, but constructs are parsed with the following statement as
the construct body and nothing or missing default on metadirective therefore
should handle the following statement as part of the if substatement instead
of having nothing as the substatement and bar done unconditionally after the
if.

2021-08-18  Jakub Jelinek  <jakub@redhat.com>

gcc/c-family/
* c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_NOTHING.
* c-pragma.c (omp_pragmas): Add nothing directive.
* c-omp.c (omp_directives): Uncomment nothing directive entry.
gcc/c/
* c-parser.c (c_parser_omp_nothing): New function.
(c_parser_pragma): Handle PRAGMA_OMP_NOTHING.
gcc/cp/
* parser.c (cp_parser_omp_nothing): New function.
(cp_parser_pragma): Handle PRAGMA_OMP_NOTHING.
gcc/testsuite/
* c-c++-common/gomp/nothing-1.c: New test.
* g++.dg/gomp/attrs-1.C (bar): Add nothing directive test.
* g++.dg/gomp/attrs-2.C (bar): Likewise.
* g++.dg/gomp/attrs-9.C: Likewise.
libgomp/
* testsuite/libgomp.c-c++-common/nothing-1.c: New test.

(cherry picked from commit 5079b7781a2c506dcdfb241347d74c7891268225)

3 years agoopenmp: Actually ignore pragma_stmt pragmas for which c_parser_pragma returns false
Tobias Burnus [Wed, 18 Aug 2021 09:09:45 +0000 (11:09 +0200)] 
openmp: Actually ignore pragma_stmt pragmas for which c_parser_pragma returns false

Unlike the C++ FE, the C FE ignored pragmas (as if they weren't there) in
pragma_stmt contexts if c*_parser_pragma returns false only when after labels,
not inside of substatements of selection or loop statements.
After making just that change, several gomp/goacc testcases started failing,
because extra diagnostics has been emitted (in C, in C++ it was emitted
already before).  Say
void
foo (int x)
{
  if (x)
    #pragma omp barrier
}
used to in C emit just an error that the pragma is not allowed in such
contexts, but in C++ emitted both that and a parsing error that
  if (x)
}
is invalid.  So, the rest of this patch is mostly about returning true
after we report that that certain pragma is not allowed in pragma_stmt
contexts, because for error-recovery it seems better to treat the
pragma in that case as something that is the substatement of such if etc.
c*_parser_pragma return value is only ever used for pragma_stmt context,
in which false means act as if the pragma isn't there (e.g. has been handled
already by preprocessor etc.), and true which means it was there.

2021-08-18  Jakub Jelinek  <jakub@redhat.com>

gcc/c/
* c-parser.c (c_parser_statement_after_labels): Add restart label
near the start of the function.  If c_parser_pragma returns false,
goto restart.
(c_parser_pragma): For PRAGMA_OMP_CANCELLATION_POINT return what
c_parser_omp_cancellation_point returned.  For PRAGMA_OMP_DECLARE
return what c_parser_omp_declare returned.  Return true instead of
false after emitting errors that the directive is not allowed in
pragma_stmt context.
(c_parser_omp_ordered): Return true instead of
false after emitting errors that the directive is not allowed in
pragma_stmt context.
(c_parser_omp_target_update): Likewise.
(c_parser_omp_target_enter_data, c_parser_omp_target_exit_data):
Change return type from tree to bool, return false if the
directive should be ignored in pragma_stmt contexts.
(c_parser_omp_target): Adjust callers of c_parser_omp_target_*_data,
return their result directly.
(c_parser_omp_cancellation_point): Change return type from void to
bool, return false if the directive should be ignored in pragma_stmt
contexts.
(c_parser_omp_declare): Likewise.
gcc/cp/
* parser.c (cp_parser_omp_ordered): Return true instead of
false after emitting errors that the directive is not allowed in
pragma_stmt context.
(cp_parser_omp_target_update): Likewise.
(cp_parser_omp_cancellation_point): Change return type from void to
bool, return false if the directive should be ignored in pragma_stmt
contexts.
(cp_parser_omp_target_enter_data, cp_parser_omp_target_exit_data):
Change return type from tree to bool, return false if the
directive should be ignored in pragma_stmt contexts.
(cp_parser_omp_target): Adjust callers of cp_parser_omp_target_*_data,
return their result directly.
(cp_parser_pragma): For PRAGMA_OMP_CANCELLATION_POINT return what
cp_parser_omp_cancellation_point returned.  Return true instead of
false after emitting errors that the directive is not allowed in
pragma_stmt context.
gcc/testsuite/
* c-c++-common/gomp/pr63326.c: Don't expect extra "before" errors
in C++.
* g++.dg/gomp/attrs-7.C: Don't expect one extra error.
* g++.dg/gomp/barrier-2.C: Likewise.
* gcc.dg/gomp/declare-simd-5.c: Likewise.
* gcc.dg/gomp/barrier-2.c: Likewise.
* gcc.dg/gomp/declare-variant-2.c: Likewise.

(cherry picked from commit 1bf976a5de69ecd9b1e10eb7515357b98e78faf7)

3 years agoDaily bump.
GCC Administrator [Wed, 18 Aug 2021 00:18:30 +0000 (00:18 +0000)] 
Daily bump.

3 years agolibstdc++: Avoid illegal argument to verbose in dg-test callback, continued
Thomas Schwinge [Tue, 17 Aug 2021 15:58:30 +0000 (17:58 +0200)] 
libstdc++: Avoid illegal argument to verbose in dg-test callback, continued

This is a follow-up to commit 697b94cfaef4a958132faf0cf4b35b15dfb29acc
"libstdc++: Avoid illegal argument to verbose in dg-test callback".
I'm confirming the original problem, but on one system, it's not
resolved by this change, because instead we get:

    extra_tool_flags are:
    ERROR: tcl error sourcing [...]/libstdc++-v3/testsuite/libstdc++-dg/conformance.exp.
    ERROR: usage: send [args] string
        while executing
    "send_log "$message\n""
        (procedure "verbose" line 48)
        invoked from within
    "verbose -log -- $extra_tool_flags"
        (procedure "libstdc++-dg-test" line 45)
        invoked from within
    "${tool}-dg-test $prog [lindex ${dg-do-what} 0] "$tool_flags ${dg-extra-tool-flags}""
        (procedure "saved-dg-test" line 115)
        invoked from within
    [...]

That's Ubuntu's dejagnu 1.5-3ubuntu1 being so old that it doesn't include
DejaGnu commit 57c22601afe43d2c2b8819df4f2ecacb034516fd "Protect from leading
dash in message".  (I suppose that's what'd make this work, but have not
verified.)

libstdc++-v3/
* testsuite/lib/libstdc++.exp: Avoid illegal argument to verbose,
continued.

(cherry picked from commit 60b94d8bd2280837e980a53cf81bdf902d726e61)

3 years agoRestore 'gcc.dg/pr78213.c' testing
Thomas Schwinge [Tue, 17 Aug 2021 06:45:18 +0000 (08:45 +0200)] 
Restore 'gcc.dg/pr78213.c' testing

... after it had gotten disabled in r243681 (Git
commit ecfc21ff34ddc6f8aa517251fb51494c68ff741f)
"Introduce selftest::locate_file".

gcc/testsuite/
* gcc.dg/pr78213.c: Restore testing.

(cherry picked from commit a42467bdb70650cd2f421e67b6c3418f74feaec2)

3 years agoFortran: Implement OpenMP 5.1 scope construct
Tobias Burnus [Tue, 17 Aug 2021 13:56:41 +0000 (15:56 +0200)] 
Fortran: Implement OpenMP 5.1 scope construct

Fortran version to commit e45483c7c4badc4bf2d6ced22360ce1ab172967f,
which implemented OpenMP's scope construct for C and C++.
Most testcases are based on the C testcases; it also contains some
testcases which existed previously but had no Fortran equivalent.

gcc/fortran/ChangeLog:

* dump-parse-tree.c (show_omp_node, show_code_node): Handle
EXEC_OMP_SCOPE.
* gfortran.h (enum gfc_statement): Add ST_OMP_(END_)SCOPE.
(enum gfc_exec_op): Add EXEC_OMP_SCOPE.
* match.h (gfc_match_omp_scope): New.
* openmp.c (OMP_SCOPE_CLAUSES): Define
(gfc_match_omp_scope): New.
(gfc_match_omp_cancellation_point, gfc_match_omp_end_nowait):
Improve error diagnostic.
(omp_code_to_statement): Handle ST_OMP_SCOPE.
(gfc_resolve_omp_directive): Handle EXEC_OMP_SCOPE.
* parse.c (decode_omp_directive, next_statement,
gfc_ascii_statement, parse_omp_structured_block,
parse_executable): Handle OpenMP's scope construct.
* resolve.c (gfc_resolve_blocks): Likewise
* st.c (gfc_free_statement): Likewise
* trans-openmp.c (gfc_trans_omp_scope): New.
(gfc_trans_omp_directive): Call it.
* trans.c (trans_code): handle EXEC_OMP_SCOPE.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/scope-1.f90: New test.
* testsuite/libgomp.fortran/task-reduction-16.f90: New test.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/scan-1.f90:
* gfortran.dg/gomp/cancel-1.f90: New test.
* gfortran.dg/gomp/cancel-4.f90: New test.
* gfortran.dg/gomp/loop-4.f90: New test.
* gfortran.dg/gomp/nesting-1.f90: New test.
* gfortran.dg/gomp/nesting-2.f90: New test.
* gfortran.dg/gomp/nesting-3.f90: New test.
* gfortran.dg/gomp/nowait-1.f90: New test.
* gfortran.dg/gomp/reduction-task-1.f90: New test.
* gfortran.dg/gomp/reduction-task-2.f90: New test.
* gfortran.dg/gomp/reduction-task-2a.f90: New test.
* gfortran.dg/gomp/reduction-task-3.f90: New test.
* gfortran.dg/gomp/scope-1.f90: New test.
* gfortran.dg/gomp/scope-2.f90: New test.

(cherry picked from commit f8d535f3fec81c1cc84e22df5500e693544ec65b)

3 years agoopenmp: Implement OpenMP 5.1 scope construct
Jakub Jelinek [Tue, 17 Aug 2021 13:44:56 +0000 (15:44 +0200)] 
openmp: Implement OpenMP 5.1 scope construct

This patch implements the OpenMP 5.1 scope construct, which is similar
to worksharing constructs in many regards, but isn't one of them.
The body of the construct is encountered by all threads though, it can
be nested in itself or intermixed with taskgroup and worksharing etc.
constructs can appear inside of it (but it can't be nested in
worksharing etc. constructs).  The main purpose of the construct
is to allow reductions (normal and task ones) without the need to
close the parallel and reopen another one.

If it doesn't have task reductions, it can be implemented without
any new library support, with nowait it just does the privatizations
at the start if any and reductions before the end of the body, with
without nowait emits a normal GOMP_barrier{,_cancel} at the end too.

For task reductions, we need to ensure only one thread initializes
the task reduction library data structures and other threads copy from that,
so a new GOMP_scope_start routine is added to the library for that.
It acts as if the start of the scope construct is a nowait worksharing
construct (that is ok, it can't be nested in other worksharing
constructs and all threads need to encounter the start in the same
order) which does the task reduction initialization, but as the body
can have other scope constructs and/or worksharing constructs, that is
all where we use this dummy worksharing construct.  With task reductions,
the construct must not have nowait and ends with a GOMP_barrier{,_cancel},
followed by task reductions followed by GOMP_workshare_task_reduction_unregister.

Only C/C++ FE support is done.

2021-08-17  Jakub Jelinek  <jakub@redhat.com>

gcc/
* tree.def (OMP_SCOPE): New tree code.
* tree.h (OMP_SCOPE_BODY, OMP_SCOPE_CLAUSES): Define.
* tree-nested.c (convert_nonlocal_reference_stmt,
convert_local_reference_stmt, convert_gimple_call): Handle
GIMPLE_OMP_SCOPE.
* tree-pretty-print.c (dump_generic_node): Handle OMP_SCOPE.
* gimple.def (GIMPLE_OMP_SCOPE): New gimple code.
* gimple.c (gimple_build_omp_scope): New function.
(gimple_copy): Handle GIMPLE_OMP_SCOPE.
* gimple.h (gimple_build_omp_scope): Declare.
(gimple_has_substatements): Handle GIMPLE_OMP_SCOPE.
(gimple_omp_scope_clauses, gimple_omp_scope_clauses_ptr,
gimple_omp_scope_set_clauses): New inline functions.
(CASE_GIMPLE_OMP): Add GIMPLE_OMP_SCOPE.
* gimple-pretty-print.c (dump_gimple_omp_scope): New function.
(pp_gimple_stmt_1): Handle GIMPLE_OMP_SCOPE.
* gimple-walk.c (walk_gimple_stmt): Likewise.
* gimple-low.c (lower_stmt): Likewise.
* gimplify.c (is_gimple_stmt): Handle OMP_MASTER.
(gimplify_scan_omp_clauses): For task reductions, handle OMP_SCOPE
like ORT_WORKSHARE constructs.  Adjust diagnostics for %<scope%>
allowing task reductions.  Reject inscan reductions on scope.
(omp_find_stores_stmt): Handle GIMPLE_OMP_SCOPE.
(gimplify_omp_workshare, gimplify_expr): Handle OMP_SCOPE.
* tree-inline.c (remap_gimple_stmt): Handle GIMPLE_OMP_SCOPE.
(estimate_num_insns): Likewise.
* omp-low.c (build_outer_var_ref): Look through GIMPLE_OMP_SCOPE
contexts if var isn't privatized there.
(check_omp_nesting_restrictions): Handle GIMPLE_OMP_SCOPE.
(scan_omp_1_stmt): Likewise.
(maybe_add_implicit_barrier_cancel): Look through outer
scope constructs.
(lower_omp_scope): New function.
(lower_omp_task_reductions): Handle OMP_SCOPE.
(lower_omp_1): Handle GIMPLE_OMP_SCOPE.
(diagnose_sb_1, diagnose_sb_2): Likewise.
* omp-expand.c (expand_omp_single): Support also GIMPLE_OMP_SCOPE.
(expand_omp): Handle GIMPLE_OMP_SCOPE.
(omp_make_gimple_edges): Likewise.
* omp-builtins.def (BUILT_IN_GOMP_SCOPE_START): New built-in.
gcc/c-family/
* c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_SCOPE.
* c-pragma.c (omp_pragmas): Add scope construct.
* c-omp.c (omp_directives): Uncomment scope directive entry.
gcc/c/
* c-parser.c (OMP_SCOPE_CLAUSE_MASK): Define.
(c_parser_omp_scope): New function.
(c_parser_omp_construct): Handle PRAGMA_OMP_SCOPE.
gcc/cp/
* parser.c (OMP_SCOPE_CLAUSE_MASK): Define.
(cp_parser_omp_scope): New function.
(cp_parser_omp_construct, cp_parser_pragma): Handle PRAGMA_OMP_SCOPE.
* pt.c (tsubst_expr): Handle OMP_SCOPE.
gcc/testsuite/
* c-c++-common/gomp/nesting-2.c (foo): Add scope and masked
construct tests.
* c-c++-common/gomp/scan-1.c (f3): Add scope construct test..
* c-c++-common/gomp/cancel-1.c (f2): Add scope and masked
construct tests.
* c-c++-common/gomp/reduction-task-2.c (bar): Add scope construct
test.  Adjust diagnostics for the addition of scope.
* c-c++-common/gomp/loop-1.c (f5): Add master, masked and scope
construct tests.
* c-c++-common/gomp/clause-dups-1.c (f1): Add scope construct test.
* gcc.dg/gomp/nesting-1.c (f1, f2, f3): Add scope construct tests.
* c-c++-common/gomp/scope-1.c: New test.
* c-c++-common/gomp/scope-2.c: New test.
* g++.dg/gomp/attrs-1.C (bar): Add scope construct tests.
* g++.dg/gomp/attrs-2.C (bar): Likewise.
* gfortran.dg/gomp/reduction4.f90: Adjust expected diagnostics.
* gfortran.dg/gomp/reduction7.f90: Likewise.
libgomp/
* Makefile.am (libgomp_la_SOURCES): Add scope.c
* Makefile.in: Regenerated.
* libgomp_g.h (GOMP_scope_start): Declare.
* libgomp.map: Add GOMP_scope_start@@GOMP_5.1.
* scope.c: New file.
* testsuite/libgomp.c-c++-common/scope-1.c: New test.
* testsuite/libgomp.c-c++-common/task-reduction-16.c: New test.

(cherry picked from commit e45483c7c4badc4bf2d6ced22360ce1ab172967f)

3 years agotree-optimization/101868 - avoid PRE of trapping mems across calls
Richard Biener [Tue, 17 Aug 2021 06:38:35 +0000 (08:38 +0200)] 
tree-optimization/101868 - avoid PRE of trapping mems across calls

This backports a fix for the omission of a check of trapping mems
when hoisting them across calls that might not return.  This was
originally done as part of a fix to handle const functions that throw
properly.

2021-08-17  Richard Biener  <rguenther@suse.de>

PR tree-optimization/101373
PR tree-optimization/101868
* tree-ssa-pre.c (prune_clobbered_mems): Also prune trapping
references when the BB may not return.

* gcc.dg/lto/pr101868_0.c: New testcase.
* gcc.dg/lto/pr101868_1.c: Likewise.
* gcc.dg/lto/pr101868_2.c: Likewise.
* gcc.dg/lto/pr101868_3.c: Likewise.

3 years agoDaily bump.
GCC Administrator [Tue, 17 Aug 2021 00:18:10 +0000 (00:18 +0000)] 
Daily bump.

3 years agoFortran: fix checks for STAT= and ERRMSG= arguments of SYNC ALL/SYNC IMAGES
Harald Anlauf [Sun, 15 Aug 2021 18:13:11 +0000 (20:13 +0200)] 
Fortran: fix checks for STAT= and ERRMSG= arguments of SYNC ALL/SYNC IMAGES

gcc/fortran/ChangeLog:

PR fortran/99351
* match.c (sync_statement): Replace %v code by %e in gfc_match to
allow for function references as STAT and ERRMSG arguments.
* resolve.c (resolve_sync): Adjust checks of STAT= and ERRMSG= to
being definable arguments.  Function references with a data
pointer result are accepted.
* trans-stmt.c (gfc_trans_sync): Adjust assertion.

gcc/testsuite/ChangeLog:

PR fortran/99351
* gfortran.dg/coarray_sync.f90: New test.
* gfortran.dg/coarray_3.f90: Adjust error messages.

(cherry picked from commit bbf19f9c20515da9fcd23f08c8139427374e8d77)

3 years agoUpdate cpplib de.po
Joseph Myers [Mon, 16 Aug 2021 19:17:50 +0000 (19:17 +0000)] 
Update cpplib de.po

* de.po: Update.

3 years agoFix regression in debug info for Ada with DWARF 5
Eric Botcazou [Mon, 16 Aug 2021 13:26:22 +0000 (15:26 +0200)] 
Fix regression in debug info for Ada with DWARF 5

add_scalar_info can directly generate a reference to an existing DIE for a
scalar attribute, e.g the upper bound of a VLA, but it does so only if this
existing DIE has a location or is a constant:

              if (get_AT (decl_die, DW_AT_location)
                  || get_AT (decl_die, DW_AT_data_member_location)
                  || get_AT (decl_die, DW_AT_const_value))

Now, in DWARF 5, members of a structure that are bitfields no longer have a
DW_AT_data_member_location but a DW_AT_data_bit_offset attribute instead, so
the condition is bypassed.

gcc/
* dwarf2out.c (add_scalar_info): Deal with DW_AT_data_bit_offset.

3 years ago[OpenMP] Update omp-low.c's omp_runtime_api_call [PR101931]
Tobias Burnus [Mon, 16 Aug 2021 12:00:13 +0000 (14:00 +0200)] 
[OpenMP] Update omp-low.c's omp_runtime_api_call [PR101931]

gcc/ChangeLog:

PR middle-end/101931
* omp-low.c (omp_runtime_api_call): Update for routines
added in the meanwhile.

(cherry picked from commit e660441f94f2ca2ca1bd63c922c6a43737c2259e)

3 years agoMerge remote-tracking branch 'origin/releases/gcc-11' into devel/omp/gcc-11
Tobias Burnus [Mon, 16 Aug 2021 11:58:12 +0000 (13:58 +0200)] 
Merge remote-tracking branch 'origin/releases/gcc-11' into devel/omp/gcc-11

Merge up to 64336a85c96ef91f863bd8e86aa5002c3c69f386 (Aug 16, 2021)

3 years agoFortran/OpenMP: Add support for OpenMP 5.1 masked construct
Tobias Burnus [Mon, 16 Aug 2021 11:54:05 +0000 (13:54 +0200)] 
Fortran/OpenMP: Add support for OpenMP 5.1 masked construct

Commit r12-2891-gd0befed793b94f3f407be44e6f69f81a02f5f073 added C/C++
support for the masked construct. This patch extends it to
Fortran.

gcc/fortran/ChangeLog:

* dump-parse-tree.c (show_omp_clauses): Handle 'filter' clause.
(show_omp_node, show_code_node): Handle (combined) omp masked construct.
* frontend-passes.c (gfc_code_walker): Likewise.
* gfortran.h (enum gfc_statement): Add ST_OMP_*_MASKED*.
(enum gfc_exec_op): Add EXEC_OMP_*_MASKED*.
* match.h (gfc_match_omp_masked, gfc_match_omp_masked_taskloop,
gfc_match_omp_masked_taskloop_simd, gfc_match_omp_parallel_masked,
gfc_match_omp_parallel_masked_taskloop,
gfc_match_omp_parallel_masked_taskloop_simd): New prototypes.
* openmp.c (enum omp_mask1): Add OMP_CLAUSE_FILTER.
(gfc_match_omp_clauses): Match it.
(OMP_MASKED_CLAUSES, gfc_match_omp_parallel_masked,
gfc_match_omp_parallel_masked_taskloop,
gfc_match_omp_parallel_masked_taskloop_simd,
gfc_match_omp_masked, gfc_match_omp_masked_taskloop,
gfc_match_omp_masked_taskloop_simd): New.
(resolve_omp_clauses): Resolve filter clause.
(gfc_resolve_omp_parallel_blocks, resolve_omp_do,
omp_code_to_statement, gfc_resolve_omp_directive): Handle
omp masked constructs.
* parse.c (decode_omp_directive, case_exec_markers,
gfc_ascii_statement, parse_omp_do, parse_omp_structured_block,
parse_executable): Likewise.
* resolve.c (gfc_resolve_blocks, gfc_resolve_code): Likewise.
* st.c (gfc_free_statement): Likewise.
* trans-openmp.c (gfc_trans_omp_clauses): Handle filter clause.
(GFC_OMP_SPLIT_MASKED, GFC_OMP_MASK_MASKED): New enum values.
(gfc_trans_omp_masked): New.
(gfc_split_omp_clauses): Handle combined masked directives.
(gfc_trans_omp_master_taskloop): Rename to ...
(gfc_trans_omp_master_masked_taskloop): ... this; handle also
combined masked directives.
(gfc_trans_omp_parallel_master): Rename to ...
(gfc_trans_omp_parallel_master_masked): ... this; handle
combined masked directives.
(gfc_trans_omp_directive): Handle EXEC_OMP_*_MASKED*.
* trans.c (trans_code): Likewise.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/masked-1.f90: New test.

gcc/testsuite/ChangeLog:

* gfortran.dg/gomp/masked-1.f90: New test.
* gfortran.dg/gomp/masked-2.f90: New test.
* gfortran.dg/gomp/masked-3.f90: New test.
* gfortran.dg/gomp/masked-combined-1.f90: New test.
* gfortran.dg/gomp/masked-combined-2.f90: New test.

(cherry picked from commit 53d5b59cb3b417ab8293702aacc75a9bbb3ead78)

3 years agoipa: ICF should check SSA_NAME_IS_DEFAULT_DEF
Martin Liska [Fri, 13 Aug 2021 10:35:47 +0000 (12:35 +0200)] 
ipa: ICF should check SSA_NAME_IS_DEFAULT_DEF

PR ipa/100600

gcc/ChangeLog:

* ipa-icf-gimple.c (func_checker::compare_ssa_name): Do not
  consider equal SSA_NAMEs when one is a param.

gcc/testsuite/ChangeLog:

* gcc.dg/ipa/pr100600.c: New test.

3 years agoipa: do not make localaliases for target_clones [PR101261]
Martin Liska [Fri, 13 Aug 2021 09:10:56 +0000 (11:10 +0200)] 
ipa: do not make localaliases for target_clones [PR101261]

PR ipa/101261

gcc/ChangeLog:

* symtab.c (symtab_node::noninterposable_alias): Do not create
  local aliases for target_clone functions as the clonning pass
  rejects aliases.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr101261.c: New test.

3 years agoipa: make target_clone default decl local [PR101726]
Martin Liska [Thu, 12 Aug 2021 14:01:01 +0000 (16:01 +0200)] 
ipa: make target_clone default decl local [PR101726]

PR ipa/101726

gcc/ChangeLog:

* multiple_target.c (create_dispatcher_calls): Make default
  function local only if it is a definition.

3 years agoLTO: bump minor version
Martin Liska [Mon, 16 Aug 2021 11:02:54 +0000 (13:02 +0200)] 
LTO: bump minor version

Bump the LTO_minor_version due to changes in 52f0aa4dee8401ef3958dbf789780b0ee877beab

PR c/100150

gcc/ChangeLog:

* lto-streamer.h (LTO_minor_version): Bump.

3 years agoopenmp: Add support for OpenMP 5.1 masked construct
Jakub Jelinek [Mon, 16 Aug 2021 10:35:25 +0000 (12:35 +0200)] 
openmp: Add support for OpenMP 5.1 masked construct

This construct has been introduced as a replacement for master
construct, but unlike that construct is slightly more general,
has an optional clause which allows to choose which thread
will be the one running the region, it can be some other thread
than the master (primary) thread with number 0, or it could be no
threads or multiple threads (then of course one needs to be careful
about data races).

It is way too early to deprecate the master construct though, we don't
even have OpenMP 5.0 fully implemented, it has been deprecated in 5.1,
will be also in 5.2 and removed in 6.0.  But even then it will likely
be a good idea to just -Wdeprecated warn about it and still accept it.

The patch also contains something I should have done much earlier,
for clauses that accept some integral expression where we only care
about the value, forces during gimplification that value into
either a min invariant (as before), SSA_NAME or a fresh temporary,
but never e.g. a user VAR_DECL, so that for those clauses we don't
need to worry about adjusting it.

2021-08-12  Jakub Jelinek  <jakub@redhat.com>

gcc/
* tree.def (OMP_MASKED): New tree code.
* tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_FILTER.
* tree.h (OMP_MASKED_BODY, OMP_MASKED_CLAUSES, OMP_MASKED_COMBINED,
OMP_CLAUSE_FILTER_EXPR): Define.
* tree.c (omp_clause_num_ops): Add OMP_CLAUSE_FILTER entry.
(omp_clause_code_name): Likewise.
(walk_tree_1): Handle OMP_CLAUSE_FILTER.
* tree-nested.c (convert_nonlocal_omp_clauses,
convert_local_omp_clauses): Handle OMP_CLAUSE_FILTER.
(convert_nonlocal_reference_stmt, convert_local_reference_stmt,
convert_gimple_call): Handle GIMPLE_OMP_MASTER.
* tree-pretty-print.c (dump_omp_clause): Handle OMP_CLAUSE_FILTER.
(dump_generic_node): Handle OMP_MASTER.
* gimple.def (GIMPLE_OMP_MASKED): New gimple code.
* gimple.c (gimple_build_omp_masked): New function.
(gimple_copy): Handle GIMPLE_OMP_MASKED.
* gimple.h (gimple_build_omp_masked): Declare.
(gimple_has_substatements): Handle GIMPLE_OMP_MASKED.
(gimple_omp_masked_clauses, gimple_omp_masked_clauses_ptr,
gimple_omp_masked_set_clauses): New inline functions.
(CASE_GIMPLE_OMP): Add GIMPLE_OMP_MASKED.
* gimple-pretty-print.c (dump_gimple_omp_masked): New function.
(pp_gimple_stmt_1): Handle GIMPLE_OMP_MASKED.
* gimple-walk.c (walk_gimple_stmt): Likewise.
* gimple-low.c (lower_stmt): Likewise.
* gimplify.c (is_gimple_stmt): Handle OMP_MASTER.
(gimplify_scan_omp_clauses): Handle OMP_CLAUSE_FILTER.  For clauses
that take one expression rather than decl or constant, force
gimplification of that into a SSA_NAME or temporary unless min
invariant.
(gimplify_adjust_omp_clauses): Handle OMP_CLAUSE_FILTER.
(gimplify_expr): Handle OMP_MASKED.
* tree-inline.c (remap_gimple_stmt): Handle GIMPLE_OMP_MASKED.
(estimate_num_insns): Likewise.
* omp-low.c (scan_sharing_clauses): Handle OMP_CLAUSE_FILTER.
(check_omp_nesting_restrictions): Handle GIMPLE_OMP_MASKED.  Adjust
diagnostics for existence of masked construct.
(scan_omp_1_stmt, lower_omp_master, lower_omp_1, diagnose_sb_1,
diagnose_sb_2): Handle GIMPLE_OMP_MASKED.
* omp-expand.c (expand_omp_synch, expand_omp, omp_make_gimple_edges):
Likewise.
gcc/c-family/
* c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_MASKED.
(enum pragma_omp_clause): Add PRAGMA_OMP_CLAUSE_FILTER.
* c-pragma.c (omp_pragmas_simd): Add masked construct.
* c-common.h (enum c_omp_clause_split): Add C_OMP_CLAUSE_SPLIT_MASKED
enumerator.
(c_finish_omp_masked): Declare.
* c-omp.c (c_finish_omp_masked): New function.
(c_omp_split_clauses): Handle combined masked constructs.
gcc/c/
* c-parser.c (c_parser_omp_clause_name): Parse filter clause name.
(c_parser_omp_clause_filter): New function.
(c_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_FILTER.
(OMP_MASKED_CLAUSE_MASK): Define.
(c_parser_omp_masked): New function.
(c_parser_omp_parallel): Handle parallel masked.
(c_parser_omp_construct): Handle PRAGMA_OMP_MASKED.
* c-typeck.c (c_finish_omp_clauses): Handle OMP_CLAUSE_FILTER.
gcc/cp/
* parser.c (cp_parser_omp_clause_name): Parse filter clause name.
(cp_parser_omp_clause_filter): New function.
(cp_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_FILTER.
(OMP_MASKED_CLAUSE_MASK): Define.
(cp_parser_omp_masked): New function.
(cp_parser_omp_parallel): Handle parallel masked.
(cp_parser_omp_construct, cp_parser_pragma): Handle PRAGMA_OMP_MASKED.
* semantics.c (finish_omp_clauses): Handle OMP_CLAUSE_FILTER.
* pt.c (tsubst_omp_clauses): Likewise.
(tsubst_expr): Handle OMP_MASKED.
gcc/testsuite/
* c-c++-common/gomp/clauses-1.c (bar): Add tests for combined masked
constructs with clauses.
* c-c++-common/gomp/clauses-5.c (foo): Add testcase for filter clause.
* c-c++-common/gomp/clause-dups-1.c (f1): Likewise.
* c-c++-common/gomp/masked-1.c: New test.
* c-c++-common/gomp/masked-2.c: New test.
* c-c++-common/gomp/masked-combined-1.c: New test.
* c-c++-common/gomp/masked-combined-2.c: New test.
* c-c++-common/goacc/uninit-if-clause.c: Remove xfails.
* g++.dg/gomp/block-11.C: New test.
* g++.dg/gomp/tpl-masked-1.C: New test.
* g++.dg/gomp/attrs-1.C (bar): Add tests for masked construct and
combined masked constructs with clauses in attribute syntax.
* g++.dg/gomp/attrs-2.C (bar): Likewise.
* gcc.dg/gomp/nesting-1.c (f1, f2): Add tests for masked construct
nesting.
* gfortran.dg/goacc/host_data-tree.f95: Allow also SSA_NAMEs in if
clause.
* gfortran.dg/goacc/kernels-tree.f95: Likewise.
libgomp/
* testsuite/libgomp.c-c++-common/masked-1.c: New test.

(cherry picked from commit d0befed793b94f3f407be44e6f69f81a02f5f073)

3 years agoOpenMP 5.1: Add proc-bind 'primary' support
Tobias Burnus [Mon, 16 Aug 2021 07:05:02 +0000 (09:05 +0200)] 
OpenMP 5.1: Add proc-bind 'primary' support

In OpenMP 5.1 "master thread" was changed to "primary thread" and
the proc_bind clause and the OMP_PROC_BIND environment variable
now take 'primary' as argument as alias for 'master', while the
latter is deprecated.
This commit accepts 'primary' and adds the named constant
omp_proc_bind_primary and changes 'master thread' in the
documentation; however, given that not even OpenMP 5.0 is
fully supported, omp_display_env and the dumps currently
still output 'master' and there is no deprecation warning
when using the 'master' in the proc_bind clause.

gcc/c/ChangeLog:

* c-parser.c (c_parser_omp_clause_proc_bind): Accept
'primary' as alias for 'master'.

gcc/cp/ChangeLog:

* parser.c (cp_parser_omp_clause_proc_bind): Accept
'primary' as alias for 'master'.

gcc/fortran/ChangeLog:

* gfortran.h (gfc_omp_proc_bind_kind): Add OMP_PROC_BIND_PRIMARY.
* dump-parse-tree.c (show_omp_clauses): Add TODO comment to
change 'master' to 'primary' in proc_bind for OpenMP 5.1.
* intrinsic.texi (OMP_LIB): Mention OpenMP 5.1; add
omp_proc_bind_primary.
* openmp.c (gfc_match_omp_clauses): Accept
'primary' as alias for 'master'.
* trans-openmp.c (gfc_trans_omp_clauses): Handle
OMP_PROC_BIND_PRIMARY.

gcc/ChangeLog:

* tree-core.h (omp_clause_proc_bind_kind): Add
OMP_CLAUSE_PROC_BIND_PRIMARY.
* tree-pretty-print.c (dump_omp_clause): Add TODO comment to
change 'master' to 'primary' in proc_bind for OpenMP 5.1.

libgomp/ChangeLog:

* env.c (parse_bind_var): Accept 'primary' as alias for
'master'.
(omp_display_env): Add TODO comment to
change 'master' to 'primary' in proc_bind for OpenMP 5.1.
* libgomp.texi: Change 'master thread' to 'primary thread'
in line with OpenMP 5.1.
(omp_get_proc_bind): Add omp_proc_bind_primary and note that
omp_proc_bind_master is an alias of it.
(OMP_PROC_BIND): Mention 'PRIMARY'.
* omp.h.in (__GOMP_DEPRECATED_5_1): Define.
(omp_proc_bind_primary): Add.
(omp_proc_bind_master): Deprecate for OpenMP 5.1.
* omp_lib.f90.in (omp_proc_bind_primary): Add.
(omp_proc_bind_master): Deprecate for OpenMP 5.1.
* omp_lib.h.in (omp_proc_bind_primary): Add.
* testsuite/libgomp.c/affinity-1.c: Check that
'primary' works and is identical to 'master'.

gcc/testsuite/ChangeLog:

* c-c++-common/gomp/pr61486-2.c: Duplicate one proc_bind(master)
testcase and test proc_bind(primary) instead.
* gfortran.dg/gomp/affinity-1.f90: Likewise.

(cherry picked from commit 432de08498142d2266c0fb05f2c555a7f1e10ddd)

3 years agoDaily bump.
GCC Administrator [Mon, 16 Aug 2021 00:18:19 +0000 (00:18 +0000)] 
Daily bump.

3 years agoDaily bump.
GCC Administrator [Sun, 15 Aug 2021 00:18:14 +0000 (00:18 +0000)] 
Daily bump.

3 years agoDaily bump.
GCC Administrator [Sat, 14 Aug 2021 00:18:04 +0000 (00:18 +0000)] 
Daily bump.

3 years agocoverage: handle function beginning
Martin Liska [Tue, 1 Jun 2021 13:13:18 +0000 (15:13 +0200)] 
coverage: handle function beginning

PR gcov-profile/100788

gcc/ChangeLog:

* coverage.c (coverage_begin_function): Update function
  beginning when #line macro is used.

gcc/testsuite/ChangeLog:

* gcc.dg/pr100788.c: New test.

3 years agoDaily bump.
GCC Administrator [Fri, 13 Aug 2021 00:18:24 +0000 (00:18 +0000)] 
Daily bump.

3 years agolibcpp: Fix ICE with -Wtraditional preprocessing [PR101638]
Jakub Jelinek [Thu, 12 Aug 2021 20:38:18 +0000 (22:38 +0200)] 
libcpp: Fix ICE with -Wtraditional preprocessing [PR101638]

The following testcase ICEs in cpp_sys_macro_p, because cpp_sys_macro_p
is called for a builtin macro which doesn't use node->value.macro union
member but a different one and so dereferencing it ICEs.
As the testcase is distilled from contemporary glibc headers, it means
basically -Wtraditional now ICEs on almost everything.

The fix can be either the patch below, return true for builtin macros,
or we could instead return false for builtin macros, or the fix could
be also (untested):
--- libcpp/expr.c       2021-05-07 10:34:46.345122608 +0200
+++ libcpp/expr.c       2021-08-12 09:54:01.837556365 +0200
@@ -783,13 +783,13 @@ cpp_classify_number (cpp_reader *pfile,

       /* Traditional C only accepted the 'L' suffix.
          Suppress warning about 'LL' with -Wno-long-long.  */
-      if (CPP_WTRADITIONAL (pfile) && ! cpp_sys_macro_p (pfile))
+      if (CPP_WTRADITIONAL (pfile))
        {
          int u_or_i = (result & (CPP_N_UNSIGNED|CPP_N_IMAGINARY));
          int large = (result & CPP_N_WIDTH) == CPP_N_LARGE
                       && CPP_OPTION (pfile, cpp_warn_long_long);

-         if (u_or_i || large)
+         if ((u_or_i || large) && ! cpp_sys_macro_p (pfile))
            cpp_warning_with_line (pfile, large ? CPP_W_LONG_LONG : CPP_W_TRADITIONAL,
                                   virtual_location, 0,
                                   "traditional C rejects the \"%.*s\" suffix",
The builtin macros at least currently don't add any suffixes
or numbers -Wtraditional would like to warn about.  For floating
point suffixes, -Wtraditional calls cpp_sys_macro_p only right
away before emitting the warning, but in the above case the ICE
is because cpp_sys_macro_p is called even if the number doesn't
have any suffixes (that is I think always for builtin macros
right now).

2021-08-12  Jakub Jelinek  <jakub@redhat.com>

PR preprocessor/101638
* macro.c (cpp_sys_macro_p): Return true instead of
crashing on builtin macros.

* gcc.dg/cpp/pr101638.c: New test.

(cherry picked from commit 408d88af60e3268f7fad59fa393ec7e28922c435)

3 years agosanitizer: Cherry-pick realpath fix
Jakub Jelinek [Wed, 11 Aug 2021 08:23:34 +0000 (10:23 +0200)] 
sanitizer: Cherry-pick realpath fix

tsan in some cases starts ignoring interceptors and only calls the
intercepted functions.  But for realpath the behavior for NULL second argument
was only handled in the interceptor and intercepted function was the one
found by dlsym which is often one that doesn't handle NULL as second argument.

Fixed by using dlvsym with "GLIBC_2.3" if possible for intercepted function
and don't emulate behavior in the wrapper.

2021-08-11  Jakub Jelinek  <jakub@redhat.com>

* sanitizer_common/sanitizer_common_interceptors.inc: Cherry-pick
llvm-project revision faef0d042f523357fe5590e7cb6a8391cf0351a8.

(cherry picked from commit 0e6017f5b4f13906dd2c09b25403ffa94a80181f)

3 years agoc++: Fix up #pragma omp declare {simd,variant} and acc routine parsing
Jakub Jelinek [Wed, 4 Aug 2021 09:53:48 +0000 (11:53 +0200)] 
c++: Fix up #pragma omp declare {simd,variant} and acc routine parsing

When parsing default arguments, we need to temporarily clear parser->omp_declare_simd
and parser->oacc_routine, otherwise it can clash with further declarations
inside of e.g. lambdas inside of those default arguments.

2021-08-04  Jakub Jelinek  <jakub@redhat.com>

PR c++/101759
* parser.c (cp_parser_default_argument): Temporarily override
parser->omp_declare_simd and parser->oacc_routine to NULL.

* g++.dg/gomp/pr101759.C: New test.
* g++.dg/goacc/pr101759.C: New test.

(cherry picked from commit af31cab04770f7a1a1da069415ab62ca2ef54fc4)

3 years agoubsan: Fix ICEs with DECL_REGISTER tests [PR101624]
Jakub Jelinek [Wed, 28 Jul 2021 16:43:15 +0000 (18:43 +0200)] 
ubsan: Fix ICEs with DECL_REGISTER tests [PR101624]

The following testcase ICEs, because the base is a CONST_DECL for
the Fortran parameter, and ubsan/sanopt uses DECL_REGISTER macro on it.
 /* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'.  */
 #define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0)
while CONST_DECL doesn't satisfy DECL_WRTL_CHECK.

The following patch checks explicitly for VAR_DECL/PARM_DECL/RESULT_DECL
only before using DECL_REGISTER, assumes other decls aren't DECL_REGISTER.
Not really sure about RESULT_DECL but it at least satisfies DECL_WRTL_CHECK...

2021-07-28  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/101624
* ubsan.c (maybe_instrument_pointer_overflow,
instrument_object_size): Only test DECL_REGISTER on VAR_DECLs,
PARM_DECLs or RESULT_DECLs.
* sanopt.c (maybe_optimize_ubsan_ptr_ifn): Likewise.

* gfortran.dg/ubsan/ubsan.exp: New file.
* gfortran.dg/ubsan/pr101624.f90: New test.

(cherry picked from commit 49e28c02a95a4bee981e69a80950309869580151)

3 years agoc++: constexpr std::construct_at on empty field [PR101663]
Patrick Palka [Thu, 12 Aug 2021 00:59:53 +0000 (20:59 -0400)] 
c++: constexpr std::construct_at on empty field [PR101663]

Here during constexpr evaluation of

  std::construct_at(&a._M_value)

we find ourselves in cxx_eval_store_expression where the target object
is 'a._M_value' and the initializer is {}.  Since _M_value is an empty
[[no_unique_address]] member we don't create a sub-CONSTRUCTOR for it,
so we end up in the early exit code path for empty stores with mismatched
types and trip over the assert therein

  gcc_assert (is_empty_class (TREE_TYPE (init)) && !lval);

because lval is true.  The reason it's true is because the INIT_EXPR in
question is the LHS of a COMPOUND_EXPR, and evaluation of the LHS is
always performed with lval=true (to indicate there's no lvalue-to-rvalue
conversion).

This patch makes the code path in question handle the lval=true case
appropriately rather than asserting.  In passing, it also consolidates
the duplicate implementations of std::construct_at/destroy_at in some
of the C++20 constexpr tests into a common header file.

PR c++/101663

gcc/cp/ChangeLog:

* constexpr.c (cxx_eval_store_expression): Handle the lval=true
case in the early exit code path for empty stores with mismatched
types.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/construct_at.h: New convenience header file that
defines minimal implementations of std::construct_at/destroy_at,
split out from ...
* g++.dg/cpp2a/constexpr-new5.C: ... here.
* g++.dg/cpp2a/constexpr-new6.C: Use the header.
* g++.dg/cpp2a/constexpr-new14.C: Likewise.
* g++.dg/cpp2a/constexpr-new20.C: New test.

(cherry picked from commit 21fd62e5ca9967bba8f97fd6244a8c6a564c2146)

3 years agoMerge remote-tracking branch 'origin/releases/gcc-11' into devel/omp/gcc-11
Tobias Burnus [Thu, 12 Aug 2021 09:25:43 +0000 (11:25 +0200)] 
Merge remote-tracking branch 'origin/releases/gcc-11' into devel/omp/gcc-11

Merge up to 2e4e16f75e637d6486d0fdbb8c6ab13701238a55 (Aug 12, 2021)

3 years agoopenmp: Diagnose syntax mismatches between declare target and end declare target
Jakub Jelinek [Thu, 12 Aug 2021 09:25:26 +0000 (11:25 +0200)] 
openmp: Diagnose syntax mismatches between declare target and end declare target

OpenMP 5.1 says:
For any directive that has a paired end directive, including those with a begin
and end pair, both directives must use either the attribute syntax or the
pragma syntax.

The following patch enforces it with the only pair so far recognized in C++
(Fortran has many, but on the other side doesn't have attribute syntax).

While I initially wanted to use vec<bool, va_gc> *member; in there, that
unfortunately doesn't work, one gets linker errors and I guess it is fixable,
but for begin declare target we'll need a struct anyway to store device_type
etc.

2021-08-12  Jakub Jelinek  <jakub@redhat.com>

* cp-tree.h (omp_declare_target_attr): New type.
(struct saved_scope): Change type of omp_declare_target_attribute
from int to vec<omp_declare_target_attr, va_gc> * and move it.
* parser.c (cp_parser_omp_declare_target): Instead of
incrementing scope_chain->omp_declare_target_attribute, push
a struct containing parser->lexer->in_omp_attribute_pragma to
the vector.
(cp_parser_omp_end_declare_target): Instead of decrementing
scope_chain->omp_declare_target_attribute, pop a structure
from it.  Diagnose mismatching declare target vs.
end declare target syntax.
* semantics.c (finish_translation_unit): Use vec_safe_length
and vec_safe_truncate on scope_chain->omp_declare_target_attributes.
* decl2.c (cplus_decl_attributes): Use vec_safe_length
on scope_chain->omp_declare_target_attributes.

* g++.dg/gomp/attrs-12.C: New test.

(cherry picked from commit 01f8a8b48e50cbaa68b878d9f8a330b8c0736bed)

3 years agoopenmp: Diagnose another case of mixing parameter and attribute syntax
Jakub Jelinek [Thu, 12 Aug 2021 09:23:51 +0000 (11:23 +0200)] 
openmp: Diagnose another case of mixing parameter and attribute syntax

This patch diagnoses cases like:
  #pragma omp parallel
  [[omp::directive (declare simd)]] int foo ();
or
  #pragma omp taskgroup
  int bar [[omp::directive (declare simd)]] (int);
where the pragma is on the same declaration statement as the declare simd
attribute.

2021-08-12  Jakub Jelinek  <jakub@redhat.com>

* parser.c (cp_parser_lambda_body): Add temp overrides
for parser->{omp_declare_simd,oacc_routine,omp_attrs_forbidden_p}.
(cp_parser_statement): Restore parser->omp_attrs_forbidden_p for
cp_parser_declaration_statement.
(cp_parser_default_argument): Add temp override for
parser->omp_attrs_forbidden_p.
(cp_parser_late_parsing_omp_declare_simd): Diagnose declare simd
or declare variant in attribute syntax on a declaration immediately
following an OpenMP construct in pragma syntax.

* g++.dg/gomp/attrs-11.C: Add new tests.

(cherry picked from commit ef07b918a7ad4f64e0e1e3db21d861f2e79de92a)

3 years agoc++: Fix up #pragma omp declare {simd,variant} and acc routine parsing
Jakub Jelinek [Thu, 12 Aug 2021 09:09:00 +0000 (11:09 +0200)] 
c++: Fix up #pragma omp declare {simd,variant} and acc routine parsing

When parsing default arguments, we need to temporarily clear parser->omp_declare_simd
and parser->oacc_routine, otherwise it can clash with further declarations
inside of e.g. lambdas inside of those default arguments.

2021-08-04  Jakub Jelinek  <jakub@redhat.com>

PR c++/101759
* parser.c (cp_parser_default_argument): Temporarily override
parser->omp_declare_simd and parser->oacc_routine to NULL.

* g++.dg/gomp/pr101759.C: New test.
* g++.dg/goacc/pr101759.C: New test.

(cherry picked from commit af31cab04770f7a1a1da069415ab62ca2ef54fc4)

3 years agoopenmp: Diagnose omp::directive/sequence on using-directive
Jakub Jelinek [Thu, 12 Aug 2021 09:00:51 +0000 (11:00 +0200)] 
openmp: Diagnose omp::directive/sequence on using-directive

With the using-directive parsing changes, we now emit only a warning
for [[omp::directive (...)]] on using-directive.  While that is right
without -fopenmp/-fopenmp-simd, when OpenMP is enabled, that should
be an error as OpenMP (is going to) disallow such attributes there
as they do not appertain to a statement.

2021-08-12  Jakub Jelinek  <jakub@redhat.com>

* name-lookup.c (finish_using_directive): Diagnose omp::directive
or omp::sequence attributes on using-directive.

* g++.dg/gomp/attrs-11.C: Adjust expected diagnostics.

(cherry picked from commit c84f79e9e3f63e9ae447fd15dbd0a768cab3f643)

3 years agoMake -no-pie option work for native Windows
Eric Botcazou [Thu, 12 Aug 2021 07:30:31 +0000 (09:30 +0200)] 
Make -no-pie option work for native Windows

Binutils 2.36/2.37 generate PIE executables by default on native Windows
(because --dynamicbase is the default) so it makes sense to have a simple
way to counter that and -no-pie seems appropriate, all the more so that
it is automatically passed when building the compiler itself.

gcc/
* configure.ac (PE linker --disable-dynamicbase support): New check.
* configure: Regenerate.
* config.in: Likewise.
* config/i386/mingw32.h (LINK_SPEC_DISABLE_DYNAMICBASE): New define.
(LINK_SPEC): Use it.
* config/i386/mingw-w64.h (LINK_SPEC_DISABLE_DYNAMICBASE): Likewise.
(LINK_SPEC): Likewise.

3 years agoDaily bump.
GCC Administrator [Thu, 12 Aug 2021 00:18:06 +0000 (00:18 +0000)] 
Daily bump.

3 years agolibstdc++: Fix test that fails randomly [PR101866]
Jonathan Wakely [Wed, 11 Aug 2021 21:11:19 +0000 (22:11 +0100)] 
libstdc++: Fix test that fails randomly [PR101866]

This test assumes that the same sequence of three values cannot occur,
which is incorect. It's unlikely, but not impossible.

Perform the check in a loop, so that in the unlikely event of an
identical sequence, we retry. If the library code is buggy it will keep
producing the same sequence and the test will time out. If the code is
working correctly then we will usually break out of the loop after one
iteration, or very rarely after two or three.

libstdc++-v3/ChangeLog:

PR libstdc++/101866
* testsuite/experimental/random/randint.cc: Loop and retry if
reseed() produces the same sequence.

(cherry picked from commit 93f1dbc7cdcc4b31ea4061efb4c2acf2d4f81eb8)

3 years agoc++: parameterized requires-expr as default argument [PR101725]
Patrick Palka [Wed, 11 Aug 2021 20:53:53 +0000 (16:53 -0400)] 
c++: parameterized requires-expr as default argument [PR101725]

Here we're rejecting the default template argument

  requires (T t) { x(t); }

because we consider the 't' in the requirement to be a local variable
(according to local_variable_p), and we generally forbid local variables
from appearing inside default arguments.  We can perhaps fix this by
giving special treatment to parameters introduced by requires-expressions,
but DR 2082 relaxed the restriction about local variables appearing within
default arguments to permit them inside unevaluated operands thereof.
So this patch just implements DR 2082 which also fixes this PR since a
requires-expression is an unevaluated context.

PR c++/101725
DR 2082

gcc/cp/ChangeLog:

* cp-tree.h (unevaluated_p): Return true for REQUIRES_EXPR.
* decl.c (local_variable_p_walkfn): Don't walk into unevaluated
operands.
* parser.c (cp_parser_primary_expression) <case CPP_NAME>: Never
reject uses of local variables in unevaluated contexts.
* tree.c (cp_walk_subtrees) <case REQUIRES_EXPR>: Increment
cp_unevaluated_operand.  Use cp_walk_tree directly instead of
WALK_SUBTREE to avoid the goto.  Use REQUIRES_EXPR_REQS instead
of TREE_OPERAND directly.

gcc/testsuite/ChangeLog:

* g++.dg/DRs/dr2082.C: New test.
* g++.dg/cpp2a/concepts-uneval4.C: New test.

(cherry picked from commit 9707d2e5dbb92d2bc990c922461a5a16ae652319)

3 years agoFortran: ICE in resolve_allocate_deallocate for invalid STAT argument
Harald Anlauf [Wed, 28 Jul 2021 17:11:27 +0000 (19:11 +0200)] 
Fortran: ICE in resolve_allocate_deallocate for invalid STAT argument

gcc/fortran/ChangeLog:

PR fortran/101564
* expr.c (gfc_check_vardef_context): Add check for KIND and LEN
parameter inquiries.
* match.c (gfc_match): Fix comment for %v code.
(gfc_match_allocate, gfc_match_deallocate): Replace use of %v code
by %e in gfc_match to allow for function references as STAT and
ERRMSG arguments.
* resolve.c (resolve_allocate_deallocate): Avoid NULL pointer
dereferences and shortcut for bad STAT and ERRMSG argument to
(DE)ALLOCATE.  Remove bogus parts of checks for STAT and ERRMSG.

gcc/testsuite/ChangeLog:

PR fortran/101564
* gfortran.dg/allocate_stat_3.f90: New test.
* gfortran.dg/allocate_stat.f90: Adjust error messages.
* gfortran.dg/implicit_11.f90: Likewise.
* gfortran.dg/inquiry_type_ref_3.f90: Likewise.

(cherry picked from commit 7bf582e6cfcef922a087b1b2b42aa04ea9cb2d94)

3 years agoc++: Improve memory usage of subsumption [PR100828]
Patrick Palka [Mon, 2 Aug 2021 13:59:56 +0000 (09:59 -0400)] 
c++: Improve memory usage of subsumption [PR100828]

Constraint subsumption is implemented in two steps.  The first step
computes the disjunctive (or conjunctive) normal form of one of the
constraints, and the second step verifies that each clause in the
decomposed form implies the other constraint.   Performing these two
steps separately is problematic because in the first step the DNF/CNF
can be exponentially larger than the original constraint, and by
computing it ahead of time we'd have to keep all of it in memory.

This patch fixes this exponential blowup in memory usage by interleaving
the two steps, so that as soon as we decompose one clause we check
implication for it.  In turn, memory usage during subsumption is now
worst case linear in the size of the constraints rather than
exponential, and so we can safely remove the hard limit of 16 clauses
without introducing runaway memory usage on some inputs.  (Note the
_time_ complexity of subsumption is still exponential in the worst case.)

In order for this to work we need to make formula::branch() insert the
copy of the current clause directly after the current clause rather than
at the end of the list, so that we fully decompose a clause shortly
after creating it.  Otherwise we'd end up accumulating exponentially
many (partially decomposed) clauses in memory anyway.

PR c++/100828

gcc/cp/ChangeLog:

* logic.cc (formula::formula): Use emplace_back instead of
push_back.
(formula::branch): Insert a copy of m_current directly after
m_current instead of at the end of the list.
(formula::erase): Define.
(decompose_formula): Remove.
(decompose_antecedents): Remove.
(decompose_consequents): Remove.
(derive_proofs): Remove.
(max_problem_size): Remove.
(diagnose_constraint_size): Remove.
(subsumes_constraints_nonnull): Rewrite directly in terms of
decompose_clause and derive_proof, interleaving decomposition
with implication checking.  Remove limit on constraint complexity.
Use formula::erase to free the current clause before moving on to
the next one.

(cherry picked from commit f48c3cd2e3f9cd9e3c329eb2d3185bd26e7c7607)

3 years agolibstdc++: Fix create_directories to resolve symlinks [PR101510]
Jonathan Wakely [Tue, 20 Jul 2021 17:15:48 +0000 (18:15 +0100)] 
libstdc++: Fix create_directories to resolve symlinks [PR101510]

When filesystem__create_directories checks to see if the path already
exists and resolves to a directory, it uses filesystem::symlink_status,
which means it reports an error if the path is a symlink. It should use
filesystem::status, so that the target directory is detected, and no
error is reported.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

PR libstdc++/101510
* src/c++17/fs_ops.cc (fs::create_directories): Use status
instead of symlink_status.
* src/filesystem/ops.cc (fs::create_directories): Likewise.
* testsuite/27_io/filesystem/operations/create_directories.cc:
Check symlink to existing directory.
* testsuite/27_io/filesystem/operations/create_directory.cc: Do
not test with symlinks on Windows.
* testsuite/experimental/filesystem/operations/create_directories.cc:
Check symlink to existing directory.
* testsuite/experimental/filesystem/operations/create_directory.cc:
Do not test with symlinks on Windows.

(cherry picked from commit 124eaa50e0a34f5f89572c1aa812c50979da58fc)

3 years agolibstdc++: Add more tests for filesystem::create_directory [PR101510]
Jonathan Wakely [Tue, 20 Jul 2021 11:35:37 +0000 (12:35 +0100)] 
libstdc++: Add more tests for filesystem::create_directory [PR101510]

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

PR libstdc++/101510
* src/c++17/fs_ops.cc (create_dir): Adjust whitespace.
* testsuite/27_io/filesystem/operations/create_directory.cc:
Test creating directory with name of existing symlink to
directory.
* testsuite/experimental/filesystem/operations/create_directory.cc:
Likewise.

(cherry picked from commit 0c4ae4ff46b1d7633f1e06f57d348b5817b8f640)

3 years agolibstdc++: Implement LWG 3465 for std::compare_partial_order_fallback [PR101056]
Jonathan Wakely [Mon, 14 Jun 2021 11:30:52 +0000 (12:30 +0100)] 
libstdc++: Implement LWG 3465 for std::compare_partial_order_fallback [PR101056]

libstdc++-v3/ChangeLog:

PR libstdc++/101056
* libsupc++/compare (compare_partial_order_fallback): Add
constraint using reversed parameter order, as per LWG 3465.
* testsuite/18_support/comparisons/algorithms/fallback.cc:
Adjust expected result.

(cherry picked from commit b76a529c095f076c4780df0c913cf6d2391bcbc9)

3 years agolibstdc++: Change [cmp.alg] assertions to constraints
Jonathan Wakely [Mon, 14 Jun 2021 11:25:43 +0000 (12:25 +0100)] 
libstdc++: Change [cmp.alg] assertions to constraints

This moves the same_as<decay_t<_Tp>, decay_t<_Up>> checks from the
[cmp.alg] function bodies into their constraints.

Also add a test for the compare_xxx_order_fallback algorithms.

libstdc++-v3/ChangeLog:

* libsupc++/compare (__decayed_same_as): New helper concept.
(strong_order, weak_order, partial_order): Constrain with new
concept instead of using static_assert.
(compare_strong_order_fallback, compare_weak_order_fallback)
(compare_partial_order_fallback): Likewise. Do not deduce return
types. Remove redundant if-constexpr checks.
* testsuite/18_support/comparisons/algorithms/fallback.cc: New test.

(cherry picked from commit e2c79b968ff95421c31a5a9a1b80b11321fe70d2)

3 years agolibstdc++: Improvements to Doxygen markup
Jonathan Wakely [Wed, 30 Jun 2021 23:30:54 +0000 (00:30 +0100)] 
libstdc++: Improvements to Doxygen markup

This attempts to improve the doxygen output to work around what seems to
be some bugs in doxygen (issues 8635 and 8638).

The @addtogroup command doesn't work for entities inside a nested
namespace (see 8635) so we need to close and reopen groups on entering
and elaving nested namespaces. This fixes the problem that
chrono::duration and chrono::time_point were not documented in the
"Time" documentation group. I am unable to make the path classes appear
as part of their relevant groups (File System and Filesystem TS), nor
the contents of <exception> or <system_error>. I have made some minor
improvements to the docs for those types, including starting to address
PR 97001 by adding @since to the doxygen comments.

This change also excludes the <experimental/bits/net.h> header from
Doxygen processing, so we don't get an unwanted "Networking-ts" group
in the documentation.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* doc/doxygen/doxygroups.cc: Fix docs for std::literals.
* doc/doxygen/user.cfg.in: Exclude the Networking TS header.
Add some more predefined macros.
* include/bits/fs_fwd.h: Move @addtogroup commands inside
namespaces. Add better documentation.
* include/bits/fs_path.h: Likewise.
* include/experimental/bits/fs_fwd.h: Likewise.
* include/experimental/bits/fs_path.h: Likewise.
* include/ext/throw_allocator.h: Fix typo and improve docs.
* include/std/chrono: Move @addtogroup commands.
* include/std/system_error: Move @addtogroup commands.
* libsupc++/exception: Improve documentation.
* libsupc++/exception.h: Add @since documentation.

(cherry picked from commit f2ce64b53fa76a4c192fe51b2f6c5a863a3b1241)

3 years agolibstdc++: Improve Doxygen documentation groups [PR 101258]
Jonathan Wakely [Wed, 30 Jun 2021 15:00:58 +0000 (16:00 +0100)] 
libstdc++: Improve Doxygen documentation groups [PR 101258]

This defines some new Doxygen groups for C++17 variable templates and
for the contents of <experimental/type_traits>. By documenting the group
as a whole and adding each template to a group we don't need to document
them individually.

Also mark more internals with "@cond undocumented" so that Doxygen
ignores them by default. Also make Doxygen process <experimental/simd>.

For some reason, many of the class templates in <type_traits> do not
appear in the "Metaprogramming" group. For example, add_cv,
remove_extent, and all the is_xxx_constructible and is_xxx_assignable
traits. For some reason, Doxygen doesn't include them in the group,
despite doing it correctly for other traits in the same header.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

PR libstdc++/101258
* doc/doxygen/user.cfg.in (INPUT): Add <experimental/simd>.
(COLS_IN_ALPHA_INDEX): Remove obsolete tag.
(PREDEFINED): Add/fix some more macros that need to be expanded.
* include/bits/random.h: Stop Doxygen from documenting internal
implementation details.
* include/bits/random.tcc: Likewise.
* include/bits/this_thread_sleep.h: Fix @file name.
* include/experimental/bits/simd.h: Add to Doxygen group. Do not
document internal implementation details.
* include/experimental/bits/simd_detail.h: Do not document
internal implementation details.
* include/experimental/simd: Define Doxygen groups.
* include/experimental/type_traits: Improve documentation for
the header file. Define groups. Use @since commands.
* include/std/scoped_allocator (scoped_allocator_adaptor): Move
declaration before undocumented region.
* include/std/type_traits (true_type, false_type): Use using
declaration instead of typedef.
(is_invocable_v, is_nothrow_invocable_v, is_invocable_r_v)
(is_nothrow_invocable_r_v): Move definitions next to other C++17
variable templates.
Do not document internal implementation details. Move misplaced
group-end command. Define group for variable templates.
* include/std/variant: Do not document internal implementation
details.
* testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error
line number.

(cherry picked from commit 6963c3b9ed1308bf5d2d8877956e56fec92853a7)

3 years agoDaily bump.
GCC Administrator [Wed, 11 Aug 2021 00:18:04 +0000 (00:18 +0000)] 
Daily bump.

4 years agoopenmp: Fix up cp/parser.c build with GCC 4.8 to 6
Jakub Jelinek [Tue, 10 Aug 2021 16:30:27 +0000 (18:30 +0200)] 
openmp: Fix up cp/parser.c build with GCC 4.8 to 6

Christophe Lyon reported that cp/parser.c no longer compiles with
GCC 4.8.5 after my recent OpenMP changes.
A goto out; there crosses odsd variable declaration, and odsd has
a vec<...> member where vec has = default; default constructor
and gcc before r7-2822-gd0b0fbd9fce2f30a82558bf2308b3a7b56c2f364
treated that as error.

Fixed by moving the declaration earlier before the goto.

Tested on x86_64-linux with GCC 4.8.5 system gcc, committed to trunk
as obvious.

2021-08-10  Jakub Jelinek  <jakub@redhat.com>

* parser.c (cp_parser_member_declaration): Move odsd declaration
before cp_parser_using_declaration call to avoid errors with
GCC 4.8 to 6.

(cherry picked from commit d796cc7a3e719cc36f1851ca322e2877b974691b)

4 years agoopenmp: Add support for declare simd and declare variant in a attribute syntax
Jakub Jelinek [Tue, 10 Aug 2021 12:35:11 +0000 (14:35 +0200)] 
openmp: Add support for declare simd and declare variant in a attribute syntax

This patch adds support for declare simd and declare variant in attribute
syntax.  Either in attribute-specifier-seq at the start of declaration, in
that case it has similar restriction to pragma-syntax, that there is a single
function declaration/definition in the declaration, rather than variable
declaration or more than one function declarations or mix of function and
variable declarations.  Or after the declarator id, in that case it applies
just to the single function declaration and the same declaration can have
multiple such attributes.  Or both.

Furthermore, cp_parser_statement has been adjusted so that it doesn't
accept [[omp::directive (parallel)]] etc. before statements that don't
take attributes at all, or where those attributes don't appertain to
the statement but something else (e.g. to label, using directive,
declaration, etc.).

2021-08-10  Jakub Jelinek  <jakub@redhat.com>

gcc/cp/
* parser.h (struct cp_omp_declare_simd_data): Remove
in_omp_attribute_pragma and clauses members, add loc and attribs.
(struct cp_oacc_routine_data): Remove loc member, add clauses
member.
* parser.c (cp_finalize_omp_declare_simd): New function.
(cp_parser_handle_statement_omp_attributes): Mention in
function comment the function is used also for
attribute-declaration.
(cp_parser_handle_directive_omp_attributes): New function.
(cp_parser_statement): Don't call
cp_parser_handle_statement_omp_attributes if statement doesn't
have attribute-specifier-seq at the beginning at all or if
if those attributes don't appertain to the statement.
(cp_parser_simple_declaration): Call
cp_parser_handle_directive_omp_attributes and
cp_finalize_omp_declare_simd.
(cp_parser_explicit_instantiation): Likewise.
(cp_parser_init_declarator): Initialize prefix_attributes
only after parsing declarators.
(cp_parser_direct_declarator): Call
cp_parser_handle_directive_omp_attributes and
cp_finalize_omp_declare_simd.
(cp_parser_member_declaration): Likewise.
(cp_parser_single_declaration): Likewise.
(cp_parser_omp_declare_simd): Don't initialize
data.in_omp_attribute_pragma, instead initialize
data.attribs[0] and data.attribs[1].
(cp_finish_omp_declare_variant): Remove
in_omp_attribute_pragma argument, instead use
parser->lexer->in_omp_attribute_pragma.
(cp_parser_late_parsing_omp_declare_simd): Adjust
cp_finish_omp_declare_variant caller.  Handle attribute-syntax
declare simd/variant.
gcc/testsuite/
* g++.dg/gomp/attrs-1.C (bar): Add missing semicolon after
[[omp::directive (threadprivate (t2))]].  Add tests with
if/while/switch after parallel in attribute syntax.
(corge): Add missing omp:: before directive.
* g++.dg/gomp/attrs-2.C (bar): Add missing semicolon after
[[omp::directive (threadprivate (t2))]].
* g++.dg/gomp/attrs-10.C: New test.
* g++.dg/gomp/attrs-11.C: New test.

(cherry picked from commit c40c6a50fd4da342c87a715ae83927a37797e094)

4 years agoDaily bump.
GCC Administrator [Tue, 10 Aug 2021 00:18:01 +0000 (00:18 +0000)] 
Daily bump.

4 years agoMerge remote-tracking branch 'origin/releases/gcc-11' into devel/omp/gcc-11
Tobias Burnus [Mon, 9 Aug 2021 06:59:24 +0000 (08:59 +0200)] 
Merge remote-tracking branch 'origin/releases/gcc-11' into devel/omp/gcc-11

Merge up to bde6489fe0365b20f8df28157f8434ae7554ac3d (Aug 9, 2021)

4 years agoopenmp: Implement omp_get_device_num routine
Chung-Lin Tang [Mon, 9 Aug 2021 06:58:07 +0000 (08:58 +0200)] 
openmp: Implement omp_get_device_num routine

This patch implements the omp_get_device_num library routine, specified in
OpenMP 5.0.

GOMP_DEVICE_NUM_VAR is a macro symbol which defines name of a "device number"
variable, is defined on the device-side libgomp, has it's address returned to
host-side libgomp during device initialization, and the host libgomp then
sets its value to the designated device number.

libgomp/ChangeLog:

* icv-device.c (omp_get_device_num): New API function, host side.
* fortran.c (omp_get_device_num_): New interface function.
* libgomp-plugin.h (GOMP_DEVICE_NUM_VAR): Define macro symbol.
* libgomp.map (OMP_5.0.2): New version space with omp_get_device_num,
omp_get_device_num_.
* libgomp.texi (omp_get_device_num): Add documentation for new API
function.
* omp.h.in (omp_get_device_num): Add declaration.
* omp_lib.f90.in (omp_get_device_num): Likewise.
* omp_lib.h.in (omp_get_device_num): Likewise.
* target.c (gomp_load_image_to_device): If additional entry for device
number exists at end of returned entries from 'load_image_func' hook,
copy the assigned device number over to the device variable.

* config/gcn/icv-device.c (GOMP_DEVICE_NUM_VAR): Define static global.
(omp_get_device_num): New API function, device side.
* plugin/plugin-gcn.c ("symcat.h"): Add include.
(GOMP_OFFLOAD_load_image): Add addresses of device GOMP_DEVICE_NUM_VAR
at end of returned 'target_table' entries.

* config/nvptx/icv-device.c (GOMP_DEVICE_NUM_VAR): Define static global.
(omp_get_device_num): New API function, device side.
* plugin/plugin-nvptx.c ("symcat.h"): Add include.
(GOMP_OFFLOAD_load_image): Add addresses of device GOMP_DEVICE_NUM_VAR
at end of returned 'target_table' entries.

* testsuite/lib/libgomp.exp
(check_effective_target_offload_target_intelmic): New function for
testing for intelmic offloading.
* testsuite/libgomp.c-c++-common/target-45.c: New test.
* testsuite/libgomp.fortran/target10.f90: New test.

(cherry picked from commit 0bac793ed6bad2c0c13cd1e93a1aa5808467afc8)

4 years agoDaily bump.
GCC Administrator [Mon, 9 Aug 2021 00:18:16 +0000 (00:18 +0000)] 
Daily bump.

4 years agoDaily bump.
GCC Administrator [Sun, 8 Aug 2021 00:18:08 +0000 (00:18 +0000)] 
Daily bump.

4 years agoDaily bump.
GCC Administrator [Sat, 7 Aug 2021 00:18:16 +0000 (00:18 +0000)] 
Daily bump.

4 years agoaarch64: Add -mtune=neoverse-512tvb
Richard Sandiford [Fri, 6 Aug 2021 14:36:58 +0000 (15:36 +0100)] 
aarch64: Add -mtune=neoverse-512tvb

This patch adds an option to tune for Neoverse cores that have
a total vector bandwidth of 512 bits (4x128 for Advanced SIMD
and a vector-length-dependent equivalent for SVE).  This is intended
to be a compromise between tuning aggressively for a single core like
Neoverse V1 (which can be too narrow) and tuning for AArch64 cores
in general (which can be too wide).

-mcpu=neoverse-512tvb is equivalent to -mcpu=neoverse-v1
-mtune=neoverse-512tvb.

gcc/
* doc/invoke.texi: Document -mtune=neoverse-512tvb and
-mcpu=neoverse-512tvb.
* config/aarch64/aarch64-cores.def (neoverse-512tvb): New entry.
* config/aarch64/aarch64-tune.md: Regenerate.
* config/aarch64/aarch64.c (neoverse512tvb_sve_vector_cost)
(neoverse512tvb_sve_issue_info, neoverse512tvb_vec_issue_info)
(neoverse512tvb_vector_cost, neoverse512tvb_tunings): New structures.
(aarch64_adjust_body_cost_sve): Handle -mtune=neoverse-512tvb.
(aarch64_adjust_body_cost): Likewise.

(cherry picked from commit 048039c49b96875144f67e7789fdea54abf7710b)

4 years agoaarch64: Restrict issue heuristics to inner vector loop
Richard Sandiford [Fri, 6 Aug 2021 14:36:57 +0000 (15:36 +0100)] 
aarch64: Restrict issue heuristics to inner vector loop

The AArch64 vector costs try to take issue rates into account.
However, when vectorising an outer loop, we lumped the inner
and outer operations together, which is somewhat meaningless.
This patch restricts the heuristic to the inner loop.

gcc/
* config/aarch64/aarch64.c (aarch64_add_stmt_cost): Only
record issue information for operations that occur in the
innermost loop.

(cherry picked from commit 9690309baf8294b0512b55b133bc102dc0dac5b5)