Tamar Christina [Sun, 13 Dec 2020 13:54:48 +0000 (13:54 +0000)]
middle-end: Support complex Addition
This patch adds support for
* Complex Addition with rotation of 90 and 270.
Addition with rotation of the second argument around the Argand plane.
Supported rotations are 90 and 180.
c = a + (b * I) and c = a + (b * I * I * I)
gcc/ChangeLog:
* tree-vect-slp-patterns.c: New file.
* Makefile.in: Add it.
* doc/passes.texi: Document it.
* internal-fn.def (COMPLEX_ADD_ROT90, COMPLEX_ADD_ROT270): New.
* optabs.def (cadd90_optab, cadd270_optab): New.
* doc/md.texi: Document them.
* tree-vect-loop.c (vect_analyze_loop_2): Add dissolve code.
* tree-vect-slp.c:
(vect_free_slp_instance, vect_create_new_slp_node): Export.
(vect_match_slp_patterns_2, vect_match_slp_patterns): New.
(vect_analyze_slp): Use it.
* tree-vectorizer.h (vect_free_slp_tree): Export.
(enum _complex_operation): Forward declare.
(class vect_pattern): New
gcc/testsuite/ChangeLog:
* lib/target-supports.exp
(check_effective_target_arm_v8_3a_complex_neon_ok_nocache): Fix it.
(check_effective_target_vect_complex_add_byte
,check_effective_target_vect_complex_add_int
,check_effective_target_vect_complex_add_short
,check_effective_target_vect_complex_add_long
,check_effective_target_vect_complex_add_half
,check_effective_target_vect_complex_add_float
,check_effective_target_vect_complex_add_double): New.
* gcc.dg/vect/complex/bb-slp-complex-add-pattern-byte.c: New test.
* gcc.dg/vect/complex/bb-slp-complex-add-pattern-int.c: New test.
* gcc.dg/vect/complex/bb-slp-complex-add-pattern-long.c: New test.
* gcc.dg/vect/complex/bb-slp-complex-add-pattern-short.c: New test.
* gcc.dg/vect/complex/bb-slp-complex-add-pattern-unsigned-byte.c: New test.
* gcc.dg/vect/complex/bb-slp-complex-add-pattern-unsigned-int.c: New test.
* gcc.dg/vect/complex/bb-slp-complex-add-pattern-unsigned-long.c: New test.
* gcc.dg/vect/complex/bb-slp-complex-add-pattern-unsigned-short.c: New test.
* gcc.dg/vect/complex/complex-add-pattern-template.c: New test.
* gcc.dg/vect/complex/complex-add-template.c: New test.
* gcc.dg/vect/complex/complex-operations-run.c: New test.
* gcc.dg/vect/complex/complex-operations.c: New test.
* gcc.dg/vect/complex/complex.exp: New test.
* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-double.c: New test.
* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-float.c: New test.
* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-half-float.c: New test.
* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-double.c: New test.
* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-float.c: New test.
* gcc.dg/vect/complex/fast-math-bb-slp-complex-add-pattern-half-float.c: New test.
* gcc.dg/vect/complex/fast-math-complex-add-double.c: New test.
* gcc.dg/vect/complex/fast-math-complex-add-float.c: New test.
* gcc.dg/vect/complex/fast-math-complex-add-half-float.c: New test.
* gcc.dg/vect/complex/fast-math-complex-add-pattern-double.c: New test.
* gcc.dg/vect/complex/fast-math-complex-add-pattern-float.c: New test.
* gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c: New test.
* gcc.dg/vect/complex/vect-complex-add-pattern-byte.c: New test.
* gcc.dg/vect/complex/vect-complex-add-pattern-int.c: New test.
* gcc.dg/vect/complex/vect-complex-add-pattern-long.c: New test.
* gcc.dg/vect/complex/vect-complex-add-pattern-short.c: New test.
* gcc.dg/vect/complex/vect-complex-add-pattern-unsigned-byte.c: New test.
* gcc.dg/vect/complex/vect-complex-add-pattern-unsigned-int.c: New test.
* gcc.dg/vect/complex/vect-complex-add-pattern-unsigned-long.c: New test.
* gcc.dg/vect/complex/vect-complex-add-pattern-unsigned-short.c: New test.
Tamar Christina [Sun, 13 Dec 2020 13:53:48 +0000 (13:53 +0000)]
middle-end: Refactor and expose some vectorizer helper functions.
This is a small refactoring which exposes some helper functions in the
vectorizer so they can be used in other places.
gcc/ChangeLog:
* tree-vect-patterns.c (vect_mark_pattern_stmts): Remove static inline.
* tree-vect-slp.c (vect_create_new_slp_node): Remove static and only
set smts if valid.
* tree-vectorizer.c (vec_info::add_pattern_stmt): New.
(vec_info::set_vinfo_for_stmt): Optionally enforce read-only.
* tree-vectorizer.h (struct _slp_tree): Use new types.
(lane_permutation_t, lane_permutation_t): New.
(vect_create_new_slp_node, vect_mark_pattern_stmts): New.
Thomas Koenig [Sun, 13 Dec 2020 11:54:57 +0000 (12:54 +0100)]
Show coarrays on parse tree dump, implement debug for array references.
gcc/fortran/ChangeLog:
* dump-parse-tree.c (show_array_ref): Also show coarrays.
(debug): Implement for array reference.
Rainer Orth [Sun, 13 Dec 2020 11:48:26 +0000 (12:48 +0100)]
testsuite: Fix various scan-assembler-symbol-section issues
This patch addresses some of the issues that I found when looking into the
failures of the scan-assembler-symbol-section tests on Solaris/SPARC.
* The first issue was that on Solaris/SPARC, section names are
double-quoted, both with as and gas:
.section ".text"
When using as, the section flag and type syntax is completely
different from other ELF targets:
.section "my_named_section",#alloc,#execinstr,#progbits
This patch fixes this by stripping double quotes from section names.
* However, this didn't work initially (only the leading quote was
stripped), which is due to David's recent AIX patch: with the
introduction of the new capturing group to handle both .section (ELF)
and .csect (XCOFF), $full_section_directive would never be empty on
ELF and Mach-O targets, so the extraction of the section name didn't
work any longer. This had also broken the Darwin tests completely.
* With working double quote stripping, all but one of the tests PASSed
on Solaris/SPARC, the exception being:
FAIL: gcc.dg/
20021029-1.c scan-assembler-symbol-section symbol ar (found __sparc_get_pc_thunk.l7) has section ^\\\\.(const|rodata)|\\\\[RO\\\\] (found .text.__sparc_get_pc_thunk.l7%__sparc_get_pc_thunk.l7)
This is due to the symbol name (ar) not being anchored in the test and
unexpectedly matchting __sparc_get_pc_thunk.l7.
* Next, I ran the tests on Darwin 11 and found two failing tests:
FAIL: gcc.dg/darwin-sections.c scan-assembler-symbol-section symbol ^_a\$ (symbol not found) has section \\\\.data
FAIL: gcc.dg/darwin-sections.c scan-assembler-symbol-section symbol ^_b\$ (symbol not found) has section \\\\.data
is due to Iain's recent "Darwin : Begin rework of zero-fill sections."
patch which emits
.globl _a
.zerofill __DATA,__common,_a,1,0
This is already scanned for, so the two scans above can just go.
The other failing test is
FAIL: g++.dg/gomp/tls-5.C -std=c++14 scan-assembler-symbol-section symbol ^_?_ZGR2ir_\$ (symbol not found) has section ^\\\\.tdata|\\\\[TL\\\\]
FAIL: g++.dg/gomp/tls-5.C -std=c++14 scan-assembler-symbol-section symbol ^_?ir\$ (symbol not found) has section ^\\\\.tbss|\\\\[TL\\\\]
Other scans are guarded by target tls_native, and indeed the assembler
output has
___emutls_v._ZGR2ir_:
___emutls_t._ZGR2ir_:
___emutls_v.ir:
Unfortunately scan-assembler-symbol-section doesn't support selects
yet, which this test implements both for the benefit of this test and
for symmetry.
With those changes, test results are clean now on sparc-sun-solaris2.11,
i386-pc-solaris2.11, i386-apple-darwin11.4.2, and
powerpc-ibm-aix7.2.4.0.
2020-12-03 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
gcc:
* doc/sourcebuild.texi (Commands for use in dg-final, Scan the
assembly output, scan-assembler-symbol-section): Document.
(scan-symbol-section): Document.
gcc/testsuite:
* lib/scanasm.exp (scan-symbol-section): Pass args to
dg-scan-symbol-section.
(scan-assembler-symbol-section): Likewise.
(dg-scan-symbol-section): Handle selector from orig_args.
Get patterns from orig_args.
(parse_section_of_symbols): Fix section_pattern.
Strip double quotes from section name.
* g++.dg/gomp/tls-5.C: Restrict ir, _ZGR2ir_ scans to tls_native.
* gcc.dg/
20021029-1.c: Anchor ar symbol.
* gcc.dg/darwin-sections.c: Remove obsolete scans for _a, _b in
.data.
Richard Sandiford [Sun, 13 Dec 2020 10:41:09 +0000 (10:41 +0000)]
Tweak the way that is_a is implemented
At the moment, class hierarchies that use is_a are expected
to define specialisations like:
template <>
template <>
inline bool
is_a_helper <cgraph_node *>::test (symtab_node *p)
{
return p->type == SYMTAB_FUNCTION;
}
But this doesn't scale well to larger hierarchies, because it only
defines ::test for an argument that is exactly “symtab_node *”
(and not for example “const symtab_node *” or something that
comes between cgraph_node and symtab_node in the hierarchy).
For example:
struct A { int x; };
struct B : A {};
struct C : B {};
template <>
template <>
inline bool
is_a_helper <C *>::test (A *a)
{
return a->x == 1;
}
bool f(B *b) { return is_a<C *> (b); }
gives:
warning: inline function ‘static bool is_a_helper<T>::test(U*) [with U = B; T = C*]’ used but never defined
and:
bool f(const A *a) { return is_a<const C *> (a); }
gives:
warning: inline function ‘static bool is_a_helper<T>::test(U*) [with U = const A; T = const C*]’ used but never defined
This patch instead allows is_a to be implemented by specialising
is_a_helper as a whole, for example:
template<>
struct is_a_helper<C *> : static_is_a_helper<C *>
{
static inline bool test (const A *a) { return a->x == 1; }
};
It also adds a general specialisation of is_a_helper for const
pointers. Together, this makes both of the above examples work.
gcc/
* is-a.h (reinterpret_is_a_helper): New class.
(static_is_a_helper): Likewise.
(is_a_helper): Inherit from reinterpret_is_a_helper.
(is_a_helper<const T *>): New specialization.
Richard Sandiford [Sun, 13 Dec 2020 10:41:08 +0000 (10:41 +0000)]
Move iterator_range to a new iterator-utils.h file
A later patch will add more iterator-related utilities. Rather than
putting them all directly in coretypes.h, it seemed better to add a
new header file, here called "iterator-utils.h". This preliminary
patch moves the existing iterator_range class there too.
I used the same copyright date range as coretypes.h “just to be sure”.
gcc/
* coretypes.h (iterator_range): Move to...
* iterator-utils.h: ...this new file.
Richard Sandiford [Sun, 13 Dec 2020 10:41:07 +0000 (10:41 +0000)]
rtlanal: Remove noop_move_p REG_EQUAL condition
noop_move_p currently keeps any instruction that has a REG_EQUAL
note, on the basis that the equality might be useful in future.
But this creates a perverse incentive not to add potentially-useful
REG_EQUAL notes, in case they prevent an instruction from later being
removed as dead.
The condition originates from flow.c:life_analysis_1 and predates
the changes tracked by the current repository (1992). It probably
made sense when most optimisations were done on RTL rather than FE
trees, but it seems counterproductive now.
gcc/
* rtlanal.c (noop_move_p): Don't check for REG_EQUAL notes.
Richard Sandiford [Sun, 13 Dec 2020 10:41:06 +0000 (10:41 +0000)]
vec: Silence clang warning
I noticed during compatibility testing that clang warns that this
operator won't be implicitly const in C++14 onwards.
gcc/
* vec.h (vnull::operator vec<T, A, L>): Make const.
GCC Administrator [Sun, 13 Dec 2020 00:16:19 +0000 (00:16 +0000)]
Daily bump.
François Dumont [Fri, 11 Dec 2020 06:48:06 +0000 (07:48 +0100)]
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.
Paul Thomas [Sat, 12 Dec 2020 14:01:08 +0000 (14:01 +0000)]
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.
Jakub Jelinek [Sat, 12 Dec 2020 13:49:57 +0000 (14:49 +0100)]
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.
Jakub Jelinek [Sat, 12 Dec 2020 13:48:47 +0000 (14:48 +0100)]
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.
Jakub Jelinek [Sat, 12 Dec 2020 07:36:02 +0000 (08:36 +0100)]
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.
GCC Administrator [Sat, 12 Dec 2020 00:16:35 +0000 (00:16 +0000)]
Daily bump.
Jason Merrill [Fri, 11 Dec 2020 19:37:09 +0000 (14:37 -0500)]
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.
Jason Merrill [Fri, 11 Dec 2020 19:35:20 +0000 (14:35 -0500)]
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.
Nathan Sidwell [Fri, 11 Dec 2020 19:10:40 +0000 (11:10 -0800)]
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.
Nathan Sidwell [Fri, 11 Dec 2020 18:05:41 +0000 (10:05 -0800)]
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.
Jim Wilson [Thu, 10 Dec 2020 02:57:32 +0000 (18:57 -0800)]
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.
GCC Administrator [Fri, 11 Dec 2020 18:22:52 +0000 (18:22 +0000)]
Daily bump.
Ian Lance Taylor [Fri, 11 Dec 2020 05:07:27 +0000 (21:07 -0800)]
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
Christophe Lyon [Fri, 11 Dec 2020 16:46:26 +0000 (16:46 +0000)]
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.
Claudiu Zissulescu [Fri, 11 Dec 2020 16:27:21 +0000 (18:27 +0200)]
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>
Claudiu Zissulescu [Fri, 11 Dec 2020 16:27:21 +0000 (18:27 +0200)]
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.
Claudiu Zissulescu [Fri, 11 Dec 2020 16:27:21 +0000 (18:27 +0200)]
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>
Nathan Sidwell [Fri, 11 Dec 2020 16:26:27 +0000 (08:26 -0800)]
c++: module test harness
Here is the module test harness -- but no tests.
gcc/testsuite/
* g++.dg/modules/modules.exp: New.
Nathan Sidwell [Fri, 11 Dec 2020 16:22:57 +0000 (08:22 -0800)]
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.
Christophe Lyon [Fri, 13 Nov 2020 12:34:12 +0000 (12:34 +0000)]
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.
Claudiu Zissulescu [Tue, 28 Jul 2020 10:15:48 +0000 (13:15 +0300)]
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>
H.J. Lu [Thu, 10 Dec 2020 02:14:24 +0000 (18:14 -0800)]
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.
Nathan Sidwell [Fri, 11 Dec 2020 14:42:26 +0000 (06:42 -0800)]
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.
Nathan Sidwell [Thu, 10 Dec 2020 21:05:44 +0000 (13:05 -0800)]
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.
Patrick Palka [Fri, 11 Dec 2020 14:40:58 +0000 (09:40 -0500)]
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.
Andrea Corallo [Tue, 1 Dec 2020 10:21:33 +0000 (11:21 +0100)]
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.
Andrea Corallo [Thu, 26 Nov 2020 11:33:18 +0000 (12:33 +0100)]
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'.
Richard Biener [Fri, 11 Dec 2020 12:45:55 +0000 (13:45 +0100)]
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.
Richard Biener [Fri, 11 Dec 2020 12:31:24 +0000 (13:31 +0100)]
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.
Richard Biener [Fri, 11 Dec 2020 12:23:21 +0000 (13:23 +0100)]
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.
Richard Biener [Fri, 11 Dec 2020 12:13:28 +0000 (13:13 +0100)]
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.
Jakub Jelinek [Fri, 11 Dec 2020 11:47:52 +0000 (12:47 +0100)]
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.
Richard Biener [Fri, 11 Dec 2020 09:52:58 +0000 (10:52 +0100)]
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.
Jakub Jelinek [Fri, 11 Dec 2020 10:10:17 +0000 (11:10 +0100)]
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.
Andrea Corallo [Wed, 9 Dec 2020 16:59:12 +0000 (17:59 +0100)]
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.
Richard Biener [Fri, 11 Dec 2020 09:07:10 +0000 (10:07 +0100)]
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.
Hongyu [Wed, 9 Dec 2020 19:18:41 +0000 (19:18 +0000)]
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.
Jakub Jelinek [Thu, 10 Dec 2020 23:36:21 +0000 (00:36 +0100)]
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.
Jonathan Wakely [Thu, 10 Dec 2020 21:57:42 +0000 (21:57 +0000)]
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.
Andrew MacLeod [Thu, 10 Dec 2020 19:59:14 +0000 (14:59 -0500)]
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.
Ed Schonberg [Thu, 10 Dec 2020 21:26:57 +0000 (22:26 +0100)]
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.
Jason Merrill [Wed, 2 Sep 2020 20:47:37 +0000 (16:47 -0400)]
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.
Jason Merrill [Thu, 10 Dec 2020 16:21:50 +0000 (11:21 -0500)]
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.
Marek Polacek [Thu, 10 Dec 2020 20:34:19 +0000 (15:34 -0500)]
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.
Nathan Sidwell [Thu, 10 Dec 2020 19:33:35 +0000 (11:33 -0800)]
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.
Nathan Sidwell [Thu, 10 Dec 2020 18:19:07 +0000 (10:19 -0800)]
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.
Nathan Sidwell [Thu, 10 Dec 2020 16:28:31 +0000 (08:28 -0800)]
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.
Dennis Zhang [Thu, 10 Dec 2020 15:36:23 +0000 (15:36 +0000)]
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.
Marek Polacek [Thu, 10 Dec 2020 14:56:40 +0000 (09:56 -0500)]
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.
Nathan Sidwell [Thu, 10 Dec 2020 14:54:37 +0000 (06:54 -0800)]
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.
Eric Botcazou [Thu, 10 Dec 2020 14:35:28 +0000 (15:35 +0100)]
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
Nathan Sidwell [Wed, 9 Dec 2020 20:18:06 +0000 (12:18 -0800)]
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.
Nathan Sidwell [Wed, 9 Dec 2020 18:46:58 +0000 (10:46 -0800)]
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.
Bernd Edlinger [Mon, 7 Dec 2020 11:00:00 +0000 (12:00 +0100)]
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.
Richard Biener [Thu, 10 Dec 2020 12:33:12 +0000 (13:33 +0100)]
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
605c2a393d3a2db8
2020-12-10 Richard Biener <rguenther@suse.de>
* tree-vect-stmts.c (vectorizable_assignment): Remove special
allowance of VECTOR_BOOLEAN_TYPE_P conversions.
Christophe Lyon [Thu, 12 Nov 2020 20:16:05 +0000 (20:16 +0000)]
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.
Richard Sandiford [Thu, 10 Dec 2020 12:10:00 +0000 (12:10 +0000)]
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.
Joel Hutton [Thu, 10 Dec 2020 11:55:18 +0000 (11:55 +0000)]
[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.
Joel Hutton [Thu, 10 Dec 2020 11:54:03 +0000 (11:54 +0000)]
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.
Richard Biener [Thu, 10 Dec 2020 10:12:53 +0000 (11:12 +0100)]
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.
Alexandre Oliva [Thu, 10 Dec 2020 09:23:36 +0000 (06:23 -0300)]
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.
Jakub Jelinek [Thu, 10 Dec 2020 11:03:30 +0000 (12:03 +0100)]
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.
Jakub Jelinek [Thu, 10 Dec 2020 10:46:08 +0000 (11:46 +0100)]
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.
Jakub Jelinek [Thu, 10 Dec 2020 10:07:07 +0000 (11:07 +0100)]
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.
Richard Biener [Thu, 10 Dec 2020 09:34:32 +0000 (10:34 +0100)]
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.
Simon Cook [Wed, 9 Dec 2020 10:39:28 +0000 (10:39 +0000)]
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.
Nikhil Benesch [Thu, 10 Dec 2020 02:46:02 +0000 (18:46 -0800)]
-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.
Ian Lance Taylor [Thu, 10 Dec 2020 00:34:14 +0000 (16:34 -0800)]
go-test.exp: recognize errorcheckdir -n
* go.test/go-test.exp (go-gc-tests): Recognize errorcheckdir -n,
for bug345.go.
GCC Administrator [Thu, 10 Dec 2020 00:16:47 +0000 (00:16 +0000)]
Daily bump.
Ian Lance Taylor [Wed, 9 Dec 2020 23:43:44 +0000 (15:43 -0800)]
go-test.exp: rewrite errchk regexp quoting
* go.test/go-test.exp (errchk): Rewrite regexp quoting to use
curly braces, making it much simpler.
Jakub Jelinek [Wed, 9 Dec 2020 22:52:25 +0000 (23:52 +0100)]
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.
Przemyslaw Wirkus [Wed, 9 Dec 2020 21:29:58 +0000 (21:29 +0000)]
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.
Uros Bizjak [Wed, 9 Dec 2020 20:06:07 +0000 (21:06 +0100)]
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
Jonathan Wakely [Wed, 9 Dec 2020 16:53:18 +0000 (16:53 +0000)]
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.
Richard Biener [Wed, 9 Dec 2020 14:48:36 +0000 (15:48 +0100)]
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.
Nathan Sidwell [Wed, 9 Dec 2020 15:18:23 +0000 (07:18 -0800)]
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.
Marek Polacek [Tue, 8 Dec 2020 21:44:53 +0000 (16:44 -0500)]
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.
Martin Liska [Wed, 9 Dec 2020 14:24:36 +0000 (15:24 +0100)]
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.
Kyrylo Tkachov [Tue, 1 Dec 2020 14:53:30 +0000 (14:53 +0000)]
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.
Nathan Sidwell [Wed, 9 Dec 2020 12:52:51 +0000 (04:52 -0800)]
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.
Ilya Leoshkevich [Thu, 3 Dec 2020 01:02:20 +0000 (02:02 +0100)]
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.
Tobias Burnus [Wed, 9 Dec 2020 11:20:01 +0000 (12:20 +0100)]
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.
Andrew Stubbs [Mon, 23 Nov 2020 16:27:59 +0000 (16:27 +0000)]
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.
Richard Biener [Wed, 9 Dec 2020 08:56:59 +0000 (09:56 +0100)]
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.
Tobias Burnus [Wed, 9 Dec 2020 09:42:49 +0000 (10:42 +0100)]
gfortran.dg/gomp/reduction4.f90: Fix testcase
Fix to 'omp scan' commit
005cff4e2ecbd5c4e2ef978fe4842fa3c8c79f47
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.
Jakub Jelinek [Wed, 9 Dec 2020 08:36:11 +0000 (09:36 +0100)]
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.
Jakub Jelinek [Wed, 9 Dec 2020 08:34:51 +0000 (09:34 +0100)]
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.
Jason Merrill [Wed, 9 Dec 2020 02:47:11 +0000 (21:47 -0500)]
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.
Jason Merrill [Wed, 9 Dec 2020 03:05:45 +0000 (22:05 -0500)]
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.
GCC Administrator [Wed, 9 Dec 2020 00:16:50 +0000 (00:16 +0000)]
Daily bump.
Jakub Jelinek [Tue, 8 Dec 2020 23:35:04 +0000 (00:35 +0100)]
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.