aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/gomp
AgeCommit message (Collapse)AuthorFilesLines
4 daysOpenMP: Require target and/or targetsync init modifier [PR118965]Sandra Loosemore10-111/+179
As noted in PR 118965, the initial interop implementation overlooked the requirement in the OpenMP spec that at least one of the "target" and "targetsync" modifiers is required in both the interop construct init clause and the declare variant append_args clause. Adding the check was fairly straightforward, but it broke about a gazillion existing test cases. In particular, things like "init (x, y)" which were previously accepted (and tested for being accepted) aren't supposed to be allowed by the spec, much less things like "init (target)" where target was previously interpreted as a variable name instead of a modifier. Since one of the effects of the change is that at least one modifier is always required, I found that deleting all the code that was trying to detect and handle the no-modifier case allowed for better diagnostics. gcc/c/ChangeLog PR middle-end/118965 * c-parser.cc (c_parser_omp_clause_init_modifiers): Adjust error message. (c_parser_omp_clause_init): Remove code for recognizing clauses without modifiers. Diagnose missing target/targetsync modifier. (c_finish_omp_declare_variant): Diagnose missing target/targetsync modifier. gcc/cp/ChangeLog PR middle-end/118965 * parser.cc (c_parser_omp_clause_init_modifiers): Adjust error message. (cp_parser_omp_clause_init): Remove code for recognizing clauses without modifiers. Diagnose missing target/targetsync modifier. (cp_finish_omp_declare_variant): Diagnose missing target/targetsync modifier. gcc/fortran/ChangeLog PR middle-end/118965 * openmp.cc (gfc_parser_omp_clause_init_modifiers): Fix some inconsistent code indentation. Remove code for recognizing clauses without modifiers. Diagnose prefer_type without a following paren. Adjust error message for an unrecognized modifier. Diagnose missing target/targetsync modifier. (gfc_match_omp_init): Fix more inconsistent code indentation. gcc/testsuite/ChangeLog PR middle-end/118965 * c-c++-common/gomp/append-args-1.c: Add target/targetsync modifiers so tests do what they were previously supposed to do. Adjust expected output. * c-c++-common/gomp/append-args-7.c: Likewise. * c-c++-common/gomp/append-args-8.c: Likewise. * c-c++-common/gomp/append-args-9.c: Likewise. * c-c++-common/gomp/interop-1.c: Likewise. * c-c++-common/gomp/interop-2.c: Likewise. * c-c++-common/gomp/interop-3.c: Likewise. * c-c++-common/gomp/interop-4.c: Likewise. * c-c++-common/gomp/pr118965-1.c: New. * c-c++-common/gomp/pr118965-2.c: New. * g++.dg/gomp/append-args-1.C: Add target/targetsync modifiers and adjust expected output. * g++.dg/gomp/append-args-2.C: Likewise. * g++.dg/gomp/append-args-6.C: Likewise. * g++.dg/gomp/append-args-7.C: Likewise. * g++.dg/gomp/append-args-8.C: Likewise. * g++.dg/gomp/interop-5.C: Likewise. * gfortran.dg/gomp/append_args-1.f90: Add target/targetsync modifiers and adjust expected output. * gfortran.dg/gomp/append_args-2.f90: Likewise. * gfortran.dg/gomp/append_args-3.f90: Likewise. * gfortran.dg/gomp/append_args-4.f90: Likewise. * gfortran.dg/gomp/interop-1.f90: Likewise. * gfortran.dg/gomp/interop-2.f90: Likewise. * gfortran.dg/gomp/interop-3.f90: Likewise. * gfortran.dg/gomp/interop-4.f90: Likewise. * gfortran.dg/gomp/pr118965-1.f90: New. * gfortran.dg/gomp/pr118965-2.f90: New.
10 daysOpenMP: Fix declaration in append-args-interop.c test caseSandra Loosemore1-1/+1
I ran into this while backporting my declare variant/dispatch/interop patch f016ee89955ab4da5fe7ef89368e9437bb5ffb13 to the og14 development branch. In C dialects prior to C23 (the default on mainline), functions declared "float f()" and "float g(void)" aren't considered equivalent for the purpose of the C front end code that checks whether a type of a variant matches the base function after accounting for the added interop arguments. Using "(void)" instead of "()" works in all C dialects as well as C++, so do that. gcc/testsuite/ChangeLog * c-c++-common/gomp/append-args-interop.c: Fix declaration of base function to be correct for pre-C23 dialects.
10 daystestsuite, gomp: fix broken dg directivesDavid Malcolm1-1/+1
gcc/testsuite/ChangeLog: * c-c++-common/gomp/metadirective-target-device-2.c: Fix missing trailing " }" on dg-do directive. * gcc.dg/gomp/attrs-21.c: Likewise for dg-options. * gcc.dg/gomp/parallel-2.c: Drop ":" from dg-message. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
11 daystestsuite: i386: Fix c-c++-common/gomp/metadirective-device.c etc. with i?86 ↵Rainer Orth2-2/+2
compiler Two new tests FAIL on both Solaris/x86 and Linux/i686 with a 32-bit-default compiler: FAIL: c-c++-common/gomp/metadirective-device.c -std=c++17 scan-tree-dump-not optimized "__builtin_GOMP_error" FAIL: c-c++-common/gomp/metadirective-device.c -std=c++26 scan-tree-dump-not optimized "__builtin_GOMP_error" FAIL: c-c++-common/gomp/metadirective-device.c -std=c++98 scan-tree-dump-not optimized "__builtin_GOMP_error" FAIL: c-c++-common/gomp/metadirective-target-device-1.c -std=c++17 scan-tree-dump-times optimized "GOMP_error" 0 FAIL: c-c++-common/gomp/metadirective-target-device-1.c -std=c++26 scan-tree-dump-times optimized "GOMP_error" 0 FAIL: c-c++-common/gomp/metadirective-target-device-1.c -std=c++98 scan-tree-dump-times optimized "GOMP_error" 0 FAIL: c-c++-common/gomp/metadirective-device.c scan-tree-dump-not optimized "__builtin_GOMP_error" FAIL: c-c++-common/gomp/metadirective-target-device-1.c scan-tree-dump-times optimized "GOMP_error" 0 They also FAIL on Linux/x86_64 with -mx32. The problem is two-fold: restricting a test to target x86_64-*-* is always wrong: an i?86-*-* compiler can produce 64-bit code with -m64 just as well, so it should always be both. In addition, the -mx32 failure shows that the test seems to be 64-bit only. To fix both issues, this patch uses the new x86 effective-target keyword and restricts the tests to lp64 instead of ! ia32. Tested on i386-pc-solaris2.11 and x86_64-pc-linux-gnu. 2025-03-25 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> gcc/testsuite: * c-c++-common/gomp/metadirective-device.c (dg-additional-options): Use on all x86 targets. Restrict to lp64. * c-c++-common/gomp/metadirective-target-device-1.c: Likewise.
12 daysOpenMP: Create additional interop objects with append_args.Sandra Loosemore3-15/+46
This patch adds support for the case where #pragma omp declare variant with append_args is used inside a #pragma omp dispatch interop that specifies fewer interop args than required by the variant; new interop objects are implicitly created and then destroyed around the call to the variant, using the GOMP_interop builtin. gcc/fortran/ChangeLog * trans-openmp.cc (gfc_trans_omp_declare_variant): Remove accidental redeclaration of pref. gcc/ChangeLog * gimplify.cc (modify_call_for_omp_dispatch): Adjust arguments. Remove the "sorry" for the case where new interop objects must be constructed, and add code to make it work instead. (expand_variant_call_expr): Adjust arguments and call to modify_call_for_omp_dispatch. (gimplify_variant_call_expr): Simplify logic for calling expand_variant_call_expr. gcc/testsuite/ChangeLog * c-c++-common/gomp/append-args-1.c: Adjust expected behavior. * c-c++-common/gomp/append-args-interop.c: New. * c-c++-common/gomp/dispatch-11.c: Adjust expected behavior. * g++.dg/gomp/append-args-1.C: Likewise. * gfortran.dg/gomp/append-args-interop.f90: New. * gfortran.dg/gomp/declare-variant-mod-2.f90: Adjust expected behavior. libgomp/ChangeLog * libgomp.texi (OpenMP 5.1): Mark append_args as fully supported. Co-Authored-By: Tobias Burnus <tburnus@baylibre.com>
2025-03-21OpenMP: 'interop' construct - add ME support + target-independent libgompPaul-Antoine Arras5-12/+74
This patch partially enables use of the OpenMP interop construct by adding middle end support, mostly in the omplower pass, and in the target-independent part of the libgomp runtime. It follows up on previous patches for C, C++ and Fortran front ends support. The full interop feature requires another patch to enable foreign runtime support in libgomp plugins. gcc/ChangeLog: * builtin-types.def (BT_FN_VOID_INT_INT_PTR_PTR_PTR_INT_PTR_INT_PTR_UINT_PTR): New. * gimple-low.cc (lower_stmt): Handle GIMPLE_OMP_INTEROP. * gimple-pretty-print.cc (dump_gimple_omp_interop): New function. (pp_gimple_stmt_1): Handle GIMPLE_OMP_INTEROP. * gimple.cc (gimple_build_omp_interop): New function. (gimple_copy): Handle GIMPLE_OMP_INTEROP. * gimple.def (GIMPLE_OMP_INTEROP): Define. * gimple.h (gimple_build_omp_interop): Declare. (gimple_omp_interop_clauses): New function. (gimple_omp_interop_clauses_ptr): Likewise. (gimple_omp_interop_set_clauses): Likewise. (gimple_return_set_retval): Handle GIMPLE_OMP_INTEROP. * gimplify.cc (gimplify_scan_omp_clauses): Handle OMP_CLAUSE_INIT, OMP_CLAUSE_USE and OMP_CLAUSE_DESTROY. (gimplify_omp_interop): New function. (gimplify_expr): Replace sorry with call to gimplify_omp_interop. * omp-builtins.def (BUILT_IN_GOMP_INTEROP): Define. * omp-low.cc (scan_sharing_clauses): Handle OMP_CLAUSE_INIT, OMP_CLAUSE_USE and OMP_CLAUSE_DESTROY. (scan_omp_1_stmt): Handle GIMPLE_OMP_INTEROP. (lower_omp_interop_action_clauses): New function. (lower_omp_interop): Likewise. (lower_omp_1): Handle GIMPLE_OMP_INTEROP. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_clause_destroy): Make addressable. (c_parser_omp_clause_init): Make addressable. gcc/cp/ChangeLog: * parser.cc (cp_parser_omp_clause_init): Make addressable. gcc/fortran/ChangeLog: * trans-openmp.cc (gfc_trans_omp_clauses): Make OMP_CLAUSE_DESTROY and OMP_CLAUSE_INIT addressable. * types.def (BT_FN_VOID_INT_INT_PTR_PTR_PTR_INT_PTR_INT_PTR_UINT_PTR): New. include/ChangeLog: * gomp-constants.h (GOMP_DEVICE_DEFAULT_OMP_61, GOMP_INTEROP_TARGET, GOMP_INTEROP_TARGETSYNC, GOMP_INTEROP_FLAG_NOWAIT): Define. libgomp/ChangeLog: * icv-device.c (omp_set_default_device): Check GOMP_DEVICE_DEFAULT_OMP_61. * libgomp-plugin.h (struct interop_obj_t): New. (enum gomp_interop_flag): New. (GOMP_OFFLOAD_interop): Declare. (GOMP_OFFLOAD_get_interop_int): Declare. (GOMP_OFFLOAD_get_interop_ptr): Declare. (GOMP_OFFLOAD_get_interop_str): Declare. (GOMP_OFFLOAD_get_interop_type_desc): Declare. * libgomp.h (_LIBGOMP_OMP_LOCK_DEFINED): Define. (struct gomp_device_descr): Add interop_func, get_interop_int_func, get_interop_ptr_func, get_interop_str_func, get_interop_type_desc_func. * libgomp.map: Add GOMP_interop. * libgomp_g.h (GOMP_interop): Declare. * target.c (resolve_device): Handle GOMP_DEVICE_DEFAULT_OMP_61. (omp_get_interop_int): Replace stub with actual implementation. (omp_get_interop_ptr): Likewise. (omp_get_interop_str): Likewise. (omp_get_interop_type_desc): Likewise. (struct interop_data_t): Define. (gomp_interop_internal): New function. (GOMP_interop): Likewise. (gomp_load_plugin_for_device): Load symbols for get_interop_int, get_interop_ptr, get_interop_str and get_interop_type_desc. * testsuite/libgomp.c-c++-common/interop-1.c: New test. gcc/testsuite/ChangeLog: * c-c++-common/gomp/interop-1.c: Remove dg-prune-output "sorry". * c-c++-common/gomp/interop-2.c: Likewise. * c-c++-common/gomp/interop-3.c: Likewise. * c-c++-common/gomp/interop-4.c: Remove dg-message "not supported". * g++.dg/gomp/interop-5.C: Likewise. * gfortran.dg/gomp/interop-4.f90: Likewise. * c-c++-common/gomp/interop-5.c: New test. * gfortran.dg/gomp/interop-5.f90: New test. Co-authored-by: Tobias Burnus <tburnus@baylibre.com>
2025-03-11OpenMP/C: Store location in cp_parser_omp_var_list for kind=0 [PR118579]Sandra Loosemore1-0/+25
This patch is the C equivalent of commit r15-6512-gcf94ba812ca496 for C++, to improve the location information for individual items in an OpenMP variable list. gcc/c/ChangeLog PR c/118579 * c-parser.cc (c_parser_omp_variable_list): Capture location information when KIND is OMP_CLAUSE_ERROR. (c_parser_oacc_data_clause_deviceptr): Use the improved location for diagnostics, and remove the FIXME. (c_finish_omp_declare_variant): Likewise. (c_parser_omp_threadprivate): Likewise. gcc/testsuite/ChangeLog PR c/118579 * c-c++-common/gomp/pr118579.c: New testcase.
2025-03-09OpenMP: Integrate dynamic selectors with dispatch argument handling [PR118457]Sandra Loosemore4-39/+109
Support for dynamic selectors in "declare variant" was developed in parallel with support for the adjust_args/append_args clauses and the dispatch construct; they collided in a bad way. This patch fixes the "sorry" for calls that need both by removing the adjust_args/append_args code from gimplify_call_expr and invoking it from the new variant substitution code instead. It's handled as a tree -> tree transformation rather than tree -> gimple because eventually this code may end up being invoked from the front ends instead of the gimplifier (see PR115076). gcc/ChangeLog PR middle-end/118457 * gimplify.cc (modify_call_for_omp_dispatch): New, containing code split from gimplify_call_expr and modified to emit tree instead of gimple. Remove the error for falling through to a call to the base function. (expand_variant_call_expr): New, split from gimplify_variant_call_expr. Call modify_call_for_omp_dispatch on calls to variants in a dispatch construct context. (gimplify_variant_call_expr): Make it call expand_variant_call_expr to do the actual work. (gimplify_call_expr): Remove sorry for calls involving both dynamic/late selectors and adjust_args/append_args, and adjust for new interface. Move adjust_args/append_args code to modify_call_for_omp_dispatch. (gimplify_omp_dispatch): Add some comments. gcc/testsuite/ChangeLog PR middle-end/118457 * c-c++-common/gomp/adjust-args-6.c: Remove xfails and adjust expected output. * c-c++-common/gomp/append-args-5.c: Adjust expected output. * c-c++-common/gomp/append-args-dynamic.c: New. * c-c++-common/gomp/dispatch-11.c: Adjust expected output. * gfortran.dg/gomp/dispatch-11.f90: Likewise.
2025-02-25openmp: Mark OpenMP atomic write expression as read [PR119000]Jakub Jelinek1-0/+16
The following testcase was emitting false positive warning that the rhs of #pragma omp atomic write was stored but not read, when the atomic actually does read it. The following patch fixes that by calling default_function_array_read_conversion on it, so that it is marked as read as well as converted from lvalue to rvalue. Furthermore, the code had if (code == NOP_EXPR) ... else ... if (code == NOP_EXPR) ... with none of ... parts changing code, so I've merged the two ifs. 2025-02-25 Jakub Jelinek <jakub@redhat.com> PR c/119000 * c-parser.cc (c_parser_omp_atomic): For omp write call default_function_array_read_conversion on the rhs expression. Merge the two adjacent if (code == NOP_EXPR) blocks. * c-c++-common/gomp/pr119000.c: New test.
2025-02-24openmp: Fix diagnostics typo [PR118993]Jakub Jelinek1-4/+4
There is a typo in one of the OpenMP gimplification diagnostics messages. The following patch fixes that and adjusts tests which just copied that message including typo to dg-warning regexps in 2 tests. 2025-02-24 Jakub Jelinek <jakub@redhat.com> PR middle-end/118993 * gimplify.cc (gimplify_scan_omp_clauses): Fix diagnostics typo, undfined -> undefined. * c-c++-common/gomp/allocate-18.c: Adjust dg-warning regex for diagnostics typo fix. * gfortran.dg/gomp/allocate-clause.f90: Likewise.
2025-02-22Turn test cases into UNSUPPORTED if running into 'sorry, unimplemented: ↵Thomas Schwinge1-1/+0
dynamic stack allocation not supported' In Subversion r217296 (Git commit e2acc079ff125a869159be45371dc0a29b230e92) "Testsuite alloca fixes for ptx", effective-target 'alloca' was added to mark up test cases that run into the nvptx back end's non-support of dynamic stack allocation. (Later, nvptx gained conditional support for that in commit 3861d362ec7e3c50742fc43833fe9d8674f4070e "nvptx: PTX 'alloca' for '-mptx=7.3'+, '-march=sm_52'+ [PR65181]", but on the other hand, in commit f93a612fc4567652b75ffc916d31a446378e6613 "bpf: liberate R9 for general register allocation", the BPF back end joined "the list of targets that do not support alloca in target-support.exp". Manually maintaining the list of test cases requiring effective-target 'alloca' is notoriously hard, gets out of date quickly: new test cases added to the test suite may need to be analyzed and annotated, and over time annotations also may need to be removed, in cases where the compiler learns to optimize out 'alloca'/VLA usage, for example. This commit replaces (99 % of) the manual annotations with an automatic scheme: turn test cases into UNSUPPORTED if running into 'sorry, unimplemented: dynamic stack allocation not supported'. gcc/testsuite/ * lib/target-supports.exp (check_effective_target_alloca): Gracefully handle the case that we've not be called (indirectly) from 'dg-test'. * lib/gcc-dg.exp (proc gcc-dg-prune): Turn 'sorry, unimplemented: dynamic stack allocation not supported' into UNSUPPORTED. * c-c++-common/Walloca-larger-than.c: Don't 'dg-require-effective-target alloca'. * c-c++-common/Warray-bounds-9.c: Likewise. * c-c++-common/Warray-bounds.c: Likewise. * c-c++-common/Wdangling-pointer-2.c: Likewise. * c-c++-common/Wdangling-pointer-4.c: Likewise. * c-c++-common/Wdangling-pointer-5.c: Likewise. * c-c++-common/Wdangling-pointer.c: Likewise. * c-c++-common/Wimplicit-fallthrough-7.c: Likewise. * c-c++-common/Wsizeof-pointer-memaccess1.c: Likewise. * c-c++-common/Wsizeof-pointer-memaccess2.c: Likewise. * c-c++-common/Wstringop-truncation.c: Likewise. * c-c++-common/Wunused-var-6.c: Likewise. * c-c++-common/Wunused-var-8.c: Likewise. * c-c++-common/analyzer/alloca-leak.c: Likewise. * c-c++-common/analyzer/allocation-size-multiline-2.c: Likewise. * c-c++-common/analyzer/allocation-size-multiline-3.c: Likewise. * c-c++-common/analyzer/capacity-1.c: Likewise. * c-c++-common/analyzer/capacity-3.c: Likewise. * c-c++-common/analyzer/imprecise-floating-point-1.c: Likewise. * c-c++-common/analyzer/infinite-recursion-alloca.c: Likewise. * c-c++-common/analyzer/malloc-callbacks.c: Likewise. * c-c++-common/analyzer/malloc-paths-8.c: Likewise. * c-c++-common/analyzer/out-of-bounds-5.c: Likewise. * c-c++-common/analyzer/out-of-bounds-diagram-11.c: Likewise. * c-c++-common/analyzer/uninit-alloca.c: Likewise. * c-c++-common/analyzer/write-to-string-literal-5.c: Likewise. * c-c++-common/asan/alloca_loop_unpoisoning.c: Likewise. * c-c++-common/auto-init-11.c: Likewise. * c-c++-common/auto-init-12.c: Likewise. * c-c++-common/auto-init-15.c: Likewise. * c-c++-common/auto-init-16.c: Likewise. * c-c++-common/builtins.c: Likewise. * c-c++-common/dwarf2/vla1.c: Likewise. * c-c++-common/gomp/pr61486-2.c: Likewise. * c-c++-common/torture/builtin-clear-padding-4.c: Likewise. * c-c++-common/torture/strub-run3.c: Likewise. * c-c++-common/torture/strub-run4.c: Likewise. * c-c++-common/torture/strub-run4c.c: Likewise. * c-c++-common/torture/strub-run4d.c: Likewise. * c-c++-common/torture/strub-run4i.c: Likewise. * g++.dg/Walloca1.C: Likewise. * g++.dg/Walloca2.C: Likewise. * g++.dg/cpp0x/pr70338.C: Likewise. * g++.dg/cpp1y/lambda-generic-vla1.C: Likewise. * g++.dg/cpp1y/vla10.C: Likewise. * g++.dg/cpp1y/vla2.C: Likewise. * g++.dg/cpp1y/vla6.C: Likewise. * g++.dg/cpp1y/vla8.C: Likewise. * g++.dg/debug/debug5.C: Likewise. * g++.dg/debug/debug6.C: Likewise. * g++.dg/debug/pr54828.C: Likewise. * g++.dg/diagnostic/pr70105.C: Likewise. * g++.dg/eh/cleanup5.C: Likewise. * g++.dg/eh/spbp.C: Likewise. * g++.dg/ext/builtin_alloca.C: Likewise. * g++.dg/ext/tmplattr9.C: Likewise. * g++.dg/ext/vla10.C: Likewise. * g++.dg/ext/vla11.C: Likewise. * g++.dg/ext/vla12.C: Likewise. * g++.dg/ext/vla15.C: Likewise. * g++.dg/ext/vla16.C: Likewise. * g++.dg/ext/vla17.C: Likewise. * g++.dg/ext/vla23.C: Likewise. * g++.dg/ext/vla3.C: Likewise. * g++.dg/ext/vla6.C: Likewise. * g++.dg/ext/vla7.C: Likewise. * g++.dg/init/array24.C: Likewise. * g++.dg/init/new47.C: Likewise. * g++.dg/init/pr55497.C: Likewise. * g++.dg/opt/pr78201.C: Likewise. * g++.dg/template/vla2.C: Likewise. * g++.dg/torture/Wsizeof-pointer-memaccess1.C: Likewise. * g++.dg/torture/Wsizeof-pointer-memaccess2.C: Likewise. * g++.dg/torture/pr62127.C: Likewise. * g++.dg/torture/pr67055.C: Likewise. * g++.dg/torture/stackalign/eh-alloca-1.C: Likewise. * g++.dg/torture/stackalign/eh-inline-2.C: Likewise. * g++.dg/torture/stackalign/eh-vararg-1.C: Likewise. * g++.dg/torture/stackalign/eh-vararg-2.C: Likewise. * g++.dg/warn/Wplacement-new-size-5.C: Likewise. * g++.dg/warn/Wsizeof-pointer-memaccess-1.C: Likewise. * g++.dg/warn/Wvla-1.C: Likewise. * g++.dg/warn/Wvla-3.C: Likewise. * g++.old-deja/g++.ext/array2.C: Likewise. * g++.old-deja/g++.ext/constructor.C: Likewise. * g++.old-deja/g++.law/builtin1.C: Likewise. * g++.old-deja/g++.other/crash12.C: Likewise. * g++.old-deja/g++.other/eh3.C: Likewise. * g++.old-deja/g++.pt/array6.C: Likewise. * g++.old-deja/g++.pt/dynarray.C: Likewise. * gcc.c-torture/compile/20000923-1.c: Likewise. * gcc.c-torture/compile/20030224-1.c: Likewise. * gcc.c-torture/compile/20071108-1.c: Likewise. * gcc.c-torture/compile/20071117-1.c: Likewise. * gcc.c-torture/compile/900313-1.c: Likewise. * gcc.c-torture/compile/parms.c: Likewise. * gcc.c-torture/compile/pr17397.c: Likewise. * gcc.c-torture/compile/pr35006.c: Likewise. * gcc.c-torture/compile/pr42956.c: Likewise. * gcc.c-torture/compile/pr51354.c: Likewise. * gcc.c-torture/compile/pr52714.c: Likewise. * gcc.c-torture/compile/pr55851.c: Likewise. * gcc.c-torture/compile/pr77754-1.c: Likewise. * gcc.c-torture/compile/pr77754-2.c: Likewise. * gcc.c-torture/compile/pr77754-3.c: Likewise. * gcc.c-torture/compile/pr77754-4.c: Likewise. * gcc.c-torture/compile/pr77754-5.c: Likewise. * gcc.c-torture/compile/pr77754-6.c: Likewise. * gcc.c-torture/compile/pr78439.c: Likewise. * gcc.c-torture/compile/pr79413.c: Likewise. * gcc.c-torture/compile/pr82564.c: Likewise. * gcc.c-torture/compile/pr87110.c: Likewise. * gcc.c-torture/compile/pr99787-1.c: Likewise. * gcc.c-torture/compile/vla-const-1.c: Likewise. * gcc.c-torture/compile/vla-const-2.c: Likewise. * gcc.c-torture/execute/20010209-1.c: Likewise. * gcc.c-torture/execute/20020314-1.c: Likewise. * gcc.c-torture/execute/20020412-1.c: Likewise. * gcc.c-torture/execute/20021113-1.c: Likewise. * gcc.c-torture/execute/20040223-1.c: Likewise. * gcc.c-torture/execute/20040308-1.c: Likewise. * gcc.c-torture/execute/20040811-1.c: Likewise. * gcc.c-torture/execute/20070824-1.c: Likewise. * gcc.c-torture/execute/20070919-1.c: Likewise. * gcc.c-torture/execute/built-in-setjmp.c: Likewise. * gcc.c-torture/execute/pr22061-1.c: Likewise. * gcc.c-torture/execute/pr43220.c: Likewise. * gcc.c-torture/execute/pr82210.c: Likewise. * gcc.c-torture/execute/pr86528.c: Likewise. * gcc.c-torture/execute/vla-dealloc-1.c: Likewise. * gcc.dg/20001012-2.c: Likewise. * gcc.dg/20020415-1.c: Likewise. * gcc.dg/20030331-2.c: Likewise. * gcc.dg/20101010-1.c: Likewise. * gcc.dg/Walloca-1.c: Likewise. * gcc.dg/Walloca-10.c: Likewise. * gcc.dg/Walloca-11.c: Likewise. * gcc.dg/Walloca-12.c: Likewise. * gcc.dg/Walloca-13.c: Likewise. * gcc.dg/Walloca-14.c: Likewise. * gcc.dg/Walloca-15.c: Likewise. * gcc.dg/Walloca-2.c: Likewise. * gcc.dg/Walloca-3.c: Likewise. * gcc.dg/Walloca-4.c: Likewise. * gcc.dg/Walloca-5.c: Likewise. * gcc.dg/Walloca-6.c: Likewise. * gcc.dg/Walloca-7.c: Likewise. * gcc.dg/Walloca-8.c: Likewise. * gcc.dg/Walloca-9.c: Likewise. * gcc.dg/Walloca-larger-than-2.c: Likewise. * gcc.dg/Walloca-larger-than-3.c: Likewise. * gcc.dg/Walloca-larger-than-4.c: Likewise. * gcc.dg/Walloca-larger-than.c: Likewise. * gcc.dg/Warray-bounds-22.c: Likewise. * gcc.dg/Warray-bounds-41.c: Likewise. * gcc.dg/Warray-bounds-46.c: Likewise. * gcc.dg/Warray-bounds-48-novec.c: Likewise. * gcc.dg/Warray-bounds-48.c: Likewise. * gcc.dg/Warray-bounds-50.c: Likewise. * gcc.dg/Warray-bounds-63.c: Likewise. * gcc.dg/Warray-bounds-66.c: Likewise. * gcc.dg/Wdangling-pointer.c: Likewise. * gcc.dg/Wfree-nonheap-object-2.c: Likewise. * gcc.dg/Wfree-nonheap-object.c: Likewise. * gcc.dg/Wrestrict-17.c: Likewise. * gcc.dg/Wrestrict.c: Likewise. * gcc.dg/Wreturn-local-addr-2.c: Likewise. * gcc.dg/Wreturn-local-addr-3.c: Likewise. * gcc.dg/Wreturn-local-addr-4.c: Likewise. * gcc.dg/Wreturn-local-addr-6.c: Likewise. * gcc.dg/Wsizeof-pointer-memaccess1.c: Likewise. * gcc.dg/Wstack-usage.c: Likewise. * gcc.dg/Wstrict-aliasing-bogus-vla-1.c: Likewise. * gcc.dg/Wstrict-overflow-27.c: Likewise. * gcc.dg/Wstringop-overflow-15.c: Likewise. * gcc.dg/Wstringop-overflow-23.c: Likewise. * gcc.dg/Wstringop-overflow-25.c: Likewise. * gcc.dg/Wstringop-overflow-27.c: Likewise. * gcc.dg/Wstringop-overflow-3.c: Likewise. * gcc.dg/Wstringop-overflow-39.c: Likewise. * gcc.dg/Wstringop-overflow-56.c: Likewise. * gcc.dg/Wstringop-overflow-57.c: Likewise. * gcc.dg/Wstringop-overflow-67.c: Likewise. * gcc.dg/Wstringop-overflow-71.c: Likewise. * gcc.dg/Wstringop-truncation-3.c: Likewise. * gcc.dg/Wvla-larger-than-1.c: Likewise. * gcc.dg/Wvla-larger-than-2.c: Likewise. * gcc.dg/Wvla-larger-than-3.c: Likewise. * gcc.dg/Wvla-larger-than-4.c: Likewise. * gcc.dg/Wvla-larger-than-5.c: Likewise. * gcc.dg/analyzer/boxed-malloc-1.c: Likewise. * gcc.dg/analyzer/call-summaries-2.c: Likewise. * gcc.dg/analyzer/malloc-1.c: Likewise. * gcc.dg/analyzer/malloc-reuse.c: Likewise. * gcc.dg/analyzer/out-of-bounds-diagram-12.c: Likewise. * gcc.dg/analyzer/pr93355-localealias.c: Likewise. * gcc.dg/analyzer/putenv-1.c: Likewise. * gcc.dg/analyzer/taint-alloc-1.c: Likewise. * gcc.dg/analyzer/torture/pr93373.c: Likewise. * gcc.dg/analyzer/torture/ubsan-1.c: Likewise. * gcc.dg/analyzer/vla-1.c: Likewise. * gcc.dg/atomic/stdatomic-vm.c: Likewise. * gcc.dg/attr-alloc_size-6.c: Likewise. * gcc.dg/attr-alloc_size-7.c: Likewise. * gcc.dg/attr-alloc_size-8.c: Likewise. * gcc.dg/attr-alloc_size-9.c: Likewise. * gcc.dg/attr-noipa.c: Likewise. * gcc.dg/auto-init-uninit-36.c: Likewise. * gcc.dg/auto-init-uninit-9.c: Likewise. * gcc.dg/auto-type-1.c: Likewise. * gcc.dg/builtin-alloc-size.c: Likewise. * gcc.dg/builtin-dynamic-alloc-size.c: Likewise. * gcc.dg/builtin-dynamic-object-size-1.c: Likewise. * gcc.dg/builtin-dynamic-object-size-2.c: Likewise. * gcc.dg/builtin-dynamic-object-size-3.c: Likewise. * gcc.dg/builtin-dynamic-object-size-4.c: Likewise. * gcc.dg/builtin-object-size-1.c: Likewise. * gcc.dg/builtin-object-size-2.c: Likewise. * gcc.dg/builtin-object-size-3.c: Likewise. * gcc.dg/builtin-object-size-4.c: Likewise. * gcc.dg/builtins-64.c: Likewise. * gcc.dg/builtins-68.c: Likewise. * gcc.dg/c23-auto-2.c: Likewise. * gcc.dg/c99-const-expr-13.c: Likewise. * gcc.dg/c99-vla-1.c: Likewise. * gcc.dg/fold-alloca-1.c: Likewise. * gcc.dg/gomp/pr30494.c: Likewise. * gcc.dg/gomp/vla-2.c: Likewise. * gcc.dg/gomp/vla-3.c: Likewise. * gcc.dg/gomp/vla-4.c: Likewise. * gcc.dg/gomp/vla-5.c: Likewise. * gcc.dg/graphite/pr99085.c: Likewise. * gcc.dg/guality/guality.c: Likewise. * gcc.dg/lto/pr80778_0.c: Likewise. * gcc.dg/nested-func-10.c: Likewise. * gcc.dg/nested-func-12.c: Likewise. * gcc.dg/nested-func-13.c: Likewise. * gcc.dg/nested-func-14.c: Likewise. * gcc.dg/nested-func-15.c: Likewise. * gcc.dg/nested-func-16.c: Likewise. * gcc.dg/nested-func-17.c: Likewise. * gcc.dg/nested-func-9.c: Likewise. * gcc.dg/packed-vla.c: Likewise. * gcc.dg/pr100225.c: Likewise. * gcc.dg/pr25682.c: Likewise. * gcc.dg/pr27301.c: Likewise. * gcc.dg/pr31507-1.c: Likewise. * gcc.dg/pr33238.c: Likewise. * gcc.dg/pr41470.c: Likewise. * gcc.dg/pr49120.c: Likewise. * gcc.dg/pr50764.c: Likewise. * gcc.dg/pr51491-2.c: Likewise. * gcc.dg/pr51990-2.c: Likewise. * gcc.dg/pr51990.c: Likewise. * gcc.dg/pr59011.c: Likewise. * gcc.dg/pr59523.c: Likewise. * gcc.dg/pr61561.c: Likewise. * gcc.dg/pr78468.c: Likewise. * gcc.dg/pr78902.c: Likewise. * gcc.dg/pr79972.c: Likewise. * gcc.dg/pr82875.c: Likewise. * gcc.dg/pr83844.c: Likewise. * gcc.dg/pr84131.c: Likewise. * gcc.dg/pr87099.c: Likewise. * gcc.dg/pr87320.c: Likewise. * gcc.dg/pr89045.c: Likewise. * gcc.dg/pr91014.c: Likewise. * gcc.dg/pr93986.c: Likewise. * gcc.dg/pr98721-1.c: Likewise. * gcc.dg/pr99122-2.c: Likewise. * gcc.dg/shrink-wrap-alloca.c: Likewise. * gcc.dg/sso-14.c: Likewise. * gcc.dg/strlenopt-62.c: Likewise. * gcc.dg/strlenopt-83.c: Likewise. * gcc.dg/strlenopt-84.c: Likewise. * gcc.dg/strlenopt-91.c: Likewise. * gcc.dg/torture/Wsizeof-pointer-memaccess1.c: Likewise. * gcc.dg/torture/calleesave-sse.c: Likewise. * gcc.dg/torture/pr48953.c: Likewise. * gcc.dg/torture/pr71881.c: Likewise. * gcc.dg/torture/pr71901.c: Likewise. * gcc.dg/torture/pr78742.c: Likewise. * gcc.dg/torture/pr92088-1.c: Likewise. * gcc.dg/torture/pr92088-2.c: Likewise. * gcc.dg/torture/pr93124.c: Likewise. * gcc.dg/torture/pr94479.c: Likewise. * gcc.dg/torture/stackalign/alloca-1.c: Likewise. * gcc.dg/torture/stackalign/inline-2.c: Likewise. * gcc.dg/torture/stackalign/nested-3.c: Likewise. * gcc.dg/torture/stackalign/vararg-1.c: Likewise. * gcc.dg/torture/stackalign/vararg-2.c: Likewise. * gcc.dg/tree-ssa/20030807-2.c: Likewise. * gcc.dg/tree-ssa/20080530.c: Likewise. * gcc.dg/tree-ssa/alias-37.c: Likewise. * gcc.dg/tree-ssa/builtin-sprintf-warn-22.c: Likewise. * gcc.dg/tree-ssa/builtin-sprintf-warn-25.c: Likewise. * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: Likewise. * gcc.dg/tree-ssa/loop-interchange-15.c: Likewise. * gcc.dg/tree-ssa/pr23848-1.c: Likewise. * gcc.dg/tree-ssa/pr23848-2.c: Likewise. * gcc.dg/tree-ssa/pr23848-3.c: Likewise. * gcc.dg/tree-ssa/pr23848-4.c: Likewise. * gcc.dg/uninit-32.c: Likewise. * gcc.dg/uninit-36.c: Likewise. * gcc.dg/uninit-39.c: Likewise. * gcc.dg/uninit-41.c: Likewise. * gcc.dg/uninit-9-O0.c: Likewise. * gcc.dg/uninit-9.c: Likewise. * gcc.dg/uninit-pr100250.c: Likewise. * gcc.dg/uninit-pr101300.c: Likewise. * gcc.dg/uninit-pr101494.c: Likewise. * gcc.dg/uninit-pr98583.c: Likewise. * gcc.dg/vla-2.c: Likewise. * gcc.dg/vla-22.c: Likewise. * gcc.dg/vla-24.c: Likewise. * gcc.dg/vla-3.c: Likewise. * gcc.dg/vla-4.c: Likewise. * gcc.dg/vla-stexp-1.c: Likewise. * gcc.dg/vla-stexp-2.c: Likewise. * gcc.dg/vla-stexp-4.c: Likewise. * gcc.dg/vla-stexp-5.c: Likewise. * gcc.dg/winline-7.c: Likewise. * gcc.target/aarch64/stack-check-alloca-1.c: Likewise. * gcc.target/aarch64/stack-check-alloca-10.c: Likewise. * gcc.target/aarch64/stack-check-alloca-2.c: Likewise. * gcc.target/aarch64/stack-check-alloca-3.c: Likewise. * gcc.target/aarch64/stack-check-alloca-4.c: Likewise. * gcc.target/aarch64/stack-check-alloca-5.c: Likewise. * gcc.target/aarch64/stack-check-alloca-6.c: Likewise. * gcc.target/aarch64/stack-check-alloca-7.c: Likewise. * gcc.target/aarch64/stack-check-alloca-8.c: Likewise. * gcc.target/aarch64/stack-check-alloca-9.c: Likewise. * gcc.target/arc/interrupt-6.c: Likewise. * gcc.target/i386/pr80969-3.c: Likewise. * gcc.target/loongarch/stack-check-alloca-1.c: Likewise. * gcc.target/loongarch/stack-check-alloca-2.c: Likewise. * gcc.target/loongarch/stack-check-alloca-3.c: Likewise. * gcc.target/loongarch/stack-check-alloca-4.c: Likewise. * gcc.target/loongarch/stack-check-alloca-5.c: Likewise. * gcc.target/loongarch/stack-check-alloca-6.c: Likewise. * gcc.target/riscv/stack-check-alloca-1.c: Likewise. * gcc.target/riscv/stack-check-alloca-10.c: Likewise. * gcc.target/riscv/stack-check-alloca-2.c: Likewise. * gcc.target/riscv/stack-check-alloca-3.c: Likewise. * gcc.target/riscv/stack-check-alloca-4.c: Likewise. * gcc.target/riscv/stack-check-alloca-5.c: Likewise. * gcc.target/riscv/stack-check-alloca-6.c: Likewise. * gcc.target/riscv/stack-check-alloca-7.c: Likewise. * gcc.target/riscv/stack-check-alloca-8.c: Likewise. * gcc.target/riscv/stack-check-alloca-9.c: Likewise. * gcc.target/sparc/setjmp-1.c: Likewise. * gcc.target/x86_64/abi/ms-sysv/ms-sysv.c: Likewise. * gcc.c-torture/compile/20001221-1.c: Don't 'dg-skip-if' for '! alloca'. * gcc.c-torture/compile/20020807-1.c: Likewise. * gcc.c-torture/compile/20050801-2.c: Likewise. * gcc.c-torture/compile/920428-4.c: Likewise. * gcc.c-torture/compile/debugvlafunction-1.c: Likewise. * gcc.c-torture/compile/pr41469.c: Likewise. * gcc.c-torture/execute/920721-2.c: Likewise. * gcc.c-torture/execute/920929-1.c: Likewise. * gcc.c-torture/execute/921017-1.c: Likewise. * gcc.c-torture/execute/941202-1.c: Likewise. * gcc.c-torture/execute/align-nest.c: Likewise. * gcc.c-torture/execute/alloca-1.c: Likewise. * gcc.c-torture/execute/pr22061-4.c: Likewise. * gcc.c-torture/execute/pr36321.c: Likewise. * gcc.dg/torture/pr8081.c: Likewise. * gcc.dg/analyzer/data-model-1.c: Don't 'dg-require-effective-target alloca'. XFAIL relevant 'dg-warning's for '! alloca'. * gcc.dg/uninit-38.c: Likewise. * gcc.dg/uninit-pr98578.c: Likewise. * gcc.dg/compat/struct-by-value-22_main.c: Comment on 'dg-require-effective-target alloca'. libstdc++-v3/ * testsuite/lib/prune.exp (proc libstdc++-dg-prune): Turn 'sorry, unimplemented: dynamic stack allocation not supported' into UNSUPPORTED.
2025-01-30OpenMP: append_args clause fixes + Fortran supportTobias Burnus6-10/+266
This fixes a large number of smaller and larger issues with the append_args clause to 'declare variant' and adds Fortran support for it; it also contains a larger number of testcases. In particular, for Fortran, it also handles passing allocatable, pointer, optional arguments to an interop dummy argument with or without value attribute. And it changes the internal representation such that dumping the tree does not lead to an ICE. gcc/c/ChangeLog: * c-parser.cc (c_finish_omp_declare_variant): Modify how append_args is saved internally. gcc/cp/ChangeLog: * parser.cc (cp_finish_omp_declare_variant): Modify how append_args is saved internally. * pt.cc (tsubst_attribute): Likewise. (tsubst_omp_clauses): Remove C_ORT_OMP_DECLARE_SIMD from interop handling as no longer called for it. * decl.cc (omp_declare_variant_finalize_one): Update append_args changes; fixes for ADL input. gcc/fortran/ChangeLog: * gfortran.h (gfc_omp_declare_variant): Add append_args_list. * openmp.cc (gfc_parser_omp_clause_init_modifiers): New; splitt of from ... (gfc_match_omp_init): ... here; call it. (gfc_match_omp_declare_variant): Update to handle append_args clause; some syntax handling fixes. * trans-openmp.cc (gfc_trans_omp_declare_variant): Handle append_args clause; add some diagnostic. gcc/ChangeLog: * gimplify.cc (gimplify_call_expr): For OpenMP's append_args clause processed by 'omp dispatch', update for internal-representation changes; fix handling of hidden arguments, add some comments and handle Fortran's value dummy and optional/pointer/allocatable actual args. libgomp/ChangeLog: * libgomp.texi (Impl. Status): Update for accumpulated changes related to 'dispatch' and interop. gcc/testsuite/ChangeLog: * c-c++-common/gomp/append-args-1.c: Update dg-*. * c-c++-common/gomp/append-args-3.c: Likewise. * g++.dg/gomp/append-args-1.C: Likewise. * gfortran.dg/gomp/adjust-args-1.f90: Likewise. * gfortran.dg/gomp/adjust-args-3.f90: Likewise. * gfortran.dg/gomp/declare-variant-2.f90: Likewise. * c-c++-common/gomp/append-args-6.c: New test. * c-c++-common/gomp/append-args-7.c: New test. * c-c++-common/gomp/append-args-8.c: New test. * c-c++-common/gomp/append-args-9.c: New test. * g++.dg/gomp/append-args-4.C: New test. * g++.dg/gomp/append-args-5.C: New test. * g++.dg/gomp/append-args-6.C: New test. * g++.dg/gomp/append-args-7.C: New test. * gcc.dg/gomp/append-args-1.c: New test. * gfortran.dg/gomp/append_args-1.f90: New test. * gfortran.dg/gomp/append_args-2.f90: New test. * gfortran.dg/gomp/append_args-3.f90: New test. * gfortran.dg/gomp/append_args-4.f90: New test.
2025-01-28Clarify 'OMP_CLAUSE_MAP_RUNTIME_IMPLICIT_P' in ↵Thomas Schwinge4-5/+5
'gcc/tree-pretty-print.cc:dump_omp_clause' In commit b7e20480630e3eeb9eed8b3941da3b3f0c22c969 "openmp: Relax handling of implicit map vs. existing device mappings", 'OMP_CLAUSE_MAP_RUNTIME_IMPLICIT_P' was added next to 'OMP_CLAUSE_MAP_IMPLICIT' with comment: "NOTE: this is different than OMP_CLAUSE_MAP_IMPLICIT". However, dumping it as '[implicit]' doesn't exactly help for telling the two apart; make that '[runtime_implicit]'. Also, prepend a space character, similar to how we're doing with other such attributes. gcc/ * tree-pretty-print.cc (dump_omp_clause): Clarify 'OMP_CLAUSE_MAP_RUNTIME_IMPLICIT_P'. gcc/testsuite/ * c-c++-common/gomp/defaultmap-4.c: Adjust. * c-c++-common/gomp/defaultmap-5.c: Likewise. * c-c++-common/gomp/target-implicit-map-1.c: Likewise. * c-c++-common/gomp/target-implicit-map-2.c: Likewise. * gfortran.dg/gomp/defaultmap-8.f90: Likewise. * gfortran.dg/gomp/defaultmap-9.f90: Likewise. * gfortran.dg/gomp/map-subarray.f90: Likewise. * gfortran.dg/gomp/target-enter-exit-data.f90: Likewise.
2025-01-25c: Diagnose ,) at the end of OpenMP clauses [PR118639]Jakub Jelinek1-0/+14
This is something the C++ FE has been diagnosing but C FE only complained if there wasn't an identifier right after opening ( 2025-01-25 Jakub Jelinek <jakub@redhat.com> PR c/118639 * c-parser.cc (c_parser_omp_variable_list): Remove first variable and emit "expected identifier" error regardless of it. * c-c++-common/gomp/pr118639.c: New test. * c-c++-common/goacc/cache-2.c: Remove one xfail for c.
2025-01-17OpenMP: Fix metadirective test failures on x86_64 with -m32Sandra Loosemore2-2/+2
gcc/testsuite/ChangeLog * c-c++-common/gomp/metadirective-device.c: Don't add extra options for target ia32. * c-c++-common/gomp/metadirective-target-device-1.c: Likewise.
2025-01-16OpenMP: Improve error message for invalid directive in "assumes".Sandra Loosemore3-15/+15
gcc/c/ChangeLog * c-parser.cc (c_parser_omp_assumption_clauses): Give a more specific error message for invalid directives vs unknown names. gcc/cp/ChangeLog * parser.cc (cp_parser_omp_assumption_clauses): Give a more specific error message for invalid directives vs unknown names. gcc/fortran/ChangeLog * openmp.cc (gfc_omp_absent_contains_clause): Use an Oxford comma in the message. gcc/testsuite/ChangeLog * c-c++-common/gomp/assume-2.c: Adjust expected diagnostics. * c-c++-common/gomp/assumes-2.c: Likewise. * c-c++-common/gomp/begin-assumes-2.c: Likewise. * gfortran.dg/gomp/allocate-6.f90: Likewise. * gfortran.dg/gomp/assumes-2.f90: Likewise.
2025-01-16OpenMP: Update "declare target"/OpenMP context interactionSandra Loosemore3-8/+8
The code and test case previously implemented the OpenMP 5.0 spec, which said in section 2.3.1: "For functions within a declare target block, the target trait is added to the beginning of the set..." In OpenMP 5.1, this was changed to "For device routines, the target trait is added to the beginning of the set..." In OpenMP 5.2 and TR12, it says: "For procedures that are determined to be target function variants by a declare target directive..." The definition of "device routine" in OpenMP 5.1 is confusing, but certainly the intent of the later versions of the spec is clear that it doesn't just apply to functions within a begin declare target/end declare target block. The only use of the "omp declare target block" function attribute was to support the 5.0 language, so it can be removed. This patch changes the context augmentation to use the "omp declare target" attribute instead. gcc/c-family/ChangeLog * c-attribs.cc (c_common_gnu_attributes): Delete "omp declare target block". gcc/c/ChangeLog * c-decl.cc (c_decl_attributes): Don't add "omp declare target block". gcc/cp/ChangeLog * decl2.cc (cplus_decl_attributes): Don't add "omp declare target block". gcc/ChangeLog * omp-general.cc (omp_complete_construct_context): Check "omp declare target" attribute, not "omp declare target block". gcc/testsuite/ChangeLog * c-c++-common/gomp/declare-target-indirect-2.c : Adjust expected output for removal of "omp declare target block". * c-c++-common/gomp/declare-variant-8.c: Likewise, the variant call to f20 is now resolved differently. * c-c++-common/gomp/reverse-offload-1.c: Adjust expected output. * gfortran.dg/gomp/declare-variant-8.f90: Likewise, both f18 and f20 now resolve to the variant. Delete obsolete comments.
2025-01-16OpenMP: Shared metadirective/dynamic selector tests for C and C++Sandra Loosemore25-0/+1434
gcc/testsuite/ChangeLog * c-c++-common/gomp/adjust-args-6.c: New. * c-c++-common/gomp/attrs-metadirective-1.c: New. * c-c++-common/gomp/attrs-metadirective-2.c: New. * c-c++-common/gomp/attrs-metadirective-3.c: New. * c-c++-common/gomp/attrs-metadirective-4.c: New. * c-c++-common/gomp/attrs-metadirective-5.c: New. * c-c++-common/gomp/attrs-metadirective-6.c: New. * c-c++-common/gomp/attrs-metadirective-7.c: New. * c-c++-common/gomp/attrs-metadirective-8.c: New. * c-c++-common/gomp/declare-variant-arg-exprs.c: New. * c-c++-common/gomp/declare-variant-dynamic-1.c: New. * c-c++-common/gomp/declare-variant-dynamic-2.c: New. * c-c++-common/gomp/metadirective-1.c: New. * c-c++-common/gomp/metadirective-2.c: New. * c-c++-common/gomp/metadirective-3.c: New. * c-c++-common/gomp/metadirective-4.c: New. * c-c++-common/gomp/metadirective-5.c: New. * c-c++-common/gomp/metadirective-6.c: New. * c-c++-common/gomp/metadirective-7.c: New. * c-c++-common/gomp/metadirective-8.c: New. * c-c++-common/gomp/metadirective-construct.c: New. * c-c++-common/gomp/metadirective-device.c: New. * c-c++-common/gomp/metadirective-no-score.c: New. * c-c++-common/gomp/metadirective-target-device-1.c: New. * c-c++-common/gomp/metadirective-target-device-2.c: New. libgomp/ChangeLog * testsuite/libgomp.c-c++-common/metadirective-1.c: New. * testsuite/libgomp.c-c++-common/metadirective-2.c: New. * testsuite/libgomp.c-c++-common/metadirective-3.c: New. * testsuite/libgomp.c-c++-common/metadirective-4.c: New. * testsuite/libgomp.c-c++-common/metadirective-5.c: New. * testsuite/libgomp.c-c++-common/metadirective-late-1.c: New. * testsuite/libgomp.c-c++-common/metadirective-late-2.c: New. * testsuite/libgomp.c-c++-common/metadirective-target-device.c: New. Co-Authored-By: Kwok Cheung Yeung <kcy@codesourcery.com> Co-Authored-By: Sandra Loosemore <sandra@codesourcery.com>
2025-01-16OpenMP: C++ support for metadirectives and dynamic selectors.Sandra Loosemore1-3/+1
Additional shared C/C++ testcases are included in a subsequent patch in this series. gcc/cp/ChangeLog PR middle-end/112779 PR middle-end/113904 * cp-tree.h (struct saved_scope): Add new field x_processing_omp_trait_property_expr. (processing_omp_trait_property_expr): New. * parser.cc (cp_parser_skip_to_end_of_block_or_statement): Add metadirective_p parameter and handle skipping over the parentheses in a "for" statement. (struct omp_metadirective_parse_data): New. (mangle_metadirective_region_label): New. (cp_parser_label_for_labeled_statement): Mangle label names in a metadirective body. (cp_parser_jump_statement): Likewise. (cp_parser_omp_context_selector): Allow arbitrary expressions in device_num and condition properties. (cp_parser_omp_assumption_clauses): Handle C_OMP_DIR_META. (analyze_metadirective_body): New. (cp_parser_omp_metadirective): New. (cp_parser_pragma): Handle PRAGMA_OMP_METADIRECTIVE. * parser.h (struct cp_parser): Add omp_metadirective_state field. * pt.cc (tsubst_omp_context_selector): New. (tsubst_stmt): Handle OMP_METADIRECTIVE. * semantics.cc (finish_id_expression_1): Don't diagnose use of parameter outside function body in dynamic selector expressions here. gcc/testsuite/ PR middle-end/112779 PR middle-end/113904 * c-c++-common/gomp/declare-variant-2.c: Adjust output for C++. * g++.dg/gomp/declare-variant-class-1.C: New. * g++.dg/gomp/declare-variant-class-2.C: New. * g++.dg/gomp/metadirective-template-1.C: New. libgomp/ PR middle-end/112779 PR middle-end/113904 * testsuite/libgomp.c++/metadirective-template-1.C: New. * testsuite/libgomp.c++/metadirective-template-2.C: New. * testsuite/libgomp.c++/metadirective-template-3.C: New. Co-Authored-By: Kwok Cheung Yeung <kcy@codesourcery.com> Co-Authored-By: Sandra Loosemore <sandra@codesourcery.com>
2025-01-16OpenMP: Add C support for metadirectives and dynamic selectors.Sandra Loosemore1-2/+4
Additional shared C/C++ testcases are included in a subsequent patch in this series. gcc/c-family/ChangeLog PR middle-end/112779 PR middle-end/113904 * c-common.h (enum c_omp_directive_kind): Add C_OMP_DIR_META. (c_omp_expand_variant_construct): Declare. * c-gimplify.cc: Include omp-general.h. (genericize_omp_metadirective_stmt): New. (c_genericize_control_stmt): Add case for OMP_METADIRECTIVE. * c-omp.cc (c_omp_directives): Fix entries for metadirective. (c_omp_expand_variant_construct_r): New. (c_omp_expand_variant_construct): New. * c-pragma.cc (omp_pragmas): Add metadirective. * c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_METADIRECTIVE. gcc/c/ChangeLog PR middle-end/112779 PR middle-end/113904 * c-parser.cc (struct c_parser): Add omp_metadirective_state field. (c_parser_skip_to_end_of_block_or_statement): Add metadirective_p parameter and handle skipping over the parentheses in a "for" statement. (struct omp_metadirective_parse_data): New. (mangle_metadirective_region_label): New. (c_parser_label): Mangle label names in a metadirective body. (c_parser_statement_after_labels): Likewise. (c_parser_pragma): Handle PRAGMA_OMP_METADIRECTIVE. (c_parser_omp_context_selector): Allow arbitrary expressions in device_num and condition properties. (c_parser_omp_assumption_clauses): Handle C_OMP_DIR_META. (analyze_metadirective_body): New. (c_parser_omp_metadirective): New. gcc/testsuite/ PR middle-end/112779 * c-c++-common/gomp/declare-variant-2.c: Adjust expected output for C. * gcc.dg/gomp/metadirective-1.c: New. Co-Authored-By: Kwok Cheung Yeung <kcy@codesourcery.com> Co-Authored-By: Sandra Loosemore <sandra@codesourcery.com>
2025-01-14OpenMP: Re-work and extend context selector resolutionSandra Loosemore3-9/+11
This patch reimplements the middle-end support for "declare variant" and extends the resolution mechanism to also handle metadirectives (PR112779). It also adds partial support for dynamic selectors (PR113904) and fixes a selector scoring bug reported as PR114596. I hope this rewrite also improves the engineering aspect of the code, e.g. more comments to explain what it is doing. In most cases, variant constructs can be resolved either in the front end or during gimplification; if the variant with the highest score has a static selector, then only that one is emitted. In the case where it has a dynamic selector, it is resolved into a (possibly nested) if/then/else construct, testing the run-time predicate for each selector sorted by decreasing order of score until a static selector is found. In some cases, notably a variant construct in a "declare simd" function which may or may not expand into a simd clone, it may not be possible to score or sort the variants until later in compilation (the ompdevlow pass). In this case the gimplifier emits a loop containing a switch statement with the variants in arbitrary order and uses the OMP_NEXT_VARIANT tree node as a placeholder to control which variant is tested on each iteration of the loop. It looks something like: switch_var = OMP_NEXT_VARIANT (0, state); loop_label: switch (switch_var) { case 1: if (dynamic_selector_predicate_1) { alternative_1; goto end_label; } else { switch_var = OMP_NEXT_VARIANT (1, state); goto loop_label; } case 2: ... } end_label: Note that when there are no dynamic selectors, the loop is unnecessary and only the switch is emitted. Finally, in the ompdevlow pass, the OMP_NEXT_VARIANT magic cookies are resolved and replaced with constants. When compiling with -O we can expect that the loop and switch will be discarded by subsequent optimizations and replaced with direct jumps between the cases, eventually arriving at code with similar control flow to the early-resolution cases. This approach is somewhat simpler than the one currently used for handling declare variant in that all possible code paths are already included in the output of the gimplifier, so it is not necessary to maintain hidden references or data structures pointing to expansions of not-yet-resolved variant constructs and special logic for passing them through LTO (see PR lto/96680). A possible disadvantage of this expansion strategy is that dead code for unused variants in the switch can remain when compiling without -O. If this turns out to be a critical problem (e.g., an unused case includes calls to functions not available to the linker) perhaps some further processing could be performed by default after ompdevlow to simplify such constructs. In order to make this patch more readable for review purposes, it leaves the existing code for "declare variant" resolution (including the above-mentioned LTO hack) in place, in some cases just ifdef-ing out functions that won't compile due to changed interfaces for dependencies. The next patch in the series will delete all the now-unused code. gcc/ChangeLog PR middle-end/114596 PR middle-end/112779 PR middle-end/113904 * Makefile.in (GTFILES): Move omp-general.h earlier; required because of moving score_wide_int declaration to that file. * cgraph.h (struct cgraph_node): Add has_omp_variant_constructs flag. * cgraphclones.cc (cgraph_node::create_clone): Propagate has_omp_variant_constructs flag. * gimplify.cc (omp_resolved_variant_calls): New. (expand_late_variant_directive): New. (find_supercontext): New. (gimplify_variant_call_expr): New. (gimplify_call_expr): Adjust parameters to make fallback available. Update processing for "declare variant" substitution. (is_gimple_stmt): Add OMP_METADIRECTIVE. (omp_construct_selector_matches): Ifdef out unused function. (omp_get_construct_context): New. (gimplify_omp_dispatch): Replace call to deleted function omp_resolve_declare_variant with equivalent logic. (expand_omp_metadirective): New. (expand_late_variant_directive): New. (gimplify_omp_metadirective): New. (gimplify_expr): Adjust arguments to gimplify_call_expr. Add cases for OMP_METADIRECTIVE, OMP_NEXT_VARIANT, and OMP_TARGET_DEVICE_MATCHES. (gimplify_function_tree): Initialize/clean up omp_resolved_variant_calls. * gimplify.h (omp_construct_selector_matches): Delete declaration. (omp_get_construct_context): Declare. * lto-cgraph.cc (lto_output_node): Write has_omp_variant_constructs. (input_overwrite_node): Read has_omp_variant_constructs. * omp-builtins.def (BUILT_IN_OMP_GET_NUM_DEVICES): New. * omp-expand.cc (expand_omp_taskreg): Propagate has_omp_variant_constructs. (expand_omp_target): Likewise. * omp-general.cc (omp_maybe_offloaded): Add construct_context parameter; use it instead of querying gimplifier state. Add comments. (omp_context_name_list_prop): Do not test lang_GNU_Fortran in offload compiler, just use the string as-is. (expr_uses_parm_decl): New. (omp_check_context_selector): Add metadirective_p parameter. Remove sorry for target_device selector. Add additional checks specific to metadirective or declare variant. (make_omp_metadirective_variant): New. (omp_construct_traits_match): New. (omp_context_selector_matches): Temporarily ifdef out the previous code, and add a new implementation based on the old one with different parameters, some unnecessary loops removed, and code re-indented. (omp_target_device_matches_on_host): New. (resolve_omp_target_device_matches): New. (omp_construct_simd_compare): Support matching of "simdlen" and "aligned" clauses. (omp_context_selector_set_compare): Make static. Adjust call to omp_construct_simd_compare. (score_wide_int): Move declaration to omp-general.h. (omp_selector_is_dynamic): New. (omp_device_num_check): New. (omp_dynamic_cond): New. (omp_context_compute_score): Ifdef out the old version and re-implement with different parameters. (omp_complete_construct_context): New. (omp_resolve_late_declare_variant): Ifdef out. (omp_declare_variant_remove_hook): Likewise. (omp_resolve_declare_variant): Likewise. (sort_variant): New. (omp_get_dynamic_candidates): New. (omp_declare_variant_candidates): New. (omp_metadirective_candidates): New. (omp_early_resolve_metadirective): New. (omp_resolve_variant_construct): New. * omp-general.h (score_wide_int): Moved here from omp-general.cc. (struct omp_variant): New. (make_omp_metadirective_variant): Declare. (omp_construct_traits_to_codes): Delete declaration. (omp_check_context_selector): Adjust parameters. (omp_context_selector_matches): Likewise. (omp_context_selector_set_compare): Delete declaration. (omp_resolve_declare_variant): Likewise. (omp_declare_variant_candidates): Declare. (omp_metadirective_candidates): Declare. (omp_get_dynamic_candidates): Declare. (omp_early_resolve_metadirective): Declare. (omp_resolve_variant_construct): Declare. (omp_dynamic_cond): Declare. * omp-offload.cc (resolve_omp_variant_cookies): New. (execute_omp_device_lower): Call the above function to resolve variant directives. Remove call to omp_resolve_declare_variant. (pass_omp_device_lower::gate): Check has_omp_variant_construct bit. * omp-simd-clone.cc (simd_clone_create): Propagate has_omp_variant_constructs bit. * tree-inline.cc (expand_call_inline): Likewise. (tree_function_versioning): Likewise. gcc/c/ChangeLog PR middle-end/114596 PR middle-end/112779 PR middle-end/113904 * c-parser.cc (c_finish_omp_declare_variant): Update for changes to omp-general.h interfaces. gcc/cp/ChangeLog PR middle-end/114596 PR middle-end/112779 PR middle-end/113904 * decl.cc (omp_declare_variant_finalize_one): Update for changes to omp-general.h interfaces. * parser.cc (cp_finish_omp_declare_variant): Likewise. gcc/fortran/ChangeLog PR middle-end/114596 PR middle-end/112779 PR middle-end/113904 * trans-openmp.cc (gfc_trans_omp_declare_variant): Update for changes to omp-general.h interfaces. gcc/testsuite/ PR middle-end/114596 PR middle-end/112779 PR middle-end/113904 * c-c++-common/gomp/declare-variant-12.c: Adjust expected behavior per PR114596. * c-c++-common/gomp/declare-variant-13.c: Test that this is resolvable after gimplification, not just final resolution. * c-c++-common/gomp/declare-variant-14.c: Tweak testcase to ensure that -O causes dead code to be optimized away. * gfortran.dg/gomp/declare-variant-12.f90: Adjust expected behavior per PR114596. * gfortran.dg/gomp/declare-variant-13.f90: Test that this is resolvable after gimplification, not just final resolution. * gfortran.dg/gomp/declare-variant-14.f90: Tweak testcase to ensure that -O causes dead code to be optimized away. Co-Authored-By: Kwok Cheung Yeung <kcy@codesourcery.com> Co-Authored-By: Sandra Loosemore <sandra@codesourcery.com> Co-Authored-By: Marcel Vollweiler <marcel@codesourcery.com>
2025-01-13Accept commas between clauses in OpenMP declare variantPaul-Antoine Arras1-0/+21
Add support to the Fortran parser for the OpenMP syntax that allows a comma after the directive name and between clauses of declare variant. The C and C++ parsers already support this syntax so only a new test is added. gcc/fortran/ChangeLog: * openmp.cc (gfc_match_omp_declare_variant): Match comma after directive name and between clauses. Emit more useful diagnostics. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/declare-variant-2.f90: Remove error test for a comma after the directive name. Add tests for other invalid syntaxes (extra comma and invalid clause). * c-c++-common/gomp/adjust-args-5.c: New test. * gfortran.dg/gomp/adjust-args-11.f90: New test.
2025-01-09OpenMP: declare variant's append_args + dispatch interop fixesTobias Burnus4-32/+79
For 'omp dispatch interop(obj)', call omp_get_interop_int to obtain the device number. Add new error if no device clause is present if multiple interop-clause list items exist. Update some vars and continue after appending interop args instead of restarting to ensure that adjust_args updates are actually performed. gcc/ChangeLog: * builtin-types.def (BT_FN_PTRMODE_PTR_INT_PTR): Add. * gimplify.cc (gimplify_call_expr): Add error for multiple list items to the OpenMP interop clause if no device clause; continue instead of restarting after append_args handling. (gimplify_omp_dispatch): Extract device number from the single interop-clause list item. * omp-builtins.def (BUILT_IN_OMP_GET_INTEROP_INT): Add. gcc/fortran/ChangeLog: * types.def (BT_FN_PTRMODE_PTR_INT_PTR): Add. gcc/testsuite/ChangeLog: * c-c++-common/gomp/append-args-1.c: Update dg-*. * c-c++-common/gomp/append-args-3.c: Extend testcase. * c-c++-common/gomp/dispatch-11.c: Update dg-*. * c-c++-common/gomp/dispatch-12.c: Update dg-*. * g++.dg/gomp/append-args-1.C: Update dg-*.
2025-01-08OpenMP: Skip declare_variant's append_args it not variant substitutedTobias Burnus2-0/+136
Follow up to r15-6658-gaa688dd6302fd9 that handles the same for declare_variant's adjust_args. gcc/ChangeLog: * gimplify.cc (gimplify_call_expr): Disable variant function's append_args in 'omp dispatch' when invoking the variant directly and not through the base function. gcc/testsuite/ChangeLog: * c-c++-common/gomp/append-args-4.c: New test. * c-c++-common/gomp/append-args-5.c: New test.
2025-01-07Only apply adjust_args in OpenMP dispatch if variant substitution occursPaul-Antoine Arras1-0/+24
This is a followup to 084ea8ad584 OpenMP: middle-end support for dispatch + adjust_args. This patch fixes a bug that caused arguments in an OpenMP dispatch call to be modified even when no variant substitution occurred. gcc/ChangeLog: * gimplify.cc (gimplify_call_expr): Create variable variant_substituted_p to control whether adjust_args applies. gcc/testsuite/ChangeLog: * c-c++-common/gomp/adjust-args-4.c: New test.
2024-12-20AArch64: Disable `omp declare variant' tests for aarch64 [PR96342]Tamar Christina1-8/+5
These tests are x86 specific and shouldn't be run for aarch64. gcc/testsuite/ChangeLog: PR target/96342 * c-c++-common/gomp/declare-variant-14.c: Make i?86 and x86_64 target only test. * gfortran.dg/gomp/declare-variant-14.f90: Likewise.
2024-12-18OpenMP: Add declare variant's 'append_args' clause in C/C++Tobias Burnus6-27/+203
Add the append_args clause of 'declare variant' to C and C++, fix/improve diagnostic for 'interop' clause and 'declare_variant' clauses on the way. Cleanup dispatch handling in gimplify_call_expr a bit and partially handle 'append_args'. (Namely, those parts that do not require libraries calls, i.e. a dispatch construct where the 'device' and 'interop' clause has been specified.) The sorry can be removed once an enum value like omp_ipr_(ompx_gnu_)omp_device_num (cf. OpenMP Spec Issue 4451) has to be added to the runtime side such that omp_get_interop_int returns the device number of an interop object (as passed to dispatch via the interop clause); and a call to GOMP_interop has to be added to create interop objects. Once available, only a very localized change in gimplify_call_expr is required to claim for full support. - And Fortran parsing support. gcc/c-family/ChangeLog: * c-omp.cc (c_omp_interop_t_p): Handle error_mark_node. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_clause_init_modifiers): New; split of from ... (c_parser_omp_clause_init): ... here; call it. (c_finish_omp_declare_variant): Parse 'append_args' clause. (c_parser_omp_clause_interop): Set tree used/read. gcc/cp/ChangeLog: * decl.cc (omp_declare_variant_finalize_one): Handle append_args. * parser.cc (cp_parser_omp_clause_init_modifiers): New; split of from ... (cp_parser_omp_clause_init): ... here; call it. (cp_parser_omp_all_clauses): Replace interop parsing by a call to ... (cp_parser_omp_clause_interop): ... this new function; set tree used/read. (cp_finish_omp_declare_variant): Parse 'append_args' clause. (cp_parser_omp_declare): Update comment. * pt.cc (tsubst_attribute, tsubst_omp_clauses): Handle template substitution also for declare variant's append_args clause, using for 'init' the same code as for interop's init clause. gcc/ChangeLog: * gimplify.cc (gimplify_call_expr): Update for OpenMP's append_args; cleanup of OpenMP's dispatch clause handling. gcc/testsuite/ChangeLog: * c-c++-common/gomp/declare-variant-2.c: Update dg-error msg. * c-c++-common/gomp/dispatch-12.c: Likewise. * c-c++-common/gomp/dispatch-11.c: Likewise and extend a bit. * c-c++-common/gomp/append-args-1.c: New test. * c-c++-common/gomp/append-args-2.c: New test. * c-c++-common/gomp/append-args-3.c: New test. * g++.dg/gomp/append-args-1.C: New test. * g++.dg/gomp/append-args-2.C: New test. * g++.dg/gomp/append-args-3.C: New test.
2024-12-15testsuite: xfail scan-assembler-times in c-c++-common/gomp/unroll-[45].cJohn David Anglin2-2/+2
Count differs on hppa*-*-hpux* due to hpux specific directives. 2024-12-15 John David Anglin <danglin@gcc.gnu.org> gcc/testsuite/ChangeLog: * c-c++-common/gomp/unroll-4.c: xfail scan-assembler-times "dummy" for hppa*-*-hpux*. * c-c++-common/gomp/unroll-5.c: Likewise.
2024-12-12OpenMP: Enable has_device_addr clause for 'dispatch' in C/C++Tobias Burnus1-0/+85
The 'has_device_addr' of 'dispatch' has to be seen in conjunction with the 'need_device_addr' modifier to the 'adjust_args' clause of 'declare variant'. As the latter has not yet been implemented, 'has_device_addr' has no real effect. However, to prepare for 'need_device_addr' and as service to the user: For C, where 'need_device_addr' is not permitted (contrary to C++ and Fortran), a note is output when then the user tries to use it (alongside the existing error that either 'nothing' or 'need_device_ptr' was expected). And, on the ME side, is is lightly handled by diagnosing when - for the same argument - there is a mismatch between the variant's adjust_args 'need_device_ptr' modifier and dispatch having an 'has_device_addr' clause (or likewise for need_device_addr with is_device_ptr) as, according to the spec, those are completely separate. Thus, 'dispatch' will still do the host to device pointer conversion for a 'need_device_ptr' argument, even if it appeared in a 'has_device_addr' clause. gcc/c/ChangeLog: * c-parser.cc (OMP_DISPATCH_CLAUSE_MASK): Add has_device_addr clause. (c_finish_omp_declare_variant): Add an 'inform' telling the user that 'need_device_addr' is invalid for C. gcc/cp/ChangeLog: * parser.cc (OMP_DISPATCH_CLAUSE_MASK): Add has_device_addr clause. gcc/ChangeLog: * gimplify.cc (gimplify_call_expr): When handling OpenMP's dispatch, add diagnostic when there is a ptr vs. addr mismatch between need_device_{addr,ptr} and {is,has}_device_{ptr,addr}, respectively. gcc/testsuite/ChangeLog: * c-c++-common/gomp/adjust-args-3.c: New test. * gcc.dg/gomp/adjust-args-2.c: New test.
2024-12-03OpenMP: 'allocate' directive - fixes for 'alignof' and [[omp::decl]]Tobias Burnus2-8/+8
Fixed a check to permit [[omp::decl(allocate,...)]] parsing in C. Additionaly, we discussed that 'allocate align' should not affect 'alignof' to avoid issues like with: int a; _Alignas(_Alignof(a)) int b; #pragma omp allocate(a) align(128) _Alignas(_Alignof(a)) int c; Thus, the alignment is no longer set in the C and Fortran front ends, but for static variables now in varpool_node::finalize_decl. (For stack variables, the alignment is handled in gimplify_bind_expr.) NOTE: 'omp allocate' is not yet supported in C++. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_allocate): Only check scope if not in_omp_decl_attribute. Remove setting the alignment. gcc/ChangeLog: * cgraphunit.cc (varpool_node::finalize_decl): Set alignment based on OpenMP's 'omp allocate' attribute/directive. gcc/fortran/ChangeLog: * trans-decl.cc (gfc_finish_var_decl): Remove setting the alignment. libgomp/ChangeLog: * libgomp.texi (Memory allocation): Mention (non-)effect of 'align' on _Alignof. * testsuite/libgomp.c/allocate-7.c: New test. gcc/testsuite/ChangeLog: * c-c++-common/gomp/allocate-18.c: Check that alignof is unaffected by 'omp allocate'. * c-c++-common/gomp/allocate-19.c: Likewise.
2024-11-22OpenMP: Add 'interop' clause to 'dispatch' for C/C++Tobias Burnus2-0/+137
Will fail with an error if/as no suitable 'append_args' has been specified, given that 'append_args' is not yet implemented. gcc/c-family/ChangeLog: * c-pragma.h (enum pragma_omp_clause): Add PRAGMA_OMP_CLAUSE_INTEROP. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_clause_interop): New. (c_parser_omp_clause_name, c_parser_omp_all_clauses, c_parser_omp_dispatch_body): Handle 'interop' clause. * c-typeck.cc (c_finish_omp_clauses): Likewise. gcc/cp/ChangeLog: * parser.cc (cp_parser_omp_clause_name, cp_parser_omp_all_clauses, cp_parser_omp_dispatch_body): Handle 'interop' clause. * pt.cc (tsubst_omp_clauses): Likewise. * semantics.cc (finish_omp_clauses): Likewise. gcc/ChangeLog: * gimplify.cc (gimplify_call_expr): Add initial support for dispatch's 'interop' clause. (gimplify_scan_omp_clauses): Handle interop clause. * tree-pretty-print.cc (dump_omp_clause): Likewise. * tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_INTEROP. * tree.cc (omp_clause_num_ops, omp_clause_code_name): Add interop. gcc/testsuite/ChangeLog: * c-c++-common/gomp/dispatch-11.c: New test. * c-c++-common/gomp/dispatch-12.c: New test.
2024-11-22OpenMP: 'interop' construct - add C/C++ parser support, improve Fortran parsingTobias Burnus4-0/+403
Add middle end support for the 'interop' directive and the 'init', 'use', and 'destroy' clauses - but fail with a sorry, unimplemented in gimplify.cc. For Fortran, generate the tree code, update the internal representation, add some more diagnostic checks and update for newer specification changes ('fr' only takes a single value, but it integer expressions are permitted again [like with the old syntax] not only constant identifiers). For C and C++, this patch adds the full parser support for 'interop'. Still missing is actually handling the directive in the middle end and in libgomp. The GOMP_INTEROP_IFR_* internal values have been changed to have space for vendor specific values that are adjacent to the existing values but negative, if needed. gcc/c-family/ChangeLog: * c-common.h (enum c_omp_region_type): Add C_ORT_INTEROP and C_ORT_OMP_INTEROP. (c_omp_interop_t_p): New prototype. * c-omp.cc (c_omp_interop_t_p): Check whether the type is omp_interop_t. (c_omp_directives): Uncomment 'interop'. * c-pragma.cc (omp_pragmas): Add 'interop'. * c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_INTEROP. (enum pragma_omp_clause): Add init, use, and destroy clauses. gcc/c/ChangeLog: * c-parser.cc (INCLUDE_STRING): Define. (c_parser_pragma): Handle 'interop' directive. (c_parser_omp_clause_name): Handle init, use, and destroy clauses. (c_parser_omp_all_clauses): Likewise; use C_ORT_OMP_INTEROP, if 'use' is permitted, for c_finish_omp_clauses. (c_parser_omp_clause_destroy, c_parser_omp_modifier_prefer_type, c_parser_omp_clause_init, c_parser_omp_clause_use, OMP_INTEROP_CLAUSE_MASK, c_parser_omp_interop): New. * c-typeck.cc (c_finish_omp_clauses): Add missing OPT_Wopenmp to a warning; handle new clauses. gcc/cp/ChangeLog: * parser.cc (INCLUDE_STRING): Define. (cp_parser_omp_clause_name): Handle init, use, and destroy clauses. (cp_parser_omp_all_clauses): Likewise; use C_ORT_OMP_INTEROP, if 'use' is permitted, for c_finish_omp_clauses. (cp_parser_omp_modifier_prefer_type, cp_parser_omp_clause_init, OMP_INTEROP_CLAUSE_MASK, cp_parser_omp_interop): New. (cp_parser_pragma): Handle 'interop' directive. * pt.cc (tsubst_omp_clauses): Handle init, use, and destroy clauses. (tsubst_stmt): Handle OMP_INTEROP. * semantics.cc (cp_omp_init_prefer_type_update): New. (finish_omp_clauses): Handle init, use, and destroy clauses and add clause check for 'depend' on 'interop'. gcc/fortran/ChangeLog: * gfortran.h (gfc_omp_namelist): Cleanup interop internal representation. * dump-parse-tree.cc (show_omp_namelist): Update for changed internal representation. * match.cc (gfc_free_omp_namelist): Likewise. * openmp.cc (gfc_match_omp_prefer_type, gfc_match_omp_init): Likewise; also handle some corner cases better and update for newer 6.0 changes related to 'fr'. (resolve_omp_clauses): Add type-check for interop variables. * trans-openmp.cc (gfc_trans_omp_clauses): Handle init, use and destroy clauses. (gfc_trans_openmp_interop): New. (gfc_trans_omp_directive): Call it. gcc/ChangeLog: * gimplify.cc (gimplify_expr): Handle OMP_INTEROP by printing "sorry, uninplemented". * omp-api.h (omp_get_fr_id_from_name): Change return type to 'char'. * omp-general.cc (omp_get_fr_id_from_name): Likewise; return GOMP_INTEROP_IFR_UNKNOWN not 0 if not found. (omp_get_name_from_fr_id): Return "<unknown>" not NULL if not found (used for dumps). * tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_DESTROY, OMP_CLAUSE_USE, and OMP_CLAUSE_INIT. * tree-pretty-print.cc (dump_omp_init_prefer_type): New. (dump_omp_clause): Handle init, use and destroy clauses. (dump_generic_node): Handle interop directive. * tree.cc (omp_clause_num_ops, omp_clause_code_name): Add new init/use/destroy clauses. * tree.def (OACC_LOOP): Fix comment. (OMP_INTEROP): Add. * tree.h (OMP_INTEROP_CLAUSES, OMP_CLAUSE_INIT_TARGET, OMP_CLAUSE_INIT_TARGETSYNC, OMP_CLAUSE_INIT_PREFER_TYPE): New. include/ChangeLog: * gomp-constants.h (GOMP_INTEROP_IFR_NONE): Rename ... (GOMP_INTEROP_IFR_UNKNOWN): ... to this. And change value. (GOMP_INTEROP_IFR_SEPARATOR): Likewise. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/interop-1.f90: Update for parser changes, spec changes and add new tests. * gfortran.dg/gomp/interop-2.f90: Likewise. * gfortran.dg/gomp/interop-3.f90: Likewise. * c-c++-common/gomp/interop-1.c: New test. * c-c++-common/gomp/interop-2.c: New test. * c-c++-common/gomp/interop-3.c: New test. * c-c++-common/gomp/interop-4.c: New test. * g++.dg/gomp/interop-5.C: New test. * gfortran.dg/gomp/interop-4.f90: New test.
2024-11-20OpenMP: common C/C++ testcases for dispatch + adjust_argsPaul-Antoine Arras14-2/+387
gcc/testsuite/ChangeLog: * c-c++-common/gomp/declare-variant-2.c: Adjust dg-error directives. * c-c++-common/gomp/adjust-args-1.c: New test. * c-c++-common/gomp/adjust-args-2.c: New test. * c-c++-common/gomp/declare-variant-dup-match-clause.c: New test. * c-c++-common/gomp/dispatch-1.c: New test. * c-c++-common/gomp/dispatch-2.c: New test. * c-c++-common/gomp/dispatch-3.c: New test. * c-c++-common/gomp/dispatch-4.c: New test. * c-c++-common/gomp/dispatch-5.c: New test. * c-c++-common/gomp/dispatch-6.c: New test. * c-c++-common/gomp/dispatch-7.c: New test. * c-c++-common/gomp/dispatch-8.c: New test. * c-c++-common/gomp/dispatch-9.c: New test. * c-c++-common/gomp/dispatch-10.c: New test. libgomp/ChangeLog: * testsuite/libgomp.c-c++-common/dispatch-1.c: New test. * testsuite/libgomp.c-c++-common/dispatch-2.c: New test.
2024-10-07OpenMP: Allocate directive for static vars, clean upTobias Burnus3-20/+151
For the 'allocate' directive, remove the sorry for static variables and just keep using normal memory, but honor the requested alignment and set a DECL_ATTRIBUTE in case a target may want to make use of this later on. The documentation is updated accordingly. The C diagnostic to check for predefined allocators (req. for static vars) failed to accept GCC's ompx_gnu_... allocator, now fixed. (Fortran was already okay; but both now use new common #defined value for checking.) And while Fortran common block variables are still rejected, the check has been improved as before the sorry diagnostic did not work for common blocks in modules. Finally, for 'allocate' clause on the target/task/taskloop directives, there is now a warning for omp_thread_mem_alloc (i.e. predefined allocator with access = thread), which is undefined behavior according to the OpenMP specification. And, last, testing showed that var decl + static_assert sets TREE_USED but does not produce a statement list in C, which did run into an assert in gimplify. This special case is now also handled. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_allocate): Set alignment for alignof; accept static variables and fix predef allocator check. gcc/fortran/ChangeLog: * openmp.cc (is_predefined_allocator): Use gomp-constants.h consts. * trans-common.cc (translate_common): Reject OpenMP allocate directives. * trans-decl.cc (gfc_finish_var_decl): Handle allocate directive for static variables. (gfc_trans_deferred_vars): Update for the latter. gcc/ChangeLog: * gimplify.cc (gimplify_bind_expr): Fix corner case for OpenMP allocate directive. (gimplify_scan_omp_clauses): Warn if omp_thread_mem_alloc is used as allocator with the target/task/taskloop directive. include/ChangeLog: * gomp-constants.h (GOMP_OMP_PREDEF_ALLOC_MAX, GOMP_OMPX_PREDEF_ALLOC_MIN, GOMP_OMPX_PREDEF_ALLOC_MAX, GOMP_OMP_PREDEF_ALLOC_THREADS): New defines. libgomp/ChangeLog: * allocator.c: Add static asserts for news GOMP_OMP{,X}_PREDEF_ALLOC_{MIN,MAX} range values. * libgomp.texi (OpenMP Impl. Status): Allocate directive for static vars is now supported. Refer to PR for allocate clause. (Memory allocation): Update for static vars; minor word tweaking. gcc/testsuite/ChangeLog: * c-c++-common/gomp/allocate-9.c: Update for removed sorry. * gfortran.dg/gomp/allocate-15.f90: Likewise. * gfortran.dg/gomp/allocate-pinned-1.f90: Likewise. * gfortran.dg/gomp/allocate-4.f90: Likewise; add dg-error for previously missing diagnostic. * c-c++-common/gomp/allocate-18.c: New test. * c-c++-common/gomp/allocate-19.c: New test. * gfortran.dg/gomp/allocate-clause.f90: New test. * gfortran.dg/gomp/allocate-static-2.f90: New test. * gfortran.dg/gomp/allocate-static.f90: New test.
2024-09-25OpenMP: Fix testsuite failure on x86 with -m32Sandra Loosemore1-1/+1
The testcase decare-variant-duplicates.c added in commit 96246bff0bcd9e5cdec9e6cf811ee3db4997f6d4 failed on 32-bit x86 because on that target "i386" is defined as a preprocessor macro and cannot be used as an identifier. Fixed by rewriting that test not to do that. gcc/testsuite/ChangeLog * c-c++-common/gomp/declare-variant-duplicates.c: Avoid using "i386" as an identifier.
2024-09-24OpenMP: Check additional restrictions on context selector propertiesSandra Loosemore5-11/+37
TR13 (pre-6.0) of the OpenMP spec says: "Each trait-property may only be specified once in a trait selector other than those in the construct selector set." and "If trait-property any is specified in the kind trait-selector of the device selector set or the target_device selector sets, no other trait-property may be specified in the same selector set." These restrictions (with slightly different wording) date back to OpenMP 5.1, but were not in 5.0 which was the basis for GCC's implementation. This patch adds a diagnostic, adds new testcases, and fixes some older testcases that include now-invalid selectors. gcc/ChangeLog * omp-general.cc (omp_check_context_selector): Reject other properties in the same selector set with kind(any). Also reject duplicate name-list properties. gcc/testsuite/ChangeLog * c-c++-common/gomp/declare-variant-10.c: Fix broken tests. * c-c++-common/gomp/declare-variant-3.c: Likewise. * c-c++-common/gomp/declare-variant-9.c: Likewise. * c-c++-common/gomp/declare-variant-any.c: New. * c-c++-common/gomp/declare-variant-duplicates.c: New. * gfortran.dg/gomp/declare-variant-10.f90: Fix broken tests. * gfortran.dg/gomp/declare-variant-3.f90: Likewise. * gfortran.dg/gomp/declare-variant-9.f90: Likewise. * gfortran.dg/gomp/declare-variant-any.f90: New. * gfortran.dg/gomp/declare-variant-duplicates.f90: New.
2024-09-24OpenMP: Add support for 'self_maps' to the 'require' directiveTobias Burnus3-1/+8
'self_maps' implies 'unified_shared_memory', except that the latter also permits that explicit maps copy data to device memory while self_maps does not. In GCC, currently, both are handled identical. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_requires): Handle self_maps clause. gcc/cp/ChangeLog: * parser.cc (cp_parser_omp_requires): Handle self_maps clause. gcc/fortran/ChangeLog: * gfortran.h (enum gfc_omp_requires_kind): Add OMP_REQ_SELF_MAPS. (gfc_namespace): Enlarge omp_requires bitfield. * module.cc (enum ab_attribute, attr_bits): Add AB_OMP_REQ_SELF_MAPS. (mio_symbol_attribute): Handle it. * openmp.cc (gfc_check_omp_requires, gfc_match_omp_requires): Handle self_maps clause. * parse.cc (gfc_parse_file): Handle self_maps clause. gcc/ChangeLog: * lto-cgraph.cc (output_offload_tables, omp_requires_to_name): Handle self_maps clause. * omp-general.cc (struct omp_ts_info, omp_context_selector_matches): Likewise for the associated trait. * omp-general.h (enum omp_requires): Add OMP_REQUIRES_SELF_MAPS. * omp-selectors.h (enum omp_ts_code): Add OMP_TRAIT_IMPLEMENTATION_SELF_MAPS. include/ChangeLog: * gomp-constants.h (GOMP_REQUIRES_SELF_MAPS): #define. libgomp/ChangeLog: * plugin/plugin-gcn.c (GOMP_OFFLOAD_get_num_devices): Accept self_maps clause. * plugin/plugin-nvptx.c (GOMP_OFFLOAD_get_num_devices): Likewise. * libgomp.texi (TR13 Impl. Status): Set to 'Y'. * target.c (gomp_requires_to_name, GOMP_offload_register_ver, gomp_target_init): Handle self_maps clause. * testsuite/libgomp.fortran/self_maps.f90: New test. gcc/testsuite/ChangeLog: * c-c++-common/gomp/declare-variant-1.c: Add self_maps test. * c-c++-common/gomp/requires-4.c: Likewise. * gfortran.dg/gomp/declare-variant-3.f90: Likewise. * c-c++-common/gomp/requires-2.c: Update dg-error msg. * gfortran.dg/gomp/requires-2.f90: Likewise. * gfortran.dg/gomp/requires-self-maps-aux.f90: New. * gfortran.dg/gomp/requires-self-maps.f90: New.
2024-09-12testsuite: introduce hostedlib effective targetAlexandre Oliva2-0/+3
Several C++ tests fail with --disable-hosted-libstdcxx, whether because stdc++exp gets linked in despite not being built, because standard headers are included but that are unavailable in this mode, or because headers are (mistakenly?) expected to introduce declarations such as for abort, malloc, etc, but in this mode they don't. This patch introduces an effective target for GCC test, equivalent to one that's available in the libstdc++-v3 testsuite, and arranges for all such tests to be skipped when libstdc++-v3 is not hosted. Co-Authored-By: Olivier Hainque <hainque@adacore.com> for gcc/ChangeLog * doc/sourcebuild.texi (hostedlib): New effective target. for gcc/testsuite/ChangeLog * lib/target-supports.exp (check_effective_target_hostedlib): New. * g++.dg/contracts/contracts-access1.C: Skip if !hostedlib because of libstdc++exp. * g++.dg/contracts/contracts-assume3.C: Likewise. * g++.dg/contracts/contracts-assume4.C: Likewise. * g++.dg/contracts/contracts-config1.C: Likewise. * g++.dg/contracts/contracts-constexpr1.C: Likewise. * g++.dg/contracts/contracts-deduced2.C: Likewise. * g++.dg/contracts/contracts-externC.C: Likewise. * g++.dg/contracts/contracts-friend1.C: Likewise. * g++.dg/contracts/contracts-multiline1.C: Likewise. * g++.dg/contracts/contracts-nested-class2.C: Likewise. * g++.dg/contracts/contracts-post2.C: Likewise. * g++.dg/contracts/contracts-post3.C: Likewise. * g++.dg/contracts/contracts-pre2a2.C: Likewise. * g++.dg/contracts/contracts10.C: Likewise. * g++.dg/contracts/contracts18.C: Likewise. * g++.dg/contracts/contracts19.C: Likewise. * g++.dg/contracts/contracts2.C: Likewise. * g++.dg/contracts/contracts24.C: Likewise. * g++.dg/contracts/contracts25.C: Likewise. * g++.dg/contracts/contracts3.C: Likewise. * g++.dg/contracts/contracts4.C: Likewise. * g++.dg/contracts/contracts5.C: Likewise. * g++.dg/contracts/contracts6.C: Likewise. * g++.dg/contracts/contracts7.C: Likewise. * g++.dg/contracts/contracts9.C: Likewise. * g++.dg/contracts/pr110159.C: Likewise. * g++.dg/contracts/pr115434.C: Likewise. Adjust line numbers. * c-c++-common/pr36513-2.c: Skip if !hostedlib because of unavailable headers. * c-c++-common/analyzer/pr93290.c: Likewise. * g++.dg/analyzer/pr93212.C: Likewise. * g++.dg/analyzer/vfunc-2.C: Likewise. * g++.dg/cdce3.C: Likewise. Adjust line numbers. * g++.dg/concepts/expression.C: Likewise. * g++.dg/concepts/fn3.C: Likewise. * g++.dg/concepts/fn9.C: Likewise. * g++.dg/concepts/generic-fn.C: Likewise. * g++.dg/contracts/contracts-assume2.C: Likewise. * g++.dg/contracts/contracts-ignore2.C: Likewise. * g++.dg/contracts/contracts-post7.C: Likewise. * g++.dg/contracts/contracts-pre10.C: Likewise. * g++.dg/contracts/contracts-pre2.C: Likewise. * g++.dg/contracts/contracts-pre3.C: Likewise. * g++.dg/contracts/contracts-pre4.C: Likewise. * g++.dg/contracts/contracts-pre5.C: Likewise. * g++.dg/contracts/contracts-pre7.C: Likewise. * g++.dg/contracts/contracts-pre9.C: Likewise. * g++.dg/contracts/contracts-redecl3.C: Likewise. * g++.dg/contracts/contracts-redecl4.C: Likewise. * g++.dg/contracts/contracts-redecl6.C: Likewise. * g++.dg/contracts/contracts-redecl7.C: Likewise. * g++.dg/contracts/contracts-tmpl-spec1.C: Likewise. * g++.dg/contracts/contracts-tmpl-spec2.C: Likewise. * g++.dg/contracts/contracts-tmpl-spec3.C: Likewise. * g++.dg/contracts/contracts14.C: Likewise. * g++.dg/contracts/contracts15.C: Likewise. * g++.dg/contracts/contracts16.C: Likewise. * g++.dg/contracts/contracts17.C: Likewise. * g++.dg/contracts/contracts22.C: Likewise. * g++.dg/contracts/contracts35.C: Likewise. * g++.dg/coroutines/pr100611.C: Likewise. * g++.dg/coroutines/pr100772-b.C: Likewise. * g++.dg/coroutines/pr101133.C: Likewise. * g++.dg/coroutines/pr101367.C: Likewise. * g++.dg/coroutines/pr101976.C: Likewise. * g++.dg/coroutines/pr102454.C: Likewise. * g++.dg/coroutines/pr104051.C: Likewise. * g++.dg/coroutines/pr110635.C: Likewise. * g++.dg/coroutines/pr110871.C: Likewise. Adjust line numbers. * g++.dg/coroutines/pr110872.C: Likewise. Likewise. * g++.dg/coroutines/pr94288.C: Likewise. * g++.dg/coroutines/pr95520.C: Likewise. * g++.dg/coroutines/pr95736.C: Likewise. * g++.dg/coroutines/pr97587.C: Likewise. * g++.dg/coroutines/pr99576_1.C: Likewise. * g++.dg/coroutines/pr99576_2.C: Likewise. * g++.dg/coroutines/ramp-return-a.C: Likewise. * g++.dg/coroutines/ramp-return-b.C: Likewise. * g++.dg/coroutines/ramp-return-c.C: Likewise. * g++.dg/coroutines/symmetric-transfer-00-basic.C: Likewise. * g++.dg/coroutines/torture/co-await-16-template-traits.C: Likewise. * g++.dg/coroutines/torture/co-ret-15-default-return_void.C: Likewise. * g++.dg/coroutines/torture/co-yield-04-complex-local-state.C: Likewise. * g++.dg/coroutines/torture/extern-c-coroutine.C: Likewise. * g++.dg/coroutines/torture/func-params-08.C: Likewise. * g++.dg/coroutines/torture/func-params-09-awaitable-parms.C: Likewise. * g++.dg/coroutines/torture/local-var-05-awaitable.C: Likewise. * g++.dg/coroutines/torture/pr95615-01.C: Likewise. * g++.dg/coroutines/torture/pr95615-02.C: Likewise. * g++.dg/coroutines/torture/pr95615-03.C: Likewise. * g++.dg/coroutines/torture/pr95615-04.C: Likewise. * g++.dg/coroutines/torture/pr95615-05.C: Likewise. * g++.dg/coroutines/torture/pr98704.C: Likewise. * g++.dg/cpp/pr80005.C: Likewise. * g++.dg/cpp0x/Wliteral-suffix.C: Likewise. * g++.dg/cpp0x/Wpessimizing-move2.C: Likewise. * g++.dg/cpp0x/constexpr-70001-3.C: Likewise. * g++.dg/cpp0x/constexpr-ice16.C: Likewise. * g++.dg/cpp0x/dc5.C: Likewise. * g++.dg/cpp0x/enum35.C: Likewise. * g++.dg/cpp0x/enum36.C: Likewise. * g++.dg/cpp0x/initlist-opt1.C: Likewise. * g++.dg/cpp0x/initlist-vect2.C: Likewise. * g++.dg/cpp0x/initlist13.C: Likewise. * g++.dg/cpp0x/initlist15.C: Likewise. * g++.dg/cpp0x/initlist25.C: Likewise. * g++.dg/cpp0x/initlist54.C: Likewise. * g++.dg/cpp0x/initlist92.C: Likewise. * g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C: Likewise. * g++.dg/cpp0x/lambda/lambda-capture-const-ref.C: Likewise. * g++.dg/cpp0x/lambda/lambda-const-neg.C: Likewise. * g++.dg/cpp0x/lambda/lambda-const.C: Likewise. * g++.dg/cpp0x/lambda/lambda-deduce.C: Likewise. * g++.dg/cpp0x/lambda/lambda-in-class-neg.C: Likewise. * g++.dg/cpp0x/lambda/lambda-in-class.C: Likewise. * g++.dg/cpp0x/lambda/lambda-mixed.C: Likewise. * g++.dg/cpp0x/lambda/lambda-mutable.C: Likewise. * g++.dg/cpp0x/lambda/lambda-nested.C: Likewise. * g++.dg/cpp0x/lambda/lambda-non-const.C: Likewise. * g++.dg/cpp0x/lambda/lambda-nop.C: Likewise. * g++.dg/cpp0x/lambda/lambda-nullptr.C: Likewise. * g++.dg/cpp0x/lambda/lambda-pass.C: Likewise. * g++.dg/cpp0x/lambda/lambda-recursive.C: Likewise. * g++.dg/cpp0x/lambda/lambda-ref-default.C: Likewise. * g++.dg/cpp0x/lambda/lambda-ref.C: Likewise. * g++.dg/cpp0x/nullptr20.C: Likewise. * g++.dg/cpp0x/pr61038.C: Likewise. * g++.dg/cpp0x/rv-trivial-bug.C: Likewise. * g++.dg/cpp0x/udlit-concat-neg.C: Likewise. * g++.dg/cpp0x/udlit-concat.C: Likewise. * g++.dg/cpp0x/udlit-embed-quote.C: Likewise. * g++.dg/cpp0x/udlit-extended-id-1.C: Likewise. * g++.dg/cpp0x/udlit-general.C: Likewise. * g++.dg/cpp0x/udlit-namespace.C: Likewise. * g++.dg/cpp0x/udlit-raw-op.C: Likewise. * g++.dg/cpp0x/udlit-raw-str.C: Likewise. * g++.dg/cpp0x/udlit-resolve-char8_t.C: Likewise. * g++.dg/cpp0x/udlit-resolve.C: Likewise. * g++.dg/cpp0x/udlit-sfinae.C: Likewise. * g++.dg/cpp0x/udlit-string-literal.C: Likewise. * g++.dg/cpp0x/udlit-suffix-neg.C: Likewise. * g++.dg/cpp1y/udlit-userdef-string.C: Likewise. * g++.dg/cpp0x/udlit-template.C: Likewise. * g++.dg/cpp0x/variadic-bind.C: Likewise. * g++.dg/cpp0x/variadic-function.C: Likewise. * g++.dg/cpp0x/variadic-mem_fn.C: Likewise. * g++.dg/cpp0x/variadic-tuple.C: Likewise. * g++.dg/cpp1y/auto-fn45.C: Likewise. * g++.dg/cpp1y/complex_literals1.C: Likewise. * g++.dg/cpp1y/complex_literals1a.C: Likewise. * g++.dg/cpp1y/constexpr-66093.C: Likewise. * g++.dg/cpp1y/constexpr-assert1.C: Likewise. * g++.dg/cpp1y/constexpr-assert2.C: Likewise. * g++.dg/cpp1y/feat-cxx14.C: Likewise. * g++.dg/cpp1y/lambda-generic-69078-2.C: Likewise. * g++.dg/cpp1y/lambda-generic-x.C: Likewise. * g++.dg/cpp1y/lambda-init8.C: Likewise. * g++.dg/cpp1y/new2.C: Likewise. * g++.dg/cpp1y/nsdmi-aggr12.C: Likewise. * g++.dg/cpp1y/pr57640.C: Likewise. * g++.dg/cpp1y/pr77786.C: Likewise. * g++.dg/cpp1y/pr95226.C: Likewise. * g++.dg/cpp1y/udlit-char-template-sfinae.C: Likewise. * g++.dg/cpp1y/udlit-char-template-vs-std-literal-operator.C: Likewise. * g++.dg/cpp1z/class-deduction14.C: Likewise. * g++.dg/cpp1z/constexpr-asm-1.C: Likewise. * g++.dg/cpp1z/constexpr-asm-3.C: Likewise. * g++.dg/cpp1z/decomp37.C: Likewise. * g++.dg/cpp1z/eval-order2.C: Likewise. * g++.dg/cpp1z/feat-cxx1z.C: Likewise. * g++.dg/cpp1z/fold1.C: Likewise. * g++.dg/cpp1z/init-statement6.C: Likewise. * g++.dg/cpp1z/launder3.C: Likewise. * g++.dg/cpp1z/launder4.C: Likewise. * g++.dg/cpp1z/launder5.C: Likewise. * g++.dg/cpp1z/launder6.C: Likewise. * g++.dg/cpp1z/utf8.C: Likewise. * g++.dg/cpp23/ext-floating12.C: Likewise. * g++.dg/cpp23/feat-cxx2b.C: Likewise. * g++.dg/cpp26/constexpr-voidptr1.C: Likewise. * g++.dg/cpp26/feat-cxx26.C: Likewise. * g++.dg/cpp2a/concepts-cmath.C: Likewise. * g++.dg/cpp2a/concepts-explicit-spec1.C: Likewise. * g++.dg/cpp2a/concepts-explicit-spec4.C: Likewise. * g++.dg/cpp2a/concepts-explicit-spec5.C: Likewise. * g++.dg/cpp2a/concepts-memfun.C: Likewise. * g++.dg/cpp2a/concepts-pr67774.C: Likewise. * g++.dg/cpp2a/cond-triv2.C: Likewise. * g++.dg/cpp2a/feat-cxx2a.C: Likewise. * g++.dg/cpp2a/nontype-float1.C: Likewise. * g++.dg/diagnostic/disable.C: Likewise. * g++.dg/diagnostic/missing-header-pr110164.C: Likewise. * g++.dg/diagnostic/pr65923.C: Likewise. * g++.dg/eh/arm-vfp-unwind.C: Likewise. * g++.dg/eh/crossjump1.C: Likewise. * g++.dg/eh/omit-frame-pointer.C: Likewise. * g++.dg/eh/simd-3.C: Likewise. * g++.dg/ext/bases.C: Likewise. * g++.dg/ext/builtin-line1.C: Likewise. * g++.dg/ext/builtin10.C: Likewise. * g++.dg/ext/complex4.C: Likewise. * g++.dg/ext/has_nothrow_assign.C: Likewise. * g++.dg/ext/has_nothrow_assign_odr.C: Likewise. * g++.dg/ext/has_nothrow_constructor.C: Likewise. * g++.dg/ext/has_nothrow_constructor_odr.C: Likewise. * g++.dg/ext/has_nothrow_copy-1.C: Likewise. * g++.dg/ext/has_nothrow_copy-2.C: Likewise. * g++.dg/ext/has_nothrow_copy-3.C: Likewise. * g++.dg/ext/has_nothrow_copy-4.C: Likewise. * g++.dg/ext/has_nothrow_copy-5.C: Likewise. * g++.dg/ext/has_nothrow_copy-6.C: Likewise. * g++.dg/ext/has_nothrow_copy-7.C: Likewise. * g++.dg/ext/has_nothrow_copy_odr.C: Likewise. * g++.dg/ext/has_trivial_assign.C: Likewise. * g++.dg/ext/has_trivial_constructor.C: Likewise. * g++.dg/ext/has_trivial_copy.C: Likewise. * g++.dg/ext/has_trivial_destructor-1.C: Likewise. * g++.dg/ext/has_virtual_destructor.C: Likewise. * g++.dg/ext/is_abstract.C: Likewise. * g++.dg/ext/is_aggregate.C: Likewise. * g++.dg/ext/is_base_of.C: Likewise. * g++.dg/ext/is_class.C: Likewise. * g++.dg/ext/is_convertible2.C: Likewise. * g++.dg/ext/is_empty.C: Likewise. * g++.dg/ext/is_enum.C: Likewise. * g++.dg/ext/is_pod.C: Likewise. * g++.dg/ext/is_polymorphic.C: Likewise. * g++.dg/ext/is_union.C: Likewise. * g++.dg/ext/underlying_type10.C: Likewise. * g++.dg/ext/underlying_type4.C: Likewise. * g++.dg/gcov/gcov-14.C: Likewise. * g++.dg/gcov/gcov-18.C: Likewise. * g++.dg/gcov/pr88045.C: Likewise. * g++.dg/gcov/pr88263-2.C: Likewise. * g++.dg/gcov/pr88263.C: Likewise. * g++.dg/gomp/has_device_addr-non-lvalue-1.C: Likewise. * g++.dg/gomp/ind-base-3.C: Likewise. * g++.dg/gomp/map-assignment-1.C: Likewise. * g++.dg/gomp/map-lvalue-ref-1.C: Likewise. * g++.dg/gomp/map-ptrmem-1.C: Likewise. * g++.dg/gomp/map-ptrmem-2.C: Likewise. * g++.dg/gomp/map-static-cast-lvalue-1.C: Likewise. * g++.dg/gomp/map-ternary-1.C: Likewise. * g++.dg/gomp/member-array-2.C: Likewise. * g++.dg/gomp/pr71910.C: Likewise. * g++.dg/gomp/pr91118-1.C: Likewise. * g++.dg/gomp/sink-2.C: Likewise. * g++.dg/gomp/target-this-3.C: Likewise. * g++.dg/gomp/target-this-4.C: Likewise. * g++.dg/gomp/tile-1.C: Likewise. * g++.dg/gomp/tile-2.C: Likewise. * g++.dg/gomp/unroll-1.C: Likewise. * g++.dg/gomp/unroll-2.C: Likewise. * g++.dg/gomp/unroll-3.C: Likewise. * g++.dg/graphite/id-1.C: Likewise. * g++.dg/graphite/pr42130.C: Likewise. * g++.dg/inherit/virtual8.C: Likewise. * g++.dg/init/array4.C: Likewise. * g++.dg/init/new18.C: Likewise. * g++.dg/init/new39.C: Likewise. * g++.dg/init/new40.C: Likewise. * g++.dg/ipa/devirt-29.C: Likewise. * g++.dg/ipa/pr85549.C: Likewise. * g++.dg/lookup/missing-std-include-3.C: Likewise. * g++.dg/lookup/pr21802.C: Likewise. * g++.dg/lto/20091022-2_0.C: Likewise. * g++.dg/lto/20091219_0.C: Likewise. * g++.dg/lto/pr80287_0.C: Likewise. * g++.dg/lto/pr89358_0.C: Likewise. * g++.dg/lto/pr89358_1.C: Likewise. * g++.dg/modules/binding-1_a.H: Likewise. * g++.dg/modules/binding-1_b.H: Likewise. * g++.dg/modules/contracts-1_a.C: Likewise. * g++.dg/modules/contracts-1_b.C: Likewise. * g++.dg/modules/contracts-2_a.C: Likewise. * g++.dg/modules/contracts-2_b.C: Likewise. * g++.dg/modules/contracts-3_a.C: Likewise. * g++.dg/modules/contracts-3_b.C: Likewise. * g++.dg/modules/contracts-4_a.C: Likewise. * g++.dg/modules/contracts-4_d.C: Likewise. * g++.dg/modules/global-3_a.C: Likewise. * g++.dg/modules/hello-1_a.C: Likewise. * g++.dg/modules/hello-2_a.C: Likewise. * g++.dg/modules/hello-2_b.C: Likewise. * g++.dg/modules/iostream-1_a.H: Likewise. * g++.dg/modules/p1689-2.C: Likewise. * g++.dg/modules/part-5_c.C: Likewise. * g++.dg/modules/pr99023_a.X: Likewise. * g++.dg/modules/pr99166_a.X: Likewise. * g++.dg/modules/pr99166_b.C: Likewise. * g++.dg/modules/pr99425-2_a.X: Likewise. * g++.dg/modules/pr99425-2_b.X: Likewise. * g++.dg/modules/string-1_a.H: Likewise. * g++.dg/modules/string-1_b.C: Likewise. * g++.dg/modules/string-view1.C: Likewise. * g++.dg/modules/xtreme-header-1_a.H: Likewise. * g++.dg/modules/xtreme-header-1_b.C: Likewise. * g++.dg/modules/xtreme-header-2_a.H: Likewise. * g++.dg/modules/xtreme-header-2_b.C: Likewise. * g++.dg/modules/xtreme-header-3_a.H: Likewise. * g++.dg/modules/xtreme-header-3_b.C: Likewise. * g++.dg/modules/xtreme-header-4_a.H: Likewise. * g++.dg/modules/xtreme-header-4_b.C: Likewise. * g++.dg/modules/xtreme-header-5_a.H: Likewise. * g++.dg/modules/xtreme-header-5_b.C: Likewise. * g++.dg/modules/xtreme-header-6_a.H: Likewise. * g++.dg/modules/xtreme-header-6_b.C: Likewise. * g++.dg/modules/xtreme-header-7_a.H: Likewise. * g++.dg/modules/xtreme-header-7_b.C: Likewise. * g++.dg/modules/xtreme-header_a.H: Likewise. * g++.dg/modules/xtreme-header_b.C: Likewise. * g++.dg/modules/xtreme-tr1_a.H: Likewise. * g++.dg/modules/xtreme-tr1_b.C: Likewise. * g++.dg/opt/builtins2.C: Likewise. * g++.dg/opt/dtor4-aux.cc: Likewise. * g++.dg/opt/dtor4.C: Likewise. * g++.dg/opt/nrv17.C: Likewise. * g++.dg/opt/pr102970.C: Likewise. * g++.dg/opt/pr109434.C: Likewise. * g++.dg/opt/pr110879.C: Likewise. * g++.dg/opt/pr15551.C: Likewise. * g++.dg/opt/pr30965.C: Likewise. * g++.dg/opt/pr65074.C: Likewise. * g++.dg/opt/pr66119.C: Likewise. * g++.dg/opt/pr77844.C: Likewise. * g++.dg/opt/pr85393.C: Likewise. * g++.dg/opt/pr94223.C: Likewise. * g++.dg/other/final7.C: Likewise. * g++.dg/other/pr40561.C: Likewise. * g++.dg/parse/lookup1.C: Likewise. * g++.dg/parse/parse5.C: Likewise. * g++.dg/pch/system-1.C: Likewise. * g++.dg/pch/system-1.Hs: Likewise. * g++.dg/pch/system-2.C: Likewise. * g++.dg/pch/system-2.Hs: Likewise. * g++.dg/pr100253.C: Likewise. * g++.dg/pr104547.C: Likewise. * g++.dg/pr107087.C: Likewise. * g++.dg/pr71488.C: Likewise. * g++.dg/pr71655.C: Likewise. * g++.dg/pr79095-3.C: Likewise. * g++.dg/pr83239.C: Likewise. * g++.dg/pr99966.C: Likewise. * g++.dg/rtti/typeid4.C: Likewise. * g++.dg/spellcheck-inttypes.C: Likewise. * g++.dg/template/friend10.C: Likewise. * g++.dg/template/pr69961a.C: Likewise. * g++.dg/template/show-template-tree-3.C: Likewise. * g++.dg/tm/inherit2.C: Likewise. * g++.dg/tm/pr46270.C: Likewise. * g++.dg/torture/alias-1.C: Likewise. * g++.dg/torture/builtin-location.C: Likewise. * g++.dg/torture/pr103669.C: Likewise. * g++.dg/torture/pr104601.C: Likewise. * g++.dg/torture/pr106922.C: Likewise. * g++.dg/torture/pr111019.C: Likewise. * g++.dg/torture/pr33572.C: Likewise. * g++.dg/torture/pr33735.C: Likewise. * g++.dg/torture/pr34099.C: Likewise. * g++.dg/torture/pr39417.C: Likewise. * g++.dg/torture/pr44972.C: Likewise. * g++.dg/torture/pr46364.C: Likewise. * g++.dg/torture/pr49628.C: Likewise. * g++.dg/torture/pr49938.C: Likewise. * g++.dg/torture/pr51903.C: Likewise. * g++.dg/torture/pr54498.C: Likewise. * g++.dg/torture/pr60750.C: Likewise. * g++.dg/torture/pr67600.C: Likewise. * g++.dg/torture/pr82084.C: Likewise. * g++.dg/torture/pr86763.C: Likewise. * g++.dg/torture/pr95493-1.C: Likewise. * g++.dg/tree-ssa/allocator-opt1.C: Likewise. * g++.dg/tree-ssa/copyprop.C: Likewise. * g++.dg/tree-ssa/empty-loop.C: Likewise. * g++.dg/tree-ssa/initlist-opt1.C: Likewise. * g++.dg/tree-ssa/initlist-opt2.C: Likewise. * g++.dg/tree-ssa/initlist-opt3.C: Likewise. * g++.dg/tree-ssa/initlist-opt5.C: Likewise. * g++.dg/tree-ssa/loop-cond-split-1.C: Likewise. * g++.dg/tree-ssa/loop-split-1.C: Likewise. * g++.dg/tree-ssa/pr101839.C: Likewise. * g++.dg/tree-ssa/pr104529.C: Likewise. * g++.dg/tree-ssa/pr109849.C: Likewise. * g++.dg/tree-ssa/pr14703.C: Likewise. * g++.dg/tree-ssa/pr19786.C: Likewise. * g++.dg/tree-ssa/pr46228.C: Likewise. * g++.dg/tree-ssa/pr63841.C: Likewise. * g++.dg/tree-ssa/pr69336.C: Likewise. * g++.dg/tree-ssa/pr78847.C: Likewise. * g++.dg/tree-ssa/pr95638.C: Likewise. * g++.dg/uninit-pr105937.C: Likewise. * g++.dg/vect/pr102421.cc: Likewise. * g++.dg/vect/pr105053.cc: Likewise. * g++.dg/vect/pr33426-ivdep-4.cc: Likewise. * g++.dg/vect/pr64410.cc: Likewise. * g++.dg/vect/slp-pr87105.cc: Likewise. * g++.dg/vect/vect-novector-pragma.cc: Likewise. * g++.dg/warn/Warray-bounds-27.C: Likewise. * g++.dg/warn/Wdangling-pointer-pr110055.C: Likewise. * g++.dg/warn/Wdangling-reference10.C: Likewise. * g++.dg/warn/Wdangling-reference14.C: Likewise. * g++.dg/warn/Wdangling-reference17.C: Likewise. * g++.dg/warn/Wdangling-reference4.C: Likewise. * g++.dg/warn/Wdangling-reference5.C: Likewise. * g++.dg/warn/Wfree-nonheap-object-3.C: Likewise. * g++.dg/warn/Winline-3.C: Likewise. * g++.dg/warn/Wmemset-elt-size1.C: Likewise. * g++.dg/warn/Wparentheses-34.C: Likewise. * g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C: Likewise. * g++.dg/warn/Wstrict-aliasing-bogus-escape.C: Likewise. * g++.dg/warn/Wstringop-overflow-6.C: Likewise. * g++.dg/warn/Wstringop-overflow-8.C: Likewise. * g++.dg/warn/Wstringop-overread-1.C: Likewise. * g++.dg/warn/Wuninitialized-33.C: Likewise. * g++.dg/warn/Wuninitialized-pr111123-1.C: Likewise. * g++.dg/warn/format1.C: Likewise. * g++.dg/warn/huge-val1.C: Likewise. * g++.dg/warn/string1.C: Likewise. * g++.dg/warn/uninit-pr105562.C: Likewise. * g++.old-deja/g++.benjamin/15071.C: Likewise. * g++.old-deja/g++.brendan/copy9.C: Likewise. * g++.old-deja/g++.brendan/crash15.C: Likewise. * g++.old-deja/g++.brendan/crash20.C: Likewise. * g++.old-deja/g++.brendan/crash30.C: Likewise. * g++.old-deja/g++.brendan/crash38.C: Likewise. * g++.old-deja/g++.brendan/crash39.C: Likewise. * g++.old-deja/g++.brendan/crash49.C: Likewise. * g++.old-deja/g++.brendan/crash52.C: Likewise. * g++.old-deja/g++.brendan/crash62.C: Likewise. * g++.old-deja/g++.brendan/cvt1.C: Likewise. * g++.old-deja/g++.brendan/err-msg3.C: Likewise. * g++.old-deja/g++.brendan/nest21.C: Likewise. * g++.old-deja/g++.brendan/ptolemy2.C: Likewise. * g++.old-deja/g++.jason/2371.C: Likewise. * g++.old-deja/g++.jason/template24.C: Likewise. * g++.old-deja/g++.jason/template31.C: Likewise. * g++.old-deja/g++.jason/typeid1.C: Likewise. * g++.old-deja/g++.law/arg1.C: Likewise. * g++.old-deja/g++.law/arg8.C: Likewise. * g++.old-deja/g++.law/arm12.C: Likewise. * g++.old-deja/g++.law/arm9.C: Likewise. * g++.old-deja/g++.law/bad-error7.C: Likewise. * g++.old-deja/g++.law/code-gen5.C: Likewise. * g++.old-deja/g++.law/ctors10.C: Likewise. * g++.old-deja/g++.law/ctors12.C: Likewise. * g++.old-deja/g++.law/ctors13.C: Likewise. * g++.old-deja/g++.law/ctors17.C: Likewise. * g++.old-deja/g++.law/ctors6.C: Likewise. * g++.old-deja/g++.law/cvt16.C: Likewise. * g++.old-deja/g++.law/cvt2.C: Likewise. * g++.old-deja/g++.law/cvt7.C: Likewise. * g++.old-deja/g++.law/except5.C: Likewise. * g++.old-deja/g++.law/missed-error2.C: Likewise. * g++.old-deja/g++.law/nest3.C: Likewise. * g++.old-deja/g++.law/operators32.C: Likewise. * g++.old-deja/g++.law/operators4.C: Likewise. * g++.old-deja/g++.law/vbase1.C: Likewise. * g++.old-deja/g++.law/virtual3.C: Likewise. * g++.old-deja/g++.law/visibility1.C: Likewise. * g++.old-deja/g++.law/visibility10.C: Likewise. * g++.old-deja/g++.law/visibility13.C: Likewise. * g++.old-deja/g++.law/visibility17.C: Likewise. * g++.old-deja/g++.law/visibility2.C: Likewise. * g++.old-deja/g++.law/visibility22.C: Likewise. * g++.old-deja/g++.law/visibility25.C: Likewise. * g++.old-deja/g++.law/visibility7.C: Likewise. * g++.old-deja/g++.law/weak.C: Likewise. * g++.old-deja/g++.martin/new1.C: Likewise. * g++.old-deja/g++.mike/dyncast7.C: Likewise. * g++.old-deja/g++.mike/eh13.C: Likewise. * g++.old-deja/g++.mike/eh2.C: Likewise. * g++.old-deja/g++.mike/net34.C: Likewise. * g++.old-deja/g++.mike/net46.C: Likewise. * g++.old-deja/g++.mike/p658.C: Likewise. * g++.old-deja/g++.mike/rtti1.C: Likewise. * g++.old-deja/g++.ns/using4.C: Likewise. * g++.old-deja/g++.ns/using6.C: Likewise. * g++.old-deja/g++.other/defarg6.C: Likewise. * g++.old-deja/g++.other/headers1.C: Likewise. * g++.old-deja/g++.other/init9.C: Likewise. * g++.old-deja/g++.other/inline14.C: Likewise. * g++.old-deja/g++.other/inline2.C: Likewise. * g++.old-deja/g++.other/inline7.C: Likewise. * g++.old-deja/g++.other/inline8.C: Likewise. * g++.old-deja/g++.other/optimize2.C: Likewise. * g++.old-deja/g++.other/sibcall1.C: Likewise. * g++.old-deja/g++.other/unchanging1.C: Likewise. * g++.old-deja/g++.pt/crash68.C: Likewise. * g++.old-deja/g++.pt/memtemp100.C: Likewise. * g++.old-deja/g++.robertl/eb109.C: Likewise. * g++.old-deja/g++.robertl/eb113.C: Likewise. * g++.old-deja/g++.robertl/eb115.C: Likewise. * g++.old-deja/g++.robertl/eb124.C: Likewise. * g++.old-deja/g++.robertl/eb127.C: Likewise. * g++.old-deja/g++.robertl/eb129.C: Likewise. * g++.old-deja/g++.robertl/eb129a.C: Likewise. * g++.old-deja/g++.robertl/eb130.C: Likewise. * g++.old-deja/g++.robertl/eb132.C: Likewise. * g++.old-deja/g++.robertl/eb15.C: Likewise. * g++.old-deja/g++.robertl/eb21.C: Likewise. * g++.old-deja/g++.robertl/eb24.C: Likewise. * g++.old-deja/g++.robertl/eb27.C: Likewise. * g++.old-deja/g++.robertl/eb28.C: Likewise. * g++.old-deja/g++.robertl/eb29.C: Likewise. * g++.old-deja/g++.robertl/eb3.C: Likewise. * g++.old-deja/g++.robertl/eb30.C: Likewise. * g++.old-deja/g++.robertl/eb31.C: Likewise. * g++.old-deja/g++.robertl/eb33.C: Likewise. * g++.old-deja/g++.robertl/eb36.C: Likewise. * g++.old-deja/g++.robertl/eb39.C: Likewise. * g++.old-deja/g++.robertl/eb4.C: Likewise. * g++.old-deja/g++.robertl/eb41.C: Likewise. * g++.old-deja/g++.robertl/eb43.C: Likewise. * g++.old-deja/g++.robertl/eb44.C: Likewise. * g++.old-deja/g++.robertl/eb46.C: Likewise. * g++.old-deja/g++.robertl/eb54.C: Likewise. * g++.old-deja/g++.robertl/eb55.C: Likewise. * g++.old-deja/g++.robertl/eb59.C: Likewise. * g++.old-deja/g++.robertl/eb60.C: Likewise. * g++.old-deja/g++.robertl/eb62.C: Likewise. * g++.old-deja/g++.robertl/eb66.C: Likewise. * g++.old-deja/g++.robertl/eb7.C: Likewise. * g++.old-deja/g++.robertl/eb73.C: Likewise. * g++.old-deja/g++.robertl/eb77.C: Likewise. * g++.old-deja/g++.robertl/eb79.C: Likewise. * g++.old-deja/g++.warn/iomanip.C: Likewise. * g++.target/i386/pr105638.C: Likewise. * g++.target/i386/pr110170.C: Likewise. * g++.target/i386/pr80566-1.C: Likewise. * g++.target/i386/pr80566-2.C: Likewise. * c-c++-common/analyzer/allocation-size-1.c: Skip if !hostedlib because of unavailable declarations. * c-c++-common/analyzer/allocation-size-2.c: Likewise. * c-c++-common/analyzer/allocation-size-3.c: Likewise. * c-c++-common/analyzer/allocation-size-4.c: Likewise. * c-c++-common/analyzer/analyzer-verbosity-0.c: Likewise. * c-c++-common/analyzer/analyzer-verbosity-1.c: Likewise. * c-c++-common/analyzer/analyzer-verbosity-2.c: Likewise. * c-c++-common/analyzer/analyzer-verbosity-3.c: Likewise. * c-c++-common/analyzer/call-summaries-1.c: Likewise. * c-c++-common/analyzer/call-summaries-malloc.c: Likewise. * c-c++-common/analyzer/callbacks-1.c: Likewise. * c-c++-common/analyzer/callbacks-2.c: Likewise. * c-c++-common/analyzer/capacity-1.c: Likewise. * c-c++-common/analyzer/capacity-2.c: Likewise. * c-c++-common/analyzer/capacity-3.c: Likewise. * c-c++-common/analyzer/compound-assignment-1.c: Likewise. * c-c++-common/analyzer/data-model-14.c: Likewise. * c-c++-common/analyzer/data-model-20.c: Likewise. * c-c++-common/analyzer/data-model-5d.c: Likewise. * c-c++-common/analyzer/disabling.c: Likewise. * c-c++-common/analyzer/dump-state.c: Likewise. * c-c++-common/analyzer/edges-2.c: Likewise. * c-c++-common/analyzer/first-field-2.c: Likewise. * c-c++-common/analyzer/flex-with-call-summaries.c: Likewise. * c-c++-common/analyzer/flex-without-call-summaries.c: Likewise. * c-c++-common/analyzer/flexible-array-member-1.c: Likewise. * c-c++-common/analyzer/function-ptr-2.c: Likewise. * c-c++-common/analyzer/function-ptr-3.c: Likewise. * c-c++-common/analyzer/function-ptr-4.c: Likewise. * c-c++-common/analyzer/gzio.c: Likewise. * c-c++-common/analyzer/imprecise-floating-point-1.c: Likewise. * c-c++-common/analyzer/leak-2.c: Likewise. * c-c++-common/analyzer/leak-3.c: Likewise. * c-c++-common/analyzer/leak-4.c: Likewise. * c-c++-common/analyzer/loop-0-up-to-n-by-1-with-iter-obj.c: Likewise. * c-c++-common/analyzer/loop-3.c: Likewise. * c-c++-common/analyzer/malloc-3.c: Likewise. * c-c++-common/analyzer/malloc-5.c: Likewise. * c-c++-common/analyzer/malloc-CWE-401-example.c: Likewise. * c-c++-common/analyzer/malloc-CWE-415-examples.c: Likewise. * c-c++-common/analyzer/malloc-CWE-416-examples.c: Likewise. * c-c++-common/analyzer/malloc-CWE-590-examples.c: Likewise. * c-c++-common/analyzer/malloc-callbacks.c: Likewise. * c-c++-common/analyzer/malloc-dce.c: Likewise. * c-c++-common/analyzer/malloc-dedupe-1.c: Likewise. * c-c++-common/analyzer/malloc-in-loop.c: Likewise. * c-c++-common/analyzer/malloc-ipa-1.c: Likewise. * c-c++-common/analyzer/malloc-ipa-10.c: Likewise. * c-c++-common/analyzer/malloc-ipa-11.c: Likewise. * c-c++-common/analyzer/malloc-ipa-12.c: Likewise. * c-c++-common/analyzer/malloc-ipa-13a.c: Likewise. * c-c++-common/analyzer/malloc-ipa-2.c: Likewise. * c-c++-common/analyzer/malloc-ipa-3.c: Likewise. * c-c++-common/analyzer/malloc-ipa-4.c: Likewise. * c-c++-common/analyzer/malloc-ipa-5.c: Likewise. * c-c++-common/analyzer/malloc-ipa-6.c: Likewise. * c-c++-common/analyzer/malloc-ipa-7.c: Likewise. * c-c++-common/analyzer/malloc-ipa-9.c: Likewise. * c-c++-common/analyzer/malloc-macro-inline-events.c: Likewise. * c-c++-common/analyzer/malloc-macro-separate-events.c: Likewise. * c-c++-common/analyzer/malloc-many-paths-3.c: Likewise. * c-c++-common/analyzer/malloc-meaning-1.c: Likewise. * c-c++-common/analyzer/malloc-paths-1.c: Likewise. * c-c++-common/analyzer/malloc-paths-2.c: Likewise. * c-c++-common/analyzer/malloc-paths-3.c: Likewise. * c-c++-common/analyzer/malloc-paths-4.c: Likewise. * c-c++-common/analyzer/malloc-paths-5.c: Likewise. * c-c++-common/analyzer/malloc-paths-6.c: Likewise. * c-c++-common/analyzer/malloc-paths-7.c: Likewise. * c-c++-common/analyzer/malloc-paths-8.c: Likewise. * c-c++-common/analyzer/malloc-paths-9-noexcept.c: Likewise. * c-c++-common/analyzer/malloc-sarif-1.c: Likewise. * c-c++-common/analyzer/malloc-vs-local-1a.c: Likewise. * c-c++-common/analyzer/malloc-vs-local-1b.c: Likewise. * c-c++-common/analyzer/malloc-vs-local-2.c: Likewise. * c-c++-common/analyzer/malloc-vs-local-3.c: Likewise. * c-c++-common/analyzer/out-of-bounds-1.c: Likewise. * c-c++-common/analyzer/out-of-bounds-2.c: Likewise. * c-c++-common/analyzer/out-of-bounds-diagram-3.c: Likewise. * c-c++-common/analyzer/out-of-bounds-diagram-8.c: Likewise. * c-c++-common/analyzer/paths-3.c: Likewise. * c-c++-common/analyzer/paths-6.c: Likewise. * c-c++-common/analyzer/paths-7.c: Likewise. * c-c++-common/analyzer/pr103526.c: Likewise. * c-c++-common/analyzer/pr106539.c: Likewise. * c-c++-common/analyzer/pr94399.c: Likewise. * c-c++-common/analyzer/pr94851-1.c: Likewise. * c-c++-common/analyzer/pr94851-2.c: Likewise. * c-c++-common/analyzer/pr94851-4.c: Likewise. * c-c++-common/analyzer/pr97608.c: Likewise. * c-c++-common/analyzer/pr98918.c: Likewise. * c-c++-common/analyzer/pr99716-2.c: Likewise. * c-c++-common/analyzer/pr99716-3.c: Likewise. * c-c++-common/analyzer/pragma-1.c: Likewise. * c-c++-common/analyzer/pragma-2.c: Likewise. * c-c++-common/analyzer/sarif-path-role.c: Likewise. * c-c++-common/analyzer/scope-1.c: Likewise. * c-c++-common/analyzer/strndup-1.c: Likewise. * c-c++-common/analyzer/taint-alloc-3.c: Likewise. * c-c++-common/analyzer/taint-realloc.c: Likewise. * c-c++-common/analyzer/use-after-free-3.c: Likewise. * c-c++-common/analyzer/zlib-4.c: Likewise. * c-c++-common/goacc/kernels-counter-vars-function-scope.c: Likewise. * c-c++-common/goacc/kernels-loop-2.c: Likewise. * c-c++-common/goacc/kernels-loop-3.c: Likewise. * c-c++-common/goacc/kernels-loop-data-2.c: Likewise. * c-c++-common/goacc/kernels-loop-data-enter-exit-2.c: Likewise. * c-c++-common/goacc/kernels-loop-data-enter-exit.c: Likewise. * c-c++-common/goacc/kernels-loop-data-update.c: Likewise. * c-c++-common/goacc/kernels-loop-data.c: Likewise. * c-c++-common/goacc/kernels-loop-g.c: Likewise. * c-c++-common/goacc/kernels-loop-mod-not-zero.c: Likewise. * c-c++-common/goacc/kernels-loop-n.c: Likewise. * c-c++-common/goacc/kernels-loop.c: Likewise. * c-c++-common/goacc/kernels-one-counter-var.c: Likewise. * c-c++-common/goacc/kernels-parallel-loop-data-enter-exit.c: Likewise. * c-c++-common/gomp/pr103642.c: Likewise. * c-c++-common/gomp/target-implicit-map-2.c: Likewise. * c-c++-common/simulate-thread/bitfields-4.c: Likewise. * c-c++-common/tm/malloc.c: Likewise. * g++.dg/abi/mangle36.C: Likewise. * g++.dg/abi/mangle40.C: Likewise. * g++.dg/abi/mangle41.C: Likewise. * g++.dg/analyzer/cstdlib.C: Likewise. * g++.dg/analyzer/fanalyzer-show-events-in-system-headers-default.C: Likewise. * g++.dg/analyzer/fanalyzer-show-events-in-system-headers-no.C: Likewise. * g++.dg/analyzer/fanalyzer-show-events-in-system-headers.C: Likewise. * g++.dg/analyzer/malloc.C: Likewise. * g++.dg/analyzer/new-vs-malloc.C: Likewise. * g++.dg/analyzer/placement-new-size.C: Likewise. * g++.dg/analyzer/vfunc-3.C: Likewise. * g++.dg/analyzer/vfunc-5.C: Likewise. * g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C: Likewise. * g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C: Likewise. * g++.dg/coroutines/pr101765.C: Likewise. * g++.dg/coroutines/pr95477.C: Likewise. * g++.dg/coroutines/pr95599.C: Likewise. * g++.dg/coroutines/pr95711.C: Likewise. * g++.dg/coroutines/torture/alloc-00-gro-on-alloc-fail.C: Likewise. * g++.dg/coroutines/torture/alloc-01-overload-newdel.C: Likewise. * g++.dg/coroutines/torture/alloc-02-fail-new-grooaf-check.C: Likewise. * g++.dg/coroutines/torture/alloc-03-overload-new-1.C: Likewise. * g++.dg/coroutines/torture/alloc-04-overload-del-use-two-args.C: Likewise. * g++.dg/coroutines/torture/call-00-co-aw-arg.C: Likewise. * g++.dg/coroutines/torture/call-01-multiple-co-aw.C: Likewise. * g++.dg/coroutines/torture/call-02-temp-co-aw.C: Likewise. * g++.dg/coroutines/torture/call-03-temp-ref-co-aw.C: Likewise. * g++.dg/coroutines/torture/class-00-co-ret.C: Likewise. * g++.dg/coroutines/torture/class-01-co-ret-parm.C: Likewise. * g++.dg/coroutines/torture/class-02-templ-parm.C: Likewise. * g++.dg/coroutines/torture/class-03-operator-templ-parm.C: Likewise. * g++.dg/coroutines/torture/class-04-lambda-1.C: Likewise. * g++.dg/coroutines/torture/class-05-lambda-capture-copy-local.C: Likewise. * g++.dg/coroutines/torture/class-06-lambda-capture-ref.C: Likewise. * g++.dg/coroutines/torture/class-07-data-member.C: Likewise. * g++.dg/coroutines/torture/co-await-00-trivial.C: Likewise. * g++.dg/coroutines/torture/co-await-01-with-value.C: Likewise. * g++.dg/coroutines/torture/co-await-02-xform.C: Likewise. * g++.dg/coroutines/torture/co-await-03-rhs-op.C: Likewise. * g++.dg/coroutines/torture/co-await-04-control-flow.C: Likewise. * g++.dg/coroutines/torture/co-await-05-loop.C: Likewise. * g++.dg/coroutines/torture/co-await-06-ovl.C: Likewise. * g++.dg/coroutines/torture/co-await-07-tmpl.C: Likewise. * g++.dg/coroutines/torture/co-await-08-cascade.C: Likewise. * g++.dg/coroutines/torture/co-await-09-pair.C: Likewise. * g++.dg/coroutines/torture/co-await-10-template-fn-arg.C: Likewise. * g++.dg/coroutines/torture/co-await-11-forwarding.C: Likewise. * g++.dg/coroutines/torture/co-await-12-operator-2.C: Likewise. * g++.dg/coroutines/torture/co-await-13-return-ref.C: Likewise. * g++.dg/coroutines/torture/co-await-14-return-ref-to-auto.C: Likewise. * g++.dg/coroutines/torture/co-await-15-return-non-triv.C: Likewise. * g++.dg/coroutines/torture/co-await-17-capture-comp-ref.C: Likewise. * g++.dg/coroutines/torture/co-await-18-if-cond.C: Likewise. * g++.dg/coroutines/torture/co-await-19-while-cond.C: Likewise. * g++.dg/coroutines/torture/co-await-20-do-while-cond.C: Likewise. * g++.dg/coroutines/torture/co-await-21-switch-value.C: Likewise. * g++.dg/coroutines/torture/co-await-22-truth-and-of-if.C: Likewise. * g++.dg/coroutines/torture/co-await-24-for-init.C: Likewise. * g++.dg/coroutines/torture/co-await-25-for-condition.C: Likewise. * g++.dg/coroutines/torture/co-await-26-for-iteration-expr.C: Likewise. * g++.dg/coroutines/torture/co-ret-00-void-return-is-ready.C: Likewise. * g++.dg/coroutines/torture/co-ret-01-void-return-is-suspend.C: Likewise. * g++.dg/coroutines/torture/co-ret-03-different-GRO-type.C: Likewise. * g++.dg/coroutines/torture/co-ret-04-GRO-nontriv.C: Likewise. * g++.dg/coroutines/torture/co-ret-05-return-value.C: Likewise. * g++.dg/coroutines/torture/co-ret-06-template-promise-val-1.C: Likewise. * g++.dg/coroutines/torture/co-ret-07-void-cast-expr.C: Likewise. * g++.dg/coroutines/torture/co-ret-08-template-cast-ret.C: Likewise. * g++.dg/coroutines/torture/co-ret-09-bool-await-susp.C: Likewise. * g++.dg/coroutines/torture/co-ret-10-expression-evaluates-once.C: Likewise. * g++.dg/coroutines/torture/co-ret-11-co-ret-co-await.C: Likewise. * g++.dg/coroutines/torture/co-ret-12-co-ret-fun-co-await.C: Likewise. * g++.dg/coroutines/torture/co-ret-13-template-2.C: Likewise. * g++.dg/coroutines/torture/co-ret-14-template-3.C: Likewise. * g++.dg/coroutines/torture/co-ret-16-simple-control-flow.C: Likewise. * g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C: Likewise. * g++.dg/coroutines/torture/co-yield-00-triv.C: Likewise. * g++.dg/coroutines/torture/co-yield-01-multi.C: Likewise. * g++.dg/coroutines/torture/co-yield-02-loop.C: Likewise. * g++.dg/coroutines/torture/co-yield-03-tmpl.C: Likewise. * g++.dg/coroutines/torture/co-yield-03-tmpl-nondependent.C: Likewise. * g++.dg/coroutines/torture/co-yield-05-co-aw.C: Likewise. * g++.dg/coroutines/torture/co-yield-06-fun-parm.C: Likewise. * g++.dg/coroutines/torture/co-yield-07-template-fn-param.C: Likewise. * g++.dg/coroutines/torture/co-yield-08-more-refs.C: Likewise. * g++.dg/coroutines/torture/co-yield-09-more-templ-refs.C: Likewise. * g++.dg/coroutines/torture/exceptions-test-0.C: Likewise. * g++.dg/coroutines/torture/exceptions-test-01-n4849-a.C: Likewise. * g++.dg/coroutines/torture/func-params-00.C: Likewise. * g++.dg/coroutines/torture/func-params-01.C: Likewise. * g++.dg/coroutines/torture/func-params-02.C: Likewise. * g++.dg/coroutines/torture/func-params-03.C: Likewise. * g++.dg/coroutines/torture/func-params-04.C: Likewise. * g++.dg/coroutines/torture/func-params-05.C: Likewise. * g++.dg/coroutines/torture/func-params-06.C: Likewise. * g++.dg/coroutines/torture/func-params-07.C: Likewise. * g++.dg/coroutines/torture/lambda-00-co-ret.C: Likewise. * g++.dg/coroutines/torture/lambda-01-co-ret-parm.C: Likewise. * g++.dg/coroutines/torture/lambda-02-co-yield-values.C: Likewise. * g++.dg/coroutines/torture/lambda-03-auto-parm-1.C: Likewise. * g++.dg/coroutines/torture/lambda-04-templ-parm.C: Likewise. * g++.dg/coroutines/torture/lambda-05-capture-copy-local.C: Likewise. * g++.dg/coroutines/torture/lambda-06-multi-capture.C: Likewise. * g++.dg/coroutines/torture/lambda-07-multi-yield.C: Likewise. * g++.dg/coroutines/torture/lambda-08-co-ret-parm-ref.C: Likewise. * g++.dg/coroutines/torture/lambda-09-init-captures.C: Likewise. * g++.dg/coroutines/torture/lambda-10-mutable.C: Likewise. * g++.dg/coroutines/torture/local-var-00-const.C: Likewise. * g++.dg/coroutines/torture/local-var-01-single.C: Likewise. * g++.dg/coroutines/torture/local-var-02-conditional.C: Likewise. * g++.dg/coroutines/torture/local-var-03-with-awaits.C: Likewise. * g++.dg/coroutines/torture/local-var-04-hiding-nested-scopes.C: Likewise. * g++.dg/coroutines/torture/local-var-06-structured-binding.C: Likewise. * g++.dg/coroutines/torture/mid-suspend-destruction-0.C: Likewise. * g++.dg/coroutines/torture/pr95003.C: Likewise. * g++.dg/coroutines/torture/pr95519-00-return_void.C: Likewise. * g++.dg/coroutines/torture/pr95519-01-initial-suspend.C: Likewise. * g++.dg/coroutines/torture/pr95519-02-final_suspend.C: Likewise. * g++.dg/coroutines/torture/pr95519-03-return-value.C: Likewise. * g++.dg/coroutines/torture/pr95519-04-yield-value.C: Likewise. * g++.dg/coroutines/torture/pr95519-05-gro.C: Likewise. * g++.dg/coroutines/torture/pr95519-06-grooaf.C: Likewise. * g++.dg/coroutines/torture/pr95519-07-unhandled-exception.C: Likewise. * g++.dg/cpp0x/lambda/lambda-std-function.C: Likewise. * g++.dg/cpp0x/lambda/lambda-this8.C: Likewise. * g++.dg/cpp0x/pr70887.C: Likewise. * g++.dg/cpp1y/lambda-generic-variadic2.C: Likewise. * g++.dg/cpp23/subscript5.C: Likewise. * g++.dg/cpp23/subscript6.C: Likewise. * g++.dg/cpp26/constexpr-new2.C: Likewise. * g++.dg/cpp2a/destroying-delete5.C: Likewise. * g++.dg/eh/filter2.C: Likewise. * g++.dg/eh/uncaught1.C: Likewise. * g++.dg/eh/uncaught2.C: Likewise. * g++.dg/expr/anew1.C: Likewise. * g++.dg/expr/anew2.C: Likewise. * g++.dg/expr/anew3.C: Likewise. * g++.dg/expr/anew4.C: Likewise. * g++.dg/ext/cleanup-10.C: Likewise. * g++.dg/ext/cleanup-11.C: Likewise. * g++.dg/ext/cleanup-5.C: Likewise. * g++.dg/ext/cleanup-8.C: Likewise. * g++.dg/ext/cleanup-9.C: Likewise. * g++.dg/ext/is_invocable2.C: Likewise. * g++.dg/goacc/pr107028-2.C: Likewise. * g++.dg/gomp/target-lambda-2.C: Likewise. * g++.dg/init/new11.C: Likewise. * g++.dg/init/value3.C: Likewise. * g++.dg/lto/pr66180_0.C: Likewise. * g++.dg/opt/eh4.C: Likewise. * g++.dg/opt/pr103989.C: Likewise. * g++.dg/opt/pr80385.C: Likewise. * g++.dg/opt/reload3.C: Likewise. * g++.dg/other/i386-1.C: Likewise. * g++.dg/other/i386-11.C: Likewise. * g++.dg/other/i386-2.C: Likewise. * g++.dg/other/i386-3.C: Likewise. * g++.dg/other/i386-4.C: Likewise. * g++.dg/other/i386-7.C: Likewise. * g++.dg/other/i386-8.C: Likewise. * g++.dg/other/mmintrin.C: Likewise. * g++.dg/other/pr34435.C: Likewise. * g++.dg/other/pr40446.C: Likewise. * g++.dg/other/pr49133.C: Likewise. * g++.dg/other/ucnid-1-utf8.C: Likewise. * g++.dg/other/ucnid-1.C: Likewise. * g++.dg/pr80481.C: Likewise. * g++.dg/torture/pr10148.C: Likewise. * g++.dg/torture/pr91334.C: Likewise. * g++.dg/torture/pr91606.C: Likewise. * g++.dg/tree-ssa/pr102216-2.C: Likewise. * g++.dg/vect/slp-pr98855.cc: Likewise. * g++.dg/warn/Wsystem-headers1a.C: Likewise. * g++.dg/warn/noreturn-1.C: Likewise. * g++.old-deja/g++.abi/arraynew.C: Likewise. * g++.old-deja/g++.abi/cxa_vec.C: Likewise. * g++.old-deja/g++.brendan/new3.C: Likewise. * g++.old-deja/g++.eh/new1.C: Likewise. * g++.old-deja/g++.eh/new2.C: Likewise. * g++.old-deja/g++.jason/template44.C: Likewise. * g++.old-deja/g++.law/arm13.C: Likewise. * g++.old-deja/g++.law/scope2.C: Likewise. * g++.old-deja/g++.mike/eh47.C: Likewise. * g++.old-deja/g++.mike/ns15.C: Likewise. * g++.old-deja/g++.mike/p710.C: Likewise. * g++.old-deja/g++.mike/p9706.C: Likewise. * g++.old-deja/g++.oliva/new1.C: Likewise. * g++.old-deja/g++.other/delete8.C: Likewise. * g++.target/i386/avx-pr54700-1.C: Likewise. * g++.target/i386/avx-pr54700-2.C: Likewise. * g++.target/i386/avx2-pr54700-1.C: Likewise. * g++.target/i386/avx2-pr54700-2.C: Likewise. * g++.target/i386/avx512bw-pr96246-2.C: Likewise. * g++.target/i386/avx512vl-pr54700-1a.C: Likewise. * g++.target/i386/avx512vl-pr54700-1b.C: Likewise. * g++.target/i386/avx512vl-pr54700-2a.C: Likewise. * g++.target/i386/avx512vl-pr54700-2b.C: Likewise. * g++.target/i386/avx512vl-pr96246-2.C: Likewise. * g++.target/i386/mvc4.C: Likewise. * g++.target/i386/pr100885.C: Likewise. * g++.target/i386/pr102166.C: Likewise. * g++.target/i386/pr103750-fwprop-1.C: Likewise. * g++.target/i386/pr105593.C: Likewise. * g++.target/i386/pr112443.C: Likewise. * g++.target/i386/pr113560.C: Likewise. * g++.target/i386/pr88152.C: Likewise. * g++.target/i386/pr88998.C: Likewise. * g++.target/i386/pr94046-1.C: Likewise. * g++.target/i386/pr94046-2.C: Likewise. * g++.target/i386/sse4_1-pr54700-1.C: Likewise. * g++.target/i386/sse4_1-pr54700-2.C: Likewise. * g++.dg/tree-ssa/pr20458.C: Skip if !hostedlib because of unavailable library definitions.
2024-07-09c: Rewrite c_parser_omp_tile_sizes to use c_parser_expr_listJakub Jelinek2-6/+6
The following patch simplifies c_parser_omp_tile_sizes to use c_parser_expr_list, so that it will get CPP_EMBED parsing naturally, without having another spot that needs to be adjusted for it. 2024-07-09 Jakub Jelinek <jakub@redhat.com> * c-parser.cc (c_parser_omp_tile_sizes): Use c_parser_expr_list. * c-c++-common/gomp/tile-11.c: Adjust expected diagnostics for c. * c-c++-common/gomp/tile-12.c: Likewise.
2024-06-05openmp: OpenMP loop transformation supportJakub Jelinek49-8/+3072
This patch is largely rewritten version of the https://gcc.gnu.org/pipermail/gcc-patches/2023-October/631764.html patch set which I've promissed to adjust the way I'd like it but didn't get to it until now. The previous series together in diffstat was 176 files changed, 12107 insertions(+), 298 deletions(-) This patch is 197 files changed, 10843 insertions(+), 212 deletions(-) and diff between the old series and new patch is 268 files changed, 8053 insertions(+), 9231 deletions(-) Only the 5.1/5.2 tile/unroll constructs are supported, in various places some preparations for the other 6.0 loop transformations constructs (interchange/reverse/fuse) are done, but certainly not complete and not everywhere. The important difference is that because tile/unroll partial map 1:1 the original loops to generated canonical loops and add another set of generated loops without canonical form inside of it, the tile/unroll partial constructs are terminal for the generated loop, one can't have some loops from the tile or unroll partial and some further loops from inside the body of that construct. The GENERIC representation attempts to match what the standard specifies, so there are separate OMP_TILE and OMP_UNROLL trees. If for a particular loop in a loop nest of some OpenMP loop it awaits a generated loop from a nested loop, or if in OMP_LOOPXFORM_LOWERED OMP_TILE/UNROLL construct a generated loop has been moved to some surrounding construct, that particular loop is represented by all NULL_TREEs in the OMP_FOR_{INIT,COND,INCR,ORIG_DECLS} vector. The lowering of the loop transforming constructs is done at gimplification time, at the start of gimplify_omp_for. I think this way it is more maintainable over magic clauses with various loop depths on the other looping constructs or the magic OMP_LOOP_TRANS construct. Though, I admit I'm still undecided how to represent the OpenMP 6.0 loop transformation case of say: #pragma omp for collapse (4) for (int i = 0; i < 32; ++i) #pragma omp interchange permutation (2, 1) #pragma omp reverse for (int j = 0; j < 32; ++j) #pragma omp reverse for (int k = 0; k < 32; ++k) for (int l = 0; l < 32; ++l) ; Surely the i loop would go to first vector elements of OMP_FOR_* of the work-sharing loop, then 2 loops are expecting generated loops from interchange which would be inside of the body. But the innermost l loop isn't part of the interchange, so the question is where to put it. One possibility is to have it in the 4th loop of the OMP_FOR, another possibility would be to add some artificial construct inside of the OMP_INTERCHANGE and 2 OMP_REVERSE bodies which would contain the inner loop(s), e.g. it could be OMP_INTERCHANGE without permutation clause or some artificial ones or whatever. I've recently raised various unclear things in the 5.1/5.2/TRs versions regarding loop transformations, in particular https://github.com/OpenMP/spec/issues/3908 https://github.com/OpenMP/spec/issues/3909 (sorry, private links unless you have OpenMP membership). Until those are resolved, I have a sorry on trying to mix generated loops with non-rectangular loops (way too many questions need to be answered before that can be done) and similarly for mixing non-perfectly nested loops with generated loops (again, it can be implemented somehow, but is way too unclear). The second issue is mostly about data sharing, which is ambiguous, the patch makes the artificial iterators of the loops effectively private in the associated constructs (more like local), but for user iterators doesn't do anything in particular, so for now one needs to use explicit data sharing clauses on the non-loop transformation OpenMP looping constructs or surrounding parallel/task/target etc. 2024-06-05 Jakub Jelinek <jakub@redhat.com> Frederik Harwath <frederik@codesourcery.com> Sandra Loosemore <sandra@codesourcery.com> gcc/ * tree.def (OMP_TILE, OMP_UNROLL): New tree codes. * tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_PARTIAL, OMP_CLAUSE_FULL and OMP_CLAUSE_SIZES. * tree.h (OMP_LOOPXFORM_CHECK): Define. (OMP_LOOPXFORM_LOWERED): Define. (OMP_CLAUSE_PARTIAL_EXPR): Define. (OMP_CLAUSE_SIZES_LIST): Define. * tree.cc (omp_clause_num_ops, omp_clause_code_name): Add entries for OMP_CLAUSE_{PARTIAL,FULL,SIZES}. * tree-pretty-print.cc (dump_omp_clause): Handle OMP_CLAUSE_{PARTIAL,FULL,SIZES}. (dump_generic_node): Handle OMP_TILE and OMP_UNROLL. Skip printing loops with NULL OMP_FOR_INIT (node) vector element. * gimplify.cc (is_gimple_stmt): Handle OMP_TILE and OMP_UNROLL. (gimplify_omp_taskloop_expr): For SAVE_EXPR use gimplify_save_expr. (gimplify_omp_loop_xform): New function. (gimplify_omp_for): Call omp_maybe_apply_loop_xforms and if that reshuffles what the passed pointer points to, retry or return GS_OK. Handle OMP_TILE and OMP_UNROLL. (gimplify_omp_loop): Call omp_maybe_apply_loop_xforms and if that reshuffles what the passed pointer points to, return GS_OK. (gimplify_expr): Handle OMP_TILE and OMP_UNROLL. * omp-general.h (omp_loop_number_of_iterations, omp_maybe_apply_loop_xforms): Declare. * omp-general.cc (omp_adjust_for_condition): For LE_EXPR and GE_EXPR with pointers, don't add/subtract one, but the size of what the pointer points to. (omp_loop_number_of_iterations, omp_apply_tile, find_nested_loop_xform, omp_maybe_apply_loop_xforms): New functions. gcc/c-family/ * c-common.h (c_omp_find_generated_loop): Declare. * c-gimplify.cc (c_genericize_control_stmt): Handle OMP_TILE and OMP_UNROLL. * c-omp.cc (c_finish_omp_for): Handle generated loops. (c_omp_is_loop_iterator): Likewise. (c_find_nested_loop_xform_r, c_omp_find_generated_loop): New functions. (c_omp_check_loop_iv): Handle generated loops. For now sorry on mixing non-rectangular loop with generated loops. (c_omp_check_loop_binding_exprs): For now sorry on mixing imperfect loops with generated loops. (c_omp_directives): Uncomment tile and unroll entries. * c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_TILE and PRAGMA_OMP_UNROLL, change PRAGMA_OMP__LAST_ to the latter. (enum pragma_omp_clause): Add PRAGMA_OMP_CLAUSE_FULL and PRAGMA_OMP_CLAUSE_PARTIAL. * c-pragma.cc (omp_pragmas_simd): Add tile and unroll omp pragmas. gcc/c/ * c-parser.cc (c_parser_skip_std_attribute_spec_seq): New function. (check_omp_intervening_code): Reject imperfectly nested tile. (c_parser_compound_statement_nostart): If want_nested_loop, use c_parser_omp_next_tokens_can_be_canon_loop instead of just checking for RID_FOR keyword. (c_parser_omp_clause_name): Handle full and partial clause names. (c_parser_omp_clause_allocate): Remove spurious semicolon. (c_parser_omp_clause_full, c_parser_omp_clause_partial): New functions. (c_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_FULL and PRAGMA_OMP_CLAUSE_PARTIAL. (c_parser_omp_next_tokens_can_be_canon_loop): New function. (c_parser_omp_loop_nest): Parse C23 attributes. Handle tile/unroll constructs. Use c_parser_omp_next_tokens_can_be_canon_loop instead of just checking for RID_FOR keyword. Only add_stmt (body) if it is non-NULL. (c_parser_omp_for_loop): Rename tiling variable to oacc_tiling. For OMP_CLAUSE_SIZES set collapse to list length of OMP_CLAUSE_SIZES_LIST. Use c_parser_omp_next_tokens_can_be_canon_loop instead of just checking for RID_FOR keyword. Remove spurious semicolon. Don't call c_omp_check_loop_binding_exprs if stmt is NULL. Skip generated loops. (c_parser_omp_tile_sizes, c_parser_omp_tile): New functions. (OMP_UNROLL_CLAUSE_MASK): Define. (c_parser_omp_unroll): New function. (c_parser_omp_construct): Handle PRAGMA_OMP_TILE and PRAGMA_OMP_UNROLL. * c-typeck.cc (c_finish_omp_clauses): Adjust wording of some of the conflicting clause diagnostic messages to include word clause. Handle OMP_CLAUSE_{FULL,PARTIAL,SIZES} and diagnose full vs. partial conflict. gcc/cp/ * cp-tree.h (dependent_omp_for_p): Add another tree argument. * parser.cc (check_omp_intervening_code): Reject imperfectly nested tile. (cp_parser_statement_seq_opt): If want_nested_loop, use cp_parser_next_tokens_can_be_canon_loop instead of just checking for RID_FOR keyword. (cp_parser_omp_clause_name): Handle full and partial clause names. (cp_parser_omp_clause_full, cp_parser_omp_clause_partial): New functions. (cp_parser_omp_all_clauses): Formatting fix. Handle PRAGMA_OMP_CLAUSE_PARTIAL and PRAGMA_OMP_CLAUSE_FULL. (cp_parser_next_tokens_can_be_canon_loop): New function. (cp_parser_omp_loop_nest): Parse C++11 attributes. Handle tile/unroll constructs. Use cp_parser_next_tokens_can_be_canon_loop instead of just checking for RID_FOR keyword. Only add_stmt cp_parser_omp_loop_nest result if it is non-NULL. (cp_parser_omp_for_loop): Rename tiling variable to oacc_tiling. For OMP_CLAUSE_SIZES set collapse to list length of OMP_CLAUSE_SIZES_LIST. Use cp_parser_next_tokens_can_be_canon_loop instead of just checking for RID_FOR keyword. Remove spurious semicolon. Don't call c_omp_check_loop_binding_exprs if stmt is NULL. Skip and/or handle generated loops. Remove spurious ()s around & operands. (cp_parser_omp_tile_sizes, cp_parser_omp_tile): New functions. (OMP_UNROLL_CLAUSE_MASK): Define. (cp_parser_omp_unroll): New function. (cp_parser_omp_construct): Handle PRAGMA_OMP_TILE and PRAGMA_OMP_UNROLL. (cp_parser_pragma): Likewise. * semantics.cc (finish_omp_clauses): Don't call fold_build_cleanup_point_expr for cases which obviously won't need it, like checked INTEGER_CSTs. Handle OMP_CLAUSE_{FULL,PARTIAL,SIZES} and diagnose full vs. partial conflict. Adjust wording of some of the conflicting clause diagnostic messages to include word clause. (finish_omp_for): Use decl equal to global_namespace as a marker for generated loop. Pass also body to dependent_omp_for_p. Skip generated loops. (finish_omp_for_block): Skip generated loops. * pt.cc (tsubst_omp_clauses): Handle OMP_CLAUSE_{FULL,PARTIAL,SIZES}. (tsubst_stmt): Handle OMP_TILE and OMP_UNROLL. Handle or skip generated loops. (dependent_omp_for_p): Add body argument. If declv vector element is NULL, find generated loop. * cp-gimplify.cc (cp_gimplify_expr): Handle OMP_TILE and OMP_UNROLL. (cp_fold_r): Likewise. (cp_genericize_r): Likewise. Skip generated loops. gcc/fortran/ * gfortran.h (enum gfc_statement): Add ST_OMP_UNROLL, ST_OMP_END_UNROLL, ST_OMP_TILE and ST_OMP_END_TILE. (struct gfc_omp_clauses): Add sizes_list, partial, full and erroneous members. (enum gfc_exec_op): Add EXEC_OMP_UNROLL and EXEC_OMP_TILE. (gfc_expr_list_len): Declare. * match.h (gfc_match_omp_tile, gfc_match_omp_unroll): Declare. * openmp.cc (gfc_get_location): Declare. (gfc_free_omp_clauses): Free sizes_list. (match_oacc_expr_list): Rename to ... (match_omp_oacc_expr_list): ... this. Add is_omp argument and change diagnostic wording if it is true. (enum omp_mask2): Add OMP_CLAUSE_{FULL,PARTIAL,SIZES}. (gfc_match_omp_clauses): Parse full, partial and sizes clauses. (gfc_match_oacc_wait): Use match_omp_oacc_expr_list instead of match_oacc_expr_list. (OMP_UNROLL_CLAUSES, OMP_TILE_CLAUSES): Define. (gfc_match_omp_tile, gfc_match_omp_unroll): New functions. (resolve_omp_clauses): Diagnose full vs. partial clause conflict. Resolve sizes clause arguments. (find_nested_loop_in_chain): Use switch instead of series of ifs. Handle EXEC_OMP_TILE and EXEC_OMP_UNROLL. (gfc_resolve_omp_do_blocks): Set omp_current_do_collapse to list length of sizes_list if present. (gfc_resolve_do_iterator): Return for EXEC_OMP_TILE or EXEC_OMP_UNROLL. (restructure_intervening_code): Remove spurious ()s around & operands. (is_outer_iteration_variable): Handle EXEC_OMP_TILE and EXEC_OMP_UNROLL. (check_nested_loop_in_chain): Likewise. (expr_is_invariant): Likewise. (resolve_omp_do): Handle EXEC_OMP_TILE and EXEC_OMP_UNROLL. Diagnose tile without sizes clause. Use sizes_list length for count if non-NULL. Set code->ext.omp_clauses->erroneous on loops where we've reported diagnostics. Sorry for mixing non-rectangular loops with generated loops. (omp_code_to_statement): Handle EXEC_OMP_TILE and EXEC_OMP_UNROLL. (gfc_resolve_omp_directive): Likewise. * parse.cc (decode_omp_directive): Parse end tile, end unroll, tile and unroll. Move nothing entry alphabetically. (case_exec_markers): Add ST_OMP_TILE and ST_OMP_UNROLL. (gfc_ascii_statement): Handle ST_OMP_END_TILE, ST_OMP_END_UNROLL, ST_OMP_TILE and ST_OMP_UNROLL. (parse_omp_do): Add nested argument. Handle ST_OMP_TILE and ST_OMP_UNROLL. (parse_omp_structured_block): Adjust parse_omp_do caller. (parse_executable): Likewise. Handle ST_OMP_TILE and ST_OMP_UNROLL. * resolve.cc (gfc_resolve_blocks): Handle EXEC_OMP_TILE and EXEC_OMP_UNROLL. (gfc_resolve_code): Likewise. * st.cc (gfc_free_statement): Likewise. * trans.cc (trans_code): Likewise. * trans-openmp.cc (gfc_trans_omp_clauses): Handle full, partial and sizes clauses. Use tree_cons + nreverse instead of temporary vector and build_tree_list_vec for tile_list handling. (gfc_expr_list_len): New function. (gfc_trans_omp_do): Rename tile to oacc_tile. Handle sizes clause. Don't assert code->op is EXEC_DO. Handle EXEC_OMP_TILE and EXEC_OMP_UNROLL. (gfc_trans_omp_directive): Handle EXEC_OMP_TILE and EXEC_OMP_UNROLL. * dump-parse-tree.cc (show_omp_clauses): Dump full, partial and sizes clauses. (show_omp_node): Handle EXEC_OMP_TILE and EXEC_OMP_UNROLL. (show_code_node): Likewise. gcc/testsuite/ * c-c++-common/gomp/attrs-tile-1.c: New test. * c-c++-common/gomp/attrs-tile-2.c: New test. * c-c++-common/gomp/attrs-tile-3.c: New test. * c-c++-common/gomp/attrs-tile-4.c: New test. * c-c++-common/gomp/attrs-tile-5.c: New test. * c-c++-common/gomp/attrs-tile-6.c: New test. * c-c++-common/gomp/attrs-unroll-1.c: New test. * c-c++-common/gomp/attrs-unroll-2.c: New test. * c-c++-common/gomp/attrs-unroll-3.c: New test. * c-c++-common/gomp/attrs-unroll-inner-1.c: New test. * c-c++-common/gomp/attrs-unroll-inner-2.c: New test. * c-c++-common/gomp/attrs-unroll-inner-3.c: New test. * c-c++-common/gomp/attrs-unroll-inner-4.c: New test. * c-c++-common/gomp/attrs-unroll-inner-5.c: New test. * c-c++-common/gomp/imperfect-attributes.c: Adjust expected diagnostics. * c-c++-common/gomp/imperfect-loop-nest.c: New test. * c-c++-common/gomp/ordered-5.c: New test. * c-c++-common/gomp/scan-7.c: New test. * c-c++-common/gomp/tile-1.c: New test. * c-c++-common/gomp/tile-2.c: New test. * c-c++-common/gomp/tile-3.c: New test. * c-c++-common/gomp/tile-4.c: New test. * c-c++-common/gomp/tile-5.c: New test. * c-c++-common/gomp/tile-6.c: New test. * c-c++-common/gomp/tile-7.c: New test. * c-c++-common/gomp/tile-8.c: New test. * c-c++-common/gomp/tile-9.c: New test. * c-c++-common/gomp/tile-10.c: New test. * c-c++-common/gomp/tile-11.c: New test. * c-c++-common/gomp/tile-12.c: New test. * c-c++-common/gomp/tile-13.c: New test. * c-c++-common/gomp/tile-14.c: New test. * c-c++-common/gomp/tile-15.c: New test. * c-c++-common/gomp/unroll-1.c: New test. * c-c++-common/gomp/unroll-2.c: New test. * c-c++-common/gomp/unroll-3.c: New test. * c-c++-common/gomp/unroll-4.c: New test. * c-c++-common/gomp/unroll-5.c: New test. * c-c++-common/gomp/unroll-6.c: New test. * c-c++-common/gomp/unroll-7.c: New test. * c-c++-common/gomp/unroll-8.c: New test. * c-c++-common/gomp/unroll-9.c: New test. * c-c++-common/gomp/unroll-inner-1.c: New test. * c-c++-common/gomp/unroll-inner-2.c: New test. * c-c++-common/gomp/unroll-inner-3.c: New test. * c-c++-common/gomp/unroll-non-rect-1.c: New test. * c-c++-common/gomp/unroll-non-rect-2.c: New test. * c-c++-common/gomp/unroll-non-rect-3.c: New test. * c-c++-common/gomp/unroll-simd-1.c: New test. * gcc.dg/gomp/attrs-4.c: Adjust expected diagnostics. * gcc.dg/gomp/for-1.c: Likewise. * gcc.dg/gomp/for-11.c: Likewise. * g++.dg/gomp/attrs-4.C: Likewise. * g++.dg/gomp/for-1.C: Likewise. * g++.dg/gomp/pr94512.C: Likewise. * g++.dg/gomp/tile-1.C: New test. * g++.dg/gomp/tile-2.C: New test. * g++.dg/gomp/unroll-1.C: New test. * g++.dg/gomp/unroll-2.C: New test. * g++.dg/gomp/unroll-3.C: New test. * gfortran.dg/gomp/inner-loops-1.f90: New test. * gfortran.dg/gomp/inner-loops-2.f90: New test. * gfortran.dg/gomp/pure-1.f90: Add tests for !$omp unroll and !$omp tile. * gfortran.dg/gomp/pure-2.f90: Remove those tests from here. * gfortran.dg/gomp/scan-9.f90: New test. * gfortran.dg/gomp/tile-1.f90: New test. * gfortran.dg/gomp/tile-2.f90: New test. * gfortran.dg/gomp/tile-3.f90: New test. * gfortran.dg/gomp/tile-4.f90: New test. * gfortran.dg/gomp/tile-5.f90: New test. * gfortran.dg/gomp/tile-6.f90: New test. * gfortran.dg/gomp/tile-7.f90: New test. * gfortran.dg/gomp/tile-8.f90: New test. * gfortran.dg/gomp/tile-9.f90: New test. * gfortran.dg/gomp/tile-10.f90: New test. * gfortran.dg/gomp/tile-imperfect-nest-1.f90: New test. * gfortran.dg/gomp/tile-imperfect-nest-2.f90: New test. * gfortran.dg/gomp/tile-inner-loops-1.f90: New test. * gfortran.dg/gomp/tile-inner-loops-2.f90: New test. * gfortran.dg/gomp/tile-inner-loops-3.f90: New test. * gfortran.dg/gomp/tile-inner-loops-4.f90: New test. * gfortran.dg/gomp/tile-inner-loops-5.f90: New test. * gfortran.dg/gomp/tile-inner-loops-6.f90: New test. * gfortran.dg/gomp/tile-inner-loops-7.f90: New test. * gfortran.dg/gomp/tile-inner-loops-8.f90: New test. * gfortran.dg/gomp/tile-non-rectangular-1.f90: New test. * gfortran.dg/gomp/tile-non-rectangular-2.f90: New test. * gfortran.dg/gomp/tile-non-rectangular-3.f90: New test. * gfortran.dg/gomp/tile-unroll-1.f90: New test. * gfortran.dg/gomp/tile-unroll-2.f90: New test. * gfortran.dg/gomp/unroll-1.f90: New test. * gfortran.dg/gomp/unroll-2.f90: New test. * gfortran.dg/gomp/unroll-3.f90: New test. * gfortran.dg/gomp/unroll-4.f90: New test. * gfortran.dg/gomp/unroll-5.f90: New test. * gfortran.dg/gomp/unroll-6.f90: New test. * gfortran.dg/gomp/unroll-7.f90: New test. * gfortran.dg/gomp/unroll-8.f90: New test. * gfortran.dg/gomp/unroll-9.f90: New test. * gfortran.dg/gomp/unroll-10.f90: New test. * gfortran.dg/gomp/unroll-11.f90: New test. * gfortran.dg/gomp/unroll-12.f90: New test. * gfortran.dg/gomp/unroll-13.f90: New test. * gfortran.dg/gomp/unroll-inner-loop-1.f90: New test. * gfortran.dg/gomp/unroll-inner-loop-2.f90: New test. * gfortran.dg/gomp/unroll-no-clause-1.f90: New test. * gfortran.dg/gomp/unroll-non-rect-1.f90: New test. * gfortran.dg/gomp/unroll-non-rect-2.f90: New test. * gfortran.dg/gomp/unroll-simd-1.f90: New test. * gfortran.dg/gomp/unroll-simd-2.f90: New test. * gfortran.dg/gomp/unroll-simd-3.f90: New test. * gfortran.dg/gomp/unroll-tile-1.f90: New test. * gfortran.dg/gomp/unroll-tile-2.f90: New test. * gfortran.dg/gomp/unroll-tile-inner-1.f90: New test. libgomp/ * testsuite/libgomp.c-c++-common/imperfect-transform-1.c: New test. * testsuite/libgomp.c-c++-common/imperfect-transform-2.c: New test. * testsuite/libgomp.c-c++-common/matrix-1.h: New test. * testsuite/libgomp.c-c++-common/matrix-constant-iter.h: New test. * testsuite/libgomp.c-c++-common/matrix-helper.h: New test. * testsuite/libgomp.c-c++-common/matrix-no-directive-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-no-directive-unroll-full-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-distribute-parallel-for-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-for-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-parallel-for-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-parallel-masked-taskloop-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-parallel-masked-taskloop-simd-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-target-parallel-for-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-target-teams-distribute-parallel-for-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-taskloop-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-omp-teams-distribute-parallel-for-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-simd-1.c: New test. * testsuite/libgomp.c-c++-common/matrix-transform-variants-1.h: New test. * testsuite/libgomp.c-c++-common/target-imperfect-transform-1.c: New test. * testsuite/libgomp.c-c++-common/target-imperfect-transform-2.c: New test. * testsuite/libgomp.c-c++-common/unroll-1.c: New test. * testsuite/libgomp.c-c++-common/unroll-non-rect-1.c: New test. * testsuite/libgomp.c++/matrix-no-directive-unroll-full-1.C: New test. * testsuite/libgomp.c++/tile-2.C: New test. * testsuite/libgomp.c++/tile-3.C: New test. * testsuite/libgomp.c++/unroll-1.C: New test. * testsuite/libgomp.c++/unroll-2.C: New test. * testsuite/libgomp.c++/unroll-full-tile.C: New test. * testsuite/libgomp.fortran/imperfect-transform-1.f90: New test. * testsuite/libgomp.fortran/imperfect-transform-2.f90: New test. * testsuite/libgomp.fortran/inner-1.f90: New test. * testsuite/libgomp.fortran/nested-fn.f90: New test. * testsuite/libgomp.fortran/target-imperfect-transform-1.f90: New test. * testsuite/libgomp.fortran/target-imperfect-transform-2.f90: New test. * testsuite/libgomp.fortran/tile-1.f90: New test. * testsuite/libgomp.fortran/tile-2.f90: New test. * testsuite/libgomp.fortran/tile-unroll-1.f90: New test. * testsuite/libgomp.fortran/tile-unroll-2.f90: New test. * testsuite/libgomp.fortran/tile-unroll-3.f90: New test. * testsuite/libgomp.fortran/tile-unroll-4.f90: New test. * testsuite/libgomp.fortran/unroll-1.f90: New test. * testsuite/libgomp.fortran/unroll-2.f90: New test. * testsuite/libgomp.fortran/unroll-3.f90: New test. * testsuite/libgomp.fortran/unroll-4.f90: New test. * testsuite/libgomp.fortran/unroll-5.f90: New test. * testsuite/libgomp.fortran/unroll-6.f90: New test. * testsuite/libgomp.fortran/unroll-7a.f90: New test. * testsuite/libgomp.fortran/unroll-7b.f90: New test. * testsuite/libgomp.fortran/unroll-7c.f90: New test. * testsuite/libgomp.fortran/unroll-7.f90: New test. * testsuite/libgomp.fortran/unroll-8.f90: New test. * testsuite/libgomp.fortran/unroll-simd-1.f90: New test. * testsuite/libgomp.fortran/unroll-tile-1.f90: New test. * testsuite/libgomp.fortran/unroll-tile-2.f90: New test.
2024-05-28testsuite/*/gomp: Remove 'dg-prune-output "not supported yet"'Tobias Burnus4-8/+0
gcc/testsuite/ChangeLog: * c-c++-common/gomp/lastprivate-conditional-1.c: Remove '{ dg-prune-output "not supported yet" }'. * c-c++-common/gomp/requires-1.c: Likewise. * c-c++-common/gomp/requires-2.c: Likewise. * c-c++-common/gomp/reverse-offload-1.c: Likewise. * g++.dg/gomp/requires-1.C: Likewise. * gfortran.dg/gomp/requires-1.f90: Likewise. * gfortran.dg/gomp/requires-2.f90: Likewise. * gfortran.dg/gomp/requires-4.f90: Likewise. * gfortran.dg/gomp/requires-5.f90: Likewise. * gfortran.dg/gomp/requires-6.f90: Likewise. * gfortran.dg/gomp/requires-7.f90: Likewise.
2024-05-15openmp: Diagnose using grainsize+num_tasks clauses together [PR115103]Jakub Jelinek1-2/+2
I've noticed that while we diagnose many other OpenMP exclusive clauses, we don't diagnose grainsize together with num_tasks on taskloop construct in all of C, C++ and Fortran (the implementation simply ignored grainsize in that case) and for Fortran also don't diagnose mixing nogroup clause with reduction clause(s). Fixed thusly. 2024-05-15 Jakub Jelinek <jakub@redhat.com> PR c/115103 gcc/c/ * c-typeck.cc (c_finish_omp_clauses): Diagnose grainsize used together with num_tasks. gcc/cp/ * semantics.cc (finish_omp_clauses): Diagnose grainsize used together with num_tasks. gcc/fortran/ * openmp.cc (resolve_omp_clauses): Diagnose grainsize used together with num_tasks or nogroup used together with reduction. gcc/testsuite/ * c-c++-common/gomp/clause-dups-1.c: Add 2 further expected errors. * gfortran.dg/gomp/pr115103.f90: New test.
2024-03-22testsuite: Fix up depobj-3.c test on i686-linux [PR112724]Jakub Jelinek1-0/+2
While I've posted a patch to handle EXCESS_PRECISION_EXPR in C/C++ pretty printing, still we'd need to handle (a + (float)5) and (float)(((long double)a) + (long double)5) and possibly (float)(((double)a) + (double)5) too for s390?, so the following patch just uses -fexcess-precision=fast, so that the expression is always the same. 2024-03-22 Jakub Jelinek <jakub@redhat.com> PR c++/112724 * c-c++-common/gomp/depobj-3.c: Add -fexcess-precision=fast as dg-additional-options.
2024-02-14aarch64/testsuite: Remove dg-excess-errors from c-c++-common/gomp/pr63328.c ↵Andrew Pinski1-2/+0
and gcc.dg/gomp/pr87895-2.c [PR113861] These now pass after r14-6416-gf5fc001a84a7db so let's remove the dg-excess-errors from them. Committed as obvious after a test for aarch64-linux-gnu. gcc/testsuite/ChangeLog: PR testsuite/113861 * c-c++-common/gomp/pr63328.c: Remove dg-excess-errors. * gcc.dg/gomp/pr87895-2.c: Likewise. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2024-01-09OpenMP: lvalue parsing for map/to/from clauses (C++)Julian Brown2-3/+3
This patch supports "lvalue" parsing (or "locator list item type" parsing) for several OpenMP clause types for C++, as required for OpenMP 5.0 and above. This version has been rebased -- some things have changed around template handling recently, e.g. removal of build_non_dependent_expr and tsubst_copy. A new potential corner-case issue has shown up regarding implicit mapping of references to pointer to pointers -- an interaction with the post-review fixes/rework for the patch here: https://gcc.gnu.org/pipermail/gcc-patches/2023-November/638602.html Which fixed the (new) tests baseptrs-[6789].C. I've noted that for now in the patch, and adjusted the baseptrs-[46].C tests slightly to accommodate. 2024-01-08 Julian Brown <julian@codesourcery.com> gcc/c-family/ * c-common.h (c_omp_address_inspector): Remove static from get_origin and maybe_unconvert_ref methods. * c-omp.cc (c_omp_split_clauses): Support OMP_ARRAY_SECTION. (c_omp_address_inspector::map_supported_p): Handle OMP_ARRAY_SECTION. (c_omp_address_inspector::get_origin): Avoid dereferencing possibly NULL type when processing template decls. (c_omp_address_inspector::maybe_unconvert_ref): Likewise. gcc/cp/ * constexpr.cc (potential_consant_expression_1): Handle OMP_ARRAY_SECTION. * cp-tree.h (grok_omp_array_section, build_omp_array_section): Add prototypes. * decl2.cc (grok_omp_array_section): New function. * error.cc (dump_expr): Handle OMP_ARRAY_SECTION. * parser.cc (cp_parser_new): Initialize parser->omp_array_section_p. (cp_parser_statement_expr): Disallow array sections. (cp_parser_postfix_open_square_expression): Support OMP_ARRAY_SECTION parsing. (cp_parser_parenthesized_expression_list, cp_parser_lambda_expression, cp_parser_braced_list): Disallow array sections. (cp_parser_omp_var_list_no_open): Remove ALLOW_DEREF parameter, add MAP_LVALUE in its place. Support generalised lvalue parsing for OpenMP map, to and from clauses. Use OMP_ARRAY_SECTION code instead of TREE_LIST to represent OpenMP array sections. (cp_parser_omp_var_list): Remove ALLOW_DEREF parameter, add MAP_LVALUE. Pass to cp_parser_omp_var_list_no_open. (cp_parser_oacc_data_clause): Update call to cp_parser_omp_var_list. (cp_parser_omp_clause_map): Add sk_omp scope around cp_parser_omp_var_list_no_open call. * parser.h (cp_parser): Add omp_array_section_p field. * pt.cc (tsubst, tsubst_copy, tsubst_omp_clause_decl, tsubst_copy_and_build): Add OMP_ARRAY_SECTION support. * semantics.cc (handle_omp_array_sections_1, handle_omp_array_sections, cp_oacc_check_attachments, finish_omp_clauses): Use OMP_ARRAY_SECTION instead of TREE_LIST where appropriate. Handle more types of map expression. * typeck.cc (build_omp_array_section): New function. gcc/ * gimplify.cc (gimplify_expr): Ensure OMP_ARRAY_SECTION has been processed out before gimplification. * tree-pretty-print.cc (dump_generic_node): Support OMP_ARRAY_SECTION. * tree.def (OMP_ARRAY_SECTION): New tree code. gcc/testsuite/ * c-c++-common/gomp/map-6.c: Update expected output. * c-c++-common/gomp/target-enter-data-1.c: Update scan test. * g++.dg/gomp/array-section-1.C: New test. * g++.dg/gomp/array-section-2.C: New test. * g++.dg/gomp/bad-array-section-1.C: New test. * g++.dg/gomp/bad-array-section-2.C: New test. * g++.dg/gomp/bad-array-section-3.C: New test. * g++.dg/gomp/bad-array-section-4.C: New test. * g++.dg/gomp/bad-array-section-5.C: New test. * g++.dg/gomp/bad-array-section-6.C: New test. * g++.dg/gomp/bad-array-section-7.C: New test. * g++.dg/gomp/bad-array-section-8.C: New test. * g++.dg/gomp/bad-array-section-9.C: New test. * g++.dg/gomp/bad-array-section-10.C: New test. * g++.dg/gomp/bad-array-section-11.C: New test. * g++.dg/gomp/has_device_addr-non-lvalue-1.C: New test. * g++.dg/gomp/pr67522.C: Update expected output. * g++.dg/gomp/ind-base-3.C: New test. * g++.dg/gomp/map-assignment-1.C: New test. * g++.dg/gomp/map-inc-1.C: New test. * g++.dg/gomp/map-lvalue-ref-1.C: New test. * g++.dg/gomp/map-ptrmem-1.C: New test. * g++.dg/gomp/map-ptrmem-2.C: New test. * g++.dg/gomp/map-static-cast-lvalue-1.C: New test. * g++.dg/gomp/map-ternary-1.C: New test. * g++.dg/gomp/member-array-2.C: New test. libgomp/ * testsuite/libgomp.c++/baseptrs-4.C: Remove commented-out cases that now work. * testsuite/libgomp.c++/baseptrs-6.C: New test. * testsuite/libgomp.c++/ind-base-1.C: New test. * testsuite/libgomp.c++/ind-base-2.C: New test. * testsuite/libgomp.c++/lvalue-tofrom-1.C: New test. * testsuite/libgomp.c++/lvalue-tofrom-2.C: New test. * testsuite/libgomp.c++/map-comma-1.C: New test. * testsuite/libgomp.c++/map-rvalue-ref-1.C: New test. * testsuite/libgomp.c++/struct-ref-1.C: New test. * testsuite/libgomp.c-c++-common/array-field-1.c: New test. * testsuite/libgomp.c-c++-common/array-of-struct-1.c: New test. * testsuite/libgomp.c-c++-common/array-of-struct-2.c: New test.
2023-12-19OpenMP: Permit additional selector propertiesSandra Loosemore1-2/+2
This patch adds "hpe" to the known properties for the "vendor" selector, and support for "acquire" and "release" for "atomic_default_mem_order". gcc/ChangeLog * omp-general.cc (vendor_properties): Add "hpe". (atomic_default_mem_order_properties): Add "acquire" and "release". (omp_context_selector_matches): Handle "acquire" and "release". gcc/testsuite/ChangeLog * c-c++-common/gomp/declare-variant-2.c: Don't expect error on "acquire" and "release". * gfortran.dg/gomp/declare-variant-2a.f90: Likewise.
2023-12-19OpenMP: Use enumerators for names of trait-sets and traitsSandra Loosemore3-27/+52
This patch introduces enumerators to represent trait-set names and trait names, which makes it easier to use tables to control other behavior and for switch statements to dispatch on the tags. The tags are stored in the same place in the TREE_LIST structure (OMP_TSS_ID or OMP_TS_ID) and are encoded there as integer constants. gcc/ChangeLog * omp-selectors.h: New file. * omp-general.h: Include omp-selectors.h. (OMP_TSS_CODE, OMP_TSS_NAME): New. (OMP_TS_CODE, OMP_TS_NAME): New. (make_trait_set_selector, make_trait_selector): Adjust declarations. (omp_construct_traits_to_codes): Likewise. (omp_context_selector_set_compare): Likewise. (omp_get_context_selector): Likewise. (omp_get_context_selector_list): New. * omp-general.cc (omp_construct_traits_to_codes): Pass length in as argument instead of returning it. Make it table-driven. (omp_tss_map): New. (kind_properties, vendor_properties, extension_properties): New. (atomic_default_mem_order_properties): New. (omp_ts_map): New. (omp_check_context_selector): Simplify lookup and dispatch logic. (omp_mark_declare_variant): Ignore variants with unknown construct selectors. Adjust for new representation. (make_trait_set_selector, make_trait_selector): Adjust for new representations. (omp_context_selector_matches): Simplify dispatch logic. Avoid fixed-sized buffers and adjust call to omp_construct_traits_to_codes. (omp_context_selector_props_compare): Adjust for new representations and simplify dispatch logic. (omp_context_selector_set_compare): Likewise. (omp_context_selector_compare): Likewise. (omp_get_context_selector): Adjust for new representations, and split out... (omp_get_context_selector_list): New function. (omp_lookup_tss_code): New. (omp_lookup_ts_code): New. (omp_context_compute_score): Adjust for new representations. Avoid fixed-sized buffers and magic numbers. Adjust call to omp_construct_traits_to_codes. * gimplify.cc (omp_construct_selector_matches): Avoid use of fixed-size buffer. Adjust call to omp_construct_traits_to_codes. gcc/c/ChangeLog * c-parser.cc (omp_construct_selectors): Delete. (omp_device_selectors): Delete. (omp_implementation_selectors): Delete. (omp_user_selectors): Delete. (c_parser_omp_context_selector): Adjust for new representations and simplify dispatch logic. Uniformly warn instead of sometimes error when an unknown selector is found. Adjust error messages for extraneous/incorrect score. (c_parser_omp_context_selector_specification): Likewise. (c_finish_omp_declare_variant): Adjust for new representations. gcc/cp/ChangeLog * decl.cc (omp_declare_variant_finalize_one): Adjust for new representations. * parser.cc (omp_construct_selectors): Delete. (omp_device_selectors): Delete. (omp_implementation_selectors): Delete. (omp_user_selectors): Delete. (cp_parser_omp_context_selector): Adjust for new representations and simplify dispatch logic. Uniformly warn instead of sometimes error when an unknown selector is found. Adjust error messages for extraneous/incorrect score. (cp_parser_omp_context_selector_specification): Likewise. * pt.cc (tsubst_attribute): Adjust for new representations. gcc/fortran/ChangeLog * gfortran.h: Include omp-selectors.h. (enum gfc_omp_trait_property_kind): Delete, and replace all references with equivalent omp_tp_type enumerators. (struct gfc_omp_trait_property): Update for omp_tp_type. (struct gfc_omp_selector): Replace string name with new enumerator. (struct gfc_omp_set_selector): Likewise. * openmp.cc (gfc_free_omp_trait_property_list): Update for omp_tp_type. (omp_construct_selectors): Delete. (omp_device_selectors): Delete. (omp_implementation_selectors): Delete. (omp_user_selectors): Delete. (gfc_ignore_trait_property_extension): New. (gfc_ignore_trait_property_extension_list): New. (gfc_match_omp_selector): Adjust for new representations and simplify dispatch logic. Uniformly warn instead of sometimes error when an unknown selector is found. (gfc_match_omp_context_selector): Adjust for new representations. Adjust error messages for extraneous/incorrect score. (gfc_match_omp_context_selector_specification): Likewise. * trans-openmp.cc (gfc_trans_omp_declare_variant): Adjust for new representations. gcc/testsuite/ * c-c++-common/gomp/declare-variant-1.c: Expect warning on unknown selectors. * c-c++-common/gomp/declare-variant-2.c: Likewise. Also adjust messages for score errors. * c-c++-common/gomp/declare-variant-no-score.c: New. * gfortran.dg/gomp/declare-variant-1.f90: Expect warning on unknown selectors. * gfortran.dg/gomp/declare-variant-2.f90: Likewise. Also adjust messages for score errors. * gfortran.dg/gomp/declare-variant-no-score.f90: New.
2023-12-14testsuite: Fix up target-enter-data-1.c on 32-bit targetsJakub Jelinek1-1/+1
struct bar { int num_vectors; double *vectors; }; is 16 bytes only on 64-bit targets, on 32-bit ones it is just 8 bytes, so the explicit matching of the * 16 multiplication only works on the former. 2023-12-14 Jakub Jelinek <jakub@redhat.com> * c-c++-common/gomp/target-enter-data-1.c: Match also sizeof bar on 32-bit targets - 8 bytes - rather than just 16 bytes.
2023-12-13OpenMP/OpenACC: Rework clause expansion and nested struct handlingJulian Brown4-4/+6
This patch reworks clause expansion in the C, C++ and (to a lesser extent) Fortran front ends for OpenMP and OpenACC mapping nodes used in GPU offloading support. At present a single clause may be turned into several mapping nodes, or have its mapping type changed, in several places scattered through the front- and middle-end. The analysis relating to which particular transformations are needed for some given expression has become quite hard to follow. Briefly, we manipulate clause types in the following places: 1. During parsing, in c_omp_adjust_map_clauses. Depending on a set of rules, we may change a FIRSTPRIVATE_POINTER (etc.) mapping into ATTACH_DETACH, or mark the decl addressable. 2. In semantics.cc or c-typeck.cc, clauses are expanded in handle_omp_array_sections (called via {c_}finish_omp_clauses, or in finish_omp_clauses itself. The two cases are for processing array sections (the former), or non-array sections (the latter). 3. In gimplify.cc, we build sibling lists for struct accesses, which groups and sorts accesses along with their struct base, creating new ALLOC/RELEASE nodes for pointers. 4. In gimplify.cc:gimplify_adjust_omp_clauses, mapping nodes may be adjusted or created. This patch doesn't completely disrupt this scheme, though clause types are no longer adjusted in c_omp_adjust_map_clauses (step 1). Clause expansion in step 2 (for C and C++) now uses a single, unified mechanism, parts of which are also reused for analysis in step 3. Rather than the kind-of "ad-hoc" pattern matching on addresses used to expand clauses used at present, a new method for analysing addresses is introduced. This does a recursive-descent tree walk on expression nodes, and emits a vector of tokens describing each "part" of the address. This tokenized address can then be translated directly into mapping nodes, with the assurance that no part of the expression has been inadvertently skipped or misinterpreted. In this way, all the variations of ways pointers, arrays, references and component accesses might be combined can be teased apart into easily-understood cases - and we know we've "parsed" the whole address before we start analysis, so the right code paths can easily be selected. For example, a simple access "arr[idx]" might parse as: base-decl access-indexed-array or "mystruct->foo[x]" with a pointer "foo" component might parse as: base-decl access-pointer component-selector access-pointer A key observation is that support for "array" bases, e.g. accesses whose root nodes are not structures, but describe scalars or arrays, and also *one-level deep* structure accesses, have first-class support in gimplify and beyond. Expressions that use deeper struct accesses or e.g. multiple indirections were more problematic: some cases worked, but lots of cases didn't. This patch reimplements the support for those in gimplify.cc, again using the new "address tokenization" support. An expression like "mystruct->foo->bar[0:10]" used in a mapping node will translate the right-hand access directly in the front-end. The base for the access will be "mystruct->foo". This is handled recursively in gimplify.cc -- there may be several accesses of "mystruct"'s members on the same directive, so the sibling-list building machinery can be used again. (This was already being done for OpenACC, but the new implementation differs somewhat in details, and is more robust.) For OpenMP, in the case where the base pointer itself, i.e. "mystruct->foo" here, is NOT mapped on the same directive, we create a "fragile" mapping. This turns the "foo" component access into a zero-length allocation (which is a new feature for the runtime, so support has been added there too). A couple of changes have been made to how mapping clauses are turned into mapping nodes: The first change is based on the observation that it is probably never correct to use GOMP_MAP_ALWAYS_POINTER for component accesses (e.g. for references), because if the containing struct is already mapped on the target then the host version of the pointer in question will be corrupted if the struct is copied back from the target. This patch removes all such uses, across each of C, C++ and Fortran. The second change is to the way that GOMP_MAP_ATTACH_DETACH nodes are processed during sibling-list creation. For OpenMP, for pointer components, we must map the base pointer separately from an array section that uses the base pointer, so e.g. we must have both "map(mystruct.base)" and "map(mystruct.base[0:10])" mappings. These create nodes such as: GOMP_MAP_TOFROM mystruct.base G_M_TOFROM *mystruct.base [len: 10*elemsize] G_M_ATTACH_DETACH mystruct.base Instead of using the first of these directly when building the struct sibling list then skipping the group using GOMP_MAP_ATTACH_DETACH, leading to: GOMP_MAP_STRUCT mystruct [len: 1] GOMP_MAP_TOFROM mystruct.base we now introduce a new "mini-pass", omp_resolve_clause_dependencies, that drops the GOMP_MAP_TOFROM for the base pointer, marks the second group as having had a base-pointer mapping, then omp_build_struct_sibling_lists can create: GOMP_MAP_STRUCT mystruct [len: 1] GOMP_MAP_ALLOC mystruct.base [len: ptrsize] This ends up working better in many cases, particularly those involving references. (The "alloc" space is immediately overwritten by a pointer attachment, so this is mildly more efficient than a redundant TO mapping at runtime also.) There is support in the address tokenizer for "arbitrary" base expressions which aren't rooted at a decl, but that is not used as present because such addresses are disallowed at parse time. In the front-ends, the address tokenization machinery is mostly only used for clause expansion and not for diagnostics at present. It could be used for those too, which would allow more of my previous "address inspector" implementation to be removed. The new bits in gimplify.cc work with OpenACC also. This version of the patch addresses several first-pass review comments from Tobias, and fixes a few previously-missed cases for manually-managed ragged array mappings (including cases using references). Some arbitrary differences between handling of clause expansion for C vs. C++ have also been fixed, and some fragments from later in the patch series have been moved forward (where they were useful for fixing bugs). Several new test cases have been added. 2023-11-29 Julian Brown <julian@codesourcery.com> gcc/c-family/ * c-common.h (c_omp_region_type): Add C_ORT_EXIT_DATA, C_ORT_OMP_EXIT_DATA and C_ORT_ACC_TARGET. (omp_addr_token): Add forward declaration. (c_omp_address_inspector): New class. * c-omp.cc (c_omp_adjust_map_clauses): Mark decls addressable here, but do not change any mapping node types. (c_omp_address_inspector::unconverted_ref_origin, c_omp_address_inspector::component_access_p, c_omp_address_inspector::check_clause, c_omp_address_inspector::get_root_term, c_omp_address_inspector::map_supported_p, c_omp_address_inspector::get_origin, c_omp_address_inspector::maybe_unconvert_ref, c_omp_address_inspector::maybe_zero_length_array_section, c_omp_address_inspector::expand_array_base, c_omp_address_inspector::expand_component_selector, c_omp_address_inspector::expand_map_clause): New methods. (omp_expand_access_chain): New function. gcc/c/ * c-parser.cc (c_parser_oacc_all_clauses): Add TARGET_P parameter. Use to select region type for c_finish_omp_clauses call. (c_parser_oacc_loop): Update calls to c_parser_oacc_all_clauses. (c_parser_oacc_compute): Likewise. (c_parser_omp_target_data, c_parser_omp_target_enter_data): Support ATTACH kind. (c_parser_omp_target_exit_data): Support DETACH kind. (check_clauses): Handle GOMP_MAP_POINTER and GOMP_MAP_ATTACH here. * c-typeck.cc (handle_omp_array_sections_1, handle_omp_array_sections, c_finish_omp_clauses): Use c_omp_address_inspector class and OMP address tokenizer to analyze and expand map clause expressions. Fix some diagnostics. Fix "is OpenACC" condition for C_ORT_ACC_TARGET addition. gcc/cp/ * parser.cc (cp_parser_oacc_all_clauses): Add TARGET_P parameter. Use to select region type for finish_omp_clauses call. (cp_parser_omp_target_data, cp_parser_omp_target_enter_data): Support GOMP_MAP_ATTACH kind. (cp_parser_omp_target_exit_data): Support GOMP_MAP_DETACH kind. (cp_parser_oacc_declare): Update call to cp_parser_oacc_all_clauses. (cp_parser_oacc_loop): Update calls to cp_parser_oacc_all_clauses. (cp_parser_oacc_compute): Likewise. * pt.cc (tsubst_expr): Use C_ORT_ACC_TARGET for call to tsubst_omp_clauses for OpenACC compute regions. * semantics.cc (cp_omp_address_inspector): New class, derived from c_omp_address_inspector. (handle_omp_array_sections_1, handle_omp_array_sections, finish_omp_clauses): Use cp_omp_address_inspector class and OMP address tokenizer to analyze and expand OpenMP map clause expressions. Fix some diagnostics. Support C_ORT_ACC_TARGET. (finish_omp_target): Handle GOMP_MAP_POINTER. gcc/fortran/ * trans-openmp.cc (gfc_trans_omp_array_section): Add OPENMP parameter. Use GOMP_MAP_ATTACH_DETACH instead of GOMP_MAP_ALWAYS_POINTER for derived type components. (gfc_trans_omp_clauses): Update calls to gfc_trans_omp_array_section. gcc/ * gimplify.cc (build_struct_comp_nodes): Don't process GOMP_MAP_ATTACH_DETACH "middle" nodes here. (omp_mapping_group): Add REPROCESS_STRUCT and FRAGILE booleans for nested struct handling. (omp_strip_components_and_deref, omp_strip_indirections): Remove functions. (omp_get_attachment): Handle GOMP_MAP_DETACH here. (omp_group_last): Handle GOMP_MAP_*, GOMP_MAP_DETACH, GOMP_MAP_ATTACH_DETACH groups for "exit data" of reference-to-pointer component array sections. (omp_gather_mapping_groups_1): Initialise reprocess_struct and fragile fields. (omp_group_base): Handle GOMP_MAP_ATTACH_DETACH after GOMP_MAP_STRUCT. (omp_index_mapping_groups_1): Skip reprocess_struct groups. (omp_get_nonfirstprivate_group, omp_directive_maps_explicitly, omp_resolve_clause_dependencies, omp_first_chained_access_token): New functions. (omp_check_mapping_compatibility): Adjust accepted node combinations for "from" clauses using release instead of alloc. (omp_accumulate_sibling_list): Add GROUP_MAP, ADDR_TOKENS, FRAGILE_P, REPROCESSING_STRUCT, ADDED_TAIL parameters. Use OMP address tokenizer to analyze addresses. Reimplement nested struct handling, and implement "fragile groups". (omp_build_struct_sibling_lists): Adjust for changes to omp_accumulate_sibling_list. Recalculate bias for ATTACH_DETACH nodes after GOMP_MAP_STRUCT nodes. (gimplify_scan_omp_clauses): Call omp_resolve_clause_dependencies. Use OMP address tokenizer. (gimplify_adjust_omp_clauses_1): Use build_fold_indirect_ref_loc instead of build_simple_mem_ref_loc. * omp-general.cc (omp-general.h, tree-pretty-print.h): Include. (omp_addr_tokenizer): New namespace. (omp_addr_tokenizer::omp_addr_token): New. (omp_addr_tokenizer::omp_parse_component_selector, omp_addr_tokenizer::omp_parse_ref, omp_addr_tokenizer::omp_parse_pointer, omp_addr_tokenizer::omp_parse_access_method, omp_addr_tokenizer::omp_parse_access_methods, omp_addr_tokenizer::omp_parse_structure_base, omp_addr_tokenizer::omp_parse_structured_expr, omp_addr_tokenizer::omp_parse_array_expr, omp_addr_tokenizer::omp_access_chain_p, omp_addr_tokenizer::omp_accessed_addr): New functions. (omp_parse_expr, debug_omp_tokenized_addr): New functions. * omp-general.h (omp_addr_tokenizer::access_method_kinds, omp_addr_tokenizer::structure_base_kinds, omp_addr_tokenizer::token_type, omp_addr_tokenizer::omp_addr_token, omp_addr_tokenizer::omp_access_chain_p, omp_addr_tokenizer::omp_accessed_addr): New. (omp_addr_token, omp_parse_expr): New. * omp-low.cc (scan_sharing_clauses): Skip error check for references to pointers. * tree.h (OMP_CLAUSE_ATTACHMENT_MAPPING_ERASED): New macro. gcc/testsuite/ * c-c++-common/gomp/clauses-2.c: Fix error output. * c-c++-common/gomp/target-implicit-map-2.c: Adjust scan output. * c-c++-common/gomp/target-50.c: Adjust scan output. * c-c++-common/gomp/target-enter-data-1.c: Adjust scan output. * g++.dg/gomp/static-component-1.C: New test. * gcc.dg/gomp/target-3.c: Adjust scan output. * gfortran.dg/gomp/map-9.f90: Adjust scan output. libgomp/ * target.c (gomp_map_pointer): Modify zero-length array section pointer handling. (gomp_attach_pointer): Likewise. (gomp_map_fields_existing): Use gomp_map_0len_lookup. (gomp_attach_pointer): Allow attaching null pointers (or Fortran "unassociated" pointers). (gomp_map_vars_internal): Handle zero-sized struct members. Add diagnostic for unmapped struct pointer members. * testsuite/libgomp.c-c++-common/baseptrs-1.c: New test. * testsuite/libgomp.c-c++-common/baseptrs-2.c: New test. * testsuite/libgomp.c-c++-common/baseptrs-6.c: New test. * testsuite/libgomp.c-c++-common/baseptrs-7.c: New test. * testsuite/libgomp.c-c++-common/ptr-attach-2.c: New test. * testsuite/libgomp.c-c++-common/target-implicit-map-2.c: Fix missing "free". * testsuite/libgomp.c-c++-common/target-implicit-map-5.c: New test. * testsuite/libgomp.c-c++-common/target-map-zlas-1.c: New test. * testsuite/libgomp.c++/class-array-1.C: New test. * testsuite/libgomp.c++/baseptrs-3.C: New test. * testsuite/libgomp.c++/baseptrs-4.C: New test. * testsuite/libgomp.c++/baseptrs-5.C: New test. * testsuite/libgomp.c++/baseptrs-8.C: New test. * testsuite/libgomp.c++/baseptrs-9.C: New test. * testsuite/libgomp.c++/ref-mapping-1.C: New test. * testsuite/libgomp.c++/target-48.C: New test. * testsuite/libgomp.c++/target-49.C: New test. * testsuite/libgomp.c++/target-exit-data-reftoptr-1.C: New test. * testsuite/libgomp.c++/target-lambda-1.C: Update for OpenMP 5.2 semantics. * testsuite/libgomp.c++/target-this-3.C: Likewise. * testsuite/libgomp.c++/target-this-4.C: Likewise. * testsuite/libgomp.fortran/struct-elem-map-1.f90: Add temporary XFAIL. * testsuite/libgomp.fortran/target-enter-data-6.f90: Likewise.
2023-12-11aarch64: enable mixed-types for aarch64 simdclonesAndre Vieira4-6/+17
This patch enables the use of mixed-types for simd clones for AArch64, adds aarch64 as a target_vect_simd_clones and corrects the way the simdlen is chosen for non-specified simdlen clauses according to the 'Vector Function Application Binary Interface Specification for AArch64'. Additionally this patch also restricts combinations of simdlen and return/argument types that map to vectors larger than 128 bits as we currently do not have a way to represent these types in a way that is consistent internally and externally. gcc/ChangeLog: * config/aarch64/aarch64.cc (lane_size): New function. (aarch64_simd_clone_compute_vecsize_and_simdlen): Determine simdlen according to NDS rule and reject combination of simdlen and types that lead to vectors larger than 128bits. gcc/testsuite/ChangeLog: * lib/target-supports.exp: Add aarch64 targets to vect_simd_clones. * c-c++-common/gomp/declare-variant-14.c: Adapt test for aarch64. * c-c++-common/gomp/pr60823-1.c: Likewise. * c-c++-common/gomp/pr60823-2.c: Likewise. * c-c++-common/gomp/pr60823-3.c: Likewise. * g++.dg/gomp/attrs-10.C: Likewise. * g++.dg/gomp/declare-simd-1.C: Likewise. * g++.dg/gomp/declare-simd-3.C: Likewise. * g++.dg/gomp/declare-simd-4.C: Likewise. * g++.dg/gomp/declare-simd-7.C: Likewise. * g++.dg/gomp/declare-simd-8.C: Likewise. * g++.dg/gomp/pr88182.C: Likewise. * gcc.dg/declare-simd.c: Likewise. * gcc.dg/gomp/declare-simd-1.c: Likewise. * gcc.dg/gomp/declare-simd-3.c: Likewise. * gcc.dg/gomp/pr87887-1.c: Likewise. * gcc.dg/gomp/pr87895-1.c: Likewise. * gcc.dg/gomp/pr89246-1.c: Likewise. * gcc.dg/gomp/pr99542.c: Likewise. * gcc.dg/gomp/simd-clones-2.c: Likewise. * gcc.dg/vect/vect-simd-clone-1.c: Likewise. * gcc.dg/vect/vect-simd-clone-2.c: Likewise. * gcc.dg/vect/vect-simd-clone-4.c: Likewise. * gcc.dg/vect/vect-simd-clone-5.c: Likewise. * gcc.dg/vect/vect-simd-clone-6.c: Likewise. * gcc.dg/vect/vect-simd-clone-7.c: Likewise. * gcc.dg/vect/vect-simd-clone-8.c: Likewise. * gfortran.dg/gomp/declare-simd-2.f90: Likewise. * gfortran.dg/gomp/declare-simd-coarray-lib.f90: Likewise. * gfortran.dg/gomp/declare-variant-14.f90: Likewise. * gfortran.dg/gomp/pr79154-1.f90: Likewise. * gfortran.dg/gomp/pr83977.f90: Likewise. libgomp/ChangeLog: * testsuite/libgomp.c/declare-variant-1.c: Adapt test for aarch64. * testsuite/libgomp.fortran/declare-simd-1.f90: Likewise.