Commit Graph

182263 Commits

Author SHA1 Message Date
GCC Administrator
9855e8a90d Daily bump. 2020-12-13 00:16:19 +00:00
François Dumont
815eb852a2 libstdc++: Fix _GLIBCXX_DEBUG mode constexpr compatibility
The __glibcxx_check_can_[increment|decrement]_range macros are using the
_GLIBCXX_DEBUG_VERIFY_COND_AT macro which is not constexpr compliant and will produce nasty
diagnostics rather than the std::__failed_assertion dedicated to constexpr. Replace it with
correct _GLIBCXX_DEBUG_VERIFY_AT_F.

libstdc++-v3/ChangeLog:

	* include/debug/macros.h (__glibcxx_check_can_increment_range): Replace
	_GLIBCXX_DEBUG_VERIFY_COND_AT usage with _GLIBCXX_DEBUG_VERIFY_AT_F.
	(__glibcxx_check_can_decrement_range): Likewise.
	* testsuite/25_algorithms/copy_backward/constexpr.cc (test03): New.
	* testsuite/25_algorithms/copy/debug/constexpr_neg.cc: New test.
	* testsuite/25_algorithms/copy_backward/debug/constexpr_neg.cc: New test.
	* testsuite/25_algorithms/equal/constexpr_neg.cc: New test.
	* testsuite/25_algorithms/equal/debug/constexpr_neg.cc: New test.
2020-12-12 18:07:45 +01:00
Paul Thomas
ff2dfdef2f Fortran: Enable inquiry references in data statements [PR98022].
2020-12-12  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
	PR fortran/98022
	* data.c (gfc_assign_data_value): Handle inquiry references in
	the data statement object list.

gcc/testsuite/
	PR fortran/98022
	* gfortran.dg/data_inquiry_ref.f90: New test.
2020-12-12 14:01:08 +00:00
Jakub Jelinek
0bd675183d match.pd: Add ~(X - Y) -> ~X + Y simplification [PR96685]
This patch adds the ~(X - Y) -> ~X + Y simplification requested
in the PR (plus also ~(X + C) -> ~X + (-C) for constants C that can
be safely negated.

The first two simplify blocks is what has been requested in the PR
and that makes the first testcase pass.
Unfortunately, that change also breaks the second testcase, because
while the same expressions appearing in the same stmt and split
across multiple stmts has been folded (not really) before, with
this optimization fold-const.c optimizes ~X + Y further into
(Y - X) - 1 in fold_binary_loc associate: code, but we have nothing
like that in GIMPLE and so end up with different expressions.

The last simplify is an attempt to deal with just this case,
had to rule out there the Y == -1U case, because then we
reached infinite recursion as ~X + -1U was canonicalized by
the pattern into (-1U - X) + -1U but there is a canonicalization
-1 - A -> ~A that turns it back.  Furthermore, had to make it #if
GIMPLE only, because it otherwise resulted in infinite recursion
when interacting with the associate: optimization.
The end result is that we pass all 3 testcases and thus canonizalize
the 3 possible forms of writing the same thing.

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

	PR tree-optimization/96685
	* match.pd (~(X - Y) -> ~X + Y): New optimization.
	(~X + Y -> (Y - X) - 1): Likewise.

	* gcc.dg/tree-ssa/pr96685-1.c: New test.
	* gcc.dg/tree-ssa/pr96685-2.c: New test.
	* gcc.dg/tree-ssa/pr96685-3.c: New test.
2020-12-12 14:49:57 +01:00
Jakub Jelinek
fe78528c05 widening_mul: Recognize another form of ADD_OVERFLOW [PR96272]
The following patch recognizes another form of hand written
__builtin_add_overflow (this time _p), in particular when
the code does unsigned
if (x > ~0U - y)
or
if (x <= ~0U - y)
it can be optimized (if the subtraction turned into ~y is single use)
into
if (__builtin_add_overflow_p (x, y, 0U))
or
if (!__builtin_add_overflow_p (x, y, 0U))
and generate better code, e.g. for the first function in the testcase:
-       movl    %esi, %eax
        addl    %edi, %esi
-       notl    %eax
-       cmpl    %edi, %eax
-       movl    $-1, %eax
-       cmovnb  %esi, %eax
+       jc      .L3
+       movl    %esi, %eax
+       ret
+.L3:
+       orl     $-1, %eax
        ret
on x86_64.  As for the jumps vs. conditional move case, that is some CE
issue with complex branch patterns we should fix up no matter what, but
in this case I'm actually not sure if branchy code isn't better, overflow
is something that isn't that common.

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

	PR tree-optimization/96272
	* tree-ssa-math-opts.c (uaddsub_overflow_check_p): Add OTHER argument.
	Handle BIT_NOT_EXPR.
	(match_uaddsub_overflow): Optimize unsigned a > ~b into
	__imag__ .ADD_OVERFLOW (a, b).
	(math_opts_dom_walker::after_dom_children): Call match_uaddsub_overflow
	even for BIT_NOT_EXPR.

	* gcc.dg/tree-ssa/pr96272.c: New test.
2020-12-12 14:48:47 +01:00
Jakub Jelinek
cc9b9c0b68 openmp, openacc: Fix up handling of data regions [PR98183]
While the data regions (target data and OpenACC counterparts) aren't
standalone directives, unlike most other OpenMP/OpenACC constructs
we allow (apparently as an extension) exceptions and goto out of
the block. During gimplification we place an *end* call into a finally
block so that it is reached even on exceptions or goto out etc.).
During omplower pass we then add paired #pragma omp return for them,
but due to the exceptions because the region is not SESE we can end up
with #pragma omp return appearing only conditionally in the CFG etc.,
which the ompexp pass can't handle.
For the ompexp pass, we actually don't care about the end part or about
target data nesting, so we can treat it as standalone directive.

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

	PR middle-end/98183
	* omp-low.c (lower_omp_target): Don't add OMP_RETURN for
	data regions.
	* omp-expand.c (expand_omp_target): Don't try to remove
	OMP_RETURN for data regions.
	(build_omp_regions_1, omp_make_gimple_edges): Don't expect
	OMP_RETURN for data regions.

	* gcc.dg/gomp/pr98183.c: New test.
	* gcc.dg/goacc/pr98183.c: New test.
2020-12-12 08:36:02 +01:00
GCC Administrator
54f75d8fb3 Daily bump. 2020-12-12 00:16:35 +00:00
Jason Merrill
9324f7a25c c++: Avoid considering some conversion ops [PR97600]
Patrick's earlier patch to check convertibility before constraints for
conversion ops wasn't suitable because checking convertibility can also lead
to unwanted instantiations, but it occurs to me that there's a smaller check
we can do to avoid doing normal consideration of the conversion ops in this
case: since we're in the middle of a user-defined conversion, we can exclude
from consideration any conversion ops that return a type that would need an
additional user-defined conversion to reach the desired type: namely, a type
that differs in class-ness from the desired type.

[temp.inst]/9 allows optimizations like this: "If the function selected by
overload resolution can be determined without instantiating a class template
definition, it is unspecified whether that instantiation actually takes
place."

gcc/cp/ChangeLog:

	PR libstdc++/97600
	* call.c (build_user_type_conversion_1): Avoid considering
	conversion functions that return a clearly unsuitable type.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-conv3.C: New test.
2020-12-11 15:41:02 -05:00
Jason Merrill
8bab7dce62 c++: Fix build with --enable-gather-detailed-mem-stats.
Nathan's recent patch added make_binding_vec defined with MEM_STAT_DECL, but
didn't add the parallel decoration to the forward declaration.

gcc/cp/ChangeLog:

	* cp-tree.h (make_binding_vec): Add CXX_MEM_STAT_INFO.
2020-12-11 15:39:38 -05:00
Nathan Sidwell
262784be3d c++: Final module preparations
This adds the final few preparations to drop modules in.  I'd missed a
couple of changes to core compiler -- a new pair of preprocessor
options, and marking the boundary of fixed and lazy global trees.

For C++, we need to add module.cc to the GTY scanner.  Parsing final
cleanups needs a few tweaks for modules.  Lambdas used to initialize a
global (for instance) get an extra scope, but we now need to point
that object to the lambda too.  Finally template instantiation needs
to do lazy loading before looking at the available instantiations and
specializations.

	gcc/
	* gcc.c (cpp_unique_options): Add Mmodules, Mno-modules.
	* tree-core.h (enum tree_index): Add TI_MODULE_HWM.
	gcc/cp/
	* config-lang.in (gtfiles): Add cp/module.cc.
	* decl2.c (c_parse_final_cleanups): Add module support.
	* lambda.c (record_lambda_scope): Call maybe_attach_decl.
	* module.cc (maybe_attach_decl, lazy_load_specializations): Stubs.
	(finish_module_procesing): Stub.
	* pt.c (lookup_template_class_1): Lazy load specializations.
	(instantiate_template_1): Likewise.
2020-12-11 11:15:30 -08:00
Nathan Sidwell
02fc65c726 c++: Refactor final cleanup
This is a small refactor of the end of decl processing, into which
dropping module support will be simpler.

	gcc/cp/
	* decl2.c (c_parse_final_cleanups): Refactor loop.
2020-12-11 11:15:30 -08:00
Jim Wilson
755cf781f2 Add missing varasm DECL_P check.
This fixes a riscv64-linux bootstrap failure.

get_constant_section calls the select_section target hook, and select_section
calls get_named_section which calls get_section.  So it is possible to have
a constant not a decl in both of these functions.  They already call DECL_P
checks everywhere except for the new code HJ recently added.  This adds the
missing DECL_P check.

	gcc/
	* varasm.c (get_section): Add DECL_P check before DECL_PRESERVE_P.
2020-12-11 11:14:22 -08:00
GCC Administrator
35af87784e Daily bump. 2020-12-11 18:22:52 +00:00
Ian Lance Taylor
ab264f4b39 compiler: encode user visible names if necessary
Avoid putting weird characters into the user visible name.
It breaks stabs in particular, and may also cause debugger problems.
Instead, encode those names, and use a "g." prefix to tell the debugger.

Also dereference the type for the name of a recover thunk, to avoid a
pointless '*' that gets encoded.

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/277232
2020-12-11 09:57:30 -08:00
Christophe Lyon
e36ce56e81 arm: Auto-vectorization for MVE clean condition for vand and vorr expanders
The patch restores the unconditional definition of the VDQ iterator,
and changes the conditions of the vand and vorr expanders to use
ARM_HAVE_<MODE>_ARITH.

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

	gcc/
	* config/arm/iterators.md (VDQ): Remove TARGET_HAVE_MVE
	conditions.
	* config/arm/vec-common.md (and<mode>3): Use
	ARM_HAVE_<MODE>_ARITH.
	(ior<mode>3): Likewise.
2020-12-11 16:48:20 +00:00
Claudiu Zissulescu
78e9cfe1e2 arc: Update ARC700 cache hazard detection.
Replace/update ARC700 cache hazard detection. The next situations are
handled:

- There are 2 stores back2back, then 3 loads in next 3 or 4 instructions.

    if 3 loads in 3 instructions then we insert 2 nops after stores.
    if 3 loads in 4 instructions then we insert 1 nop after stores

- 2 back to back stores, followed by at least 3 loads in next 4 instructions.
        st st ld ld ld ##
        st st ## ld ld ld
        st st ld ## ld ld
        st st ld ld ## ld
        ## - any instruction

- store between non-store instructions, followed by 3 loads
        $$ st SS ld ld ld
        $$ - non-store instruction, even load.

gcc/
2020-12-11  Claudiu Zissulescu  <claziss@synopsys.com>

	* config/arc/arc.c (arc_active_insn): Ignore all non essential
	instructions when getting the next active instruction.
	(check_store_cacheline_hazard): Update.
	(workaround_arc_anomaly): Remove obsolete cache hazard code.

Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
2020-12-11 18:29:56 +02:00
Claudiu Zissulescu
a412be00c4 arc: Avoid generating brcc instructions with limm
BRcc instructions are generated quite late in the compilation
process. These instructions combines a compare with a regular
conditional branch if the result of the compare is not used
anylonger. However, when compiling for size, it is better to avoid
BRcc instructions which are introducing a 32-bit long immediate.

gcc/
2020-12-11  Claudiu Zissulescu  <claziss@synopsys.com>

	* config/arc/arc.c (arc_reorg): Avoid limm in BRcc.
2020-12-11 18:29:56 +02:00
Claudiu Zissulescu
dfbe642c97 arc: Refurbish adc/sbc patterns
The adc/sbc patterns were unecessary spliting, remove that and
associated functions.

gcc/
2020-12-11  Claudiu Zissulescu  <claziss@synopsys.com>

	* config/arc/arc-protos.h (arc_scheduling_not_expected): Remove
	it.
	(arc_sets_cc_p): Likewise.
	(arc_need_delay): Likewise.
	* config/arc/arc.c (arc_sets_cc_p): Likewise.
	(arc_need_delay): Likewise.
	(arc_scheduling_not_expected): Likewise.
	* config/arc/arc.md: Convert adc/sbc patterns to simple
	instruction definitions.

Signed-off-by: Claudiu Zissulescu <claziss@synopsys.com>
2020-12-11 18:29:56 +02:00
Nathan Sidwell
1c6b86b50d c++: module test harness
Here is the module test harness -- but no tests.

	gcc/testsuite/
	* g++.dg/modules/modules.exp: New.
2020-12-11 08:28:19 -08:00
Nathan Sidwell
059da609fa c++: cp_tree_equal tweaks
When comparing streamed trees we can encounter NON_LVALUE_EXPR and
VIEW_CONVERT_EXPRs with null types.  Also, when checking a potential
duplicate we don't want to reject PARM_DECLs with different contexts,
if those two contexts are the two decls of interest.

	gcc/cp/
	* cp-tree.h (map_context_from, map_context_to): Declare.
	* module.cc (map_context_from, map_context_to): Define.
	* tree.c (cp_tree_equal): Check map_context_{from,to} for parm
	context difference.  Allow NON_LVALUE_EXPR and VIEW_CONVERT_EXPR
	with null types.
2020-12-11 08:28:19 -08:00
Christophe Lyon
75de6a2895 arm: Auto-vectorization for MVE: vorr
This patch enables MVE vorrq instructions for auto-vectorization.  MVE
vorrq insns in mve.md are modified to use ior instead of unspec
expression to support ior<mode>3.  The ior<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 VORRQ_S and VORRQ_U.
	(VORRQ): Remove.
	* config/arm/mve.md (mve_vorrq_s<mode>): New entry for vorr
	instruction using expression ior.
	(mve_vorrq_u<mode>): New expander.
	(mve_vorrq_f<mode>): Use ior code instead of unspec.
	* config/arm/neon.md (ior<mode>3): Renamed into ior<mode>3_neon.
	* config/arm/predicates.md (imm_for_neon_logic_operand): Enable
	for MVE.
	* config/arm/unspecs.md (VORRQ_S, VORRQ_U, VORRQ_F): Remove.
	* config/arm/vec-common.md (ior<mode>3): New expander.

	gcc/testsuite/
	* gcc.target/arm/simd/mve-vorr.c: Add vorr tests.
2020-12-11 16:22:28 +00:00
Claudiu Zissulescu
f7ad444627 arc: Use separate predicated patterns for mpyd(u)
The compiler can match mpyd.eq r0,r1,r0 as a predicated instruction,
which is incorrect. The mpyd(u) instruction takes as input two 32-bit
registers, returning into a double 64-bit even-odd register pair.  For
the predicated case, the ARC instruction decoder expects the
destination register to be the same as the first input register. In
the big-endian case the result is swaped in the destination register
pair, however, the instruction encoding remains the same.  Refurbish
the mpyd(u) patterns to take into account the above observation.

gcc/
2020-12-11  Claudiu Zissulescu  <claziss@synopsys.com>

	* config/arc/arc.md (mpyd<su_optab>_arcv2hs): New template
	pattern.
	(*pmpyd<su_optab>_arcv2hs): Likewise.
	(*pmpyd<su_optab>_imm_arcv2hs): Likewise.
	(mpyd_arcv2hs): Moved into above template.
	(mpyd_imm_arcv2hs): Moved into above template.
	(mpydu_arcv2hs): Likewise.
	(mpydu_imm_arcv2hs): Likewise.
	(su_optab): New optab prefix for sign/zero-extending operations.

gcc/testsuite/
2020-12-11  Claudiu Zissulescu  <claziss@synopsys.com>

	* gcc.target/arc/pmpyd.c: New test.
	* gcc.target/arc/tmac-1.c: Update.

Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
2020-12-11 18:13:53 +02:00
H.J. Lu
078c749890 x86: Update user interrupt handler stack frame
User interrupt handler stack frame is similar to exception interrupt
handler stack frame.  Instead of error code, the second argument is
user interrupt request register vector.

gcc/

	PR target/98219
	* config/i386/uintrintrin.h (__uintr_frame): Remove uirrv.

gcc/testsuite/

	PR target/98219
	* gcc.dg/guality/pr98219-1.c: New test.
	* gcc.dg/guality/pr98219-2.c: Likewise.
	* gcc.dg/torture/pr98219-1.c: Likewise.
	* gcc.dg/torture/pr98219-2.c: Likewise.
	* gcc.target/i386/uintr-2.c: Scan "add[lq] $8, %[er]sp".
	(uword_t): New.
	(foo): Add a uword_t argument.
	(UINTR_hanlder): Likewise.
	* gcc.target/i386/uintr-3.c: Scan "add[lq] $8, %[er]sp".
	(uword_t): New.
	(UINTR_hanlder): Add a uword_t argument.
	* gcc.target/i386/uintr-4.c (uword_t): New.
	(UINTR_hanlder): Add a uword_t argument.
	* gcc.target/i386/uintr-5.c (uword_t): New.
	(UINTR_hanlder): Add a uword_t argument.
2020-12-11 06:55:58 -08:00
Nathan Sidwell
97b56dece7 c++: Module lang hook overriding
This installs stub lang hooks for modules and creates the module dump file.

	gcc/cp/
	* cp-lang.c (LANG_HOOKS_PREPROCESS_MAIN_FILE): Override.
	(LANG_HOOKS_PREPROCESS_OPTIONS): Override.
	(LANG_HOOKS_PREPROCESS_TOKEN): Override.
	* cp-objcp-common.c (cp_register_dumps): Add module dump.
	(cp_handle_option): New.
	* cp-objcp-common.h (cp_handle_option): Declare.
	(LANG_HOOKS_HANDLE_OPTION): Override.
	* cp-tree.h (module_dump_id): Declare.
	* module.cc (module_dump_id): Define.
	(module_begin_main_file, handle_module_option)
	(module_preproces_options): Stubs.
2020-12-11 06:44:26 -08:00
Nathan Sidwell
37b242a3fb c++: name lookup API for modules
This adds a set of calls to name lookup that are needed by modules.
Generally installing imported bindings, or walking the current TU's
bindings.  One note about template instantiations though.  When we're
about to instantiate a template we have to know about all the
maybe-partial specializations that exist.  These can be in any
imported module -- not necesarily the module defining the template.
Thus we key such foreign templates to the innermost namespace and
identifier of the containing entitity -- that's the only thing we have
a handle on.  That's why we note and load pending specializations here.

	gcc/cp/
	* module.cc (lazy_specializations_p): Stub.
	* name-lookup.h (append_imported_binding_slot)
	(mergeable_namespacE_slots, lookup_class_binding)
	(walk_module_binding, import_module_binding, set_module_binding)
	(note_pending_specializations, load_pending_specializations)
	(add_module_decl, add_imported_namespace): Declare.
	(get_cxx_dialect_name): Declare.
	(enum WMB_flags): New.
	* name-lookup.c (append_imported_binding_slot)
	(mergeable_namespacE_slots, lookup_class_binding)
	(walk_module_binding, import_module_binding, set_module_binding)
	(note_pending_specializations, load_pending_specializations)
	(add_module_decl, add_imported_namespace): New.
	(get_cxx_dialect_name): Make extern.
2020-12-11 06:44:26 -08:00
Patrick Palka
958d42abdf c++: missing SFINAE with pointer subtraction [PR78173]
This fixes a missed SFINAE when subtracting pointers to an incomplete
type.

gcc/cp/ChangeLog:

	PR c++/78173
	* typeck.c (pointer_diff): Use complete_type_or_maybe_complain
	instead of complete_type_or_else.

gcc/testsuite/ChangeLog:

	PR c++/78173
	* g++.dg/cpp2a/concepts-pr78173.C: New test.
2020-12-11 09:40:58 -05:00
Andrea Corallo
33314b11ca arm: Improve documentation for effective target 'arm_softfloat'
gcc/ChangeLog

2020-12-01  Andrea Corallo  <andrea.corallo@arm.com>

	* doc/sourcebuild.texi (arm_softfloat): Improve documentation.

gcc/testsuite/ChangeLog

2020-12-01  Andrea Corallo  <andrea.corallo@arm.com>

	* lib/target-supports.exp (check_effective_target_arm_softfloat):
	Improve documentation.
2020-12-11 15:24:50 +01:00
Andrea Corallo
695b8d281a arm: [testsuite] fix lob tests for -mfloat-abi=hard
2020-11-26  Andrea Corallo  <andrea.corallo@arm.com>

	* gcc.target/arm/lob2.c: Use '-march=armv8.1-m.main+fp'.
	* gcc.target/arm/lob3.c: Skip with '-mfloat-abi=hard'.
	* gcc.target/arm/lob4.c: Likewise.
	* gcc.target/arm/lob5.c: Use '-march=armv8.1-m.main+fp'.
2020-12-11 15:24:50 +01:00
Richard Biener
ab231af9cc testsuite/98244 - amend gcc.dg/vect/vect-live-6.c
Committed.

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

	PR testsuite/98244
	* gcc.dg/vect/vect-live-6.c: Require vect_condition.
2020-12-11 13:45:55 +01:00
Richard Biener
4b488a2e69 testsuite/98242 - amend gcc.dg/vect/bb-slp-subgroups-3.c
Committed.

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

	PR testsuite/98242
	* gcc.dg/vect/bb-slp-subgroups-3.c: Require vect_int_mult.
2020-12-11 13:31:24 +01:00
Richard Biener
0fc3bf781d testsuite/98240 - amend gcc.dg/vect/pr97678.c
Committed.

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

	PR testsuite/98240
	* gcc.dg/vect/pr97678.c: Require vect_int_mult and
	vect_pack_trunc.
2020-12-11 13:23:21 +01:00
Richard Biener
955af69b73 testsuite/98239 - require vect_condition for gcc.dg/vect/bb-slp-69.c
Committed.

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

	PR testsuite/98239
	* gcc.dg/vect/bb-slp-69.c: Require vect_condition.
2020-12-11 13:14:43 +01:00
Jakub Jelinek
1423318fa7 expand: Fix up expand_doubleword_mod on 32-bit targets [PR98229]
As the testcase shows, for 32-bit word size we can end up with op1
up to 0xffffffff (0x100000000 % 0xffffffff == 1 and so we use bit == 32
for that), but the CONST_INT we got from caller is for DImode in that case
and not valid for SImode operations.

The following patch canonicalizes the two spots where the constant needs
canonicalization.

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

	PR rtl-optimization/98229
	* optabs.c (expand_doubleword_mod): Canonicalize op1 and
	1 - INTVAL (op1) as word_mode constants when used in
	word_mode arithmetics.

	* gcc.c-torture/compile/pr98229.c: New test.
2020-12-11 12:47:52 +01:00
Richard Biener
fc7b424817 tree-optimization/98235 - limit SLP discovery
With following backedges and the SLP discovery cache not being
permute aware we have to put some discovery limits in place again.
That's also the opportunity to ditch the separate limit on the
number of permutes we try, so the patch limits the overall work
done (as in vect_build_slp_tree cache misses) to what we compute
as max_tree_size which is based on the number of scalar stmts in
the vectorized region.

Note the limit is global and there's no attempt to divide the
allowed work evenly amongst opportunities, so one degenerate
can eat it all up.  That's probably only relevant for BB
vectorization where the limit is based on up to the size of the
whole function.

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

	PR tree-optimization/98235
	* tree-vect-slp.c (vect_build_slp_tree): Exchange npermutes
	for limit.  Decrement that for each cache miss and fail
	discovery when it reaches zero.
	(vect_build_slp_tree_2): Remove npermutes handling and
	simply pass down limit.
	(vect_build_slp_instance): Use pass down limit.
	(vect_analyze_slp_instance): Likewise.
	(vect_analyze_slp): Base the SLP discovery limit on
	max_tree_size and pass it down.

	* gcc.dg/torture/pr98235.c: New testcase.
2020-12-11 11:55:29 +01:00
Jakub Jelinek
3e60ddeb82 expansion: Sign or zero extend on MEM_REF stores into SUBREG with SUBREG_PROMOTED_VAR_P [PR98190]
Some targets decide to promote certain scalar variables to wider mode,
so their DECL_RTL is a SUBREG with SUBREG_PROMOTED_VAR_P.
When storing to such vars, store_expr takes care of sign or zero extending,
but if we store e.g. through MEM_REF into them, no sign or zero extension
happens and that leads to wrong-code e.g. on the following testcase on
aarch64-linux.

The following patch uses store_expr if we overwrite all the bits and it is
not reversed storage order, i.e. something that store_expr handles normally,
and otherwise (if the most significant bit is (or for pdp11 might be, but
pdp11 doesn't promote) being modified), the code extends manually.

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

	PR middle-end/98190
	* expr.c (expand_assignment): If to_rtx is a promoted SUBREG,
	ensure sign or zero extension either through use of store_expr
	or by extending manually.

	* gcc.dg/pr98190.c: New test.
2020-12-11 11:10:17 +01:00
Andrea Corallo
499651e438 ira.c: Fix ICE in ira-color [PR97092]
gcc/ChangeLog

2020-12-10  Andrea Corallo  <andrea.corallo@arm.com>

	PR rtl-optimization/97092
	* ira-color.c (update_costs_from_allocno): Do not carry over mode
	between subsequent iterations.

gcc/testsuite/ChangeLog

2020-12-10  Andrea Corallo  <andrea.corallo@arm.com>

	* gcc.target/aarch64/sve/pr97092.c: New test.
2020-12-11 10:36:43 +01:00
Richard Biener
fa4a8b6463 tree-optimization/95582 - fix vector pattern with bool conversions
The pattern recognizer fends off against recognizing conversions
from VECT_SCALAR_BOOLEAN_TYPE_P to precision one types but what
it really needs to fend off is conversions between
VECT_SCALAR_BOOLEAN_TYPE_P types - the Ada FE uses an 8 bit
boolean type that satisfies this predicate.

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

	PR tree-optimization/95582
	* tree-vect-patterns.c (vect_recog_bool_pattern): Check
	for VECT_SCALAR_BOOLEAN_TYPE_P, not just precision one.
2020-12-11 10:10:11 +01:00
Hongyu
99d6ba6acb Fix feature check for HRESET/AVX_VNNI/UINTR
gcc/ChangeLog:
	* common/config/i386/cpuinfo.h (get_available_features):
	Move check for HRESET/AVX_VNNI/UINTR out of avx512_usable.
2020-12-11 14:07:52 +08:00
Jakub Jelinek
a5c0500549 dojump: Fix up probabilities splitting in dojump.c comparison splitting [PR98212]
When compiling:
void foo (void);
void bar (float a, float b) { if (__builtin_expect (a != b, 1)) foo (); }
void baz (float a, float b) { if (__builtin_expect (a == b, 1)) foo (); }
void qux (float a, float b) { if (__builtin_expect (a != b, 0)) foo (); }
void corge (float a, float b) { if (__builtin_expect (a == b, 0)) foo (); }
on x86_64, we get (unimportant cruft removed):
bar:    ucomiss %xmm1, %xmm0
        jp      .L4
        je      .L1
.L4:    jmp     foo
.L1:    ret
baz:    ucomiss %xmm1, %xmm0
        jp      .L6
        jne     .L6
        jmp     foo
.L6:    ret
qux:    ucomiss %xmm1, %xmm0
        jp      .L13
        jne     .L13
        ret
.L13:   jmp     foo
corge:  ucomiss %xmm1, %xmm0
        jnp     .L18
.L14:   ret
.L18:   jne     .L14
        jmp     foo
(note for bar and qux that changed with a patch I've posted earlier today).
This is all reasonable, except the last function, the overall jump to
the tail call is predicted unlikely (10%), so it is good jmp foo isn't on
the straight line path, but NaNs are (or should be) considered very unlikely
in the programs, so IMHO the right code (and one emitted with the following
patch) is:
corge:  ucomiss %xmm1, %xmm0
        jp      .L14
        je      .L18
.L14:   ret
.L18:   jmp     foo

Let's discuss the probabilities in the above testcase:
for !and_them it looks all correct, so for
bar we split
if (a != b) goto t; // prob 90%
goto f;
into:
if (a unord b) goto t; // first_prob = prob * cprob = 90% * 1% = 0.9%
if (a ltgt b) goto t; // adjusted prob = (prob - first_prob) / (1 - first_prob) = (90% - 0.9%) / (1 - 0.9%) = 89.909%
and for qux we split
if (a != b) goto t; // prob 10%
goto f;
into:
if (a unord b) goto t; // first_prob = prob * cprob = 10% * 1% = 0.1%
if (a ltgt b) goto t; // adjusted prob = (prob - first_prob) / (1 - first_prob) = (10% - 0.1%) / (1 - 0.1%) = 9.910%
Now, the and_them cases should be probability wise exactly the same
if we swap the f and t labels, because baz
if (a == b) goto t; // prob 90%
goto f;
is equivalent to:
if (a != b) goto f; // prob 10%
goto t;
which is in qux.  This means we could expand baz as:
if (a unord b) goto f; // 0.1%
if (a ltgt b) goto f; // 9.910%
goto t;
But we don't expand it exactly that way, but instead (as the comment says)
as:
if (a ord b) ; else goto f; // first_prob as probability of ;
if (a uneq b) goto t; // adjusted prob
goto f;
So, first_prob.invert () should be 0.1% and adjusted prob should be
1 - 9.910%.
Thus, the right thing is 4 inverts:
prob = prob.invert (); // baz is equivalent to qux with swap(t, f) and thus inverted original prob
first_prob = prob.split (cprob.invert ()).invert ();
// cprob.invert because by doing if (cond) ; else goto f; we effectively invert the condition
// the second invert because first_prob is probability of ; rather than goto f
prob = prob.invert (); // lastly because adjusted prob we want is
// probability of goto t;, while the one from corresponding !and_them case
// would be if (...) goto f; goto t;

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

	PR rtl-optimization/98212
	* dojump.c (do_compare_rtx_and_jump): Change computation of
	first_prob for and_them.  Add comment explaining and_them case.

	* gcc.dg/predict-8.c: Adjust expected probability.
2020-12-11 00:36:21 +01:00
Jonathan Wakely
2ea62857a3 libstdc++: Remove redundant branches in countl_one and countr_one [PR 98226]
There's no need to explicitly check for the maximum value, because the
function we call handles it correctly anyway.

libstdc++-v3/ChangeLog:

	PR libstdc++/98226
	* include/std/bit (__countl_one, __countr_one): Remove redundant
	branches.
2020-12-10 21:57:42 +00:00
Andrew MacLeod
7f359556a7 Reduce memory requirements for ranger
Calculate block exit info upfront, and then any SSA_NAME which is never
used in an outgoing range calculation is a pure global and can bypass the
on-entry cache.

	PR tree-optimization/98174
	* gimple-range-cache.cc (ranger_cache::ssa_range_in_bb): Only push
	poor values to be examined if it isn't a pure global.
	(ranger_cache::block_range): Don't process pure globals.
	(ranger_cache::fill_block_cache): Adjust has_edge_range call.
	* gimple-range-gori.cc (gori_map::all_outgoing): New bitmap.
	(gori_map::gori_map): Allocate all_outgoing.
	(gori_map::is_export_p): No specified BB returns global context.
	(gori_map::calculate_gori): Accumulate each block into global.
	(gori_compute::gori_compute): Preprocess each block for exports.
	(gori_compute::has_edge_range_p): No edge returns global context.
	* gimple-range-gori.h (has_edge_range_p): Provide default parameter.
2020-12-10 16:35:01 -05:00
Ed Schonberg
779bf1823c Fix PR ada/98230
It's a rather curious malfunction of the 'Mod attribute applied to the
variable of a loop whose upper bound is dynamic.

gcc/ada/ChangeLog:
	PR ada/98230
	* exp_attr.adb (Expand_N_Attribute_Reference, case Mod): Use base
	type of argument to obtain static bound and required size.

gcc/testsuite/ChangeLog:
	* gnat.dg/modular6.adb: New test.
2020-12-10 22:30:30 +01:00
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