Commit Graph

188735 Commits

Author SHA1 Message Date
Jonathan Wakely
6b6788f8c2 libstdc++: Add valid range assertions to std::basic_regex [PR89927]
This adds some debug assertions to basic_regex. They don't actually
diagnose the error in the PR yet, but I have another patch to make them
more effective.

Also change the __glibcxx_assert(false) consistency checks to include a
string literal that tells the user a bit more about why the process
aborted. We could consider adding a __glibcxx_bug or
__glibcxx_internal_error macro for this purpose, but ideally we'll never
hit such bugs anyway so it shouldn't be needed.

libstdc++-v3/ChangeLog:

	PR libstdc++/89927
	* include/bits/regex.h (basic_regex(const _Ch_type*, size_t)):
	Add __glibcxx_requires_string_len assertion.
	(basic_regex::assign(InputIterator, InputIterator)): Add
	__glibcxx_requires_valid_range assertion.
	* include/bits/regex_scanner.tcc (_Scanner::_M_advance())
	(_Scanner::_M_scan_normal()): Use string literal in assertions.
2021-10-11 20:34:16 +01:00
Jonathan Wakely
84088dc4bb libstdc++: Fix std::match_results::end() for failed matches [PR102667]
The end() function needs to consider whether the underlying vector is
empty, not whether the match_results object is empty. That's because the
underlying vector will always contain at least three elements for a
match_results object that is "ready". It contains three extra elements
which are stored in the vector but are not considered part of sequence,
and so should not be part of the [begin(),end()) range.

libstdc++-v3/ChangeLog:

	PR libstdc++/102667
	* include/bits/regex.h (match_result::empty()): Optimize by
	calling the base function directly.
	(match_results::end()): Check _Base_type::empty() not empty().
	* testsuite/28_regex/match_results/102667.C: New test.
2021-10-11 20:34:16 +01:00
Jan Hubicka
008e7397da Commonize ipa-pta constraint generation for calls
Commonize the three paths to produce constraints for function call
and makes it more flexible, so we can implement new features more easily.  Main
idea is to not special case pure and const since we can now describe all of
pure/const via their EAF flags (implicit_const_eaf_flags and
implicit_pure_eaf_flags) and info on existence of global memory loads/stores in
function which is readily available in the modref tree.

While rewriting the function, I dropped some of optimizations in the way we
generate constraints. Some of them we may want to add back, but I think the
constraint solver should be fast to get rid of them quickly, so it looks like
bit of premature optimization.

We now always produce one additional PTA variable (callescape) for things that
escape into function call and thus can be stored to parameters or global memory
(if modified). This is no longer the same as global escape in case function is
not reading global memory. It is also not same as call use, since we now
understand the fact that interposable functions may use parameter in a way that
is not releavnt for PTA (so we can not optimize out stores initializing the
memory, but we can be safe about fact that pointers stored does not escape).

Compared to previous code we now handle correctly EAF_NOT_RETURNED in all cases
(previously we did so only when all parameters had the flag) and also handle
NOCLOBBER in more cases (since we make difference between global escape and
call escape). Because I commonized code handling args and static chains, we
could now easily extend modref to also track flags for static chain and return
slot which I plan to do next.

Otherwise I put some effort into producing constraints that produce similar
solutions as before (so it is harder to debug differences). For example if
global memory is written one can simply move callescape to escape rather then
making everything escape by its own constraints, but it affects ipa-pta
testcases.

gcc/ChangeLog:

	* ipa-modref-tree.h (modref_tree::global_access_p): New member
	function.
	* ipa-modref.c:
	(implicint_const_eaf_flags,implicit_pure_eaf_flags,
	ignore_stores_eaf_flags): Move to ipa-modref.h
	(remove_useless_eaf_flags): Remove early exit on NOCLOBBER.
	(modref_summary::global_memory_read_p): New member function.
	(modref_summary::global_memory_written_p): New member function.
	* ipa-modref.h (modref_summary::global_memory_read_p,
	modref_summary::global_memory_written_p): Declare.
	(implicint_const_eaf_flags,implicit_pure_eaf_flags,
	ignore_stores_eaf_flags): move here.
	* tree-ssa-structalias.c: Include ipa-modref-tree.h, ipa-modref.h
	and attr-fnspec.h.
	(handle_rhs_call): Rewrite.
	(handle_call_arg): New function.
	(determine_global_memory_access): New function.
	(handle_const_call): Remove
	(handle_pure_call): Remove
	(find_func_aliases_for_call): Update use of handle_rhs_call.
	(compute_points_to_sets): Handle global memory acccesses
	selectively

gcc/testsuite/ChangeLog:

	* gcc.dg/torture/ssa-pta-fn-1.c: Fix template; add noipa.
	* gcc.dg/tree-ssa/pta-callused.c: Fix template.
2021-10-11 18:43:26 +02:00
Patrick Palka
0de8c2f810 c++: Add testcase for already-fixed PR [PR102643]
Fixed with r12-1744.

	PR c++/102643

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/class-deduction-alias11.C: New test.
2021-10-11 12:33:30 -04:00
Diane Meirowitz
1c0a83eff7 doc: improve -fsanitize=undefined description
gcc/ChangeLog:
	* doc/invoke.texi: Add link to UndefinedBehaviorSanitizer
	documentation, mention UBSAN_OPTIONS, similar to what is done
	for AddressSanitizer.
2021-10-11 17:08:06 +01:00
Jonathan Wakely
f858239830 ChangeLog: Remove incorrect PR reference 2021-10-11 16:19:01 +01:00
Richard Biener
338725652f middle-end/102683 - fix .DEFERRED_INIT expansion
This avoids using an integer type for which we don't have an
approprate mode when expanding .DEFERRED_INIT to a non-memory
entity.

2021-10-11  Richard Biener  <rguenther@suse.de>

	PR middle-end/102683
	* internal-fn.c (expand_DEFERRED_INIT): Check for mode
	availability before building an integer type for storage
	purposes.
2021-10-11 16:41:49 +02:00
Richard Biener
09a0affdb0 middle-end/101480 - overloaded global new/delete
The following fixes the issue of ignoring side-effects on memory
from overloaded global new/delete operators by not marking them
as effectively 'const' apart from other explicitely specified
side-effects.

This will cause

FAIL: g++.dg/warn/Warray-bounds-16.C  -std=gnu++1? (test for excess errors)

because we now no longer statically see the initialization loop
never executes because the call to operator new can now clobber 'a.m'.
This seems to be an issue with the warning code and/or ranger so
I'm leaving this FAIL to be addressed as followup.

2021-10-11  Richard Biener  <rguenther@suse.de>

	PR middle-end/101480
	* gimple.c (gimple_call_fnspec): Do not mark operator new/delete
	as const.

	* g++.dg/torture/pr10148.C: New testcase.
2021-10-11 16:20:19 +02:00
Eric Botcazou
a40970cf04 [Ada] Fix problematic import of type-generic GCC atomic builtin
gcc/ada/

	* gcc-interface/gigi.h (resolve_atomic_size): Declare.
	(list_third): New inline function.
	* gcc-interface/decl.c (type_for_atomic_builtin_p): New function.
	(resolve_atomic_builtin): Likewise.
	(gnat_to_gnu_subprog_type): Perform type resolution for most of
	type-generic GCC atomic builtins and give an error for the rest.
	* gcc-interface/utils2.c (resolve_atomic_size): Make public.
2021-10-11 13:38:13 +00:00
Eric Botcazou
4a0d6b70e3 [Ada] Tweak the warning about missing local raises
gcc/ada/

	* gcc-interface/trans.c (gnat_to_gnu) <N_Pop_Constraint_Error_Label>:
	Given the warning only if No_Exception_Propagation is active.
	<N_Pop_Storage_Error_Label>: Likewise.
	<N_Pop_Program_Error_Label>: Likewise.
2021-10-11 13:38:13 +00:00
Eric Botcazou
5ea133c6ce [Ada] Fix for atomic wrongly rejected on object of discriminated type
gcc/ada/

	* gcc-interface/decl.c (promote_object_alignment): Add GNU_SIZE
	parameter and use it for the size of the object if not null.
	(gnat_to_gnu_entity) <E_Variable>: Perform the automatic alignment
	promotion for objects whose nominal subtype is of variable size.
	(gnat_to_gnu_field): Adjust call to promote_object_alignment.
2021-10-11 13:38:13 +00:00
Eric Botcazou
92961bdf2d [Ada] Fix incorrect size for pathological pass-by-copy parameters
gcc/ada/

	* gcc-interface/decl.c (gnat_to_gnu_param): Strip padding types
	only if the size does not change in the process.  Rename local
	variable and add bypass for initialization procedures.
2021-10-11 13:38:13 +00:00
Doug Rupp
547513eeab [Ada] Runtime transition: System.Threads
gcc/ada/

	* libgnat/s-thread.ads: Fix comments.  Remove unused package
	imports.
	(Thread_Body_Exception_Exit): Remove Exception_Occurrence
	parameter.
	(ATSD): Declare type locally.
	* libgnat/s-thread__ae653.adb: Fix comments.  Remove unused
	package imports.  Remove package references to Stack_Limit
	checking.
	(Install_Handler): Remove.
	(Set_Sec_Stack): Likewise.
	(Thread_Body_Enter): Remove calls to Install_Handler and
	Stack_Limit checking.
	(Thread_Body_Exception_Exit): Remove Exception_Occurrence
	parameter.
	(Init_RTS): Call local Get_Sec_Stack.  Remove call to
	Install_Handler.  Remove references to accessors for
	Get_Sec_Stack and Set_Sec_Stack.  Remove OS check.
	(Set_Sec_Stack): Remove.
2021-10-11 13:38:12 +00:00
Piotr Trojanek
a59626c8b8 [Ada] Remove redundant guard in expansion of dispatching calls
gcc/ada/

	* exp_ch3.adb (Make_Predefined_Primitive_Specs,
	Predefined_Primitive_Bodies): Remove guard with restriction
	No_Dispatching_Calls.
2021-10-11 13:38:12 +00:00
Steve Baird
939047f542 [Ada] Valid postconditions incorrectly rejected.
gcc/ada/

	* sem_attr.adb (Analyze_Attribute_Old_Result): Permit an
	attribute reference inside a compiler-generated _Postconditions
	procedure. In this case, Subp_Decl is assigned the declaration
	of the enclosing subprogram.
	* exp_util.adb (Insert_Actions): When climbing up the tree
	looking for an insertion point, do not climb past an
	N_Iterated_Component/Element_Association, since this could
	result in inserting a reference to a loop parameter at a
	location outside of the scope of that loop parameter. On the
	other hand, be careful to preserve existing behavior in the case
	of an N_Component_Association node.
2021-10-11 13:38:12 +00:00
Steve Baird
2ad5d5e3d5 [Ada] Incorrect Dynamic_Predicate results for static arguments
gcc/ada/

	* exp_ch6.adb (Can_Fold_Predicate_Call): Do not attempt folding
	if there is more than one predicate involved. Recall that
	predicate aspect specification are additive, not overriding, and
	that there are three different predicate
	aspects (Dynamic_Predicate, Static_Predicate, and the
	GNAT-defined Predicate aspect). These various ways of
	introducing multiple predicates are all checked for.  A new
	nested function, Augments_Other_Dynamic_Predicate, is
	introduced.
	* sem_ch4.adb
	(Analyze_Indexed_Component_Form.Process_Function_Call): When
	determining whether a name like "X (Some_Discrete_Type)" might
	be interpreted as a slice, the answer should be "no" if the
	type/subtype name denotes the current instance of type/subtype.
2021-10-11 13:38:12 +00:00
Patrick Bernardi
26a7b2ada5 [Ada] sigset_t is an unsigned long on RTEMS
gcc/ada/

	* libgnarl/s-osinte__rtems.ads: Change sigset_t to an unsigned
	long.
2021-10-11 13:38:12 +00:00
Patrick Bernardi
0f076494f1 [Ada] RTEMS: use regular RTEMS API for minimum stack size calculation
gcc/ada/

	* libgnat/s-parame__rtems.adb: use
	_POSIX_Threads_Minimum_stack_size instead of
	ada_pthread_minimum_stack_size.
2021-10-11 13:38:12 +00:00
Eric Botcazou
ddbcda718c [Ada] Export No_Exception_Propagation_Active for use by gigi
gcc/ada/

	* fe.h (No_Exception_Propagation_Active): Declare.
	* restrict.ads (No_Exception_Propagation_Active): Add WARNING line.
2021-10-11 13:38:12 +00:00
Piotr Trojanek
b89465c941 [Ada] Warn about conversion with any predefined time types
gcc/ada/

	* sem_ch13.adb (Validate_Unchecked_Conversion): Simplify code
	for detecting conversions with Ada.Calendar.Time type and extend
	it to similar types in the Ada.Real_Time package.
2021-10-11 13:38:11 +00:00
Piotr Trojanek
945ec76b8e [Ada] Simplify membership tests with N_Generic_Declaration
gcc/ada/

	* sem_ch10.adb, sem_prag.adb, sem_util.adb: Use
	N_Generic_Declaration in membership tests.
2021-10-11 13:38:11 +00:00
Etienne Servais
35338c60e4 [Ada] Remove constant arguments
gcc/ada/

	* ali.adb (Get_Name): Ignore_Spaces is always False.
	* bindo-graphs.adb (Set_Is_Existing_Source_Target_Relation): Val
	is always True.
	* cstand.adb (New_Standard_Entity): New_Node_Kind is always
	N_Defininig_Identifier.
	* exp_ch3.adb (Predef_Stream_Attr_Spec): For_Body is always
	False.
	* exp_dist.adb (Add_Parameter_To_NVList): RACW_Ctrl is always
	False.
	* gnatls.adb (Add_Directories): Prepend is always False.
	* sem_ch10.adb, sem_ch10.ads (Load_Needed_Body): Do_Analyze is
	always True.
	* sem_ch3.adb, sem_ch3.ads (Process_Range_Expr_In_Decl):
	R_Check_Off is always False.
	* sem_elab.adb: (Info_Variable_Reference): Info_Msg is always
	False, In_SPARK is always True.
	(Set_Is_Traversed_Body, Set_Is_Saved_Construct,
	Set_Is_Saved_Relation): Val is always True.
	* treepr.adb (Visit_Descendant): No_Indent is always False.
	(Print_Node): Fmt does not need such a big scope.
2021-10-11 13:38:11 +00:00
Etienne Servais
d64c67d67d [Ada] Find an interpretation for membership test with a singleton value
gcc/ada/

	* sem_ch4.adb (Analyze_Membership_Op): Finds interpretation for
	the case of a membership test with a singleton value in case of
	overloading.
2021-10-11 13:38:11 +00:00
Patrick Bernardi
9d615a4b6e [Ada] RTEMS: use hardware interrupts instead of signals for interrupt handling
gcc/ada/

	* Makefile.rtl (VxWorks): Rename s-inmaop__vxworks.adb to
	s-inmaop__hwint.adb.
	(RTEMS): Use s-inmaop__hwint.adb, s-intman__rtems.adb/s,
	s-taprop__rtems.adb.
	* libgnarl/a-intnam__rtems.ads: Remove signals definitions and
	replace with Hardware_Interrupts.
	* libgnarl/s-inmaop__vxworks.adb: Rename as...
	* libgnarl/s-inmaop__hwint.adb: ... this.
	* libgnarl/s-interr__hwint.adb: Remove unnecessary comments.
	* libgnarl/s-intman__rtems.ads, libgnarl/s-intman__rtems.adb:
	New files.
	* libgnarl/s-osinte__rtems.adb: Add RTEMS API bindings.
	(Binary_Semaphore_Create, Binary_Semaphore_Delete,
	Binary_Semaphore_Obtain, Binary_Semaphore_Release,
	Binary_Semaphore_Flush, Interrupt_Connect,
	Interrupt_Number_To_Vector): New functions.
	* libgnarl/s-osinte__rtems.ads (Num_HW_Interrupts, Signal):
	Removed.
	(NSIG, Interrupt_Range): New.
	(Binary_Semaphore_Create, Binary_Semaphore_Delete,
	Binary_Semaphore_Obtain, Binary_Semaphore_Release,
	Binary_Semaphore_Flush, Interrupt_Connect,
	Interrupt_Number_To_Vector): Remove Import pragma.
	* libgnarl/s-taprop__rtems.adb: New file.
2021-10-11 13:38:11 +00:00
Eric Botcazou
cea83351a2 [Ada] Fix internal error on fixed-point divide, multiply and scaling
gcc/ada/

	* exp_fixd.adb (Get_Size_For_Value): New function returning a size
	suitable for a non-negative integer value.
	(Get_Type_For_Size): New function returning a standard type suitable
	for a size.
	(Build_Divide): Call both functions to compute the result type, but
	make sure to pass a non-negative value to the first.
	(Build_Multiply): Likewise.
	(Do_Multiply_Fixed_Universal): Minor consistency tweak.
	(Integer_Literal): Call both functions to compute the type.
2021-10-11 13:38:11 +00:00
Etienne Servais
939b3a2ac6 [Ada] Reorder subprogram spec and bodies in alphabetical order
gcc/ada/

	* sem_ch4.adb (Analyze_Membership_Op): Reorder subprogram spec
	and bodies in alphabetical order.
2021-10-11 13:38:11 +00:00
Piotr Trojanek
e0926f7901 [Ada] Rewrite extended names in derived class-wide expressions
gcc/ada/

	* exp_util.adb (Build_Class_Wide_Expression): Replace entities
	of both simple and extended names.
2021-10-11 13:38:10 +00:00
Ghjuvan Lacambre
4075bdcf80 [Ada] Import binder globals as constant
gcc/ada/

	* libgnarl/s-intman__android.adb, libgnarl/s-intman__lynxos.adb,
	libgnarl/s-intman__posix.adb, libgnarl/s-intman__qnx.adb,
	libgnarl/s-intman__solaris.adb, libgnarl/s-intman__susv3.adb,
	libgnarl/s-taprob.adb, libgnarl/s-taprop__hpux-dce.adb,
	libgnarl/s-taprop__linux.adb, libgnarl/s-taprop__mingw.adb,
	libgnarl/s-taprop__posix.adb, libgnarl/s-taprop__qnx.adb,
	libgnarl/s-taprop__solaris.adb, libgnarl/s-taprop__vxworks.adb,
	libgnarl/s-taskin.adb, libgnarl/s-tasque.adb,
	libgnarl/s-tpoben.adb, libgnat/a-calend.adb,
	libgnat/a-excach.adb, libgnat/a-except.adb, libgnat/a-tags.adb,
	libgnat/a-textio.adb, libgnat/a-witeio.adb,
	libgnat/a-ztexio.adb, libgnat/g-binenv.adb,
	libgnat/s-parame.adb, libgnat/s-parame__vxworks.adb,
	libgnat/s-stratt.adb, libgnat/s-trasym__dwarf.adb: Mark imported
	binder globals as constant.
2021-10-11 13:38:10 +00:00
Piotr Trojanek
736f9bed34 [Ada] Move rewriting of boxes in aggregates from resolution to expansion
gcc/ada/

	* exp_aggr.adb (Initialize_Record_Component): Add assertion
	about one of the parameters, so that illegal attempts to
	initialize record components with Empty node are detected early
	on.
	(Build_Record_Aggr_Code): Handle boxes in aggregate component
	associations just the components with no initialization in
	Build_Record_Init_Proc.
	* sem_aggr.adb (Resolve_Record_Aggregate): For components that
	require simple initialization carry boxes from resolution to
	expansion.
	* sem_util.adb (Needs_Simple_Initialization): Remove redundant
	paren.
2021-10-11 13:38:10 +00:00
Piotr Trojanek
1bafcab05c [Ada] Simplify initialization of concurrent components
gcc/ada/

	* exp_ch3.adb (Build_Init_Statements): Simplify detection of
	concurrent record types.
2021-10-11 13:38:10 +00:00
Piotr Trojanek
90084d7400 [Ada] Simplify detection of delayed aggregates
gcc/ada/

	* exp_aggr.adb (Is_Delayed_Aggregate): Simplify.
2021-10-11 13:38:10 +00:00
Piotr Trojanek
b52e15202c [Ada] Simplify detection of record components with default initialization
gcc/ada/

	* exp_aggr.adb (Has_Default_Init_Comps): Simplify.
2021-10-11 13:38:10 +00:00
Piotr Trojanek
7dc58f3fc2 [Ada] Remove redundant guard against an empty component list
gcc/ada/

	* exp_aggr.adb (Component_OK_For_Backend): Remove redundant
	guard.
2021-10-11 13:38:10 +00:00
Patrick Bernardi
5a6c36ae14 [Ada] RTEMS: use default stack checking emulation package
gcc/ada/

	* Makefile.rtl (RTEMS): Add s-stchop.o to
	EXTRA_GNATRTL_NONTASKING_OBJS, remove s-stchop__rtems.adb.
	* libgnat/s-stchop__rtems.adb: Removed.
2021-10-11 13:38:09 +00:00
Marc Poulhiès
4dc82cc768 [Ada] Do not clear Analyzed flag in expand if already set by preanalysis
gcc/ada/

	* expander.adb (Expand): Skip clearing of Analyzed flag if
	already set for N_Real_Literal.
2021-10-11 13:38:09 +00:00
Piotr Trojanek
6b1c091238 [Ada] Simplify code for checks within an initialization procedure
gcc/ada/

	* sem_util.adb (Compile_Time_Constraint_Error): Simplify getting
	the type of the first formal parameter.
2021-10-11 13:38:09 +00:00
Piotr Trojanek
07118f4832 [Ada] Fix crash on array component with Default_Value
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 13:38:09 +00:00
Doug Rupp
3e10307b9a [Ada] Size of time_t in newer verions of VxWorks7
gcc/ada/

	* libgnat/s-parame__ae653.ads (time_t_bits): Change to
	Long_Long_Integer'Size.  Add some comments to explain.
2021-10-11 13:38:09 +00:00
Martin Liska
177b800f5f opts: Remove AUTODETECT_VALUE usage.
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-11 15:02:33 +02:00
Martin Liska
6b7a246d13 Remove usage of IRA_REGION_AUTODETECT
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-11 15:02:27 +02:00
Marcel Vollweiler
f70977936a libgomp: Add tests for omp_atv_serialized and deprecate omp_atv_sequential.
The variable omp_atv_sequential was replaced by omp_atv_serialized in OpenMP
5.1. This was already implemented by Jakub (C/C++, commit ea82325afe) and
Tobias (Fortran, commit fff15bad1a).

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-11 04:34:51 -07:00
Jakub Jelinek
07dd3bcda1 openmp: Add omp_set_num_teams, omp_get_max_teams, omp_[gs]et_teams_thread_limit
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-11 12:20:22 +02:00
Stefan Schulze Frielinghaus
6e3c4bfd0c IBM Z: Provide rawmemchr{qi,hi,si} expander
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-11 09:59:32 +02:00
Stefan Schulze Frielinghaus
6f966f0614 ldist: Recognize strlen and rawmemchr like loops
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-11 09:59:13 +02:00
Martin Liska
9abf8c9534 options: use cl_optimization_hash.
gcc/ChangeLog:

	* tree.c (cl_option_hasher::hash): Use cl_optimization_hash
	and remove legacy hashing code.
2021-10-11 09:56:37 +02:00
Kito Cheng
4e5bc4e450 [PR/target 100316] Allow constant address for __builtin___clear_cache.
__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-11 14:14:08 +08:00
liuhongt
6d97315a4e Adjust testcase for O2 vectorization enabling.
gcc/testsuite/ChangeLog:

	PR middle-end/102669
	* gnat.dg/unroll1.adb: Add -fno-tree-vectorize.
2021-10-11 14:05:28 +08:00
GCC Administrator
8cd172ebed Daily bump. 2021-10-11 00:16:24 +00:00
Harald Anlauf
74ccca380c Fortran: handle initialization of derived type parameter arrays from scalar
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-10 20:11:43 +02:00
Jakub Jelinek
9583b26f37 var-tracking: Fix a wrong-debug issue caused by my r10-7665 var-tracking 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-10 12:16:41 +02:00