aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2021-10-11[Ada] Simplify code for checks within an initialization procedurePiotr Trojanek1-3/+1
gcc/ada/ * sem_util.adb (Compile_Time_Constraint_Error): Simplify getting the type of the first formal parameter.
2021-10-11[Ada] Fix crash on array component with Default_ValuePiotr Trojanek3-9/+12
gcc/ada/ * exp_util.adb (Inside_Init_Proc): Simplify. * sem_aggr.adb (Resolve_Record_Aggregate): Fix style. * sem_util.adb (Compile_Time_Constraint_Error): Guard against calling Corresponding_Concurrent_Type with an array type entity.
2021-10-11[Ada] Size of time_t in newer verions of VxWorks7Doug Rupp1-2/+6
gcc/ada/ * libgnat/s-parame__ae653.ads (time_t_bits): Change to Long_Long_Integer'Size. Add some comments to explain.
2021-10-11opts: Remove AUTODETECT_VALUE usage.Martin Liska2-6/+6
gcc/ChangeLog: * common.opt: Remove Init(2) for some options. * toplev.c (process_options): Do not use AUTODETECT_VALUE, but use rather OPTION_SET_P.
2021-10-11Remove usage of IRA_REGION_AUTODETECTMartin Liska3-6/+2
gcc/ChangeLog: * common.opt: Remove usage of IRA_REGION_AUTODETECT. * flag-types.h (enum ira_region): Likewise. * toplev.c (process_options): Use OPTION_SET_P instead of IRA_REGION_AUTODETECT.
2021-10-11libgomp: Add tests for omp_atv_serialized and deprecate omp_atv_sequential.Marcel Vollweiler5-3/+56
The variable omp_atv_sequential was replaced by omp_atv_serialized in OpenMP 5.1. This was already implemented by Jakub (C/C++, commit ea82325afec) and Tobias (Fortran, commit fff15bad1ab). This patch adds two tests to check if omp_atv_serialized is available (one test for C/C++ and one for Fortran). Besides that omp_atv_sequential is marked as deprecated in C/C++ and Fortran for OpenMP 5.1. libgomp/ChangeLog: * allocator.c (omp_init_allocator): Replace omp_atv_sequential with omp_atv_serialized. * omp.h.in: Add deprecated flag for omp_atv_sequential. * omp_lib.f90.in: Add deprecated flag for omp_atv_sequential. * testsuite/libgomp.c-c++-common/alloc-10.c: New test. * testsuite/libgomp.fortran/alloc-12.f90: New test.
2021-10-11openmp: Add omp_set_num_teams, omp_get_max_teams, omp_[gs]et_teams_thread_limitJakub Jelinek10-2/+136
OpenMP 5.1 adds env vars and functions to set and query new ICVs used as fallback if thread_limit or num_teams clauses aren't specified on teams construct. The following patch implements those, though further work will be needed: 1) OpenMP 5.1 also changed the num_teams clause, so that it can specify both lower and upper limit for how many teams should be created and changed the meaning when only one expression is provided, instead of num_teams(expr) in 5.0 meaning num_teams(1:expr) in 5.1, it now means num_teams(expr:expr), i.e. while previously we could create 1 to expr teams, in 5.1 we have some low limit by default equal to the single expression provided and may not create fewer teams. For host teams (which we don't currently implement efficiently for NUMA hosts) we trivially satisfy it now by always honoring what the user asked for, but for the offloading teams I think we'll need to rethink the APIs; currently teams construct is just a call that returns and possibly lowers the number of teams; and whenever possible we try to evaluate num_teams/thread_limit already on the target construct and the GOMP_teams call just sets the number of teams to the minimum of provided and requested teams; for some cases e.g. where target is not combined with teams and num_teams expression calls some functions etc., we need to call those functions in the target region and so it is late to figure number of teams, but also hw could just limit what it is willing to create; in that case I'm afraid we need to run the target body multiple times and arrange for omp_get_team_num () returning the right values 2) we need to finally implement the NUMA handling for GOMP_teams_reg 3) I now realize I haven't added some testcase coverage, will do that incrementally 4) libgomp.texi needs updates for these new APIs, but also others like the allocator 2021-10-11 Jakub Jelinek <jakub@redhat.com> gcc/ * omp-low.c (omp_runtime_api_call): Handle omp_get_max_teams, omp_[sg]et_teams_thread_limit and omp_set_num_teams. libgomp/ * omp.h.in (omp_set_num_teams, omp_get_max_teams, omp_set_teams_thread_limit, omp_get_teams_thread_limit): Declare. * omp_lib.f90.in (omp_set_num_teams, omp_get_max_teams, omp_set_teams_thread_limit, omp_get_teams_thread_limit): Declare. * omp_lib.h.in (omp_set_num_teams, omp_get_max_teams, omp_set_teams_thread_limit, omp_get_teams_thread_limit): Declare. * libgomp.h (gomp_nteams_var, gomp_teams_thread_limit_var): Declare. * libgomp.map (OMP_5.1): Export omp_get_max_teams{,_}, omp_get_teams_thread_limit{,_}, omp_set_num_teams{,_,_8_} and omp_set_teams_thread_limit{,_,_8_}. * icv.c (omp_set_num_teams, omp_get_max_teams, omp_set_teams_thread_limit, omp_get_teams_thread_limit): New functions. * env.c (gomp_nteams_var, gomp_teams_thread_limit_var): Define. (omp_display_env): Print OMP_NUM_TEAMS and OMP_TEAMS_THREAD_LIMIT. (initialize_env): Handle OMP_NUM_TEAMS and OMP_TEAMS_THREAD_LIMIT env vars. * teams.c (GOMP_teams_reg): If thread_limit is not specified, use gomp_teams_thread_limit_var as fallback if not zero. If num_teams is not specified, use gomp_nteams_var. * fortran.c (omp_set_num_teams, omp_get_max_teams, omp_set_teams_thread_limit, omp_get_teams_thread_limit): Add ialias_redirect. (omp_set_num_teams_, omp_set_num_teams_8_, omp_get_max_teams_, omp_set_teams_thread_limit_, omp_set_teams_thread_limit_8_, omp_get_teams_thread_limit_): New functions.
2021-10-11IBM Z: Provide rawmemchr{qi,hi,si} expanderStefan Schulze Frielinghaus6-26/+203
gcc/ChangeLog: * config/s390/s390-protos.h (s390_rawmemchr): Add prototype. * config/s390/s390.c (s390_rawmemchr): New function. * config/s390/s390.md (rawmemchr<SINT:mode>): New expander. * config/s390/vector.md (@vec_vfees<mode>): Basically a copy of the pattern vfees<mode> from vx-builtins.md. * config/s390/vx-builtins.md (*vfees<mode>): Remove. gcc/testsuite/ChangeLog: * gcc.target/s390/rawmemchr-1.c: New test.
2021-10-11ldist: Recognize strlen and rawmemchr like loopsStefan Schulze Frielinghaus12-31/+855
This patch adds support for recognizing loops which mimic the behaviour of functions strlen and rawmemchr, and replaces those with internal function calls in case a target provides them. In contrast to the standard strlen and rawmemchr functions, this patch also supports different instances where the memory pointed to is interpreted as 8, 16, and 32-bit sized, respectively. gcc/ChangeLog: * builtins.c (get_memory_rtx): Change to external linkage. * builtins.h (get_memory_rtx): Add function prototype. * doc/md.texi (rawmemchr<mode>): Document. * internal-fn.c (expand_RAWMEMCHR): Define. * internal-fn.def (RAWMEMCHR): Add. * optabs.def (rawmemchr_optab): Add. * tree-loop-distribution.c (find_single_drs): Change return code behaviour by also returning true if no single store was found but a single load. (loop_distribution::classify_partition): Respect the new return code behaviour of function find_single_drs. (loop_distribution::execute): Call new function transform_reduction_loop in order to replace rawmemchr or strlen like loops by calls into builtins. (generate_reduction_builtin_1): New function. (generate_rawmemchr_builtin): New function. (generate_strlen_builtin_1): New function. (generate_strlen_builtin): New function. (generate_strlen_builtin_using_rawmemchr): New function. (reduction_var_overflows_first): New function. (determine_reduction_stmt_1): New function. (determine_reduction_stmt): New function. (loop_distribution::transform_reduction_loop): New function. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/ldist-rawmemchr-1.c: New test. * gcc.dg/tree-ssa/ldist-rawmemchr-2.c: New test. * gcc.dg/tree-ssa/ldist-strlen-1.c: New test. * gcc.dg/tree-ssa/ldist-strlen-2.c: New test. * gcc.dg/tree-ssa/ldist-strlen-3.c: New test.
2021-10-11options: use cl_optimization_hash.Martin Liska1-18/+1
gcc/ChangeLog: * tree.c (cl_option_hasher::hash): Use cl_optimization_hash and remove legacy hashing code.
2021-10-11[PR/target 100316] Allow constant address for __builtin___clear_cache.Kito Cheng2-6/+22
__builtin___clear_cache was able to accept constant address for the argument, but it seems no longer accept recently, and it even not accept constant address which is hold in variable when optimization is enable: ``` void foo3(){ void *yy = (void*)0x1000; __builtin___clear_cache(yy, yy); } ``` So this patch make BEGIN and END accept VOIDmode, like cselib_lookup_mem did per Jim Wilson's suggestion. ``` static cselib_val * cselib_lookup_mem (rtx x, int create) { ... addr_mode = GET_MODE (XEXP (x, 0)); if (addr_mode == VOIDmode) addr_mode = Pmode; ``` Changes v2 -> v3: - Use gcc_assert rather than error, maybe_emit_call_builtin___clear_cache is internal use only, and we already checked the type in other place. Changes v1 -> v2: - Check is CONST_INT intead of cehck mode, no new testcase, since constant value with other type like CONST_DOUBLE will catched by front-end. e.g. Code: ```c void foo(){ __builtin___clear_cache(1.11, 0); } ``` Error message: ``` clearcache-double.c: In function 'foo': clearcache-double.c:2:27: error: incompatible type for argument 1 of '__builtin___clear_cache' 2 | __builtin___clear_cache(1.11, 0); | ^~~~ | | | double clearcache-double.c:2:27: note: expected 'void *' but argument is of type 'double' ``` gcc/ChangeLog: PR target/100316 * builtins.c (maybe_emit_call_builtin___clear_cache): Allow CONST_INT for BEGIN and END, and use gcc_assert rather than error. gcc/testsuite/ChangeLog: PR target/100316 * gcc.c-torture/compile/pr100316.c: New.
2021-10-11Adjust testcase for O2 vectorization enabling.liuhongt1-1/+1
gcc/testsuite/ChangeLog: PR middle-end/102669 * gnat.dg/unroll1.adb: Add -fno-tree-vectorize.
2021-10-11Daily bump.GCC Administrator4-1/+31
2021-10-10Fortran: handle initialization of derived type parameter arrays from scalarHarald Anlauf2-3/+32
gcc/fortran/ChangeLog: PR fortran/99348 PR fortran/102521 * decl.c (add_init_expr_to_sym): Extend initialization of parameter arrays from scalars to handle derived types. gcc/testsuite/ChangeLog: PR fortran/99348 PR fortran/102521 * gfortran.dg/parameter_array_init_8.f90: New test.
2021-10-10var-tracking: Fix a wrong-debug issue caused by my r10-7665 var-tracking ↵Jakub Jelinek1-1/+2
change [PR102441] Since my r10-7665-g33c45e51b4914008064d9b77f2c1fc0eea1ad060 change, we get wrong-debug on e.g. the following testcase at -O2 -g on x86_64-linux for the x parameter: void bar (int *r); int foo (int x) { int r = 0; bar (&r); return r; } At the start of function, we have subq $24, %rsp leaq 12(%rsp), %rdi instructions. The x parameter is passed in %rdi, but isn't used in the function and so the leaq instruction overwrites %rdi without remembering %rdi anywhere. Before the r10-7665 change (which was trying to fix a large (3% for 32-bit, 1% for 64-bit x86-64) debug info/loc growth introduced with r10-7515), the leaq insn above resulted in a MO_VAL_SET micro-operation that said that the value of sp + 12, a cselib_sp_derived_value_p, is stored into the %rdi register. The r10-7665 change added a change to add_stores that added no micro-operation for the leaq store, with the rationale that the sp based values can be and will be always computable some other more compact and primarily more stable way (cfa based expression like DW_OP_fbreg, that is the same in the whole function). That is true. But by throwing the micro-operation on the floor, we miss another important part of the MO_VAL_SET, in particular that the destination of the store, %rdi in this case, now has a different value from what it had before, so the vt_* dataflow code thinks that even after the leaq instruction %rdi still holds the x argument value (and changes it to DW_OP_entry_value (%rdi) only in the middle of the call to bar). Previously and with the patches below, the location for x changes already at the end of leaq instruction to DW_OP_entry_value (%rdi). My first attempt to fix this was instead of dropping the MO_VAL_SET add a MO_CLOBBER operation: --- gcc/var-tracking.c.jj 2021-05-04 21:02:24.196799586 +0200 +++ gcc/var-tracking.c 2021-09-24 19:23:16.420154828 +0200 @@ -6133,7 +6133,9 @@ add_stores (rtx loc, const_rtx expr, voi { if (preserve) preserve_value (v); - return; + mo.type = MO_CLOBBER; + mo.u.loc = loc; + goto log_and_return; } nloc = replace_expr_with_values (oloc); so don't track that the value lives in the loc destination, but track that the previous value doesn't live there anymore. That failed bootstrap miserably, the vt_* code isn't prepared to see MO_CLOBBER of a MEM that isn't tracked (e.g. has MEM_EXPR on it that the var-tracking code wants to track, i.e. track_p in add_stores). On the other side, thinking about it more, in the most common case where a cselib_sp_derived_value_p value is stored into the sp register (and which is the reason why PR94495 testcase got larger), dropping the micro-operation on the floor is the right thing, because we have that cselib_sp_derived_value_p tracking, any reads from the sp hard register will be treated as cselib_sp_derived_value_p. Then I've tried 3 different patches described below and in the end what is committed is patch2. Additionally, I've gathered statistics from cc1plus by always reverting the var-tracking.c change after finished bootstrap/regtest and rebuilding the stage3 var-tracking.o and cc1plus, such that it would be comparable. dwlocstat and .debug_{info,loclists} section sizes detailed below. patch3 uses MO_VAL_SET (i.e. essentially reversion of the r10-7665 change) when destination is not a REG_P and !track_p, otherwise if destination is sp drops the micro-operation on the floor (i.e. no change), otherwise adds a MO_CLOBBER. patch1 is similar, except it checks for destination not equal to sp and !track_p, i.e. for !track_p REG_P destinations other than sp it will use MO_VAL_SET rather than MO_CLOBBER. Finally, patch2, the shortest patch, uses MO_VAL_SET whenever destination is not sp and otherwise drops the micro-operation on the floor. All the 3 patches don't affect the PR94495 testcase, all the changes there were caused by stores of sp based values into %rsp. While the patch2 (and patch1 which results in exactly the same sizes) causes the largest debug loclists/info growth from the 3, it is still quite minor (0.651% on 64-bit and 0.114% on 32-bit) compared to the 1% and 3% PR94495 was trying to solve, and I actually think it is the best thing to do. Because, if we have say int q[10]; int *p = &q[0]; or similar and we load the &q[0] sp based value into some hard register, by noting in the debug info that p lives in some hard reg for some part of the function and a user is trying to change the p var in the debugger, if we say it lives in some register or memory, there is some chance that the changing of the value could work successfully (of course, nothing is guaranteed, we don't have tracking of where each var lives at which moment for changing purposes (i.e. what register, memory or else you need to change in order to change behavior of the code)), while if we just say that p's location is DW_OP_fbreg 16 DW_OP_stack_value, that is a read-only value one can just print but not change. Now, for stores of variable values into the sp register, I don't think we have such an issue, you don't want debugger to change your stack pointer when user asks to change value of some variable whose value lives in the stack pointer, that would pretty much always result in misbehavior of the program. So, my preference from these 3 is patch2 and that is being committed. 64-bit cc1plus ============== vanilla cov% samples cumul 0..10 1064665/37% 1064665/37% 11..20 35972/1% 1100637/38% 21..30 47969/1% 1148606/40% 31..40 45787/1% 1194393/42% 41..50 57529/2% 1251922/44% 51..60 53974/1% 1305896/46% 61..70 112055/3% 1417951/50% 71..80 79420/2% 1497371/52% 81..90 126225/4% 1623596/57% 91..100 1206682/42% 2830278/100% [34] .debug_info PROGBITS 0000000000000000 2f1c74c a44949f 00 0 0 1 [38] .debug_loclists PROGBITS 0000000000000000 ff5d046 506e947 00 0 0 1 patch1 (same as patch2) cov% samples cumul 0..10 1064685/37% 1064685/37% 11..20 36011/1% 1100696/38% 21..30 47975/1% 1148671/40% 31..40 45799/1% 1194470/42% 41..50 57566/2% 1252036/44% 51..60 54011/1% 1306047/46% 61..70 112068/3% 1418115/50% 71..80 79421/2% 1497536/52% 81..90 126171/4% 1623707/57% 91..100 1206571/42% 2830278/100% [34] .debug_info PROGBITS 0000000000000000 2f1c74c a448f27 00 0 0 1 [38] .debug_loclists PROGBITS 0000000000000000 ff608bc 52070dd 00 0 0 1 patch3 cov% samples cumul 0..10 1064698/37% 1064698/37% 11..20 36018/1% 1100716/38% 21..30 47977/1% 1148693/40% 31..40 45804/1% 1194497/42% 41..50 57562/2% 1252059/44% 51..60 54018/1% 1306077/46% 61..70 112071/3% 1418148/50% 71..80 79424/2% 1497572/52% 81..90 126172/4% 1623744/57% 91..100 1206534/42% 2830278/100% [34] .debug_info PROGBITS 0000000000000000 2f1c74c a449548 00 0 0 1 [38] .debug_loclists PROGBITS 0000000000000000 ff5df39 507acd8 00 0 0 1 So, size of .debug_info+.debug_loclists grows for vanilla -> patch1 (or patch2) by 0.651% and for vanilla -> patch3 by 0.020%. 32-bit cc1plus ============== vanilla cov% samples cumul 0..10 1061892/37% 1061892/37% 11..20 34002/1% 1095894/39% 21..30 43513/1% 1139407/40% 31..40 41667/1% 1181074/42% 41..50 59144/2% 1240218/44% 51..60 47009/1% 1287227/45% 61..70 105069/3% 1392296/49% 71..80 72990/2% 1465286/52% 81..90 125988/4% 1591274/56% 91..100 1208726/43% 2800000/100% [33] .debug_info PROGBITS 00000000 351ab10 8b1c83d 00 0 0 1 [37] .debug_loclists PROGBITS 00000000 ebc816e 3fe44fd 00 0 0 1 patch1 (same as patch2) cov% samples cumul 0..10 1061999/37% 1061999/37% 11..20 34065/1% 1096064/39% 21..30 43557/1% 1139621/40% 31..40 41690/1% 1181311/42% 41..50 59191/2% 1240502/44% 51..60 47143/1% 1287645/45% 61..70 105045/3% 1392690/49% 71..80 73021/2% 1465711/52% 81..90 125885/4% 1591596/56% 91..100 1208404/43% 2800000/100% [33] .debug_info PROGBITS 00000000 351ab10 8b1c597 00 0 0 1 [37] .debug_loclists PROGBITS 00000000 ebca915 401ffad 00 0 0 1 patch3 cov% samples cumul 0..10 1062006/37% 1062006/37% 11..20 34073/1% 1096079/39% 21..30 43559/1% 1139638/40% 31..40 41693/1% 1181331/42% 41..50 59189/2% 1240520/44% 51..60 47142/1% 1287662/45% 61..70 105054/3% 1392716/49% 71..80 73027/2% 1465743/52% 81..90 125874/4% 1591617/56% 91..100 1208383/43% 2800000/100% [33] .debug_info PROGBITS 00000000 351ab10 8b1c690 00 0 0 1 [37] .debug_loclists PROGBITS 00000000 ebca40a 4020a6e 00 0 0 1 So, size of .debug_info+.debug_loclists grows for vanilla -> patch1 (or patch2) by 0.114% and for vanilla -> patch3 by 0.116%. 2021-10-10 Jakub Jelinek <jakub@redhat.com> PR debug/102441 * var-tracking.c (add_stores): For cselib_sp_derived_value_p values use MO_VAL_SET if loc is not sp.
2021-10-10tree-optimization: [PR102622]: wrong code due to signed one bit integer and ↵Andrew Pinski2-9/+41
"a?-1:0" So it turns out this is kinda of a latent bug but not really latent. In GCC 9 and 10, phi-opt would transform a?-1:0 (even for signed 1-bit integer) to -(type)a but the type is an one bit integer which means the negation is undefined. GCC 11 fixed the problem by checking for a?pow2cst:0 transformation before a?-1:0 transformation. When I added the transformations to match.pd, I had swapped the order not paying attention and I didn't expect anything of it. Because there was no testcase failing due to this. Anyways this fixes the problem on the trunk by swapping the order in match.pd and adding a comment of why the order is this way. I will try to come up with a patch for GCC 9 and 10 series later on which fixes the problem there too. Note I didn't include the original testcase which requires the vectorizer and AVX-512f as I can't figure out the right dg options to restrict it to avx-512f but I did come up with a testcase which shows the problem and even more shows the problem with the 9/10 series as mentioned. OK? Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/102622 gcc/ChangeLog: * match.pd: Swap the order of a?pow2cst:0 and a?-1:0 transformations. Swap the order of a?0:pow2cst and a?0:-1 transformations. gcc/testsuite/ChangeLog: * gcc.c-torture/execute/bitfld-10.c: New test.
2021-10-10Daily bump.GCC Administrator7-1/+108
2021-10-09Fortran: accept both old and new-style relational operators in USE, ONLYHarald Anlauf2-4/+203
F2018:10.1.5.5.1(2) requires the same interpretation of old and new-style relational operators. As gfortran internally distinguishes between these versions, we must match equivalent notations in USE module, ONLY: OPERATOR(op) statements when reading modules. gcc/fortran/ChangeLog: PR fortran/65454 * module.c (read_module): Handle old and new-style relational operators when used in USE module, ONLY: OPERATOR(op). gcc/testsuite/ChangeLog: PR fortran/65454 * gfortran.dg/interface_operator_3.f90: New test.
2021-10-09testsuite: Add missing comment for some dg-warningKewen Lin6-9/+9
This fixes the typos introduced by commit r12-4240. The dg-warning format looks like: { dg-warning regexp [comment [{ target/xfail selector } [line] ]] } Some dg-warnings such as: { dg-warning "\\\[-Wstringop-overflow" { target { i?86-*-* x86_64-*-* } } } miss the comment field, it makes target selector not take effect. For targets which are not { i?86-*-* x86_64-*-* }, this kind of cases fail or pass unexpectedly. gcc/testsuite/ChangeLog: * c-c++-common/Wstringop-overflow-2.c: Add missing comment. * gcc.dg/Warray-bounds-51.c: Likewise. * gcc.dg/Warray-parameter-3.c: Likewise. * gcc.dg/Wstringop-overflow-14.c: Likewise. * gcc.dg/Wstringop-overflow-21.c: Likewise. * gcc.dg/Wstringop-overflow-76.c: Likewise.
2021-10-09Adjust more testcases for O2 vectorization enabling.liuhongt27-27/+29
libgomp/ChangeLog: * testsuite/libgomp.c++/scan-10.C: Add option -fvect-cost-model=cheap. * testsuite/libgomp.c++/scan-11.C: Ditto. * testsuite/libgomp.c++/scan-12.C: Ditto. * testsuite/libgomp.c++/scan-13.C: Ditto. * testsuite/libgomp.c++/scan-14.C: Ditto. * testsuite/libgomp.c++/scan-15.C: Ditto. * testsuite/libgomp.c++/scan-16.C: Ditto. * testsuite/libgomp.c++/scan-9.C: Ditto. * testsuite/libgomp.c-c++-common/lastprivate-conditional-7.c: Ditto. * testsuite/libgomp.c-c++-common/lastprivate-conditional-8.c: Ditto. * testsuite/libgomp.c/scan-11.c: Ditto. * testsuite/libgomp.c/scan-12.c: Ditto. * testsuite/libgomp.c/scan-13.c: Ditto. * testsuite/libgomp.c/scan-14.c: Ditto. * testsuite/libgomp.c/scan-15.c: Ditto. * testsuite/libgomp.c/scan-16.c: Ditto. * testsuite/libgomp.c/scan-17.c: Ditto. * testsuite/libgomp.c/scan-18.c: Ditto. * testsuite/libgomp.c/scan-19.c: Ditto. * testsuite/libgomp.c/scan-20.c: Ditto. * testsuite/libgomp.c/scan-21.c: Ditto. * testsuite/libgomp.c/scan-22.c: Ditto. gcc/testsuite/ChangeLog: * g++.dg/tree-ssa/pr94403.C: Add -fno-tree-vectorize * gcc.dg/optimize-bswapsi-5.c: Ditto. * gcc.dg/optimize-bswapsi-6.c: Ditto. * gcc.dg/Warray-bounds-51.c: Add additional option -mtune=generic for target x86/i?86 * gcc.dg/Wstringop-overflow-14.c: Ditto.
2021-10-09openmp: Add support for OpenMP 5.1 structured-block-sequencesJakub Jelinek8-30/+173
Related to this is the addition of structured-block-sequence in OpenMP 5.1, which doesn't change anything for Fortran, but for C/C++ allows multiple statements instead of just one possibly compound around the separating directives (section and scan). I've also made some updates to the OpenMP 5.1 support list in libgomp.texi. 2021-10-09 Jakub Jelinek <jakub@redhat.com> gcc/c/ * c-parser.c (c_parser_omp_structured_block_sequence): New function. (c_parser_omp_scan_loop_body): Use it. (c_parser_omp_sections_scope): Likewise. gcc/cp/ * parser.c (cp_parser_omp_structured_block): Remove disallow_omp_attrs argument. (cp_parser_omp_structured_block_sequence): New function. (cp_parser_omp_scan_loop_body): Use it. (cp_parser_omp_sections_scope): Likewise. gcc/testsuite/ * c-c++-common/gomp/sections1.c (foo): Don't expect errors on multiple statements in between section directive(s). Add testcases for invalid no statements in between section directive(s). * gcc.dg/gomp/sections-2.c (foo): Don't expect errors on multiple statements in between section directive(s). * g++.dg/gomp/sections-2.C (foo): Likewise. * g++.dg/gomp/attrs-6.C (foo): Add testcases for multiple statements in between section directive(s). (bar): Add testcases for multiple statements in between scan directive. * g++.dg/gomp/attrs-7.C (bar): Adjust expected error recovery. libgomp/ * libgomp.texi (OpenMP 5.1): Mention implemented support for structured block sequences in C/C++. Mention support for unconstrained/reproducible modifiers on order clause. Mention partial (C/C++ only) support of extentensions to atomics construct. Mention partial (C/C++ on clause only) support of align/allocator modifiers on allocate clause.
2021-10-09Refine movhfcc.liuhongt4-6/+67
For AVX512-FP16, HFmode only supports vcmpsh whose dest is mask register, so for movhfcc, it's vcmpsh op2, op1, %k1 vmovsh op1, op2{%k1} mov op2, dest gcc/ChangeLog: PR target/102639 * config/i386/i386-expand.c (ix86_valid_mask_cmp_mode): Handle HFmode. (ix86_use_mask_cmp_p): Ditto. (ix86_expand_sse_movcc): Ditto. * config/i386/i386.md (setcc_hf_mask): New define_insn. (movhf_mask): Ditto. (UNSPEC_MOVCC_MASK): New unspec. * config/i386/sse.md (UNSPEC_PCMP): Move to i386.md. gcc/testsuite/ChangeLog: * g++.target/i386/pr102639.C: New test.
2021-10-09Daily bump.GCC Administrator12-1/+586
2021-10-09libstdc++: Remove unnecessary uses of _GLIBCXX_USE_WCHAR_T in testsuite ↵Jonathan Wakely67-189/+18
[PR98725] Now that std::wstring and other specializations for wchar_t are defined unconditionally, many checks for _GLIBCXX_USE_WCHAR_T in the testsuite are unnecessary and can be removed. Tests for iostreams, locales, regex and filesystem::path still need to be guarded by _GLIBCXX_USE_WCHAR_T because those components depend on libc support in <wchar.h> and other headers. libstdc++-v3/ChangeLog: PR libstdc++/98725 * testsuite/18_support/numeric_limits/lowest.cc: Remove use of _GLIBCXX_USE_WCHAR_T. * testsuite/18_support/numeric_limits/min_max.cc: Replace use of _GLIBCXX_USE_WCHAR_T with checks for WCHAR_MIN and WCHAR_MAX. * testsuite/20_util/from_chars/1_neg.cc: Remove use of _GLIBCXX_USE_WCHAR_T. * testsuite/20_util/function_objects/searchers.cc: Likewise. Use char_traits<wchar_t>::length instead of wcslen. * testsuite/20_util/hash/requirements/explicit_instantiation.cc: Likewise. * testsuite/20_util/is_arithmetic/value.cc: Likewise. * testsuite/20_util/is_compound/value.cc: Likewise. * testsuite/20_util/is_floating_point/value.cc: Likewise. * testsuite/20_util/is_fundamental/value.cc: Likewise. * testsuite/20_util/is_integral/value.cc: Likewise. * testsuite/20_util/is_signed/value.cc: Likewise. * testsuite/20_util/is_unsigned/value.cc: Likewise. * testsuite/20_util/is_void/value.cc: Likewise. * testsuite/20_util/make_signed/requirements/typedefs-1.cc: Likewise. * testsuite/20_util/make_signed/requirements/typedefs-2.cc: Likewise. * testsuite/20_util/make_signed/requirements/typedefs-3.cc: Likewise. * testsuite/20_util/make_signed/requirements/typedefs-4.cc: Likewise. * testsuite/20_util/make_unsigned/requirements/typedefs-1.cc: Likewise. * testsuite/20_util/make_unsigned/requirements/typedefs-2.cc: Likewise. * testsuite/20_util/make_unsigned/requirements/typedefs-3.cc: Likewise. * testsuite/20_util/to_chars/3.cc: Likewise. * testsuite/20_util/type_identity/requirements/typedefs.cc: Likewise. * testsuite/21_strings/basic_string/hash/debug.cc: Likewise. * testsuite/21_strings/basic_string/hash/hash.cc: Likewise. * testsuite/21_strings/basic_string/literals/types-char8_t.cc: Likewise. * testsuite/21_strings/basic_string/literals/types.cc: Likewise. * testsuite/21_strings/basic_string/literals/values-char8_t.cc: Likewise. * testsuite/21_strings/basic_string/literals/values.cc: Likewise. * testsuite/21_strings/basic_string/modifiers/64422.cc: Likewise. * testsuite/21_strings/basic_string/range_access/wchar_t/1.cc: Likewise. * testsuite/21_strings/basic_string/requirements/citerators.cc: Likewise. * testsuite/21_strings/basic_string/requirements/typedefs.cc: Likewise. * testsuite/21_strings/basic_string/types/pmr_typedefs.cc: Likewise. * testsuite/21_strings/basic_string_view/literals/types-char8_t.cc: Likewise. * testsuite/21_strings/basic_string_view/literals/types.cc: Likewise. * testsuite/21_strings/basic_string_view/literals/values-char8_t.cc: Likewise. * testsuite/21_strings/basic_string_view/literals/values.cc: Likewise. * testsuite/21_strings/basic_string_view/requirements/typedefs.cc: Likewise. * testsuite/21_strings/basic_string_view/typedefs.cc: Likewise. * testsuite/21_strings/char_traits/requirements/constexpr_functions.cc: Likewise. * testsuite/21_strings/char_traits/requirements/constexpr_functions_c++17.cc: Likewise. * testsuite/21_strings/char_traits/requirements/constexpr_functions_c++20.cc: Likewise. * testsuite/22_locale/ctype/is/string/89728_neg.cc: Likewise. * testsuite/25_algorithms/fill/4.cc: Likewise. * testsuite/25_algorithms/fill_n/1.cc: Likewise. * testsuite/experimental/functional/searchers.cc: Likewise. Use char_traits<wchar_t>::length instead of wcslen. * testsuite/experimental/polymorphic_allocator/pmr_typedefs_string.cc: Likewise. * testsuite/experimental/string_view/literals/types-char8_t.cc: Likewise. * testsuite/experimental/string_view/literals/types.cc: Likewise. * testsuite/experimental/string_view/literals/values-char8_t.cc: Likewise. * testsuite/experimental/string_view/literals/values.cc: Likewise. * testsuite/experimental/string_view/range_access/wchar_t/1.cc: Likewise. * testsuite/experimental/string_view/requirements/typedefs.cc: Likewise. * testsuite/experimental/string_view/typedefs.cc: Likewise. * testsuite/ext/vstring/range_access.cc: Likewise. * testsuite/std/concepts/concepts.lang/concept.arithmetic/integral.cc: Likewise. * testsuite/std/concepts/concepts.lang/concept.arithmetic/signed_integral.cc: Likewise. * testsuite/std/concepts/concepts.lang/concept.arithmetic/unsigned_integral.cc: Likewise. * testsuite/tr1/4_metaprogramming/is_arithmetic/value.cc: Likewise. * testsuite/tr1/4_metaprogramming/is_compound/value.cc: Likewise. * testsuite/tr1/4_metaprogramming/is_floating_point/value.cc: Likewise. * testsuite/tr1/4_metaprogramming/is_fundamental/value.cc: Likewise. * testsuite/tr1/4_metaprogramming/is_integral/value.cc: Likewise. * testsuite/tr1/4_metaprogramming/is_signed/value.cc: Likewise. * testsuite/tr1/4_metaprogramming/is_unsigned/value.cc: Likewise. * testsuite/tr1/4_metaprogramming/is_void/value.cc: Likewise. * testsuite/tr1/6_containers/hash/24799.cc: Likewise.
2021-10-09libstdc++: Define deleted wchar_t overloads unconditionally [PR 98725]Jonathan Wakely1-4/+0
We don't need to have <wchar.h> support in order to delete overloads for inserting wide characters into narrow streams. libstdc++-v3/ChangeLog: PR libstdc++/98725 * include/std/ostream (operator<<(basic_ostream<char, Tr>&, wchar_t)) (operator<<(basic_ostream<char, Tr>&, const wchar_t*)): Always define as deleted. Do not check _GLIBCXX_USE_WCHAR_T.
2021-10-09libstdc++: Define std::wstring_convert unconditionally [PR 98725]Jonathan Wakely1-4/+0
The wchar_t type is defined unconditionally for C++, so there is no reason for std::wstring_convert and std::wbuffer_convert to be disabled when <wchar.h> is not usable. It should be possible to use those class templates with char16_t and char32_t even if wchar_t conversions don't work. libstdc++-v3/ChangeLog: PR libstdc++/98725 * include/bits/locale_conv.h (wstring_convert, wbuffer_convert): Define unconditionally. Do not check _GLIBCXX_USE_WCHAR_T.
2021-10-09libstdc++: Enable type traits for wchar_t unconditionally [PR98725]Jonathan Wakely3-11/+1
None of these traits depend on libc support for wchar_t, so they should be defined unconditionally. The wchar_t type is always defined in C++. libstdc++-v3/ChangeLog: PR libstdc++/98725 * include/c_global/cstddef [!_GLIBCXX_USE_WCHAR_T] (__byte_operand<wchar_t>): Define specialization. * include/std/type_traits (__make_signed<wchar_t>) (__make_unsigned<wchar_t>): Remove redundant check for __WCHAR_TYPE__ being defined. * include/tr1/type_traits [!_GLIBCXX_USE_WCHAR_T] (__is_integral_helper<wchar_t>): Likewise.
2021-10-09libstdc++: Enable vstring for wchar_t unconditionally [PR98725]Jonathan Wakely3-6/+0
None of these vstring specializations depend on libc support for wchar_t, so can be enabled unconditionally now that char_traits<wchar_t> is always available. libstdc++-v3/ChangeLog: PR libstdc++/98725 * include/ext/rc_string_base.h [!_GLIBCXX_USE_WCHAR_T] (__rc_string_base<wchar_t>): Define member function. * include/ext/vstring.h [!_GLIBCXX_USE_WCHAR_T] (hash<__gnu_cxx::__wvstring>): Define specialization. * include/ext/vstring_fwd.h [!_GLIBCXX_USE_WCHAR_T] (__wvstring) (__wsso_string, __wrc_string): Declare typedefs.
2021-10-09libstdc++: Always define typedefs and hash functions for wide strings [PR 98725]Jonathan Wakely7-27/+5
The wstring and wstring_view typedefs should be enabled even if <wchar.h> isn't supported, because char_traits<wchar_t> works unconditionally. Similarly, the std::hash specializations for wide strings do not depend on <wchar.h> support. Although the primary template works OK for std::char_traits<wchar_t> in the absence of <wchar.h> support, this patch still defines it as an explicit specialization for compatibility with declarations that expect it to be specialized. The explicit specialization just uses the same __gnu_cxx::char_traits base class as the primary template. libstdc++-v3/ChangeLog: PR libstdc++/98725 * include/bits/char_traits.h (char_traits<wchar_t>): Define explicit specialization unconditionally. * include/bits/basic_string.h (hash<wstring>): Define unconditionally. Do not check _GLIBCXX_USE_WCHAR_T. * include/bits/stringfwd.h (wstring): Likewise. * include/debug/string (wstring): Likewise. * include/experimental/string_view (experimental::wstring_view) (hash<experimental::wstring_view>): Likewise. * include/std/string (pmr::wstring, hash<pmr::wstring>): Likewise. * include/std/string_view (wstring_view, hash<wstring_view>): Likewise.
2021-10-09libstdc++: Move test that depends on wchar_t I/O to wchar_t sub-directoryJonathan Wakely1-0/+0
This fixes a FAIL when --disable-wchar_t is used. libstdc++-v3/ChangeLog: * testsuite/27_io/basic_filebuf/close/81256.cc: Moved to... * testsuite/27_io/basic_filebuf/close/wchar_t/81256.cc: ...here.
2021-10-09libstdc++: Add missing _GLIBCXX_USE_WCHAR_T checks in testsuiteJonathan Wakely13-5/+53
These tests fail for a --disable-wchar_t build. libstdc++-v3/ChangeLog: * testsuite/22_locale/conversions/buffer/1.cc: Check _GLIBCXX_USE_WCHAR_T. * testsuite/22_locale/conversions/buffer/3.cc: Likewise. Add test using char16_t. * testsuite/22_locale/conversions/string/1.cc: Check _GLIBCXX_USE_WCHAR_T. * testsuite/27_io/filesystem/path/generic/generic_string.cc: Likewise. * testsuite/27_io/filesystem/path/modifiers/make_preferred.cc: Likewise. * testsuite/27_io/filesystem/path/native/alloc.cc: Likewise. * testsuite/27_io/filesystem/path/native/string-char8_t.cc: Likewise. * testsuite/27_io/filesystem/path/native/string.cc: Likewise. * testsuite/28_regex/algorithms/regex_match/extended/wstring_locale.cc: Likewise. * testsuite/experimental/filesystem/path/generic/generic_string.cc: Likewise. * testsuite/experimental/filesystem/path/native/alloc.cc: Likewise. * testsuite/experimental/filesystem/path/native/string-char8_t.cc: Likewise. * testsuite/experimental/filesystem/path/native/string.cc: Likewise.
2021-10-09libstdc++: Replace uses of _GLIBCXX_USE_INT128 in testsuiteJonathan Wakely25-26/+66
Since r12-435 the _GLIBCXX_USE_INT128 macro is never defined, so all uses of it in the testsuite are wrong. The tests should be checking __SIZEOF_INT128__ instead. Also add some tests for an INT_3 type, which were missing. libstdc++-v3/ChangeLog: * testsuite/18_support/numeric_limits/40856.cc: Replace use of _GLIBCXX_USE_INT128. * testsuite/18_support/numeric_limits/dr559.cc: Likewise. * testsuite/18_support/numeric_limits/lowest.cc: Likewise. * testsuite/18_support/numeric_limits/max_digits10.cc: Likewise. * testsuite/20_util/is_floating_point/value.cc: Likewise. * testsuite/20_util/is_integral/value.cc: Likewise. * testsuite/20_util/is_signed/value.cc: Likewise. * testsuite/20_util/is_unsigned/value.cc: Likewise. * testsuite/20_util/make_signed/requirements/typedefs-1.cc: Likewise. * testsuite/20_util/make_signed/requirements/typedefs-2.cc: Likewise. * testsuite/20_util/make_unsigned/requirements/typedefs-1.cc: Likewise. * testsuite/20_util/make_unsigned/requirements/typedefs-2.cc: Likewise. * testsuite/20_util/type_identity/requirements/typedefs.cc: Likewise. * testsuite/26_numerics/bit/bit.count/countl_one.cc: Likewise. * testsuite/26_numerics/bit/bit.count/countl_zero.cc: Likewise. * testsuite/26_numerics/bit/bit.count/countr_one.cc: Likewise. * testsuite/26_numerics/bit/bit.count/countr_zero.cc: Likewise. * testsuite/26_numerics/bit/bit.count/popcount.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/bit_ceil.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/bit_floor.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/bit_width.cc: Likewise. * testsuite/26_numerics/bit/bit.pow.two/has_single_bit.cc: Likewise. * testsuite/26_numerics/bit/bit.rotate/rotl.cc: Likewise. libstdc++-v3/ChangeLog: * testsuite/26_numerics/bit/bit.rotate/rotr.cc: * testsuite/util/testsuite_common_types.h:
2021-10-09libstdc++: Access std::pair members without tuple-like helpersJonathan Wakely3-76/+56
This avoids the tuple-like API for std::pair in the unordered containers, removing some overly generic code. The _Select1st projection can figure out the member types of a std::pair without using decltype(std::get<0>(...)). We don't need _Select2nd because it's only needed in _NodeBuilder::_S_build, and that can just access the .second member of the pair directly. The return type of that function doesn't need to be deduced by decltype, we can just expose the __node_type typedef of the node generator. libstdc++-v3/ChangeLog: * include/bits/hashtable_policy.h (_Select1st): Replace use of std::get. (_Select2nd): Remove. (_NodeBuilder::_S_build): Use _NodeGenerator::__node_type typedef instead of deducing it. Remove unnecessary piecewise construction. (_ReuseOrAllocNode): Make __node_type public. (_Map_base): Adjust partial specialization to be able to extract the mapped_type without using tuple_element. (_Map_base::at): Define inline * testsuite/23_containers/unordered_map/requirements/53339.cc: Remove XFAIL. * testsuite/23_containers/unordered_multimap/requirements/53339.cc: Likewise.
2021-10-09libstdc++: Avoid instantiation of _Hash_node before it's neededJonathan Wakely2-9/+17
This is a step towards restoring support for incomplete types in unordered containers (PR 53339). We do not need to instantiate the node type to get its value_type member, because we know that the value type is the first template parameter. We can deduce that template argument using a custom trait and a partial specialization for _Hash_node. If we wanted to support custom hash node types we could still use typename _Tp::value_type in the primary template of that trait, but that seems unnecessary. The other change needed is to defer a static assert at class scope, so that it is done when the types are complete. We must have a complete type in the destructor, so we can do it there instead. libstdc++-v3/ChangeLog: * include/bits/hashtable.h: Move static assertion to destructor. * include/bits/hashtable_policy.h: Deduce value type from node type without instantiating it.
2021-10-08Fortran: Add diagnostic for F2018:C839 (TS29113:C535c)Sandra Loosemore6-68/+236
2021-10-08 Sandra Loosemore <sandra@codesourcery.com> PR fortran/54753 gcc/fortran/ * interface.c (gfc_compare_actual_formal): Add diagnostic for F2018:C839. Refactor shared code and fix bugs with class array info lookup, and extend similar diagnostic from PR94110 to also cover class types. gcc/testsuite/ * gfortran.dg/c-interop/c535c-1.f90: Rewrite and expand. * gfortran.dg/c-interop/c535c-2.f90: Remove xfails. * gfortran.dg/c-interop/c535c-3.f90: Likewise. * gfortran.dg/c-interop/c535c-4.f90: Likewise. * gfortran.dg/PR94110.f90: Extend to cover class types.
2021-10-08[PR102627] Use at least natural mode during splitting hard reg live rangeVladimir N. Makarov2-2/+44
In the PR test case SImode was used to split live range of cx on x86-64 because it was the biggest mode for this hard reg in the function. But all 64-bits of cx contain structure members. We need always to use at least natural mode of hard reg in splitting to fix this problem. gcc/ChangeLog: PR rtl-optimization/102627 * lra-constraints.c (split_reg): Use at least natural mode of hard reg. gcc/testsuite/ChangeLog: PR rtl-optimization/102627 * gcc.target/i386/pr102627.c: New test.
2021-10-08libstdc++: Detect miscompilation of src/c++11/limits.ccJonathan Wakely1-0/+4
Add a #error directive to ensure that the definitions are not compiled as C++17, which would prevent them being emitted. libstdc++-v3/ChangeLog: PR libstdc++/98725 * src/c++11/limits.cc: Fail if __cpp_inline_variables is defined.
2021-10-08Grow non_null_ref bitmap when num_ssa_names increases.Aldy Hernandez1-0/+3
The strlen pass changes the IL as it works with the ranger. This causes the non_null_ref code to sometimes get asked questions about new SSA names. Tested on x86-64 Linux. gcc/ChangeLog: * gimple-range-cache.cc (non_null_ref::non_null_deref_p): Grow bitmap if needed.
2021-10-08Implement irange::debug()Aldy Hernandez2-0/+8
Tested on x86-64 Linux. gcc/ChangeLog: * value-range.cc (irange::debug): New. * value-range.h (irange::debug): New.
2021-10-08libstdc++: Reduce header dependencies of <algorithm> in C++20 [PR 92546]Jonathan Wakely1-1/+3
The <bits/ranges_algobase.h> header doesn't need the stream and streambuf iterators, so don't include the whole of <iterator>. libstdc++-v3/ChangeLog: PR libstdc++/92546 * include/bits/ranges_algobase.h: Replace <iterator> with a subset of the headers it includes.
2021-10-08libsanitizer: Add AM_CCASFLAGS to Makefile.amH.J. Lu12-0/+12
commit 9069eb28d45baaa8baf5e3790b03b0e2cc5b49b3 Author: Igor Tsimbalist <igor.v.tsimbalist@intel.com> Date: Fri Nov 17 22:34:50 2017 +0100 Enable building libsanitizer with Intel CET libsanitizer/ * acinclude.m4: Add enable.m4 and cet.m4. * Makefile.in: Regenerate. * asan/Makefile.am: Update AM_CXXFLAGS. * asan/Makefile.in: Regenerate. * configure: Likewise. * configure.ac: Set CET_FLAGS. Update EXTRA_CFLAGS, EXTRA_CXXFLAGS, EXTRA_ASFLAGS. * interception/Makefile.am: Update AM_CXXFLAGS. * interception/Makefile.in: Regenerate. * libbacktrace/Makefile.am: Update AM_CFLAGS, AM_CXXFLAGS. * libbacktrace/Makefile.in: Regenerate. * lsan/Makefile.am: Update AM_CXXFLAGS. * lsan/Makefile.in: Regenerate. * sanitizer_common/Makefile.am: Update AM_CXXFLAGS, AM_CCASFLAGS. * sanitizer_common/sanitizer_linux_x86_64.S: Include cet.h. Add _CET_ENDBR macro. * sanitizer_common/Makefile.in: Regenerate. * tsan/Makefile.am: Update AM_CXXFLAGS. * tsan/Makefile.in: Regenerate. * tsan/tsan_rtl_amd64.S Include cet.h. Add _CET_ENDBR macro. * ubsan/Makefile.am: Update AM_CXXFLAGS. * ubsan/Makefile.in: Regenerate. failed to add EXTRA_ASFLAGS to AM_CCASFLAGS in all Makefile.am. As the result, CET aren't enabled in all assembly codes. Add AM_CCASFLAGS to Makefile.am to compile assembly codes with $CET_FLAGS. PR sanitizer/102632 * asan/Makefile.am (AM_CCASFLAGS): New. Set to $(EXTRA_ASFLAGS). * hwasan/Makefile.am (AM_CCASFLAGS): Likewise. * interception/Makefile.am (AM_CCASFLAGS): Likewise. * lsan/Makefile.am (AM_CCASFLAGS): Likewise. * tsan/Makefile.am (AM_CCASFLAGS): Likewise. * ubsan/Makefile.am (AM_CCASFLAGS): Likewise. * asan/Makefile.in: Regenerate. * hwasan/Makefile.in: Likewise. * interception/Makefile.in: Likewise. * lsan/Makefile.in: Likewise. * tsan/Makefile.in: Likewise. * ubsan/Makefile.in: Likewise.
2021-10-08loop: Fix profile updates after unrolling [PR102385]Richard Sandiford8-37/+140
In g:62acc72a957b5614 I'd stopped the unroller from using an epilogue loop in cases where the iteration count was known to be a multiple of the unroll factor. The epilogue and non-epilogue cases still shared this (preexisting) code to update the edge frequencies: basic_block exit_bb = single_pred (loop->latch); new_exit = find_edge (exit_bb, rest); new_exit->probability = profile_probability::always () .apply_scale (1, new_est_niter + 1); [etc] But of course (in hindsight) that only makes sense for the epilogue case, where we've already moved the main loop's exit edge to be a sibling of the latch edge. For the non-epilogue case, the exit edge stays (and needs to stay) in its original position. I don't really understand what the code is trying to do for the epilogue case. It has: /* Ensure that the frequencies in the loop match the new estimated number of iterations, and change the probability of the new exit edge. */ profile_count freq_h = loop->header->count; profile_count freq_e = (loop_preheader_edge (loop))->count (); if (freq_h.nonzero_p ()) { ... scale_loop_frequencies (loop, freq_e.probability_in (freq_h)); } Here, freq_e.probability_in (freq_h) is freq_e / freq_h, so for the header block, this has the effect of: new header count = freq_h * (freq_e / freq_h) i.e. we say that the header executes exactly as often as the preheader edge, which would only make sense if the loop never iterates. Also, after setting the probability of the nonexit edge (correctly) to new_est_niter / (new_est_niter + 1), the code does: scale_bbs_frequencies (&loop->latch, 1, prob); for this new probability. I think that only makes sense if the nonexit edge was previously unconditional (100%). But the code carefully preserved the probability of the original exit edge when creating the new one. All I'm trying to do here though is fix the mess I created and get the probabilities right for the non-epilogue case. Things are simpler there since we don't have to worry about loop versioning. Hopefully the comments explain the approach. The function's current interface implies that it can cope with multiple exit edges and that the function only needs the iteration count relative to one of those edges in order to work correctly. In practice that's not the case: it assumes there is exactly one exit edge and all current callers also ensure that the exit test dominates the latch. I think the function is easier to follow if we remove the implied generality. gcc/ PR tree-optimization/102385 * predict.h (change_edge_frequency): Declare. * predict.c (change_edge_frequency): New function. * tree-ssa-loop-manip.h (tree_transform_and_unroll_loop): Remove edge argument. (tree_unroll_loop): Likewise. * gimple-loop-jam.c (tree_loop_unroll_and_jam): Update accordingly. * tree-predcom.c (pcom_worker::tree_predictive_commoning_loop): Likewise. * tree-ssa-loop-prefetch.c (loop_prefetch_arrays): Likewise. * tree-ssa-loop-manip.c (tree_unroll_loop): Likewise. (tree_transform_and_unroll_loop): Likewise. Use single_dom_exit to retrieve the exit edges. Make all the old profile update code conditional on !single_loop_p -- the case it was written for -- and use a different approach for the single-loop case. gcc/testsuite/ * gcc.dg/pr102385.c: New test.
2021-10-08opts: include missing header files.Martin Liska2-0/+2
gcc/objc/ChangeLog: * objc-next-runtime-abi-01.c: Add missing include. * objc-next-runtime-abi-02.c: Likewise.
2021-10-08Come up with OPTION_SET_P macro.Martin Liska53-167/+192
gcc/ada/ChangeLog: * gcc-interface/misc.c (gnat_post_options): Use new macro OPTION_SET_P. (gnat_init_gcc_eh): Likewise. (gnat_init_gcc_fp): Likewise. gcc/c-family/ChangeLog: * c-opts.c (c_common_post_options): Use new macro OPTION_SET_P. gcc/ChangeLog: * config/alpha/alpha.c (alpha_option_override): Use new macro OPTION_SET_P. * config/arc/arc.c (arc_override_options): Likewise. * config/arm/arm.c (arm_option_override): Likewise. * config/bfin/bfin.c (bfin_load_pic_reg): Likewise. * config/c6x/c6x.c (c6x_option_override): Likewise. * config/csky/csky.c: Likewise. * config/darwin.c (darwin_override_options): Likewise. * config/frv/frv.c (frv_option_override): Likewise. * config/i386/djgpp.h: Likewise. * config/i386/i386.c (ix86_stack_protect_guard): Likewise. (ix86_max_noce_ifcvt_seq_cost): Likewise. * config/ia64/ia64.c (ia64_option_override): Likewise. (ia64_override_options_after_change): Likewise. * config/m32c/m32c.c (m32c_option_override): Likewise. * config/m32r/m32r.c (m32r_init): Likewise. * config/m68k/m68k.c (m68k_option_override): Likewise. * config/microblaze/microblaze.c (microblaze_option_override): Likewise. * config/mips/mips.c (mips_option_override): Likewise. * config/nios2/nios2.c (nios2_option_override): Likewise. * config/nvptx/nvptx.c (nvptx_option_override): Likewise. * config/pa/pa.c (pa_option_override): Likewise. * config/riscv/riscv.c (riscv_option_override): Likewise. * config/rs6000/aix71.h: Likewise. * config/rs6000/aix72.h: Likewise. * config/rs6000/aix73.h: Likewise. * config/rs6000/rs6000.c (darwin_rs6000_override_options): Likewise. (rs6000_override_options_after_change): Likewise. (rs6000_linux64_override_options): Likewise. (glibc_supports_ieee_128bit): Likewise. (rs6000_option_override_internal): Likewise. (rs6000_file_start): Likewise. (rs6000_darwin_file_start): Likewise. * config/rs6000/rtems.h: Likewise. * config/rs6000/sysv4.h: Likewise. * config/rs6000/vxworks.h (SUB3TARGET_OVERRIDE_OPTIONS): Likewise. * config/s390/s390.c (s390_option_override): Likewise. * config/sh/linux.h: Likewise. * config/sh/netbsd-elf.h (while): Likewise. * config/sh/sh.c (sh_option_override): Likewise. * config/sol2.c (solaris_override_options): Likewise. * config/sparc/sparc.c (sparc_option_override): Likewise. * config/tilegx/tilegx.c (tilegx_option_override): Likewise. * config/visium/visium.c (visium_option_override): Likewise. * config/vxworks.c (vxworks_override_options): Likewise. * lto-opts.c (lto_write_options): Likewise. * omp-expand.c (expand_omp_simd): Likewise. * omp-general.c (omp_max_vf): Likewise. * omp-offload.c (oacc_xform_loop): Likewise. * opts.h (OPTION_SET_P): Likewise. * targhooks.c (default_max_noce_ifcvt_seq_cost): Likewise. * toplev.c (process_options): Likewise. * tree-predcom.c: Likewise. * tree-sra.c (analyze_all_variable_accesses): Likewise. gcc/cp/ChangeLog: * constexpr.c (maybe_warn_about_constant_value): Use new macro OPTION_SET_P. * decl.c (redeclaration_error_message): Likewise. (cxx_init_decl_processing): Likewise. gcc/d/ChangeLog: * d-lang.cc (d_post_options): Use new macro OPTION_SET_P. gcc/fortran/ChangeLog: * options.c (gfc_post_options): Use new macro OPTION_SET_P. gcc/objc/ChangeLog: * objc-next-runtime-abi-01.c: Use new macro OPTION_SET_P. * objc-next-runtime-abi-02.c (objc_next_runtime_abi_02_init): Likewise.
2021-10-08libstdc++: Restore debug checks in uniform container erasure functionsJonathan Wakely12-103/+45
This partially reverts commit 561078480ffb5adb68577276c6b23e4ee7b39272. If we avoid all debug mode checks when erasing elements then we fail to invalidate safe iterators to the removed elements. This reverts the recent changes in r12-4083 and r12-4233, restoring the debug checking. libstdc++-v3/ChangeLog: * include/experimental/deque (erase, erase_if): Revert changes to avoid debug mode overhead. * include/experimental/map (erase, erase_if): Likewise. * include/experimental/set (erase, erase_if): Likewise. * include/experimental/unordered_map (erase, erase_if): Likewise. * include/experimental/unordered_set (erase, erase_if): Likewise. * include/experimental/vector (erase, erase_if): Likewise. * include/std/deque (erase, erase_if): Likewise. * include/std/map (erase, erase_if): Likewise. * include/std/set (erase, erase_if): Likewise. * include/std/unordered_map (erase, erase_if): Likewise. * include/std/unordered_set (erase, erase_if): Likewise. * include/std/vector (erase, erase_if): Likewise.
2021-10-08libstdc++: Implement ostream insertion for chrono::durationJonathan Wakely2-0/+153
This is a missing piece of the C++20 <chrono> header. It would be good to move the code into the compiled library, so that we don't need <sstream> in <chrono>. It could also use spanstream in C++20, to avoid memory allocations. That can be changed at a later date. libstdc++-v3/ChangeLog: * include/std/chrono (__detail::__units_suffix_misc): New helper function. (__detail::__units_suffix): Likewise. (chrono::operator<<(basic_ostream&, const duration&)): Define. * testsuite/20_util/duration/io.cc: New test.
2021-10-08openmp: Fix up declare target handling for vars with DECL_LOCAL_DECL_ALIAS ↵Jakub Jelinek2-59/+117
[PR102640] The introduction of DECL_LOCAL_DECL_ALIAS and push_local_extern_decl_alias in r11-3699-g4e62aca0e0520e4ed2532f2d8153581190621c1a broke the following testcase. The following patch fixes it by treating similarly not just the variable to or link clause is put on, but also its DECL_LOCAL_DECL_ALIAS if any. If it hasn't been created yet, when it is created it will copy attributes and therefore should get it for free, and as it is an extern, nothing more than attributes is needed for it. 2021-10-08 Jakub Jelinek <jakub@redhat.com> PR c++/102640 gcc/cp/ * parser.c (handle_omp_declare_target_clause): New function. (cp_parser_omp_declare_target): Use it. gcc/testsuite/ * c-c++-common/gomp/pr102640.c: New test.
2021-10-08Tweak new test cases for -march=cascadelake strangeness.Roger Sayle3-3/+3
As reported by Sunil's tester, -march=cascadelake triggers some SUBREG non-determinacy in the generated assembler for my new tests. Fixed by updating the regular expressions to match either the zero or sign extended forms. I'm testing a backend patch that may help with the underlying cause of these differences. 2021-10-08 Roger Sayle <roger@nextmovesoftware.com> gcc/testsuite/ChangeLog * gcc.target/i386/sse2-mmx-paddsb-2.c: Test for -128 or 128. * gcc.target/i386/sse2-mmx-paddusb-2.c: Test for -1 or 255. * gcc.target/i386/sse2-mmx-psubsb-2.c: Test for -128 or 128.
2021-10-07libgcc: use .init_stack for constructors if availableIan Lance Taylor3-4/+21
* config/i386/morestack.S: Use .init_array for constructor if available. * config/rs6000/morestack.S: Likewise. * config/s390/morestack.S: Likewise.
2021-10-08Simplify (_Float16) ceil ((double) x) to .CEIL (x) when available.liuhongt3-8/+80
gcc/ChangeLog: PR target/102464 * config/i386/i386.c (ix86_optab_supported_p): Return true for HFmode. * match.pd: Simplify (_Float16) ceil ((double) x) to __builtin_ceilf16 (a) when a is _Float16 type and direct_internal_fn_supported_p. gcc/testsuite/ChangeLog: * gcc.target/i386/pr102464.c: New test.