Commit Graph

182121 Commits

Author SHA1 Message Date
Jason Merrill
3cf63c94df c++: Add make_temp_override generator functions
A common pattern before C++17 is the generator function, used to avoid
having to specify the type of a container element by using a function call
to get type deduction; for example, std::make_pair.  C++17 added class type
argument deduction, making generator functions unnecessary for many uses,
but GCC won't be written in C++17 for years yet.

gcc/cp/ChangeLog:

	* cp-tree.h (struct type_identity): New.
	(make_temp_override): New.
	* decl.c (grokdeclarator): Use it.
	* except.c (maybe_noexcept_warning): Use it.
	* parser.c (cp_parser_enum_specifier): Use it.
	(cp_parser_parameter_declaration_clause): Use it.
	(cp_parser_gnu_attributes_opt): Use it.
	(cp_parser_std_attribute): Use it.
2020-12-10 15:36:15 -05:00
Jason Merrill
445430e16b c++: Update value of __cplusplus for C++20.
It's past time to update this macro to the specified value for C++20.

libcpp/ChangeLog:

	* init.c (cpp_init_builtins): Update __cplusplus for C++20.
2020-12-10 15:36:09 -05:00
Marek Polacek
96a5c483af c++: Add fixed test [PR91506]
Pre-r11-557 we issued a bogus

  error: parameter may not have variably modified type 'double [x]'

but now we compile this, as we should.

gcc/testsuite/ChangeLog:

	PR c++/91506
	* g++.dg/init/array60.C: New test.
2020-12-10 15:35:20 -05:00
Nathan Sidwell
4f1d8bd509 c++: modules & using-decls
This extends using-decls to modules.  In modules you can export a
using decl, but the exported decl must have external linkage already.
One thing you can do is export something from the GMF.

The novel thing is that now 'export using foo::bar;' *in namespace
bar* can mean something significant (rather than be an obscure nop).

	gcc/cp/
	* name-lookup.c (do_nonmember_using_decl): Add INSERT_P parm.
	Deal with exporting using decls.
	(finish_nonmember_using_decl): Examine BINDING_VECTOR.
2020-12-10 11:33:35 -08:00
Nathan Sidwell
c0979d8f22 c++: Name lookup for modules
This augments the name lookup with knowledge about the BINDING_VECTOR.
That holds per-module namespace bindings, and we need to collect the
bindings in visible imports when we do lookup.  We also need to do
some checking when we're pushing a new decl to check we're not
overriding an existing visible binding in some way.

To deal with the Global Module and Module Partitions, we reserve 1 or
2 slots inthe BINDING_VECTOR to record those entities that may
legitimately appear in more than one module.

As mentioned before, the BINDING_VECTOR is created lazily, when
imported bindings appear.  The current TUs decls then appear on slot
zero.

	gcc/cp/
	* cp-tree.h (visible_instantiation_path): Renamed.
	* module.cc (get_originating_module_decl, lazy_load_binding)
	(lazy_load_members, visible_instantiation_path): Stubs.
	* name-lookup.c (STAT_TYPE_VISIBLE_P, STAT_VISIBLE): New.
	(search_imported_binding_slot, init_global_partition)
	(get_fixed_binding_slot): New.
	(name_lookup::process_module_binding): New.
	(name_lookup::search_namespace_only): Search BINDING_VECTOR.
	(name_lookup::adl_namespace_fns): Likewise.
	(name_lookip::search_adl): Search visible instantiation path.
	(maybe_lazily_declare): Maybe lazy load members.
	(implicitly_exporT_namespace): New.
	(maybe_record_mergeable_decl): New.
	(check_module_override): New.
	(do_pushdecl): Deal with BINDING_VECTOR, check override.
	(add_mergeable_namespace_entity): New.
	(get_namespace_binding): Deal with BINDING_VECTOR.
	(do_namespace_alias): Call set_originating_module.
	(lookup_elaborated_type_1): Deal with BINDING_VECTOR.
	(do_pushtag): Call set_originating_module.
	(reuse_namespace): New.
	(make_namespace_finish): Add FROM_IMPORT parm.
	(push_namespace): Deal with BINDING_VECTOR & namespace reuse.
	(maybe_save_operator_binding): Save when module CMI in play.
	* name-lookup.h (add_mergeable_namespace_entity): Declare.
2020-12-10 10:19:07 -08:00
Nathan Sidwell
afc14c8d0a c++: modularize spelling suggestions
This augments the spelling suggestion code to understand about visible
imported modules.  Simply consider each visible binding in the
binding_vector, until we find one that has something of interest.

	gcc/cp/
	* name-lookup.c: Include bitmap.h.
	(enum binding_slots): New.
	(maybe_add_fuzzy_binding): Return bool true if found.
	(consider_binding_level): Add module support.
	* module.cc (get_import_bitmap): Stub.
2020-12-10 08:30:58 -08:00
Dennis Zhang
b46dd03fe9 arm: Fix typo in testcase mve-vsub_1.c
gcc/testsuite/
	* gcc.target/arm/simd/mve-vsub_1.c: Fix typo.
	Remove needless dg-additional-options.
2020-12-10 15:36:23 +00:00
Marek Polacek
e271cd0234 c++: Add fixed test [PR68451]
I was about to add this test with dg-ice but it turned out it had
already been fixed by the recent r11-3361!

gcc/testsuite/ChangeLog:

	PR c++/68451
	* g++.dg/cpp0x/friend6.C: New test.
2020-12-10 09:59:42 -05:00
Nathan Sidwell
36d0108adf c++: name-lookup refactoring
Here are some refactorings to the name-lookup machinery.  Primarily
breakout out worker functions that the modules patch will also use.
Fixing a couple of comments on the way.

	gcc/cp/
	* name-lookup.c (pop_local_binding): Check for IDENTIFIER_ANON_P.
	(update_binding): Level may be null, don't add namespaces to
	level.
	(newbinding_bookkeeping): New, broken out of ...
	(do_pushdecl): ... here, call it.  Don't push anonymous decls.
	(pushdecl, add_using_namespace): Correct comments.
	(do_push_nested_namespace): Remove assert.
	(make_namespace, make_namespace_finish): New, broken out of ...
	(push_namespace): ... here.  Call them.  Add namespace to level
	here.
2020-12-10 06:56:32 -08:00
Eric Botcazou
237a8e8d56 Small fix to PLACEHOLDER_EXPR handling in loc_list_from_tree_1
This handles the discriminated record types of Ada: the PLACEHOLDER_EXPR is
the "template" expression for the discriminant in the type definition. Now
for some components, typically arrays whose upper bound is the discriminant,
the compiler creates a local subtype for the component, so the code needs to
be able to deal with this nested type.

gcc/ChangeLog:
	* dwarf2out.c (loc_list_from_tree_1) <PLACEHOLDER_EXPR>: Deal with
	a nested context type
2020-12-10 15:45:16 +01:00
Nathan Sidwell
8c60696b69 c++: Module-specific error and tree dumping
With modules, we need the ability to name 'foos' in different modules.
The idiom for that is a trailing '@modulename' suffix.  This adds that
to the error printing routines.  I also augment the tree dumping
machinery to show module-specific metadata.

	gcc/cp/
	* error.c (dump_module_suffix): New.
	(dump_aggr_type, dump_simple_decl, dump_function_name): Call it.
	* ptree.c (cxx_print_decl): Print module information.
	* module.cc (module_name, get_importing_module): Stubs.
2020-12-10 05:21:52 -08:00
Nathan Sidwell
79c1b9fb44 c++: name-lookup cleanups
Name-lookup is the most changed piece of the front end for modules.
Here are some preparatort cleanups and API extensions.

	gcc/cp/
	* name-lookup.h (set_class_bindings): Return vector, take signed
	'extra' parm.
	* name-lookup.c (maybe_lazily_declare): Break out ...
	(get_class_binding): .. of here, call it.
	(find_member_slot): Adjust get_class_bindings call.
	(set_class_bindings): Allow -ve extra.  Return the vector.
	(set_identifier_type_value_with_scope): Remove checking assert.
	(lookup_using_decl): Set decl's context.
	(do_pushtag): Adjust set_identifier_type_value_with_scope handling.
2020-12-10 05:21:52 -08:00
Bernd Edlinger
2e6562043c Remove misleading debug line entries
This removes gimple_debug_begin_stmts without block info which remain
after a gimple block originating from an inline function is unused.

The line numbers from these stmts are from the inline function,
but since the inline function is completely optimized away,
there will be no DW_TAG_inlined_subroutine so the debugger has
no callstack available at this point, and therefore those
line table entries are not helpful to the user.

2020-12-10  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* cfgexpand.c (expand_gimple_basic_block): Remove special handling
	of debug_inline_entries without block info.
	* tree-inline.c (remap_gimple_stmt): Drop debug_nonbind_markers when
	the call statement has no block info.
	(copy_debug_stmt): Remove debug_nonbind_markers when inlining
	and the block info is mapped to NULL.
	* tree-ssa-live.c (clear_unused_block_pointer): Remove
	debug_nonbind_markers originating from removed inline functions.
2020-12-10 13:44:39 +01:00
Richard Biener
a1fb16e547 remove obsolete conversion handling from vectorizable_assignment
This removes an odd special-case of VECTOR_BOOLEAN_TYPE_P typed
conversions from vectorizable_assignment that was obsoleted by
making all integer mode VECTOR_BOOLEAN_TYPE_P types have 1-bit
precision bool components with 605c2a393d

2020-12-10  Richard Biener  <rguenther@suse.de>

	* tree-vect-stmts.c (vectorizable_assignment): Remove special
	allowance of VECTOR_BOOLEAN_TYPE_P conversions.
2020-12-10 13:35:20 +01:00
Christophe Lyon
11a0beff64 arm: Auto-vectorization for MVE: vand
This patch enables MVE vandq instructions for auto-vectorization.  MVE
vandq insns in mve.md are modified to use 'and' instead of unspec
expression to support and<mode>3.  The and<mode>3 expander is added to
vec-common.md

2020-12-03  Christophe Lyon  <christophe.lyon@linaro.org>

	gcc/
	* config/arm/iterators.md (supf): Remove VANDQ_S and VANDQ_U.
	(VANQ): Remove.
	(VDQ): Add TARGET_HAVE_MVE condition where relevant.
	* config/arm/mve.md (mve_vandq_u<mode>): New entry for vand
	instruction using expression 'and'.
	(mve_vandq_s<mode>): New expander.
	(mve_vaddq_n_f<mode>): Use 'and' code instead of unspec.
	* config/arm/neon.md (and<mode>3): Rename into and<mode>3_neon.
	* config/arm/predicates.md (imm_for_neon_inv_logic_operand):
	Enable for MVE.
	* config/arm/unspecs.md (VANDQ_S, VANDQ_U, VANDQ_F): Remove.
	* config/arm/vec-common.md (and<mode>3): New expander.

	gcc/testsuite/
	* gcc.target/arm/simd/mve-vand.c: New test.
2020-12-10 12:13:58 +00:00
Richard Sandiford
4cf70c20cb data-ref: Rework integer handling in split_constant_offset [PR98069]
PR98069 is about a case in which split_constant_offset miscategorises
an expression of the form:

  int foo;
  …
  POINTER_PLUS_EXPR<base, (sizetype)(INT_MIN - foo) * size>

as:

  base: base
  offset: (sizetype) (-foo) * size
  init: INT_MIN * size

“-foo” overflows when “foo” is INT_MIN, whereas the original expression
didn't overflow in that case.

As discussed in the PR trail, we could simply ignore the fact that
int overflow is undefined and treat it as a wrapping type, but that
is likely to pessimise quite a few cases.

This patch instead reworks split_constant_offset so that:

- it treats integer operations as having an implicit cast to sizetype
- for integer operations, the returned VAR has type sizetype

In other words, the problem becomes to express:

  (sizetype) (OP0 CODE OP1)

as:

  VAR:sizetype + (sizetype) OFF:ssizetype

The top-level integer split_constant_offset will (usually) be a sizetype
POINTER_PLUS operand, so the extra cast to sizetype disappears.  But adding
the cast allows the conversion handling to defer a lot of the difficult
cases to the recursive split_constant_offset call, which can detect
overflow on individual operations.

The net effect is to analyse the access above as:

  base: base
  offset: -(sizetype) foo * size
  init: INT_MIN * size

See the comments in the patch for more details.

gcc/
	PR tree-optimization/98069
	* tree-data-ref.c (compute_distributive_range): New function.
	(nop_conversion_for_offset_p): Likewise.
	(split_constant_offset): In the internal overload, treat integer
	expressions as having an implicit cast to sizetype and express
	them accordingly.  Pass back the range of the original (uncast)
	expression in a new range parameter.
	(split_constant_offset_1): Likewise.  Rework the handling of
	conversions to account for the implicit sizetype casts.
2020-12-10 12:10:00 +00:00
Joel Hutton
f5b902a9af [VECT] pr97929 fix
This addresses pr97929. The case for WIDEN_PLUS and WIDEN_MINUS were
missing in vect_get_smallest_scalar_type.

gcc/ChangeLog:

	PR tree-optimization/97929
	* tree-vect-data-refs.c (vect_get_smallest_scalar_type): Add
	WIDEN_PLUS/WIDEN_MINUS case.

gcc/testsuite/ChangeLog:

	* gcc.dg/vect/pr97929.c: New test.
2020-12-10 11:58:23 +00:00
Joel Hutton
703d2ac06f Add WIDEN_PLUS, WIDEN_MINUS pretty print
Add 'w+'/'w-' as WIDEN_PLUS/WIDEN_MINUS respectively.
Add VEC_WIDEN_PLUS/MINUS_HI/LO<...> for
VEC_WIDEN_PLUS/MINUS_HI/LO

gcc/ChangeLog:

	* tree-pretty-print.c (dump_generic_node): Add case for
	VEC_WIDEN_(PLUS/MINUS)_(HI/LO)_EXPR and WIDEN_(PLUS/MINUS)_EXPR.
2020-12-10 11:57:21 +00:00
Richard Biener
76c09f2af9 tree-optimization/98211 - fix bogus vectorization of conversion
Pattern recog incompletely handles some bool cases but we shouldn't
miscompile as a result but not vectorize.  Unfortunately
vectorizable_assignment lets invalid conversions (that
vectorizable_conversion rejects) slip through.  The following
rectifies that.

2020-12-10  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/98211
	* tree-vect-stmts.c (vectorizable_assignment): Disallow
	invalid conversions to bool vector types.

	* gcc.dg/pr98211.c: New testcase.
2020-12-10 12:36:19 +01:00
Alexandre Oliva
f2a5e5f3e6 drop __builtin_ from __clear_cache libname
I made a cut&pasto in my previous patch for tree.c, causing platforms
that have CLEAR_INSN_CACHE defined, and none of the internal
__clear_cache expansion overriders, to issue calls to symbols named
__builtin___clear_cache rather than __clear_cache, on languages other
than those in the C family.  Oops.

This patch removes __builtin_ from the string used as the libname for
__buuiltin___clear_cache.


for  gcc/ChangeLog

	* tree.c (build_common_builtin_nodes): Drop __builtin_ from
	__clear_cache libname.
2020-12-10 08:31:13 -03:00
Jakub Jelinek
680e4202f2 dojump: Improve float != comparisons on x86 [PR98212]
The x86 backend doesn't have EQ or NE floating point comparisons,
so splits x != y into x unord y || x <> y.  The problem with that is
that unord comparison doesn't trap on qNaN operands but LTGT does.
The end effect is that it doesn't trap on qNaN operands, because x unord y
will be true for those and so LTGT will not be performed, but as the backend
is currently unable to merge signalling and non-signalling comparisons (and
after all, with this exact exception it shouldn't unless the first one is
signalling and the second one is non-signalling) it means we end up with:
        ucomiss %xmm1, %xmm0
        jp      .L4
        comiss  %xmm1, %xmm0
        jne     .L4
        ret
        .p2align 4,,10
        .p2align 3
.L4:
        xorl    %eax, %eax
        jmp     foo
where the comiss is the signalling comparison, but we already know that
the right flags bits are already computed by the ucomiss insn.

The following patch, if target supports UNEQ comparisons, splits NE
as x unord y || !(x uneq y) instead, which in the end means we end up with
just:
        ucomiss %xmm1, %xmm0
        jp      .L4
        jne     .L4
        ret
        .p2align 4,,10
        .p2align 3
.L4:
        jmp     foo
because UNEQ is like UNORDERED non-signalling.

2020-12-10  Jakub Jelinek  <jakub@redhat.com>

	PR rtl-optimization/98212
	* dojump.c (do_compare_rtx_and_jump): When splitting NE and backend
	can do UNEQ, prefer splitting x != y into x unord y || !(x uneq y)
	instead of into x unord y || x ltgt y.

	* gcc.target/i386/pr98212.c: New test.
2020-12-10 12:03:30 +01:00
Jakub Jelinek
66dea8899d dojump: Optimize a == a or a != a [PR98169]
If the backend doesn't have floating point EQ or NE comparison, dojump.c
splits it into ORDERED && UNEQ or UNORDERED || LTGT.  If both comparison
operands are the same, we know the result of the second comparison though,
a == b is equivalent to a ord b and a != b is equivalent to a unord b,
and thus can just use ORDERED or UNORDERED.

On the testcase, this changes f1:
-	ucomiss	%xmm0, %xmm0
-	movl	$1, %eax
-	jp	.L3
-	jne	.L3
-	ret
-	.p2align 4,,10
-	.p2align 3
-.L3:
 	xorl	%eax, %eax
+	ucomiss	%xmm0, %xmm0
+	setnp	%al
and f3:
-	ucomisd	%xmm0, %xmm0
-	movl	$1, %eax
-	jp	.L8
-	jne	.L8
-	ret
-	.p2align 4,,10
-	.p2align 3
-.L8:
 	xorl	%eax, %eax
+	ucomisd	%xmm0, %xmm0
+	setnp	%al
while keeping the same code for f2 and f4.

2020-12-10  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/98169
	* dojump.c (do_compare_rtx_and_jump): Don't split self-EQ/NE
	comparisons, just use ORDERED or UNORDERED.

	* gcc.target/i386/pr98169.c: New test.
2020-12-10 11:46:08 +01:00
Jakub Jelinek
a2a17ae7d8 openmp: Fix ICE with broken doacross loop [PR98205]
If the loop body doesn't ever continue, we don't have a bb to insert the
updates.  Fixed by not adding them at all in that case.

2020-12-10  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/98205
	* omp-expand.c (expand_omp_for_generic): Fix up broken_loop handling.

	* c-c++-common/gomp/doacross-4.c: New test.
2020-12-10 11:07:07 +01:00
Richard Biener
154e9b831b Allow scalar fallback for pattern root stmt
This adjusts the SLP build to allow a pattern root stmt to be
built from scalars.  I've noticed this in PR98211 where we fail
to promote a SLP subtree to a simple splat operation and instead
emit a series of uniform vector operations.  The bb-slp-div-1.c
testcase is now vectorized on x86_64 but only the store so I
adjusted it to expect the load to be vectorized.

2020-12-10  Richard Biener  <rguenther@suse.de>

	* tree-vect-slp.c (vect_get_and_check_slp_defs): Do
	not mark the defs to occur in a pattern if it is the
	pattern root and record the original stmt defs in that
	case.

	* gcc.dg/vect/bb-slp-div-1.c: Expect the load to be
	vectorized.
2020-12-10 10:39:53 +01:00
Simon Cook
8d63e3c229 RISC-V: Explicitly call python when using multilib generator
When building GCC for RISC-V with the --with-multilib-generator option,
it may not be possible to call arch-canonicalize as an executable when
building on Windows. Instead directly invoke the expected python
interpreter for this step.

gcc/ChangeLog:

	* config/riscv/multilib-generator (arch_canonicalize): Invoke
	python interpreter when calling arch-canonicalize script.
2020-12-10 17:11:41 +08:00
Nikhil Benesch
73cf5da233 -fdump-go-spec: ignore type ordering of incomplete types
gcc/:
	* godump.c (go_format_type): Don't consider whether a type has
	been seen when determining whether to output a type by name.
	Consider only the use_type_name parameter.
	(go_output_typedef): When outputting a typedef, format the
	declaration's original type, which contains the name of the
	underlying type rather than the name of the typedef.
gcc/testsuite:
	* gcc.misc-tests/godump-1.c: Add test case.
2020-12-09 18:46:02 -08:00
Ian Lance Taylor
2fe4f000ad go-test.exp: recognize errorcheckdir -n
* go.test/go-test.exp (go-gc-tests): Recognize errorcheckdir -n,
	for bug345.go.
2020-12-09 16:35:08 -08:00
GCC Administrator
ca2bd94949 Daily bump. 2020-12-10 00:16:47 +00:00
Ian Lance Taylor
0c2200e419 go-test.exp: rewrite errchk regexp quoting
* go.test/go-test.exp (errchk): Rewrite regexp quoting to use
	curly braces, making it much simpler.
2020-12-09 15:46:19 -08:00
Jakub Jelinek
7d9767cb8e phiopt: Fix up two_value_replacement BOOLEAN_TYPE handling for Ada [PR98188]
For Ada with LTO, boolean_{false,true}_node can be 1-bit precision boolean,
while TREE_TYPE (lhs) can be 8-bit precision boolean and thus we can end up
with wide_int mismatches.

This patch for non-VR_RANGE just use VARYING min/max manually.
The min + 1 != max check will then do the rest.

2020-12-09  Jakub Jelinek  <jakub@redhat.com>

	PR bootstrap/98188
	* tree-ssa-phiopt.c (two_value_replacement): Don't special case
	BOOLEAN_TYPEs for ranges, instead if get_range_info doesn't return
	VR_RANGE, set min/max to wi::min/max_value.
2020-12-09 23:52:25 +01:00
Przemyslaw Wirkus
ef33047a8b aarch64: Add +pauth to -march
New +pauth (Pointer Authentication from Armv8.3-A) feature option for
-march command line option.

Please note that majority of PAUTH instructions are implemented behind HINT
instruction. PAUTH stays an Armv8.3-A feature but now can be assigned to other
architectures or CPUs.

gcc/ChangeLog:

	* config/aarch64/aarch64-option-extensions.def
	(AARCH64_OPT_EXTENSION): New +pauth option in -march for AArch64.
	* config/aarch64/aarch64.h (AARCH64_FL_PAUTH): New pauth extension bitmask.
	(AARCH64_ISA_PUATH): New ISA bitmask for PAUTH.
	(AARCH64_FL_FOR_ARCH8_3): Add PAUTH to Armv8.3-A.
	(TARGET_PAUTH): New target mask to isolate PAUTH instructions.
	* config/aarch64/aarch64.md (do_return): Condition set to TARGET_PAUTH.
	* doc/invoke.texi: Update docs for +flagm and +pauth.
2020-12-09 22:09:20 +00:00
Uros Bizjak
4c61e35f20 i386: Remove REG_ALLOC_ORDER definition
REG_ALLOC_ORDER just defines what the default is set to.

2020-12-09  Uroš Bizjak  <ubizjak@gmail.com>

gcc/
	* config/i386/i386.h (REG_ALLOC_ORDER): Remove
2020-12-09 21:06:54 +01:00
Jonathan Wakely
0aa1786d34 libstdc++: Fix build failure for target with no way to sleep
In previous releases the std::this_thread::sleep_for function was only
declared if the target supports multiple threads. I changed that
recently in r11-2649-g5bbb1f3000c57fd4d95969b30fa0e35be6d54ffb so that
sleep_for could be used single-threaded. But that means that targets
using --disable-threads are now required to provide some way to sleep.
This breaks the build for (at least) AVR when trying to build a hosted
library.

This patch adds a new autoconf macro that is defined when no way to
sleep is available, and uses that to suppress the sleeping functions in
std::this_thread.

The #error in src/c++11/thread.cc is retained for the case where there
is no sleep function available but multiple threads are supported. This
is consistent with previous releases, but that #error could probably be
removed without any consequences.

libstdc++-v3/ChangeLog:

	* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Define NO_SLEEP
	if none of nanosleep, sleep and Sleep is available.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* include/std/thread [_GLIBCXX_NO_SLEEP] (__sleep_for): Do
	not declare.
	[_GLIBCXX_NO_SLEEP] (sleep_for, sleep_until): Do not
	define.
	* src/c++11/thread.cc [_GLIBCXX_NO_SLEEP] (__sleep_for): Do
	not define.
2020-12-09 16:56:54 +00:00
Richard Biener
84d08255f9 tree-optimization/98213 - cache PHI walking result in SM
This avoids exponential work when walking PHIs in loop store motion.
Fails are quickly propagated and thus need no caching.

2020-12-09  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/98213
	* tree-ssa-loop-im.c (sm_seq_valid_bb): Cache successfully
	processed PHIs.
	(hoist_memory_references): Adjust.

	* g++.dg/pr98213.C: New testcase.
2020-12-09 17:27:25 +01:00
Nathan Sidwell
0b37233152 c++: Module parsing
This adds the module-declaration parsing and other logic.  We have two
new kinds of declaration -- module and import.  Plus the ability to
export other declarations.  The module processing can also divide the
TU into several portions -- GMF, Purview and PMF.

There are restrictions that some declarations must or mustnot appear
in a #include, so I needed to add a bit to indicate whether a token
came from the main source or not.  This seemed the least unpleasant
way of implementing such a check.

	gcc/cp/
	* parser.h (struct cp_token): Add main_source_p field.
	* parser.c (cp_lexer_new_main): Pass thought module token filter.
	Check macros.
	(cp_lexer_get_preprocessor_token): Set main_source_p.
	(enum module_parse): New.
	(cp_parser_diagnose_invalid_type_name): Deal with unrecognized
	module-directives.
	(cp_parser_skip_to_closing_parenthesize_1): Skip module-directivres.
	(cp_parser_skip_to_end_of_statement): Likewise.
	(cp_parser_skiup_to_end_of_block_or_statement): Likewise.
	(cp_parser_translation_unit): Add module parsing calls.
	(cp_parser_module_name, cp_parser_module_declaration): New.
	(cp_parser_import_declaration, cp_parser_module_export): New.
	(cp_parser_declaration): Add module export detection.
	(cp_parser_template_declaration): Adjust 'export' error message.
	(cp_parser_function_definition_after_declarator): Add
	module-specific logic.
	* module.cc (import_module, declare_module)
	(maybe_check_all_macros): Stubs.
2020-12-09 07:22:35 -08:00
Marek Polacek
fe70679b80 c++: Fix printing of decltype(nullptr) [PR97517]
The C++ printer doesn't handle NULLPTR_TYPE, so we issue the ugly
"'nullptr_type' not supported by...".  Since NULLPTR_TYPE is
decltype(nullptr), it seemed reasonable to handle it where we
handle DECLTYPE_TYPE, that is, in the simple-type-specifier handler.

gcc/cp/ChangeLog:

	PR c++/97517
	* cxx-pretty-print.c (cxx_pretty_printer::simple_type_specifier): Handle
	NULLPTR_TYPE.
	(pp_cxx_type_specifier_seq): Likewise.
	(cxx_pretty_printer::type_id): Likewise.

gcc/testsuite/ChangeLog:

	PR c++/97517
	* g++.dg/diagnostic/nullptr.C: New test.
2020-12-09 09:28:07 -05:00
Martin Liska
33d2f41785 testsuite: fix 2 tests on aarch64
gcc/testsuite/ChangeLog:

	PR tree-optimization/98182
	* gcc.dg/tree-ssa/if-to-switch-1.c: Add case-values-threshold in
	order to fix them for aarch64.
	* gcc.dg/tree-ssa/if-to-switch-10.c: Likewise.
2020-12-09 15:26:00 +01:00
Kyrylo Tkachov
76e4f444a6 aarch64: Add CPU-specific SVE vector costs struct
This patch extends the backend vector costs structures to allow for
separate Advanced SIMD and SVE
costs. The fields in the current cpu_vector_costs that would vary
between the ISAs are moved into
a simd_vec_cost struct and we have two typedefs of it: advsimd_vec_cost
and sve_vec_costs.
If, in the future, SVE needs some extra fields it could inherit from
simd_vec_cost.
The CPU vector cost tables in aarch64.c are updated for the struct
changes.
aarch64_builtin_vectorization_cost is updated to select either the
Advanced SIMD or SVE costs field
depending on the mode and field availability.
No change in codegen is intended with this patch.

gcc/
	* config/aarch64/aarch64-protos.h (cpu_vector_cost): Move simd
	fields to...
	(simd_vec_cost): ... Here.  Define.
	(advsimd_vec_cost): Define.
	(sve_vec_cost): Define.
	* config/aarch64/aarch64.c (generic_advsimd_vector_cost):
	Define.
	(generic_sve_vector_cost): Likewise.
	(generic_vector_cost): Update.
	(qdf24xx_advsimd_vector_cost): Define.
	(qdf24xx_vector_cost): Update.
	(thunderx_advsimd_vector_cost): Define.
	(thunderx_vector_cost): Update.
	(tsv110_advsimd_vector_cost): Define.
	(tsv110_vector_cost): Likewise.
	(cortexa57_advsimd_vector_cost): Define.
	(cortexa57_vector_cost): Update.
	(exynosm1_advsimd_vector_cost): Define.
	(exynosm1_vector_cost): Update.
	(xgene1_advsimd_vector_cost): Define.
	(xgene1_vector_cost): Update.
	(thunderx2t99_advsimd_vector_cost): Define.
	(thunderx2t99_vector_cost): Update.
	(thunderx3t110_advsimd_vector_cost): Define.
	(thunderx3t110_vector_cost): Update.
	(aarch64_builtin_vectorization_cost): Handle sve and advsimd
	vector cost fields.
2020-12-09 14:05:30 +00:00
Nathan Sidwell
cf97b970fe c++: Decl module-specific semantic processing
This adds the module-specific logic to the various declaration
processing routines in decl.c and semantic.c.  I also adjust the rtti
type creation, as those are all in the global module, so we need to
temporarily clear the module_kind, when they are being created.
Finally, I added init and fini module processing with the initialier
giving a fatal error if you try and turn it on (so don't do that yet).

	gcc/cp/
	* decl.c (duplicate_decls): Add module-specific redeclaration
	logic.
	(cxx_init_decl_processing): Export the global namespace, maybe
	initialize modules.
	(start_decl): Reject local-extern in a module, adjust linkage of
	template var.
	(xref_tag_1): Add module-specific redeclaration logic.
	(start_enum): Likewise.
	(finish_enum_value_list): Export unscoped members of an exported
	enum.
	(grokmethod): Implement p1779 linkage of in-class defined
	functions.
	* decl2.c (no_linkage_error): Imports are ok.
	(c_parse_final_cleanups): Call fini_modules.
	* lex.c (cxx_dup_lang_specific): Clear some module flags in the
	copy.
	* module.cc (module_kind): Define.
	(module_may_redeclare, set_defining_module): Stubs.
	(init_modules): Error on modules.
	(fini_modules): Stub.
	* rtti.c (push_abi_namespace): Save and reset module_kind.
	(pop_abi_namespace): Restore module kind.
	(build_dynamic_cast_1, tinfo_base_init): Adjust.
	* semantics.c (begin_class_definition): Add module-specific logic.
	(expand_or_defer_fn_1): Keep bodies of more fns when modules_p.
2020-12-09 04:56:47 -08:00
Ilya Leoshkevich
72217b5ddb IBM Z: Build autovec-*-signaling-eq.c tests with exceptions
According to
https://gcc.gnu.org/pipermail/gcc/2020-November/234344.html, GCC is
allowed to perform optimizations that remove floating point traps,
since they do not affect the modeled control flow.  This interferes with
two signaling comparison tests, where (a <= b && a >= b) is turned into
(a <= b && a == b) by test_for_singularity, into ((a <= b) & (a == b))
by vectorizer and then into (a == b) eliminate_redundant_comparison.

Fix by making traps affect the control flow by turning them into
exceptions.

gcc/testsuite/ChangeLog:

2020-12-03  Ilya Leoshkevich  <iii@linux.ibm.com>

	* gcc.target/s390/zvector/autovec-double-signaling-eq.c: Build
	with exceptions.
	* gcc.target/s390/zvector/autovec-float-signaling-eq.c:
	Likewise.
2020-12-09 13:47:14 +01:00
Tobias Burnus
aa0432005f OpenMP: C/C++ parse 'omp allocate'
gcc/c-family/ChangeLog:

	* c-pragma.c (omp_pragmas): Add 'allocate'.
	* c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_ALLOCATE.

gcc/c/ChangeLog:

	* c-parser.c (c_parser_omp_allocate): New.
	(c_parser_omp_construct): Call it.

gcc/cp/ChangeLog:

	* parser.c (cp_parser_omp_allocate): New.
	(cp_parser_omp_construct, cp_parser_pragma): Call it.

gcc/testsuite/ChangeLog:

	* c-c++-common/gomp/allocate-5.c: New test.
2020-12-09 12:20:01 +01:00
Andrew Stubbs
85f0a4d982 Import HSA header files from AMD
These are the same header files that exist in the Radeon Open Compute Runtime
project (as of October 2020), but they have been specially relicensed by AMD
for use in GCC.

The header files retain AMD copyright.

include/ChangeLog:

	* hsa.h: Replace whole file.
	* hsa_ext_amd.h: New file.
	* hsa_ext_image.h: New file.

libgomp/ChangeLog:

	* plugin/plugin-gcn.c: Include hsa_ext_amd.h.
	(HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT): Delete redundant definition.
2020-12-09 11:10:40 +00:00
Richard Biener
42bdf81449 c/98200 - improve error recovery for GIMPLE FE
This avoids ICEing by making sure to propagate error early.

2020-12-09  Richard Biener  <rguenther@suse.de>

	PR c/98200
gcc/c/
	* gimple-parser.c (c_parser_gimple_postfix_expression): Return
	early on error.

gcc/testsuite/
	* gcc.dg/gimplefe-error-8.c: New testcase.
2020-12-09 11:45:48 +01:00
Tobias Burnus
1cb2d1d5ce gfortran.dg/gomp/reduction4.f90: Fix testcase
Fix to 'omp scan' commit 005cff4e2e

gcc/testsuite/ChangeLog:

	* gfortran.dg/gomp/reduction4.f90: Update scan-trees, add
	lost testcase; move test with FE error to ...
	* gfortran.dg/gomp/reduction5.f90: ... here.
2020-12-09 10:47:19 +01:00
Jakub Jelinek
0673fc6911 fold-const: Fix native_encode_initializer bitfield handling [PR98199]
With the bit_cast changes, I have added support for bitfields which don't
have scalar representatives.  For bit_cast it works fine, as when mask
is non-NULL, off is asserted to be 0.  But when native_encode_initializer
is called e.g. from sccvn with off > 0 (i.e. we are interested in encoding
just a few bytes out of it somewhere from the middle or at the end), the
following computations are incorrect.
pos is a byte position from the start of the constructor, repr_size is the
size in bytes of the bit-field representative and len is the length
of the buffer.  If the buffer is offsetted by positive off, those numbers
are uncomparable though, we need to add off to len to make both
count bytes from the start of the constructor, and o is a utility temporary
set to off != -1 ? off : 0 (because off -1 also means start at offset 0
and just force special behavior).

2020-12-09  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/98199
	* fold-const.c (native_encode_initializer): Fix handling bit-fields
	when off > 0.

	* gcc.c-torture/compile/pr98199.c: New test.
2020-12-09 09:36:11 +01:00
Jakub Jelinek
4164e58bfd fold-const: Fix up native_encode_initializer missing field handling [PR98193]
When native_encode_initializer is called with non-NULL mask (i.e. ATM
bit_cast only), it checks if the current index in the CONSTRUCTOR (if any)
is the next initializable FIELD_DECL, and if not, decrements cnt and
performs the iteration with that FIELD_DECL as field and val of zero
(so that it computes mask properly).  As the testcase shows, I forgot to
set pos to the byte position of the field though (like it is done
for e.g. index referenced FIELD_DECLs in the constructor.

2020-12-09  Jakub Jelinek  <jakub@redhat.com>

	PR c++/98193
	* fold-const.c (native_encode_initializer): Set pos to field's
	byte position if iterating over a field with missing initializer.

	* g++.dg/cpp2a/bit-cast7.C: New test.
2020-12-09 09:34:51 +01:00
Jason Merrill
c3a63fb385 c++: Avoid [[nodiscard]] warning in requires-expr [PR98019]
If we aren't really evaluating the expression, it doesn't matter that the
return value is discarded.

gcc/cp/ChangeLog:

	PR c++/98019
	* cvt.c (maybe_warn_nodiscard): Check c_inhibit_evaluation_warnings.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-nodiscard1.C: Remove xfail.
2020-12-09 00:36:07 -05:00
Jason Merrill
4eb2848300 c++: Don't require accessible dtors for some forms of new [PR59238]
Jakub noticed that in build_new_1 we needed to add tf_no_cleanup to avoid
building a cleanup for a TARGET_EXPR that we already know is going to be
used to initialize something, so the cleanup will never be run.  The best
place to add it is close to where we build the INIT_EXPR; in
cp_build_modify_expr fixes the single-object new, in expand_default_init
fixes array new.

Co-authored-by: Jakub Jelinek  <jakub@redhat.com>

gcc/cp/ChangeLog:

	PR c++/59238
	* init.c (expand_default_init): Pass tf_no_cleanup when building
	a TARGET_EXPR to go on the RHS of an INIT_EXPR.
	* typeck.c (cp_build_modify_expr): Likewise.

gcc/testsuite/ChangeLog:

	PR c++/59238
	* g++.dg/cpp0x/new4.C: New test.
2020-12-09 00:36:07 -05:00
GCC Administrator
f6e8e2797e Daily bump. 2020-12-09 00:16:50 +00:00
Jakub Jelinek
ab3a5ff07c testsuite: Fix up testcase for ia32 [PR98191]
2020-12-09  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/98191
	* gcc.dg/torture/pr98191.c: Add dg-additional-options with
	-w -Wno-psabi.
2020-12-09 00:35:04 +01:00