platform/upstream/gcc.git
4 years agoaarch64: Add bfloat16 vldn/vstn intrinsics
Mihail Ionescu [Tue, 18 Feb 2020 14:29:47 +0000 (14:29 +0000)]
aarch64: Add bfloat16 vldn/vstn intrinsics

This patch adds the load/store bfloat16 intrinsics to the AArch64 back-end.
ACLE documents are at https://developer.arm.com/docs/101028/latest
ISA documents are at https://developer.arm.com/docs/ddi0596/latest

2020-02-25  Mihail Ionescu  <mihail.ionescu@arm.com>

gcc/
* config/aarch64/aarch64-builtins.c (aarch64_scalar_builtin_types):
Add simd_bf.
(aarch64_init_simd_builtin_scalar_types): Register simd_bf.
(VAR15, VAR16): New.
* config/aarch64/iterators.md (VALLDIF): Enable for V4BF and V8BF.
(VD): Enable for V4BF.
(VDC): Likewise.
(VQ): Enable for V8BF.
(VQ2): Likewise.
(VQ_NO2E): Likewise.
(VDBL, Vdbl): Add V4BF.
(V_INT_EQUIV, v_int_equiv): Add V4BF and V8BF.
* config/aarch64/arm_neon.h (bfloat16x4x2_t): New typedef.
(bfloat16x8x2_t): Likewise.
(bfloat16x4x3_t): Likewise.
(bfloat16x8x3_t): Likewise.
(bfloat16x4x4_t): Likewise.
(bfloat16x8x4_t): Likewise.
(vcombine_bf16): New.
(vld1_bf16, vld1_bf16_x2): New.
(vld1_bf16_x3, vld1_bf16_x4): New.
(vld1q_bf16, vld1q_bf16_x2): New.
(vld1q_bf16_x3, vld1q_bf16_x4): New.
(vld1_lane_bf16): New.
(vld1q_lane_bf16): New.
(vld1_dup_bf16): New.
(vld1q_dup_bf16): New.
(vld2_bf16): New.
(vld2q_bf16): New.
(vld2_dup_bf16): New.
(vld2q_dup_bf16): New.
(vld3_bf16): New.
(vld3q_bf16): New.
(vld3_dup_bf16): New.
(vld3q_dup_bf16): New.
(vld4_bf16): New.
(vld4q_bf16): New.
(vld4_dup_bf16): New.
(vld4q_dup_bf16): New.
(vst1_bf16, vst1_bf16_x2): New.
(vst1_bf16_x3, vst1_bf16_x4): New.
(vst1q_bf16, vst1q_bf16_x2): New.
(vst1q_bf16_x3, vst1q_bf16_x4): New.
(vst1_lane_bf16): New.
(vst1q_lane_bf16): New.
(vst2_bf16): New.
(vst2q_bf16): New.
(vst3_bf16): New.
(vst3q_bf16): New.
(vst4_bf16): New.
(vst4q_bf16): New.

gcc/testsuite/
* gcc.target/aarch64/advsimd-intrinsics/bf16_vstn.c: New test.
* gcc.target/aarch64/advsimd-intrinsics/bf16_vldn.c: New test.

4 years agoaarch64: Add bfloat16 vdup and vreinterpret ACLE intrinsics
Mihail Ionescu [Tue, 18 Feb 2020 14:23:09 +0000 (14:23 +0000)]
aarch64: Add bfloat16 vdup and vreinterpret ACLE intrinsics

This patch adds support for the bf16 duplicate and reinterpret intrinsics.
ACLE documents are at https://developer.arm.com/docs/101028/latest
ISA documents are at https://developer.arm.com/docs/ddi0596/latest

2020-02-25  Mihail Ionescu  <mihail.ionescu@arm.com>

gcc/
* config/aarch64/iterators.md (VDQF_F16) Add V4BF and V8BF.
(VALL_F16): Likewise.
(VALLDI_F16): Likewise.
(Vtype): Likewise.
(Vetype): Likewise.
(vswap_width_name): Likewise.
(VSWAP_WIDTH): Likewise.
(Vel): Likewise.
(VEL): Likewise.
(q): Likewise.
* config/aarch64/arm_neon.h (vset_lane_bf16, vsetq_lane_bf16): New.
(vget_lane_bf16, vgetq_lane_bf16): New.
(vcreate_bf16): New.
(vdup_n_bf16, vdupq_n_bf16): New.
(vdup_lane_bf16, vdup_laneq_bf16): New.
(vdupq_lane_bf16, vdupq_laneq_bf16): New.
(vduph_lane_bf16, vduph_laneq_bf16): New.
(vreinterpret_bf16_u8, vreinterpretq_bf16_u8): New.
(vreinterpret_bf16_u16, vreinterpretq_bf16_u16): New.
(vreinterpret_bf16_u32, vreinterpretq_bf16_u32): New.
(vreinterpret_bf16_u64, vreinterpretq_bf16_u64): New.
(vreinterpret_bf16_s8, vreinterpretq_bf16_s8): New.
(vreinterpret_bf16_s16, vreinterpretq_bf16_s16): New.
(vreinterpret_bf16_s32, vreinterpretq_bf16_s32): New.
(vreinterpret_bf16_s64, vreinterpretq_bf16_s64): New.
(vreinterpret_bf16_p8, vreinterpretq_bf16_p8): New.
(vreinterpret_bf16_p16, vreinterpretq_bf16_p16): New.
(vreinterpret_bf16_p64, vreinterpretq_bf16_p64): New
(vreinterpret_bf16_f16, vreinterpretq_bf16_f16): New
(vreinterpret_bf16_f32, vreinterpretq_bf16_f32): New.
(vreinterpret_bf16_f64, vreinterpretq_bf16_f64): New.
(vreinterpretq_bf16_p128): New.
(vreinterpret_s8_bf16, vreinterpretq_s8_bf16): New.
(vreinterpret_s16_bf16, vreinterpretq_s16_bf16): New.
(vreinterpret_s32_bf16, vreinterpretq_s32_bf16): New.
(vreinterpret_s64_bf16, vreinterpretq_s64_bf16): New.
(vreinterpret_u8_bf16, vreinterpretq_u8_bf16): New.
(vreinterpret_u16_bf16, vreinterpretq_u16_bf16): New.
(vreinterpret_u32_bf16, vreinterpretq_u32_bf16): New.
(vreinterpret_u64_bf16, vreinterpretq_u64_bf16): New.
(vreinterpret_p8_bf16, vreinterpretq_p8_bf16): New.
(vreinterpret_p16_bf16, vreinterpretq_p16_bf16): New.
(vreinterpret_p64_bf16, vreinterpretq_p64_bf16): New.
(vreinterpret_f32_bf16, vreinterpretq_f32_bf16): New.
(vreinterpret_f64_bf16,vreinterpretq_f64_bf16): New.
(vreinterpret_f16_bf16,vreinterpretq_f16_bf16): New.
(vreinterpretq_p128_bf16): New.

gcc/testsuite/
* gcc.target/aarch64/advsimd-intrinsics/bf16_dup.c: New test.
* gcc.target/aarch64/advsimd-intrinsics/bf16_reinterpret.c: New test.

4 years agolibstdc++: LWG 3397 basic_istream_view::iterator should not provide iterator_category
Patrick Palka [Mon, 24 Feb 2020 22:13:40 +0000 (17:13 -0500)]
libstdc++: LWG 3397 basic_istream_view::iterator should not provide iterator_category

libstdc++-v3/ChangeLog:

LWG 3397 basic_istream_view::iterator should not provide
iterator_category
* include/std/ranges (basic_istream_view:_Iterator::iterator_category):
Rename to ...
(basic_istream_view:_Iterator::iterator_concept): ... this.
* testsuite/std/ranges/istream_view.cc: Augment test.

4 years agolibstdc++: LWG 3325 Constrain return type of transformation function for transform_view
Patrick Palka [Mon, 24 Feb 2020 21:21:55 +0000 (16:21 -0500)]
libstdc++: LWG 3325 Constrain return type of transformation function for transform_view

libstdc++-v3/ChangeLog:

LWG 3325 Constrain return type of transformation function for
transform_view
* include/std/ranges (transform_view): Constrain the return type of the
transformation function as per LWG 3325.
* testsuite/std/ranges/adaptors/lwg3325_neg.cc: New test.

4 years agolibstdc++: LWG 3313 join_view::iterator::operator-- is incorrectly constrained
Patrick Palka [Mon, 24 Feb 2020 21:09:48 +0000 (16:09 -0500)]
libstdc++: LWG 3313 join_view::iterator::operator-- is incorrectly constrained

libstdc++-v3/ChangeLog:

LWG 3313 join_view::_Iterator::operator-- is incorrectly constrained
* include/std/ranges (join_view::_Iterator::operator--): Require that
range_reference_t<_Base> models common_range.
* testsuite/std/ranges/adaptors/lwg3313_neg.cc: New test.

4 years agolibstdc++: LWG 3301 transform_view::iterator has incorrect iterator_category
Patrick Palka [Mon, 24 Feb 2020 21:38:07 +0000 (16:38 -0500)]
libstdc++: LWG 3301 transform_view::iterator has incorrect iterator_category

libstdc++-v3/ChangeLog:

LWG 3301 transform_view::_Iterator has incorrect iterator_category
* include/std/ranges (transform_view::_Iterator::_S_iter_cat): Adjust
determination of iterator_category as per LWG 3301.
* testsuite/std/ranges/adaptors/transform.cc: Augment test.

4 years agolibstdc++: LWG 3292 iota_view is under-constrained
Patrick Palka [Mon, 24 Feb 2020 22:01:29 +0000 (17:01 -0500)]
libstdc++: LWG 3292 iota_view is under-constrained

libstdc++-v3/ChangeLog:

LWG 3292 iota_view is under-constrained
* include/std/ranges (iota_view): Require that _Winc models semiregular
  as per LWG 3292.
* testsuite/std/ranges/iota/lwg3292_neg.cc: New test.

4 years agoarm: ACLE intrinsics for bfloat16 dot product
Dennis Zhang [Tue, 25 Feb 2020 17:38:00 +0000 (17:38 +0000)]
arm: ACLE intrinsics for bfloat16 dot product

This patch is part of a series adding support for Armv8.6-A features.
It adds intrinsics for brain half-precision float-point (BF16) dot
instructions with AdvSIMD support.

gcc/ChangeLog:

2020-02-25  Dennis Zhang  <dennis.zhang@arm.com>

* config/arm/arm_neon.h (vbfdot_f32, vbfdotq_f32): New
(vbfdot_lane_f32, vbfdotq_laneq_f32): New.
(vbfdot_laneq_f32, vbfdotq_lane_f32): New.
* config/arm/arm_neon_builtins.def (vbfdot): New entry.
(vbfdot_lanev4bf, vbfdot_lanev8bf): Likewise.
* config/arm/iterators.md (VSF2BF): New attribute.
* config/arm/neon.md (neon_vbfdot<VCVTF:mode>): New entry.
(neon_vbfdot_lanev4bf<VCVTF:mode>): Likewise.
(neon_vbfdot_lanev8bf<VCVTF:mode>): Likewise.

gcc/testsuite/ChangeLog:

2020-02-25  Dennis Zhang  <dennis.zhang@arm.com>

* gcc.target/arm/simd/bf16_dot_1.c: New test.
* gcc.target/arm/simd/bf16_dot_2.c: New test.
* gcc.target/arm/simd/bf16_dot_3.c: New test.

4 years agolibstdc++: Remove __memmove wrapper for constexpr algorithms
Jonathan Wakely [Tue, 25 Feb 2020 14:16:42 +0000 (14:16 +0000)]
libstdc++: Remove __memmove wrapper for constexpr algorithms

The mutating sequence algorithms std::copy, std::copy_backward,
std::move and std::move_backward conditionally use __builtin_memmove
for trivially copyable types. However, because memmove isn't usable in
constant expressions the use of __builtin_memmove is wrapped in a
__memmove function which replaces __builtin_memmove with a handwritten
loop when std::is_constant_evaluated() is true.

This means we have a manual loop for non-trivially copyable cases, and a
different manual loop for trivially copyable but constexpr cases. The
latter loop has incorrect semantics for the {copy,move}_backward cases
and so isn't used for them. Until earlier today the latter loop also had
incorrect semantics for the std::move cases, trying to move from const
rvalues.

The approach taken by this patch is to remove the __memmove function
entirely and use the original (and correct) manual loops for the
constexpr cases as well as the non-trivially copyable cases. This was
already done for move_backward and copy_backward, but was incorrectly
turning copy_backward into move_backward, by failing to use the _IsMove
constant to select the right specialization. This patch also fixes that.

* include/bits/ranges_algobase.h (__copy_or_move): Do not use memmove
during constant evaluation. Call __builtin_memmove directly instead of
__memmove.
(__copy_or_move_backward): Likewise.
* include/bits/stl_algobase.h (__memmove): Remove.
(__copy_move<M, true, random_access_iterator_tag>::__copy_m)
(__copy_move_backward<M, true, random_access_iterator_tag>::__copy_m):
Use __builtin_memmove directly instead of __memmove.
(__copy_move_a2): Do not use memmove during constant evaluation.
(__copy_move_backward_a2): Use _IsMove constant to select correct
__copy_move_backward specialization.
* testsuite/25_algorithms/copy_backward/constexpr.cc: Check for copies
begin turned into moves during constant evaluation.

4 years agoFix ChangeLog date
Jonathan Wakely [Tue, 25 Feb 2020 16:58:52 +0000 (16:58 +0000)]
Fix ChangeLog date

4 years ago[ARM] Fix -mpure-code for v6m
Christophe Lyon [Tue, 25 Feb 2020 15:54:14 +0000 (15:54 +0000)]
[ARM] Fix -mpure-code for v6m

When running the testsuite with -fdisable-rtl-fwprop2 and -mpure-code
for cortex-m0, I noticed that some testcases were failing because we
still generate "ldr rX, .LCY", which is what we want to avoid with
-mpure-code. This is latent since a recent improvement in fwprop
(PR88833).

In this patch I change the thumb1_movsi_insn pattern so that it emits
the desired instruction sequence when arm_disable_literal_pool is set.

To achieve that, I introduce a new required_for_purecode attribute to
enable the corresponding alternative in thumb1_movsi_insn and take the
actual instruction sequence length into account.

gcc/ChangeLog:

2020-02-13  Christophe Lyon  <christophe.lyon@linaro.org>

* config/arm/arm.md (required_for_purecode): New attribute.
(enabled): Handle required_for_purecode.
* config/arm/thumb1.md (thumb1_movsi_insn): Add alternative to
work with -mpure-code.

4 years agocombine: Fix find_split_point handling of constant store into ZERO_EXTRACT [PR93908]
Jakub Jelinek [Tue, 25 Feb 2020 12:56:47 +0000 (13:56 +0100)]
combine: Fix find_split_point handling of constant store into ZERO_EXTRACT [PR93908]

git is miscompiled on s390x-linux with -O2 -march=zEC12 -mtune=z13.
I've managed to reduce it into the following testcase.  The problem is that
during combine we see the s->k = -1; bitfield store and change the SET_SRC
from a pseudo into a constant:
(set (zero_extract:DI (mem/j:HI (plus:DI (reg/v/f:DI 60 [ s ])
                (const_int 10 [0xa])) [0 +0 S2 A16])
        (const_int 2 [0x2])
        (const_int 7 [0x7]))
    (const_int -1 [0xffffffffffffffff]))
This on s390x with the above option isn't recognized as valid instruction,
so find_split_point decides to handle it as IOR or IOR/AND.
src is -1, mask is 3 and pos is 7.
src != mask (this is also incorrect, we want to set all (both) bits in the
bitfield), so we go for IOR/AND, but instead of trying
mem = (mem & ~0x180) | ((-1 << 7) & 0x180)
we actually try
mem = (mem & ~0x180) | (-1 << 7)
and that is further simplified into:
mem = mem | (-1 << 7)
aka
mem = mem | 0xff80
which doesn't set just the 2-bit bitfield, but also many other bitfields
that shouldn't be touched.
We really should do:
mem = mem | 0x180
instead.
The problem is that we assume that no bits but those low len (2 here) will
be set in the SET_SRC, but there is nothing that can prevent that, we just
should ignore the other bits.

The following patch fixes it by masking src with mask, this way already
the src == mask test will DTRT, and as the code for or_mask uses
gen_int_mode, if the most significant bit is set after shifting it left by
pos, it will be properly sign-extended.

2020-02-25  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/93908
* combine.c (find_split_point): For store into ZERO_EXTRACT, and src
with mask.

* gcc.c-torture/execute/pr93908.c: New test.

4 years agolibstdc++: Add test accidentally left out of previous commit
Jonathan Wakely [Tue, 25 Feb 2020 12:42:03 +0000 (12:42 +0000)]
libstdc++: Add test accidentally left out of previous commit

* testsuite/25_algorithms/move_backward/93872.cc: Add test left out of
previous commit.

4 years agolibstdc++: Fix regression in std::move algorithm (PR 93872)
Jonathan Wakely [Tue, 25 Feb 2020 12:21:44 +0000 (12:21 +0000)]
libstdc++: Fix regression in std::move algorithm (PR 93872)

The std::move and std::move_backward algorithms dispatch to the
std::__memmove helper when appropriate. That function uses a
pointer-to-const for the source values, preventing them from being
moved. The two callers of that function have the same problem.

Rather than altering __memmove and its callers to work with const or
non-const source pointers, this takes a more conservative approach of
casting away the const at the point where we want to do a move
assignment. This relies on the fact that we only use __memmove when the
type is trivially copyable, so we know the move assignment doesn't alter
the source anyway.

PR libstdc++/93872
* include/bits/stl_algobase.h (__memmove): Cast away const before
doing move assignment.
* testsuite/25_algorithms/move/93872.cc: New test.
* testsuite/25_algorithms/move_backward/93872.cc: New test.

4 years agoFix link failure with debug info in LTO mode
Eric Botcazou [Tue, 25 Feb 2020 11:34:00 +0000 (12:34 +0100)]
Fix link failure with debug info in LTO mode

This fixes a regression whereby the program fails to link with debug
info in LTO mode because of an undefined reference to a symbol coming
from the object files containing the early debug info.

* dwarf2out.c (dwarf2out_size_function): Run in early-DWARF mode.

4 years agotestcase for last_vuse in FRE
Richard Biener [Tue, 25 Feb 2020 11:19:33 +0000 (12:19 +0100)]
testcase for last_vuse in FRE

This adds a testcase for some basic FRE functionality.

2020-02-25  Richard Biener  <rguenther@suse.de>

* gcc.dg/tree-ssa/ssa-fre-86.c: New testcase.

4 years agodoc: minor --enable-checking wording fixes
Roman Zhuykov [Tue, 25 Feb 2020 11:08:00 +0000 (14:08 +0300)]
doc: minor --enable-checking wording fixes

gcc/ChangeLog:
 doc/install.texi (--enable-checking): Adjust wording.

4 years agotree-optimization/93868 copy SLP tree before re-arranging stmts
Richard Biener [Tue, 25 Feb 2020 09:31:16 +0000 (10:31 +0100)]
tree-optimization/93868 copy SLP tree before re-arranging stmts

This avoids altering possibly shared SLP subtrees when attempting
to get rid of permutations in SLP reductions by copying the SLP
subtree before re-arranging stmts in it.

2020-02-25  Richard Biener  <rguenther@suse.de>

PR tree-optimization/93868
* tree-vect-slp.c (slp_copy_subtree): New function.
(vect_attempt_slp_rearrange_stmts): Copy the SLP tree before
re-arranging stmts in it.

* gcc.dg/torture/pr93868.c: New testcase.

4 years agopass_manager: Fix ICE with -fdump-passes -fdisable-tree-* [PR93874]
Jakub Jelinek [Tue, 25 Feb 2020 09:21:34 +0000 (10:21 +0100)]
pass_manager: Fix ICE with -fdump-passes -fdisable-tree-* [PR93874]

dump_passes pushes a dummy function for which it evaluates the gates
and checks whether the pass is enabled or disabled.
Unfortunately, if any -fdisable-*-*/-fenable-*-* options were seen,
we ICE during is_pass_explicitly_enabled_or_disabled because slot
is non-NULL then and the code will do:
  cgraph_uid = func ? cgraph_node::get (func)->get_uid () : 0;
but the dummy function doesn't have a cgraph node.

So, either we need to create and then remove a cgraph node for the dummy
function like the following patch, or function.c would need to export the
in_dummy_function flag (or have some way to query that flag from other TUs)
and we'd need to check it in is_pass_explicitly_enabled_or_disabled.

2020-02-25  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/93874
* passes.c (pass_manager::dump_passes): Create a cgraph node for the
dummy function and remove it at the end.

* gcc.dg/pr93874.c: New test.

4 years agoDead code in fortran/simplify.c
Steven G. Kargl [Tue, 25 Feb 2020 08:25:33 +0000 (09:25 +0100)]
Dead code in fortran/simplify.c

* simplify.c (degrees_f): Remove unused code.

4 years agotestsuite: Fix recently added ipa testcases [PR93763]
Jakub Jelinek [Tue, 25 Feb 2020 08:05:57 +0000 (09:05 +0100)]
testsuite: Fix recently added ipa testcases [PR93763]

Seems the test has been badly reduced (if the original doesn't emit
warnings, it is always better in the reduction script avoid introducing new
ones).
Also, the g++.dg/ipa/ test fails with -std=c++98 because it is written in
C++11.

2020-02-25  Jakub Jelinek  <jakub@redhat.com>

PR ipa/93763
* gcc.dg/ipa/pr93763.c: Adjust the test so that it compiles without
warnings and still ICEs before the ipa-cp.c fix.
* g++.dg/ipa/pr93763.C: Require c++11 effective target.

4 years agoc: Small diagnostics tweak - add missing ? after did you mean [PR93858]
Jakub Jelinek [Tue, 25 Feb 2020 08:04:39 +0000 (09:04 +0100)]
c: Small diagnostics tweak - add missing ? after did you mean [PR93858]

2020-02-25  Jakub Jelinek  <jakub@redhat.com>

PR c/93858
* c-pragma.c (handle_pragma_diagnostic): Add missing ? after
"did you mean" hint in diagnostics.

4 years agoFix typo: paramter -> parameter [PR93864]
Jakub Jelinek [Tue, 25 Feb 2020 08:02:57 +0000 (09:02 +0100)]
Fix typo: paramter -> parameter [PR93864]

2020-02-25  Jakub Jelinek  <jakub@redhat.com>

PR translation/93864
* config/lm32/lm32.c (lm32_setup_incoming_varargs): Fix comment typo
paramter -> parameter.
* config/aarch64/aarch64.c (aarch64_is_extend_from_extract): Likewise.
* ipa-prop.h (struct ipa_agg_replacement_value): Likewise.

* intrinsic.texi (CO_BROADCAST): Fix typo, paramter -> parameter.
* trans-array.c (gfc_allocate_pdt_comp, gfc_deallocate_pdt_comp,
gfc_check_pdt_dummy): Fix comment typo paramter -> parameter.

* objc.dg/encode-2.m: Fix comment typo paramter -> parameter.
* obj-c++.dg/encode-4.mm: Likewise.
* gfortran.dg/data_array_5.f90: Likewise.
* gcc.dg/decl-1.c: Likewise.

4 years agodoc: properly describe --enable-checking behavior
Roman Zhuykov [Tue, 25 Feb 2020 07:15:49 +0000 (10:15 +0300)]
doc: properly describe --enable-checking behavior

This patch rewords the whole description to fix minor issues:
 - documents 'gimple' and 'types' checks,
 - clarifies what happens when option is used without '=list',
 - fixes inaccurate wrong wording about release snapshots,
 - describes that release checks can only de disabled explicitly.

gcc/ChangeLog:
* doc/install.texi (--enable-checking): Properly document current
behavior.
(--enable-stage1-checking): Minor clarification about bootstrap.

4 years agoanalyzer: fix -fdump-analyzer
David Malcolm [Mon, 24 Feb 2020 22:02:11 +0000 (17:02 -0500)]
analyzer: fix -fdump-analyzer

This patch fixes a bug with -fdump-analyzer, which is meant to write
purely a dumpfile, but was erroneously sending part of the dump to
stderr.

gcc/analyzer/ChangeLog:
* engine.cc (exploded_graph::get_or_create_node): Dump the
program_state to the pp, rather than to stderr.

4 years agoUpdate gcc de.po.
Joseph Myers [Tue, 25 Feb 2020 01:16:02 +0000 (01:16 +0000)]
Update gcc de.po.

* de.po: Update.

4 years agoDaily bump.
GCC Administrator [Tue, 25 Feb 2020 00:16:33 +0000 (00:16 +0000)]
Daily bump.

4 years agoanalyzer: disable the "taint" checker by default
David Malcolm [Fri, 21 Feb 2020 15:50:16 +0000 (10:50 -0500)]
analyzer: disable the "taint" checker by default

PR analyzer/93032 tracks a false negative where we fail to report
FILE * leaks within zlib/contrib/minizip/mztools.c.

The underlying issue is a combinatorial explosion of states within the
exploded graph.  In particular, the state of the "taint" checker is
exploding, leading to the analyzer bailing out.

I have a patch kit under construction that fixes the state explosion
issue enough for the "file" checker to report the leaks, but doing so
requires disabling the "taint" checker.  Given that the latter is more
of a proof-of-concept, this patch disables it by default, to stop it
breaking the other checkers.

gcc/analyzer/ChangeLog:
PR analyzer/93032
* sm.cc (make_checkers): Require the "taint" checker to be
explicitly enabled.

gcc/ChangeLog:
PR analyzer/93032
* doc/invoke.texi (-Wnanalyzer-tainted-array-index): Note that
-fanalyzer-checker=taint is also required.
(-fanalyzer-checker=): Note that providing this option enables the
given checker, and doing so may be required for checkers that are
disabled by default.

gcc/testsuite/ChangeLog:
PR analyzer/93032
* gcc.dg/analyzer/pr93382.c: Add "-fanalyzer-checker=taint".
* gcc.dg/analyzer/taint-1.c: Likewise.

4 years agoanalyzer: fix ICE with OFFSET_TYPE [PR 93899]
David Malcolm [Mon, 24 Feb 2020 17:12:28 +0000 (12:12 -0500)]
analyzer: fix ICE with OFFSET_TYPE [PR 93899]

PR analyzer/93899 reports an ICE within make_region_for_type when
handling a param of type OFFSET_TYPE within
exploded_graph::add_function_entry.

This patch fixes the ICE by further generalizing the "give up on this
tree code" logic from
  r10-6667-gf76a88ebf089871dcce215aa0cb1956ccc060895
     for PR analyzer/93388 and
  r10-6695-g2e6233935c77b56a68e939c629702f960b8e6fb2
     for PR analyzer/93778
by replacing the gcc_unreachable in make_region_for_type with a return
of NULL, and handling this in add_region_for_type by notifying the ctxt.

Doing so means that numerous places that create regions now need to have
a context passed to them, so most of the patch is churn involved in
passing a context around to where it's needed.

gcc/analyzer/ChangeLog:
PR analyzer/93899
* engine.cc
(impl_region_model_context::impl_region_model_context): Add logger
param.
* engine.cc (exploded_graph::add_function_entry): Create an
impl_region_model_context and pass it to the push_frame call.
Bail if the resulting state is invalid.
(exploded_graph::build_initial_worklist): Likewise.
(exploded_graph::build_initial_worklist): Handle the case where
add_function_entry fails.
* exploded-graph.h
(impl_region_model_context::impl_region_model_context): Add logger
param.
* region-model.cc (map_region::get_or_create): Add ctxt param and
pass it to add_region_for_type.
(map_region::can_merge_p): Pass NULL as a ctxt to call to
get_or_create.
(array_region::get_element): Pass ctxt to call to get_or_create.
(array_region::get_or_create): Add ctxt param and pass it to
add_region_for_type.
(root_region::push_frame): Pass ctxt to get_or_create calls.
(region_model::get_lvalue_1): Likewise.
(region_model::make_region_for_unexpected_tree_code): Assert that
ctxt is non-NULL.
(region_model::get_rvalue_1): Pass ctxt to get_svalue_for_fndecl
and get_svalue_for_label calls.
(region_model::get_svalue_for_fndecl): Add ctxt param and pass it
to get_region_for_fndecl.
(region_model::get_region_for_fndecl): Add ctxt param and pass it
to get_or_create.
(region_model::get_svalue_for_label): Add ctxt param and pass it
to get_region_for_label.
(region_model::get_region_for_label): Add ctxt param and pass it
to get_region_for_fndecl and get_or_create.
(region_model::get_field_region): Add ctxt param and pass it to
get_or_create_view and get_or_create.
(make_region_for_type): Replace gcc_unreachable with return NULL.
(region_model::add_region_for_type): Add ctxt param.  Handle a
return of NULL from make_region_for_type by calling
make_region_for_unexpected_tree_code.
(region_model::get_or_create_mem_ref): Pass ctxt to calls to
get_or_create_view.
(region_model::get_or_create_view): Add ctxt param and pass it to
add_region_for_type.
(selftest::test_state_merging): Pass ctxt to get_or_create_view.
* region-model.h (region_model::get_or_create): Add ctxt param.
(region_model::add_region_for_type): Likewise.
(region_model::get_svalue_for_fndecl): Likewise.
(region_model::get_svalue_for_label): Likewise.
(region_model::get_region_for_fndecl): Likewise.
(region_model::get_region_for_label): Likewise.
(region_model::get_field_region): Likewise.
(region_model::get_or_create_view): Likewise.

gcc/testsuite/ChangeLog:
PR analyzer/93899
* g++.dg/analyzer/pr93899.C: New test.

4 years agointernal/poll: add hurd build tag
Ian Lance Taylor [Mon, 24 Feb 2020 17:27:03 +0000 (09:27 -0800)]
internal/poll: add hurd build tag

Patch from Svante Signell.

Fixes GCC PR go/93900

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/220592

4 years agoRemove a hunk duplicated during a merge.
Martin Sebor [Mon, 24 Feb 2020 17:18:11 +0000 (10:18 -0700)]
Remove a hunk duplicated during a merge.

gcc/cp/ChangeLog:
* parser.c (cp_parser_check_class_key): Remove a duplicate hunk
of code.

4 years agoPR c++/93804 - exempt extern C headers from -Wredundant-tags
Martin Sebor [Mon, 24 Feb 2020 17:14:16 +0000 (10:14 -0700)]
PR c++/93804 - exempt extern C headers from -Wredundant-tags

gcc/cp/ChangeLog:

PR c++/93804
* parser.c (cp_parser_check_class_key): Avoid issuing -Wredundant-tags
in shared C/C++ code in headers.

gcc/testsuite/ChangeLog:

PR c++/93804
* g++.dg/warn/Wredundant-tags-4.C: New test.
* g++.dg/warn/Wredundant-tags-5.C: New test.
* g++.dg/warn/Wredundant-tags-5.h: New test.

4 years agoanalyzer: eliminate irrelevant control-flow edges from paths
David Malcolm [Sat, 22 Feb 2020 00:25:40 +0000 (19:25 -0500)]
analyzer: eliminate irrelevant control-flow edges from paths

Paths emitted by the analyzer can be quite verbose at the default of
-fanalyzer-verbosity=2.

Consider the double-free in this example:

  #include <stdlib.h>

  int foo ();
  int bar ();

  void test (int a, int b, int c)
  {
    void *p = malloc (1024);
    while (a)
      foo ();
    if (b)
      foo ();
    else
      bar ();
    if (c)
      free (p);
    free (p);
  }

Previously, the analyzer would emit a checker_path containing all
control-flow information on the exploded_path leading to the
double-free:

  test.c: In function 'test':
  test.c:17:3: warning: double-'free' of 'p' [CWE-415] [-Wanalyzer-double-free]
     17 |   free (p);
        |   ^~~~~~~~
    'test': events 1-9
      |
      |    8 |   void *p = malloc (1024);
      |      |             ^~~~~~~~~~~~~
      |      |             |
      |      |             (1) allocated here
      |    9 |   while (a)
      |      |         ~
      |      |         |
      |      |         (2) following 'false' branch (when 'a == 0')...
      |   10 |     foo ();
      |   11 |   if (b)
      |      |      ~
      |      |      |
      |      |      (3) ...to here
      |      |      (4) following 'false' branch (when 'b == 0')...
      |......
      |   14 |     bar ();
      |      |     ~~~~~~
      |      |     |
      |      |     (5) ...to here
      |   15 |   if (c)
      |      |      ~
      |      |      |
      |      |      (6) following 'true' branch (when 'c != 0')...
      |   16 |     free (p);
      |      |     ~~~~~~~~
      |      |     |
      |      |     (7) ...to here
      |      |     (8) first 'free' here
      |   17 |   free (p);
      |      |   ~~~~~~~~
      |      |   |
      |      |   (9) second 'free' here; first 'free' was at (8)
      |

despite the fact that only the "if (c)" is relevant to triggering the
double-free.

This patch implements pruning of control flow events at
-fanalyzer-verbosity=2, based on reachability information within the
exploded_graph.
The diagnostic_manager pre-computes reachability information about
which exploded_nodes can reach the exploded_node of the diagnostic,
and uses this to prune irrelvent control flow edges.

The patch also adds a -fanalyzer-verbosity=3 to preserve these edges,
so that the "show me everything" debugging level becomes
-fanalyzer-verbosity=4.

With these changes, the "while (a)" and "if (b)" edges are pruned from
the above example, leading to:

  test.c: In function 'test':
  test.c:17:3: warning: double-'free' of 'p' [CWE-415] [-Wanalyzer-double-free]
     17 |   free (p);
        |   ^~~~~~~~
    'test': events 1-5
      |
      |    8 |   void *p = malloc (1024);
      |      |             ^~~~~~~~~~~~~
      |      |             |
      |      |             (1) allocated here
      |......
      |   15 |   if (c)
      |      |      ~
      |      |      |
      |      |      (2) following 'true' branch (when 'c != 0')...
      |   16 |     free (p);
      |      |     ~~~~~~~~
      |      |     |
      |      |     (3) ...to here
      |      |     (4) first 'free' here
      |   17 |   free (p);
      |      |   ~~~~~~~~
      |      |   |
      |      |   (5) second 'free' here; first 'free' was at (4)
      |

The above example is gcc.dg/analyzer/edges-2.c.

gcc/analyzer/ChangeLog:
* checker-path.cc (superedge_event::should_filter_p): Update
filter for empty descriptions to cover verbosity level 3 as well
as 2.
* diagnostic-manager.cc: Include "analyzer/reachability.h".
(class path_builder): New class.
(diagnostic_manager::emit_saved_diagnostic): Create a path_builder
and pass it to build_emission_path, rather passing eg; similarly
for add_events_for_eedge and ext_state.
(diagnostic_manager::build_emission_path): Replace "eg" param
with a path_builder, pass it to add_events_for_eedge.
(diagnostic_manager::add_events_for_eedge): Replace ext_state
param with path_builder; pass it to add_events_for_superedge.
(diagnostic_manager::significant_edge_p): New.
(diagnostic_manager::add_events_for_superedge): Add path_builder
param.  Reject insignificant edges at verbosity levels below 3.
(diagnostic_manager::prune_for_sm_diagnostic): Update highest
verbosity level to 4.
* diagnostic-manager.h (class path_builder): New forward decl.
(diagnostic_manager::build_emission_path): Replace "eg" param
with a path_builder.
(diagnostic_manager::add_events_for_eedge): Replace ext_state
param with path_builder.
(diagnostic_manager::significant_edge_p): New.
(diagnostic_manager::add_events_for_superedge): Add path_builder
param.
* reachability.h: New file.

gcc/ChangeLog:
* doc/invoke.texi (-fanalyzer-verbosity=): "2" only shows
significant control flow events; add a "3" which shows all
control flow events; the old "3" becomes "4".

gcc/testsuite/ChangeLog:
* gcc.dg/analyzer/analyzer-verbosity-2a.c: New test.
* gcc.dg/analyzer/analyzer-verbosity-3.c: New test, based on
analyzer-verbosity-2.c
* gcc.dg/analyzer/analyzer-verbosity-3a.c: New test.
* gcc.dg/analyzer/edges-1.c: New test.
* gcc.dg/analyzer/edges-2.c: New test.
* gcc.dg/analyzer/file-paths-1.c: Add -fanalyzer-verbosity=3.

4 years agoc++: Fix ICE with -Wmismatched-tags [PR93869]
Marek Polacek [Fri, 21 Feb 2020 17:58:04 +0000 (12:58 -0500)]
c++: Fix ICE with -Wmismatched-tags [PR93869]

This is a crash in cp_parser_check_class_key:
  tree type_decl = TYPE_MAIN_DECL (type);
  tree name = DECL_NAME (type_decl); // HERE
because TYPE_MAIN_DECL of type was null as it's not a class type.
Instead of checking CLASS_TYPE_P we should simply check class_key
a bit earlier (in this case it was typename_type).

2020-02-24  Marek Polacek  <polacek@redhat.com>

PR c++/93869 - ICE with -Wmismatched-tags.
* parser.c (cp_parser_check_class_key): Check class_key earlier.

* g++.dg/warn/Wmismatched-tags-2.C: New test.

4 years agoortran: ICE using SHAPE with FINDLOC PR93835
Mark Eggleston [Mon, 24 Feb 2020 15:40:03 +0000 (15:40 +0000)]
ortran: ICE using SHAPE with FINDLOC PR93835

The expression representing the array returned by SHAPE does not
have its shape defined. An ICE occurs when FINDLOC attempts to
use the shape of the array.  Add shape to expression before returning
from SHAPE.

Whitespace issues identified by Steven G. Kargl  <kargl@gcc.gnu.org>
have also been fixed.

gcc/fortran/ChangeLog

PR fortran/93835
* simplify.c (simplify_findloc_nodim) : Fix whitespace issues.
(gfc_simplify_shape) : Create and initialise one shape value
for the result expression. Set shape value with the rank of
the source array.

gcc/testsuite/ChangeLog

PR fortran/93835
* gfortran.dg/pr77351.f90 : Check for one error instead of two.
* gfortran.dg/pr93835.f08 : New test.

4 years agoc++: Fix ICE with ill-formed array list-initialization [PR93712]
Marek Polacek [Thu, 13 Feb 2020 19:05:51 +0000 (14:05 -0500)]
c++: Fix ICE with ill-formed array list-initialization [PR93712]

My P0388R4 patch changed build_array_conv to create an identity
conversion at the start of the conversion chain and now we crash
in convert_like_real:

 7457     case ck_identity:
 7458       if (BRACE_ENCLOSED_INITIALIZER_P (expr))
 7459         {
 7460           int nelts = CONSTRUCTOR_NELTS (expr);
 7461           if (nelts == 0)
 7462             expr = build_value_init (totype, complain);
 7463           else if (nelts == 1)
 7464             expr = CONSTRUCTOR_ELT (expr, 0)->value;
 7465           else
 7466             gcc_unreachable ();  // HERE
 7467         }

in a test like this

  int f (int const (&)[2])
  { return f({1, "M"}); }

Instead of creating a ck_identity at the start of the conversion chain,
so that conv_get_original_expr can be used with a ck_aggr, let's set
u.expr for a ck_aggr, and adjust next_conversion not to try to see
what's next in the chain if it gets a ck_aggr.

2020-02-24  Marek Polacek  <polacek@redhat.com>

PR c++/93712 - ICE with ill-formed array list-initialization.
* call.c (next_conversion): Return NULL for ck_aggr.
(build_aggr_conv): Set u.expr instead of u.next.
(build_array_conv): Likewise.
(build_complex_conv): Likewise.
(conv_get_original_expr): Handle ck_aggr.

* g++.dg/cpp0x/initlist-array11.C: New test.

4 years agolibstdc++: Add missing bits of P0896R4 pertaining to [back|front]_insert_iterator
Patrick Palka [Mon, 24 Feb 2020 12:59:08 +0000 (07:59 -0500)]
libstdc++: Add missing bits of P0896R4 pertaining to [back|front]_insert_iterator

This adds some missing pieces of the Ranges TS that make back_insert_iterator and
front_insert_iterator conform to the new output_iterator requirements.

It also fixes a bug in ranges::__copy_or_move and
ranges::__copy_or_move_backward in which we were inspecting the iter_value_t of
the output iterator, but output iterators such as back_insert_iterator and
front_insert_iterator whose value_type = void do not have an iter_value_t
according to [readable.traits] p4.  The entire __use_memmove condition should
probably be rewritten, but the simplest fix for now is to inspect the
iterator_traits of the output iterator instead.

libstdc++-v3/ChangeLog:

PR libstdc++/93884
* include/bits/ranges_algobase.h (__copy_or_move,
__copy_or_move_backward): Don't inspect the iter_value_t of the output
iterator, instead inspect its iterator_traits directly.
* include/bits/stl_iterator.h (back_insert_iterator::container):
Conditionally initialize.
(back_insert_iterator::difference_type): Conditionally define.
(back_insert_iterator::back_insert_iterator): Conditionally define this
default constructor.
(front_insert_iterator::container): Conditionally initialize.
(front_insert_iterator::difference_type): Conditionally define.
(front_insert_iterator::front_insert_iterator): Conditionally define
this default constructor.
* 24_iterators/back_insert_iterator/pr93884.cc: New test.
* 24_iterators/front_insert_iterator/pr93884.cc: New test.

4 years agolibstdc++: P0769R2 Add shift to <algorithm>
Patrick Palka [Fri, 21 Feb 2020 18:55:01 +0000 (13:55 -0500)]
libstdc++: P0769R2 Add shift to <algorithm>

This patch adds std::shift_left and std::shift_right as per P0769R2.  Alhough
these are STL-style algos, this patch places them in <bits/ranges_algo.h>
because they make use of some functions in the ranges namespace that are more
easily reachable from <bits/ranges_algo.h> than from <bits/stl_algo.h>, namely
ranges::next.  In order to place these algos in <bits/stl_algo.h>, we would need
to include <bits/range_access.h> from <bits/stl_algo.h> which would undesirably
increase the size of <bits/stl_algo.h>.

libstdc++-v3/ChangeLog:

P0769R2 Add shift to <algorithm>
* include/bits/ranges_algo.h (shift_left, shift_right): New.
* testsuite/25_algorithms/shift_left/1.cc: New test.
* testsuite/25_algorithms/shift_right/1.cc: New test.

4 years agointernal/syscall/unix: add hurd build tag
Ian Lance Taylor [Mon, 24 Feb 2020 14:38:11 +0000 (06:38 -0800)]
internal/syscall/unix: add hurd build tag

Patch from Svante Signell.

Fixes GCC PR go/93900

Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/220589

4 years agofortran: ICE in gfc_conv_constant_to_tree PR93604
Mark Eggleston [Mon, 24 Feb 2020 14:33:35 +0000 (14:33 +0000)]
fortran: ICE in gfc_conv_constant_to_tree PR93604

Using a BOZ constant in a structure constructor in a data statement
resulted in an ICE. Output a "BOZ literal constant cannot appear in
a structure constructor" error message instead.

Original patch provided by Steven G. Kargl  <kargl@gcc.gnu.org>.

Test case added later.

gcc/fortran/ChangeLog

PR fortran/93604
* decl.c (gfc_match_data) : Check whether the data expression
is a derived type and is a constructor. If a BOZ constant
is encountered in the constructor output an error and return
MATCH_ERROR.

gcc/testsuite/ChangeLog

PR fortran/93604
* gfortran.dg/pr93604.f90 : New test.

4 years agoc++: P1937R2 - Fixing inconsistencies between const{expr,eval} functions
Jakub Jelinek [Mon, 24 Feb 2020 14:23:23 +0000 (15:23 +0100)]
c++: P1937R2 - Fixing inconsistencies between const{expr,eval} functions

The following patch implements my understanding of P1937R2, though I wonder
if https://eel.is/c++draft/expr.const#14.example-1 shouldn't have been
also either removed or adjusted by the P1937R2 paper.

2020-02-24  Jakub Jelinek  <jakub@redhat.com>

P1937R2 - Fixing inconsistencies between const{expr,eval} functions
* call.c (build_over_call): Don't evaluate immediate functions in
unevaluated operands.

* g++.dg/ext/consteval1.C: Change dg-{message,error} into dg-bogus.
* g++.dg/cpp2a/consteval6.C: Likewise.
* g++.dg/cpp2a/consteval3.C: Change dg-error for unevaluated operands
into dg-bogus.

4 years agolibstdc++: Fix noexcept-specifier for istream_iterator
Jonathan Wakely [Mon, 24 Feb 2020 14:22:21 +0000 (14:22 +0000)]
libstdc++: Fix noexcept-specifier for istream_iterator

Somehow I missed that the _M_value member can throw on construction.

* include/bits/stream_iterator.h (istream_iterator(default_sentinel_t)):
Make noexcept-specifier conditional.
* testsuite/24_iterators/istream_iterator/cons/sentinel.cc: Check
noexcept-specifier.

4 years agoc++: Fix C++20 variadic lambda init-capture grammar.
Jason Merrill [Mon, 24 Feb 2020 01:52:41 +0000 (20:52 -0500)]
c++: Fix C++20 variadic lambda init-capture grammar.

The grammar for variadic init-capture was fixed at the Prague C++ meeting
where we finalized C++20.

gcc/cp/ChangeLog
2020-02-24  Jason Merrill  <jason@redhat.com>

P0780R2: Resolve lambda init-capture pack grammar.
* parser.c (cp_parser_lambda_introducer): Expect &...x=y rather than
...&x=y.

4 years agolibstdc++: Add default_sentinel support to stream iterators
Jonathan Wakely [Mon, 24 Feb 2020 13:11:31 +0000 (13:11 +0000)]
libstdc++: Add default_sentinel support to stream iterators

Missing pieces of P0896R4 "The One Ranges Proposal" for C++20.

* include/bits/stream_iterator.h (istream_iterator(default_sentinel_t)):
Add constructor.
(operator==(istream_iterator, default_sentinel_t)): Add operator.
(ostream_iterator::difference_type): Define to ptrdiff_t for C++20.
* include/bits/streambuf_iterator.h
(istreambuf_iterator(default_sentinel_t)): Add constructor.
(operator==(istreambuf_iterator, default_sentinel_t)): Add operator.
* testsuite/24_iterators/istream_iterator/cons/sentinel.cc:
New test.
* testsuite/24_iterators/istream_iterator/sentinel.cc: New test.
* testsuite/24_iterators/istreambuf_iterator/cons/sentinel.cc:
New test.
* testsuite/24_iterators/istreambuf_iterator/sentinel.cc: New test.

4 years agoPR78353: Fix testcases
Christophe Lyon [Mon, 24 Feb 2020 13:01:52 +0000 (13:01 +0000)]
PR78353: Fix testcases

Skip the test if arm7a is not supported at link time. This is the case
if the toolchain targets an M-profile CPU by default and does not have
A-profile multilib: the link step fails because it tries to mix
M-profile startup files with A-profile testcase.

2020-02-24  Christophe Lyon  <christophe.lyon@linaro.org>

PR lto/78353
* gcc.target/arm/pr78353-1.c: Add arm_arch_v7a_multilib effective
target.
* gcc.target/arm/pr78353-2.c: Likewise.

4 years agolibstdc++: enable_view has false positives (LWG 3326)
Jonathan Wakely [Mon, 24 Feb 2020 11:45:20 +0000 (11:45 +0000)]
libstdc++: enable_view has false positives (LWG 3326)

* include/std/ranges (__deep_const_range, __enable_view_impl): Remove.
(ranges::enable_view): Simplify (LWG 3326).
* include/bits/range_access.h (ranges::enable_view): Declare.
* include/bits/regex.h (__enable_view_impl): Remove partial
specialization.
* include/bits/stl_multiset.h (__enable_view_impl): Likewise.
* include/bits/stl_set.h (__enable_view_impl): Likewise.
* include/bits/unordered_set.h (__enable_view_impl): Likewise.
* include/debug/multiset.h (__enable_view_impl): Likewise.
* include/debug/set.h (__enable_view_impl): Likewise.
* include/debug/unordered_set (__enable_view_impl): Likewise.
* include/experimental/string_view (ranges::enable_view): Define
partial specialization.
* include/std/span (ranges::enable_view): Likewise.
* include/std/string_view (ranges::enable_view): Likewise.
* testsuite/std/ranges/view.cc: Check satisfaction of updated concept.

4 years agosccvn: Handle bitfields in push_partial_def [PR93582]
Jakub Jelinek [Mon, 24 Feb 2020 11:56:39 +0000 (12:56 +0100)]
sccvn: Handle bitfields in push_partial_def [PR93582]

The following patch adds support for bitfields to push_partial_def.
Previously pd.offset and pd.size were counted in bytes and maxsizei
in bits, now everything is counted in bits.

Not really sure how much of the further code can be outlined and moved, e.g.
the full def and partial def code doesn't have pretty much anything in
common (the partial defs case basically have some load bit range and a set
of store bit ranges that at least partially overlap and we need to handle
all the different cases, like negative pd.offset or non-negative, little vs.
bit endian, size so small that we need to preserve original bits on both
sides of the byte, size that fits or is too large.
Perhaps the storing of some value into a middle of existing buffer (i.e.
what push_partial_def now does in the loop) could, but the candidate for
sharing would be most likely store-merging rather than the other spots in
sccvn, and I think it is better not to touch store-merging at this stage.

Yes, I've thought about trying to do everything in place, but the code is
quite hard to understand and get right already now and if we tried to do the
optimize on the fly, it would need more special cases and would for gcov
coverage need more testcases to cover it.  Most of the time the sizes will
be small.  Furthermore, for bitfields native_encode_expr stores actually
number of bytes in the mode and not say actual bitsize rounded up to bytes,
so it wouldn't be just a matter of saving/restoring bytes at the start and
end, but we might need even 7 further bytes e.g. for __int128 bitfields.
Perhaps we could have just a fast path for the case where everything is byte
aligned and (for integral types the mode bitsize is equal to the size too)?

2020-02-24  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/93582
* tree-ssa-sccvn.c (vn_walk_cb_data::push_partial_def): Consider
pd.offset and pd.size to be counted in bits rather than bytes, add
support for maxsizei that is not a multiple of BITS_PER_UNIT and
handle bitfield stores and loads.
(vn_reference_lookup_3): Don't call ranges_known_overlap_p with
uncomparable quantities - bytes vs. bits.  Allow push_partial_def
on offsets/sizes that aren't multiple of BITS_PER_UNIT and adjust
pd.offset/pd.size to be counted in bits rather than bytes.
Formatting fix.  Rename shadowed len variable to buflen.

* gcc.dg/tree-ssa/pr93582-4.c: New test.
* gcc.dg/tree-ssa/pr93582-5.c: New test.
* gcc.dg/tree-ssa/pr93582-6.c: New test.
* gcc.dg/tree-ssa/pr93582-7.c: New test.
* gcc.dg/tree-ssa/pr93582-8.c: New test.

4 years agoOpenACC tile clause – apply exit/cycle checks (PR 93552)
Tobias Burnus [Mon, 24 Feb 2020 11:18:04 +0000 (12:18 +0100)]
OpenACC tile clause â€“ apply exit/cycle checks (PR 93552)

        PR fortran/93552
        * match.c (match_exit_cycle): With OpenACC, check the kernels loop
        directive and tile clause as well.

        PR fortran/93552
        * gfortran.dg/goacc/tile-4.f90: New.

4 years agoPR47785: Add support for handling Xassembler/Wa options with LTO.
Prathamesh Kulkarni [Mon, 24 Feb 2020 06:25:45 +0000 (11:55 +0530)]
PR47785: Add support for handling Xassembler/Wa options with LTO.

2020-02-24  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
    Kugan Vivekandarajah  <kugan.vivekanandarajah@linaro.org>

PR driver/47785
* gcc.c (putenv_COLLECT_AS_OPTIONS): New function.
(driver::main): Call putenv_COLLECT_AS_OPTIONS.
* opts-common.c (parse_options_from_collect_gcc_options): New function.
(prepend_xassembler_to_collect_as_options): Likewise.
* opts.h (parse_options_from_collect_gcc_options): Declare prototype.
(prepend_xassembler_to_collect_as_options): Likewise.
* lto-opts.c (lto_write_options): Stream assembler options
in COLLECT_AS_OPTIONS.
* lto-wrapper.c (xassembler_options_error): New static variable.
(get_options_from_collect_gcc_options): Move parsing options code to
parse_options_from_collect_gcc_options and call it.
(merge_and_complain): Validate -Xassembler options.
(append_compiler_options): Handle OPT_Xassembler.
(run_gcc): Append command line -Xassembler options to
collect_gcc_options.
* doc/invoke.texi: Add documentation about using Xassembler
options with LTO.

testsuite/
* gcc.target/arm/pr78353-1.c: New test.
* gcc.target/arm/pr78353-2.c: Likewise.

4 years agoRISC-V: Adjust floating point code gen for LTGT compare
Kito Cheng [Mon, 24 Feb 2020 16:54:21 +0000 (10:54 -0600)]
RISC-V: Adjust floating point code gen for LTGT compare

 - Using gcc.dg/torture/pr91323.c as testcase, so no new testcase
   introduced.

 - We use 3 eq compare for LTGT compare before, in order to prevent exception
   flags setting when any input is NaN.

 - According latest GCC document LTGT and discussion on pr91323
   LTGT should signals on NaNs, like GE/GT/LE/LT.

 - So we expand (LTGT a b) to ((LT a b) | (GT a b)) for fit the document.

 - Tested rv64gc/rv32gc bare-metal/linux on qemu and
   rv64gc on HiFive unleashed board with linux.

ChangeLog

gcc/

Kito Cheng  <kito.cheng@sifive.com>

* config/riscv/riscv.c (riscv_emit_float_compare): Change the code gen
for LTGT.
(riscv_rtx_costs): Update cost model for LTGT.

4 years agoDaily bump.
GCC Administrator [Mon, 24 Feb 2020 00:16:40 +0000 (00:16 +0000)]
Daily bump.

4 years agoChanging cost propagation and ordering colorable bucket heuristics for PR93564.
Vladimir N. Makarov [Sun, 23 Feb 2020 21:20:05 +0000 (16:20 -0500)]
Changing cost propagation and ordering colorable bucket heuristics for PR93564.

2020-02-23  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/93564
* ira-color.c (struct update_cost_queue_elem): New member start.
(queue_update_cost, get_next_update_cost): Add new arg start.
(allocnos_conflict_p): New function.
(update_costs_from_allocno): Add new arg conflict_cost_update_p.
Add checking conflicts with allocnos_conflict_p.
(update_costs_from_prefs, restore_costs_from_copies): Adjust
update_costs_from_allocno calls.
(update_conflict_hard_regno_costs): Add checking conflicts with
allocnos_conflict_p.  Adjust calls of queue_update_cost and
get_next_update_cost.
(assign_hard_reg): Adjust calls of queue_update_cost.  Add
debugging print.
(bucket_allocno_compare_func): Restore previous version.

4 years agoAdd missing closing parenthises in error message.
Thomas König [Sun, 23 Feb 2020 16:22:26 +0000 (17:22 +0100)]
Add missing closing parenthises in error message.

2020-02-23  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/93889
* interface.c (compare_parameter): Fix error message.

4 years agoFix error message.
Thomas König [Sun, 23 Feb 2020 16:04:06 +0000 (17:04 +0100)]
Fix error message.

2020-02-23  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/93890
* interface.c: Replace "can not" by "cannot" and remove trailing
space.

2020-02-23  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/93890
* gfortran.dg/argument_checking_24.f90: Correct test case.

4 years agoPatch for PR57710
Paul Thomas [Sun, 23 Feb 2020 10:27:37 +0000 (10:27 +0000)]
Patch for PR57710

4 years agoDaily bump.
GCC Administrator [Sun, 23 Feb 2020 00:16:44 +0000 (00:16 +0000)]
Daily bump.

4 years agolibatomic: Fix last change [PR55930]
Jakub Jelinek [Sat, 22 Feb 2020 18:55:09 +0000 (19:55 +0100)]
libatomic: Fix last change [PR55930]

2020-02-22  Jakub Jelinek  <jakub@redhat.com>

PR other/55930
* Makefile.am (M_DEPS): Guard the empty definition with
@AMDEP_FALSE@ rather than @AMDEP_TRUE@.
* Makefile.in: Regenerated.

4 years agoc++: Use %qs in diagnostic message [PR93882]
Marek Polacek [Sat, 22 Feb 2020 16:53:45 +0000 (11:53 -0500)]
c++: Use %qs in diagnostic message [PR93882]

A tweak for translators, as requested in the PR.

2020-02-22  Marek Polacek  <polacek@redhat.com>

PR c++/93882
* decl.c (grokdeclarator): Use %qs in a diagnostic message.

4 years agoHonor --disable-dependency-tracking in libatomic
Richarde Purdie [Sat, 22 Feb 2020 15:13:13 +0000 (10:13 -0500)]
Honor --disable-dependency-tracking in libatomic

PR other/55930
* Makefile.am (M_DEPS): Honor -disable-dependency-tracking.
* Makefile.in: Regenerated.

4 years agoDaily bump.
GCC Administrator [Sat, 22 Feb 2020 00:16:30 +0000 (00:16 +0000)]
Daily bump.

4 years agoFix handling of floating-point homogeneous aggregates.
John David Anglin [Fri, 21 Feb 2020 23:30:24 +0000 (23:30 +0000)]
Fix handling of floating-point homogeneous aggregates.

2020-02-21  John David Anglin  <danglin@gcc.gnu.org>

* gcc/config/pa/pa.c (pa_function_value): Fix check for word and
double-word size when handling aggregate return values.
* gcc/config/pa/som.h (ASM_DECLARE_FUNCTION_NAME): Fix to indicate
that homogeneous SFmode and DFmode aggregates are passed and returned
in general registers.

4 years agoi18n: Fix translation of --help [PR93759]
Jakub Jelinek [Fri, 21 Feb 2020 21:01:03 +0000 (22:01 +0100)]
i18n: Fix translation of --help [PR93759]

The first two hunks make sure we actually translate what has been marked
for translation, i.e. the cl_options[...].help strings, rather than those
strings ammended in various ways, like:
_("%s  Same as %s."), help, ...
or
"%s  %s", help, _(use_diagnosed_msg)

The exgettext changes attempt to make sure that the cl_options[...].help
strings are marked as no-c-format, because otherwise if they happen
to contain a % character, such as the 90% substring, they will be marked
as c-format, which they aren't.

2020-02-21  Jakub Jelinek  <jakub@redhat.com>

PR translation/93759
* opts.c (print_filtered_help): Translate help before appending
messages to it rather than after that.

* exgettext: For *.opt help texts, use __opt_help_text("...")
rather than _("...") in the $emsg file and pass options that
say that this implies no-c-format.

4 years agolra: Stop registers being incorrectly marked live v2 [PR92989]
Richard Sandiford [Wed, 19 Feb 2020 12:59:17 +0000 (12:59 +0000)]
lra: Stop registers being incorrectly marked live v2 [PR92989]

This PR is about a case in which the clobbers at the start of
an EH receiver can lead to registers becoming unnecessarily
live in predecessor blocks.  My first attempt at fixing this
made sure that we update the bb liveness info based on the
real live set:

  http://gcc.gnu.org/g:e648e57efca6ce6d751ef8c2038608817b514fb4

But it turns out that the clobbered registers were also added to
the "gen" set of LRA's private liveness problem, where "gen" in
this context means "generates a requirement for a live value".
So the clobbered registers could still end up live via that
mechanism instead.

This patch therefore reverts the patch above and takes the other
approach floated in the original patch description: model the full
clobber by making the registers live and then dead again.

There's no specific need to revert the original patch, since the
code should no longer be sensitive to the order of the bb liveness
update and the modelling of the clobber.  But given that there's
no specific need to keep the original patch either, it seemed better
to restore the code to the more well-tested order.

Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?

Richard

2020-02-19  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
PR rtl-optimization/PR92989
* lra-lives.c (process_bb_lives): Restore the original order
of the bb liveness update.  Call make_hard_regno_dead for each
register clobbered at the start of an EH receiver.

4 years agoDo not propagate self-dependent value (PR ipa/93763) (ChangeLog)
Jeff Law [Fri, 21 Feb 2020 20:24:27 +0000 (13:24 -0700)]
Do not propagate self-dependent value (PR ipa/93763) (ChangeLog)

            PR ipa/93763
            * ipa-cp.c (self_recursively_generated_p): Mark self-dependent value as
            self-recursively generated.

4 years agoDo not propagate self-dependent value (PR ipa/93763)
Feng Xue [Mon, 17 Feb 2020 09:07:04 +0000 (17:07 +0800)]
Do not propagate self-dependent value (PR ipa/93763)

        PR ipa/93763
        * ipa-cp.c (self_recursively_generated_p): Mark self-dependent value as
        self-recursively generated.

4 years agoDarwin: Fix wrong quoting on an error string (PR93860).
Iain Sandoe [Fri, 21 Feb 2020 20:12:39 +0000 (20:12 +0000)]
Darwin: Fix wrong quoting on an error string (PR93860).

The quotes should surround all of the literal content from the pragma
that has incorrect usage.

2020-02-21  Iain Sandoe  <iain@sandoe.co.uk>

PR target/93860
* config/darwin-c.c (pop_field_alignment): Adjust quoting of
error string.

4 years agoPR c++/93753 - ICE on a flexible array followed by a member in an anonymous struct...
Martin Sebor [Fri, 21 Feb 2020 17:45:56 +0000 (10:45 -0700)]
PR c++/93753 - ICE on a flexible array followed by a member in an anonymous struct with an initializer

gcc/cp/ChangeLog:

PR gcov-profile/93753
* class.c (check_flexarrays): Tighten up a test for potential members
of anonymous structs or unions.

gcc/testsuite/ChangeLog:

PR gcov-profile/93753
* g++.dg/ext/flexary36.C: New test.
* g++.dg/lto/pr93166_0.C: Make struct with flexarray valid.

4 years agolibstdc++: Define <=> for tuple, optional and variant
Jonathan Wakely [Fri, 21 Feb 2020 12:02:15 +0000 (12:02 +0000)]
libstdc++: Define <=> for tuple, optional and variant

Another piece of P1614R2.

* include/std/optional (operator<=>(optional<T>, optional<U>))
(operator<=>(optional<T>, nullopt), operator<=>(optional<T>, U)):
Define for C++20.
* include/std/tuple (__tuple_cmp): New helper function for <=>.
(operator<=>(tuple<T...>, tuple<U>...)): Define for C++20.
* include/std/variant (operator<=>(variant<T...>, variant<T...>))
(operator<=>(monostate, monostate)): Define for C++20.
* testsuite/20_util/optional/relops/three_way.cc: New test.
* testsuite/20_util/tuple/comparison_operators/three_way.cc: New test.
* testsuite/20_util/variant/89851.cc: Move to ...
* testsuite/20_util/variant/relops/89851.cc: ... here.
* testsuite/20_util/variant/90008.cc: Move to ...
* testsuite/20_util/variant/relops/90008.cc: ... here.
* testsuite/20_util/variant/relops/three_way.cc: New test.

4 years ago[PATCH, GCC/ARM] Add MVE target check to sourcebuild.texi
Mihail Ionescu [Fri, 21 Feb 2020 15:26:06 +0000 (15:26 +0000)]
[PATCH, GCC/ARM] Add MVE target check to sourcebuild.texi

Follow up to: https://gcc.gnu.org/ml/gcc-patches/2020-02/msg01109.html

Committed as obvious.

gcc/ChangeLog:

2020-02-21  Mihail Ionescu  <mihail.ionescu@arm.com>

* doc/sourcebuild.texi (arm_v8_1m_mve_ok):
Document new target supports option.

4 years agoarm: ACLE I8MM multiply-accumulate
Dennis Zhang [Fri, 21 Feb 2020 15:36:13 +0000 (15:36 +0000)]
arm: ACLE I8MM multiply-accumulate

This patch adds intrinsics for matrix multiply-accumulate instructions
including vmmlaq_s32, vmmlaq_u32, and vusmmlaq_s32.

gcc/ChangeLog:

2020-02-21  Dennis Zhang  <dennis.zhang@arm.com>

* config/arm/arm_neon.h (vmmlaq_s32, vmmlaq_u32, vusmmlaq_s32): New.
* config/arm/arm_neon_builtins.def (smmla, ummla, usmmla): New.
* config/arm/iterators.md (MATMUL): New iterator.
(sup): Add UNSPEC_MATMUL_S, UNSPEC_MATMUL_U, and UNSPEC_MATMUL_US.
(mmla_sfx): New attribute.
* config/arm/neon.md (neon_<sup>mmlav16qi): New.
* config/arm/unspecs.md (UNSPEC_MATMUL_S, UNSPEC_MATMUL_U): New.
(UNSPEC_MATMUL_US): New.

gcc/testsuite/ChangeLog:

2020-02-21  Dennis Zhang  <dennis.zhang@arm.com>

* gcc.target/arm/simd/vmmla_1.c: New test.

4 years agotestsuite: Add -fcommon to gcc.target/i386/pr69052.c
Uros Bizjak [Fri, 21 Feb 2020 15:23:30 +0000 (16:23 +0100)]
testsuite: Add -fcommon to gcc.target/i386/pr69052.c

This testcase is susceptible to memory location details and start to fail
with default to -fno-common.  Use -fcommon to set expected testing conditions.

* gcc.target/i386/pr69052.c: Require target ia32.
(dg-options): Add -fcommon and remove -pie.

4 years ago[PATCH, GCC/ARM] Fix MVE scalar shift tests
Mihail Ionescu [Fri, 21 Feb 2020 15:21:23 +0000 (15:21 +0000)]
[PATCH, GCC/ARM] Fix MVE scalar shift tests

*** gcc/ChangeLog ***

2020-02-21  Mihail-Calin Ionescu  <mihail.ionescu@arm.com>

* config/arm/arm.md: Prevent scalar shifts from being
used when big endian is enabled.

*** gcc/testsuite/ChangeLog ***

2020-02-21  Mihail-Calin Ionescu  <mihail.ionescu@arm.com>

* gcc.target/arm/armv8_1m-shift-imm-1.c: Add MVE target checks.
* gcc.target/arm/armv8_1m-shift-reg-1.c: Likewise.
* lib/target-supports.exp
(check_effective_target_arm_v8_1m_mve_ok_nocache): New.
(check_effective_target_arm_v8_1m_mve_ok): New.
(add_options_for_v8_1m_mve): New.

4 years agotestsuite: Require vect_mutiple_sizes for scan-tree-dump in vect-epilogues.c
Uros Bizjak [Fri, 21 Feb 2020 15:12:57 +0000 (16:12 +0100)]
testsuite: Require vect_mutiple_sizes for scan-tree-dump in vect-epilogues.c

Default testsuite flags do not enable V8QI (MMX) vector mode for
32bit x86 targets.  Require vect_multiple_sizes effective target in
scan-tree-dump to avoid "LOOP EPILOGUE VECTORIZED" failure.

* gcc.dg/vect/vect-epilogues.c (scan-tree-dump): Require
vect_mutiple_sizes effective target.

4 years agoAdapt libgomp acc_get_property.f90 test
Frederik Harwath [Fri, 21 Feb 2020 14:26:02 +0000 (15:26 +0100)]
Adapt libgomp acc_get_property.f90 test

The commit r10-6721-g8d1a1cb1b816381bf60cb1211c93b8eba1fe1472 has changed
the name of the type that is used for the return value of the Fortran
acc_get_property function without adapting the test acc_get_property.f90.

2020-02-21  Frederik Harwath  <frederik@codesourcery.com>

* testsuite/libgomp.oacc-fortran/acc_get_property.f90: Adapt to
changes from 2020-02-19, i.e. use integer(c_size_t) instead of
integer(acc_device_property) for the type of the return value of
acc_get_property.

4 years agotree-optimization: fix access path oracle on mismatched array refs [PR93586]
Jan Hubicka [Fri, 21 Feb 2020 14:36:00 +0000 (15:36 +0100)]
tree-optimization: fix access path oracle on mismatched array refs [PR93586]

nonoverlapping_array_refs_p is not supposed to give meaningful results when
bases of ref1 and ref2 are not same or completely disjoint and here it is
called on c[0][j_2][0] and c[0][1] so bases in sence of this functions are
"c[0][j_2]" and "c[0]" which do partially overlap.  nonoverlapping_array_refs
however walks pair of array references and in this case it misses to note the
fact that if it walked across first mismatched pair it is no longer safe to
compare rest.

The reason why it continues matching is because it hopes it will
eventually get pair of COMPONENT_REFs from types of same size and use
TBAA to conclude that their addresses must be either same or completely
disjoint.

This patch makes the loop to terminate early but popping all the
remaining pairs so walking can continue.  We could re-synchronize on
arrays of same size with TBAA but this is bit fishy (because we try to
support some sort of partial array overlaps) and hard to implement
(because of zero sized arrays and VLAs) so I think it is not worth the
effort.

In addition I notied that the function is not !flag_strict_aliasing safe
and added early exits on places we set seen_unmatched_ref_p since later
we do not check that in:

       /* If we skipped array refs on type of different sizes, we can
   no longer be sure that there are not partial overlaps.  */
       if (seen_unmatched_ref_p
    && !operand_equal_p (TYPE_SIZE (type1), TYPE_SIZE (type2), 0))
  {
    ++alias_stats
      .nonoverlapping_refs_since_match_p_may_alias;
}

   PR tree-optimization/93586
* tree-ssa-alias.c (nonoverlapping_array_refs_p): Finish array walk
after mismatched array refs; do not sure type size information to
recover from unmatched referneces with !flag_strict_aliasing_p.

* gcc.dg/torture/pr93586.c: New testcase.

4 years agoamdgcn: Use correct offset mode for gather/scatter
Andrew Stubbs [Thu, 20 Feb 2020 14:44:04 +0000 (14:44 +0000)]
amdgcn: Use correct offset mode for gather/scatter

The scatter/gather pattern names changed for GCC 10, but I hadn't noticed.
This switches the patterns to the new offset mode scheme.

2020-02-21  Andrew Stubbs  <ams@codesourcery.com>

gcc/
* config/gcn/gcn-valu.md (gather_load<mode>): Rename to ...
(gather_load<mode>v64si): ... this and set operand 2 to V64SI.
(scatter_store<mode>): Rename to ...
(scatter_store<mode>v64si): ... this and set operand 1 to V64SI.
(scatter<mode>_exec): Delete. Move contents ...
(mask_scatter_store<mode>): ... here, and rename that to ...
(mask_gather_load<mode>v64si): ... this. Set operand 2 to V64SI.
Remove mode conversion.
(mask_gather_load<mode>): Rename to ...
(mask_scatter_store<mode>v64si): ... this. Set operand 1 to V64SI.
Remove mode conversion.
* config/gcn/gcn.c (gcn_expand_scaled_offsets): Remove mode conversion.

4 years agosra: Only verify sizes of scalar accesses (PR 93845)
Martin Jambor [Fri, 21 Feb 2020 12:38:22 +0000 (13:38 +0100)]
sra: Only verify sizes of scalar accesses (PR 93845)

the testcase is another example - in addition to recent PR 93516 - where
the SRA access verifier is confused by the fact that get_ref_base_extent
can return different sizes for the same type, depending whether they are
COMPONENT_REF or not.  In the previous bug I decided to keep the
verifier check for aggregate type even though it is not really important
and instead avoid easily detectable type-within-the-same-type situation.
This testcase is however a result of a fairly random looking type cast
and so cannot be handled in the same way.

Because the check is not really important for aggregates, this patch
simply disables it for non-register types.

2020-02-21  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/93845
* tree-sra.c (verify_sra_access_forest): Only test access size of
scalar types.

testsuite/
* g++.dg/tree-ssa/pr93845.C: New test.

4 years agoamdgcn: Align VGPR pairs
Andrew Stubbs [Fri, 21 Feb 2020 11:07:55 +0000 (11:07 +0000)]
amdgcn: Align VGPR pairs

Aligning the registers is not needed by the architecture, but doing so
allows us to remove the requirement for bug-prone early-clobber
constraints from many split patterns (and avoid adding more in future).

2020-02-21  Andrew Stubbs  <ams@codesourcery.com>

gcc/
* config/gcn/gcn.c (gcn_hard_regno_mode_ok): Align VGPR pairs.
* config/gcn/gcn-valu.md (addv64di3): Remove early-clobber.
(addv64di3_exec): Likewise.
(subv64di3): Likewise.
(subv64di3_exec): Likewise.
(addv64di3_zext): Likewise.
(addv64di3_zext_exec): Likewise.
(addv64di3_zext_dup): Likewise.
(addv64di3_zext_dup_exec): Likewise.
(addv64di3_zext_dup2): Likewise.
(addv64di3_zext_dup2_exec): Likewise.
(addv64di3_sext_dup2): Likewise.
(addv64di3_sext_dup2_exec): Likewise.
(<expander>v64di3): Likewise.
(<expander>v64di3_exec): Likewise.
(*<reduc_op>_dpp_shr_v64di): Likewise.
(*plus_carry_dpp_shr_v64di): Likewise.
* config/gcn/gcn.md (adddi3): Likewise.
(addptrdi3): Likewise.
(<expander>di3): Likewise.

4 years agoamdgcn: fix mode in vec_series
Andrew Stubbs [Wed, 5 Feb 2020 11:32:38 +0000 (11:32 +0000)]
amdgcn: fix mode in vec_series

2020-02-21  Andrew Stubbs  <ams@codesourcery.com>

gcc/
* config/gcn/gcn-valu.md (vec_seriesv64di): Use gen_vec_duplicatev64di.

4 years agoaarch64: Add SVE support for -mlow-precision-sqrt
Richard Sandiford [Wed, 19 Feb 2020 17:22:14 +0000 (17:22 +0000)]
aarch64: Add SVE support for -mlow-precision-sqrt

SVE was missing support for -mlow-precision-sqrt, which meant that
-march=armv8.2-a+sve -mlow-precision-sqrt could cause a performance
regression compared to -march=armv8.2-a -mlow-precision-sqrt.

2020-02-21  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64.c (aarch64_emit_approx_sqrt): Add SVE
support.  Use aarch64_emit_mult instead of emitting multiplication
instructions directly.
* config/aarch64/aarch64-sve.md (sqrt<mode>2, rsqrt<mode>2)
(@aarch64_rsqrte<mode>, @aarch64_rsqrts<mode>): New expanders.

gcc/testsuite/
* gcc.target/aarch64/sve/rsqrt_1.c: New test.
* gcc.target/aarch64/sve/rsqrt_1_run.c: Likewise.
* gcc.target/aarch64/sve/sqrt_1.c: Likewise.
* gcc.target/aarch64/sve/sqrt_1_run.c: Likewise.

4 years agoaarch64: Add SVE support for -mlow-precision-div
Richard Sandiford [Wed, 19 Feb 2020 18:28:48 +0000 (18:28 +0000)]
aarch64: Add SVE support for -mlow-precision-div

SVE was missing support for -mlow-precision-div, which meant that
-march=armv8.2-a+sve -mlow-precision-div could cause a performance
regression compared to -march=armv8.2-a -mlow-precision-div.

I ended up doing this much later than originally intended, sorry...

2020-02-21  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64.c (aarch64_emit_mult): New function.
(aarch64_emit_approx_div): Add SVE support.  Use aarch64_emit_mult
instead of emitting multiplication instructions directly.
* config/aarch64/iterators.md (SVE_COND_FP_BINARY_OPTAB): New iterator.
* config/aarch64/aarch64-sve.md (div<mode>3, @aarch64_frecpe<mode>)
(@aarch64_frecps<mode>): New expanders.

gcc/testsuite/
* gcc.target/aarch64/sve/recip_1.c: New test.
* gcc.target/aarch64/sve/recip_1_run.c: Likewise.
* gcc.target/aarch64/sve/recip_2.c: Likewise.
* gcc.target/aarch64/sve/recip_2_run.c: Likewise.

4 years agoaarch64: Bump AARCH64_APPROX_MODE to 64 bits
Richard Sandiford [Thu, 20 Feb 2020 13:57:44 +0000 (13:57 +0000)]
aarch64: Bump AARCH64_APPROX_MODE to 64 bits

We now have more than 32 scalar and vector float modes, so the
32-bit AARCH64_APPROX_MODE would invoke UB for some of them.
Bumping to a 64-bit mask fixes that... for now.

Ideally we'd have a static assert to trap this, but logically
it would go at file scope.  I think it would be better to wait
until the switch to C++11, so that we can use static_assert
directly.

2020-02-21  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64-protos.h (AARCH64_APPROX_MODE): Operate
on and produce uint64_ts rather than ints.
(AARCH64_APPROX_NONE, AARCH64_APPROX_ALL): Change to uint64_ts.
(cpu_approx_modes): Change the fields from unsigned int to uint64_t.

4 years agoaarch64: Avoid creating an unused register
Richard Sandiford [Thu, 20 Feb 2020 15:04:19 +0000 (15:04 +0000)]
aarch64: Avoid creating an unused register

The rsqrt path of aarch64_emit_approx_sqrt created a pseudo
register that it never used.

2020-02-21  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64.c (aarch64_emit_approx_sqrt): Don't create
an unused xmsk register when handling approximate rsqrt.

4 years agoaarch64: Fix inverted approx_sqrt condition
Richard Sandiford [Thu, 20 Feb 2020 14:16:12 +0000 (14:16 +0000)]
aarch64: Fix inverted approx_sqrt condition

The fix for PR80530 included an accidental flipping of the
flag_finite_math_only check, so that -ffinite-math-only (and thus
-ffast-math) disabled approximate sqrt rather than enabling it.

This is tested by later patches but seemed worth splitting out.

2020-02-21  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64.c (aarch64_emit_approx_sqrt): Fix inverted
flag_finite_math_only condition.

4 years agoMAINTAINERS: Change to my personal email address
Palmer Dabbelt [Wed, 30 Oct 2019 04:40:09 +0000 (21:40 -0700)]
MAINTAINERS: Change to my personal email address

I left SiFive a bit more than three months ago, and while I sent out a message
saying I was going to updated my email address I neclected to actually do so.
I'm moving to my personal email address to avoid the need to do this again.

gcc/ChangeLog

2020-02-20  Palmer Dabbelt  <palmer@sifive.com>

        * MAINTAINERS: Change palmer@sifive.com to palmer@dabbelt.com.

4 years agoAllow CONFIG_SHELL to override build-time shell in mkheaders
Alexandre Oliva [Fri, 21 Feb 2020 01:09:03 +0000 (22:09 -0300)]
Allow CONFIG_SHELL to override build-time shell in mkheaders

mkheaders.in uses substitutions of @SHELL@ to run fixinc.sh and
mkinstalldirs.  Problem is, SHELL comes from CONFIG_SHELL for the
build system, and it needs not match whatever is available at an
unrelated host system after installation, when mkheaders is supposed
to be run.

I considered ditching the hardcoding altogether, but decided to retain
it, but allowing CONFIG_SHELL and SHELL to override it, if any of them
can successfully run mkinstalldirs, and if those and the substituted
@SHELL@ fail, fallback to /bin/sh and to plain execution of the
script, which appears to enable at least one shell on a system that
doesn't typicall have a shell to recognize a script by #!/bin/sh and
reinvoke itself to run it.

If all of these fail, we fail, but only after telling the user to
retry after setting CONFIG_SHELL, that fixincl itself also uses.

for  fixincludes/ChangeLog

* mkheaders.in: Don't require build-time shell on host.

4 years agoDaily bump.
GCC Administrator [Fri, 21 Feb 2020 00:16:41 +0000 (00:16 +0000)]
Daily bump.

4 years agoPR c++/93801 - False -Wmismatched-tags upon redundant typename
Martin Sebor [Thu, 20 Feb 2020 21:31:38 +0000 (14:31 -0700)]
PR c++/93801 - False -Wmismatched-tags upon redundant typename

gcc/cp/ChangeLog:

PR c++/93801
* parser.c (cp_parser_check_class_key): Only handle true C++ class-keys.

gcc/testsuite/ChangeLog:

PR c++/93801
* g++.dg/warn/Wredundant-tags-3.C: New test.

4 years agotestsuite: Do not run g++.target/i386/pr93828.C on 32bit targets.
Uros Bizjak [Thu, 20 Feb 2020 21:17:44 +0000 (22:17 +0100)]
testsuite: Do not run g++.target/i386/pr93828.C on 32bit targets.

4 years agoi386: Fix *vec_extractv2sf_1 and *vec_extractv2sf_1 shufps alternative [PR93828]
Uros Bizjak [Thu, 20 Feb 2020 20:06:18 +0000 (21:06 +0100)]
i386: Fix *vec_extractv2sf_1 and *vec_extractv2sf_1 shufps alternative [PR93828]

shufps moves two of the four packed single-precision floating-point values
from *destination* operand (first operand) into the low quadword of the
destination operand.  Match source operand to the destination.

PR target/93828
* config/i386/mmx.md (*vec_extractv2sf_1): Match source operand
to destination operand for shufps alternative.
(*vec_extractv2si_1): Ditto.

testsuite/ChangeLog:

PR target/93828
* g++.target/i386/pr93828.C: New test.

4 years agoi386: Fix *vec_extractv2sf_1 and *vec_extractv2sf_1 shufps alternative [PR93828]
Uros Bizjak [Thu, 20 Feb 2020 20:04:44 +0000 (21:04 +0100)]
i386: Fix *vec_extractv2sf_1 and *vec_extractv2sf_1 shufps alternative [PR93828]

shufps moves two of the four packed single-precision floating-point values
from *destination* operand (first operand) into the low quadword of the
destination operand.  Match source operand to the destination.

PR target/93828
* config/i386/mmx.md (*vec_extractv2sf_1): Match source operand
to destination operand for shufps alternative.
(*vec_extractv2si_1): Ditto.

testsuite/ChangeLog:

PR target/93828
* g++.target/i386/pr93828.C: New test.

4 years agolibstdc++: Fix capturing of lvalue references in_RangeAdaptor::operator()
Patrick Palka [Wed, 19 Feb 2020 19:10:32 +0000 (14:10 -0500)]
libstdc++: Fix capturing of lvalue references in_RangeAdaptor::operator()

This fixes a dangling-reference issue with views::split and other multi-argument
adaptors that may take its extra arguments by reference.

When creating the _RangeAdaptorClosure in _RangeAdaptor::operator(), we
currently capture all provided arguments by value.  When we then use the
_RangeAdaptorClosure and call it with a range, as in e.g.

    v = views::split(p)(range),

we forward the range and the captures to the underlying adaptor routine.  But
then when the temporary _RangeAdaptorClosure goes out of scope, the by-value
captures get destroyed and the references to these captures in the resulting view
become dangling.

This patch fixes this problem by capturing lvalue references by reference in
_RangeAdaptorClosure::operator(), and then forwarding the captures appropriately
to the underlying adaptor routine.

libstdc++-v3/ChangeLog:

* include/std/ranges (views::__adaptor::__maybe_refwrap): New utility
function.
(views::__adaptor::_RangeAdaptor::operator()): Add comments.  Use
__maybe_refwrap to capture lvalue references by reference, and then use
unwrap_reference_t to forward the by-reference captures as references.
* testsuite/std/ranges/adaptors/split.cc: Augment test.
* testsuite/std/ranges/adaptors/split_neg.cc: New test.

4 years agolibstdc++: Forward second argument of views::iota using the correct type
Patrick Palka [Thu, 20 Feb 2020 04:14:02 +0000 (23:14 -0500)]
libstdc++: Forward second argument of views::iota using the correct type

We are forwarding the second argument of views::iota using the wrong type,
causing compile errors when calling views::iota with a value and bound of
different types, like in the test case below.

libstdc++-v3/ChangeLog:

* include/std/ranges (iota_view): Forward declare _Sentinel.
(iota_view::_Iterator): Befriend _Sentinel.
(iota_view::_Sentinel::_M_equal): New member function.
(iota_view::_Sentinel::operator==): Use it.
(views::_Iota::operator()): Forward __f using the correct type.
* testsuite/std/ranges/access/ssize.cc (test06): Don't call views::iota
with integers of different signedness, to appease iota_view's deduction
guide.
* testsuite/std/ranges/iota/iota_view.cc: Augment test.

4 years agors6000: Fix infinite loop building ghostscript and icu [PR93658]
Peter Bergner [Thu, 20 Feb 2020 17:25:12 +0000 (11:25 -0600)]
rs6000: Fix infinite loop building ghostscript and icu [PR93658]

Previous push didn't get the ChangeLog entries or the actual fix.
Push those now.

gcc/
PR target/93658
* config/rs6000/rs6000.c (rs6000_legitimate_address_p): Handle VSX
vector modes.

gcc/testsuite/
PR target/93658
* gcc.target/powerpc/pr93658.c: New test.

4 years agoOpenACC's tile clause fix for implicit typing (PR93825)
Tobias Burnus [Thu, 20 Feb 2020 17:11:32 +0000 (18:11 +0100)]
OpenACC's tile clause fix for implicit typing (PR93825)

2020-02-20  Tobias Burnus  <tobias@codesourcery.com>

PR fortran/93825
* openmp.c (resolve_oacc_loop_blocks): Move call to
resolve_oacc_nested_loops from here ...
(resolve_oacc_loop): ... to here.

PR fortran/93825
* gfortran.dg/goacc/tile-3.f90: New.

4 years agors6000: Fix infinite loop building ghostscript and icu [PR93658]
Peter Bergner [Thu, 20 Feb 2020 17:08:02 +0000 (11:08 -0600)]
rs6000: Fix infinite loop building ghostscript and icu [PR93658]

Fix rs6000_legitimate_address_p(), which erroneously marks a valid Altivec
address as being invalid, which causes LRA's process_address()  to go into
an infinite loop spilling the same address over and over again.

gcc/
PR target/93658
* config/rs6000/rs6000.c (rs6000_legitimate_address_p): Handle VSX
vector modes.

gcc/testsuite/
PR target/93658
* gcc.target/powerpc/pr93658.c: New test.

4 years agolibstdc++: Issues with range access CPOs (P2091R0)
Jonathan Wakely [Thu, 20 Feb 2020 13:20:44 +0000 (13:20 +0000)]
libstdc++: Issues with range access CPOs (P2091R0)

This changes how arrays of unknown bound and/or incomplete element type
are handled.

* include/bits/range_access.h (ranges::begin): Reject array of
incomplete type.
(ranges::end, ranges::size): Require arrays to be bounded.
(ranges::data): Require lvalue or borrowed_range.
(ranges::iterator_t): Remove constraint.
* testsuite/std/ranges/access/begin.cc: Do not check array of
incomplete type.
* testsuite/std/ranges/access/begin_neg.cc: New test.
* testsuite/std/ranges/access/end_neg.cc: Adjust expected error.
* testsuite/std/ranges/access/size_neg.cc: Adjust expected error.
* testsuite/std/ranges/access/ssize.cc: Do not check array of
incomplete type.

4 years agolibstdc++: Define operator<=> for <system_error> types
Jonathan Wakely [Fri, 7 Feb 2020 20:50:00 +0000 (20:50 +0000)]
libstdc++: Define operator<=> for <system_error> types

Another piece of P1614R2 for C++20.

This also adds tests for operator< in C++11, which was present but
untested.

* include/std/system_error (error_category::operator<=>)
(operator<=>(const error_code&, const error_code&))
(operator<=>(const error_condition&, const error_condition&)): Define
for C++20.
* testsuite/19_diagnostics/error_category/operators/less.cc: New test.
* testsuite/19_diagnostics/error_category/operators/three_way.cc: New
test.
* testsuite/19_diagnostics/error_code/operators/equal.cc: Remove
incorrect comment.
* testsuite/19_diagnostics/error_code/operators/less.cc: New test.
* testsuite/19_diagnostics/error_code/operators/not_equal.cc: Remove
incorrect comment.
* testsuite/19_diagnostics/error_code/operators/three_way.cc: New test.
* testsuite/19_diagnostics/error_condition/operators/equal.cc: Remove
incorrect comment.
* testsuite/19_diagnostics/error_condition/operators/less.cc: New test.
* testsuite/19_diagnostics/error_condition/operators/not_equal.cc:
Remove incorrect comment.
* testsuite/19_diagnostics/error_condition/operators/three_way.cc: New
test.

4 years agolibstdc++: Remove std::type_info::operator!= for C++20
Jonathan Wakely [Fri, 7 Feb 2020 20:50:00 +0000 (20:50 +0000)]
libstdc++: Remove std::type_info::operator!= for C++20

This function can be synthesized by the compiler now.

* libsupc++/typeinfo (type_info::operator!=): Remove for C++20.

4 years agolibstdc++: Add <=> to thread::id
Jonathan Wakely [Fri, 7 Feb 2020 20:28:06 +0000 (20:28 +0000)]
libstdc++: Add <=> to thread::id

* include/std/thread (thread::id::operator<=>): Define for C++20.
* testsuite/30_threads/thread/id/70294.cc: Do not take addresses of
functions in namespace std.
* testsuite/30_threads/thread/id/operators_c++20.cc: New test.