platform/upstream/gcc.git
2 years agoc++: wrong parse with functors [PR64679]
Marek Polacek [Fri, 29 Apr 2022 19:01:12 +0000 (15:01 -0400)]
c++: wrong parse with functors [PR64679]

Consider

  struct F {
    F(int) {}
    F operator()(int) const { return *this; }
  };

and

  F(i)(0)(0);

where we're supposed to first call the constructor and then invoke
the operator() twice.  However, we parse this as an init-declarator:
"(i)" looks like a perfectly valid declarator, then we see an '(' and
think it must be an initializer, so we commit and we're toast.  My
fix is to look a little bit farther before deciding we've seen an
initializer.

This is only a half of c++/64679, the other part of the PR is unrelated:
there the problem is that we are calling pushdecl while parsing
tentatively (in cp_parser_parameter_declaration_list), which is bad.

PR c++/64679

gcc/cp/ChangeLog:

* parser.cc (cp_parser_init_declarator): Properly handle a series of
operator() calls, they are not part of an init-declarator.

gcc/testsuite/ChangeLog:

* g++.dg/parse/functor1.C: New test.

2 years agoc++: optimize reshape_init
Jason Merrill [Mon, 21 Mar 2022 13:58:28 +0000 (09:58 -0400)]
c++: optimize reshape_init

If the index of a constructor_elt is a FIELD_DECL, the CONSTRUCTOR is
already reshaped, so we can save time and memory by returning immediately.

gcc/cp/ChangeLog:

* decl.cc (reshape_init): Shortcut already-reshaped init.
 (reshape_init_class): Assert not getting one here.

2 years agoc++: use %D more
Jason Merrill [Fri, 18 Jun 2021 09:45:02 +0000 (05:45 -0400)]
c++: use %D more

There's no reason to call cxx_printable_name_translate here instead of using
%D in the format string.

gcc/cp/ChangeLog:

* error.cc (cp_print_error_function): Use %qD.
(function_category): Use %qD.

2 years agolibgomp/plugin/plugin-gcn.c: Use -foffload-options= in err msg
Tobias Burnus [Wed, 4 May 2022 16:39:28 +0000 (18:39 +0200)]
libgomp/plugin/plugin-gcn.c: Use -foffload-options= in err msg

While -foffload=-<flag> works (never documented legacy feature),
the documented way is to use -foffload-options=.

libgomp/ChangeLog:

* plugin/plugin-gcn.c (isa_matches_agent): Suggest -foffload-options.

2 years agoUpdate cpplib es.po
Joseph Myers [Wed, 4 May 2022 16:33:35 +0000 (16:33 +0000)]
Update cpplib es.po

* es.po: Update.

2 years agoOpenMP: Fix use_device_{addr,ptr} with in-data-sharing arg
Tobias Burnus [Wed, 4 May 2022 16:18:44 +0000 (18:18 +0200)]
OpenMP: Fix use_device_{addr,ptr} with in-data-sharing arg

For array-descriptor vars, the descriptor is assigned to a temporary. However,
this failed when the clause's argument was in turn in a data-sharing clause
as the outer context's VALUE_EXPR wasn't used.

gcc/ChangeLog:

* omp-low.cc (lower_omp_target): Fix use_device_{addr,ptr} with list
item that is in an outer data-sharing clause.

libgomp/ChangeLog:

* testsuite/libgomp.fortran/use_device_addr-5.f90: New test.

2 years agoc++: parse error with >= in template argument list [PR105436]
Marek Polacek [Fri, 29 Apr 2022 21:03:41 +0000 (17:03 -0400)]
c++: parse error with >= in template argument list [PR105436]

This patch fixes an oversight whereby we treated >= as the end of
a template argument.  This causes problems in C++14, because in
cp_parser_template_argument we go different ways for C++14 and C++17:

  /* It must be a non-type argument.  In C++17 any constant-expression is
     allowed.  */
  if (cxx_dialect > cxx14)
    goto general_expr;

so in this testcase in C++14 we get "N" as the template argument but in
C++17 it is the whole "N >= 5" expression.  So in C++14 the remaining
">= 5" triggered the newly-added diagnostic.

PR c++/105436

gcc/cp/ChangeLog:

* parser.cc (cp_parser_next_token_ends_template_argument_p): Don't
return true for CPP_GREATER_EQ.

gcc/testsuite/ChangeLog:

* g++.dg/parse/template31.C: New test.

2 years agolibstdc++: Add always_inline to the simplest std::array accessors [PR104719]
Jonathan Wakely [Wed, 27 Apr 2022 15:09:06 +0000 (16:09 +0100)]
libstdc++: Add always_inline to the simplest std::array accessors [PR104719]

libstdc++-v3/ChangeLog:

PR libstdc++/104719
* include/std/array (array::size(), array::max_size())
(array::empty(), array::data()): Add  always_inline attribute.

2 years agolibstdc++: Simplify std::array accessors [PR104719]
Jonathan Wakely [Fri, 25 Mar 2022 10:28:28 +0000 (10:28 +0000)]
libstdc++: Simplify std::array accessors [PR104719]

This removes the __array_traits::_S_ref and __array_traits::_S_ptr
accessors, which only exist to make the special case of std::array<T, 0>
syntactically well-formed.

By changing the empty type used as the std::array<T, 0>::_M_elems data
member to support operator[] and conversion to a pointer, we can write
code using the natural syntax. The indirection through _S_ref and
_S_ptr is removed for the common case, and a function call is only used
for the special case of zero-size arrays.

The invalid member access for zero-sized arrays is changed to use
__builtin_trap() instead of a null dereference. This guarantees a
runtime error if it ever gets called, instead of undefined behaviour
that is likely to get optimized out as unreachable.

libstdc++-v3/ChangeLog:

PR libstdc++/104719
* include/std/array (__array_traits::_S_ref): Remove.
(__array_traits::_S_ptr): Remove.
(__array_traits<T, 0>::_Type): Define operator[] and operator T*
to provide an array-like API.
(array::_AT_Type): Remove public typeef.
(array::operator[], array::at, array::front, array::back): Use
index operator to access _M_elems instead of _S_ref.
(array::data): Use implicit conversion from _M_elems to pointer.
(swap(array&, array&)): Use __enable_if_t helper.
(get<I>): Use index operator to access _M_elems.
* testsuite/23_containers/array/tuple_interface/get_neg.cc:
Adjust dg-error line numbers.

2 years agoc++: Remove cdtor_label
Jason Merrill [Fri, 25 Feb 2022 14:58:47 +0000 (09:58 -0500)]
c++: Remove cdtor_label

Jakub pointed out that cdtor_label is unnecessary, we should get all the
desired semantics with a normal return.

gcc/cp/ChangeLog:

* cp-tree.h (struct language_function): Remove x_cdtor_label.
(cdtor_label, LABEL_DECL_CDTOR): Remove.
* constexpr.cc (returns): Don't check LABEL_DECL_CDTOR.
(cxx_eval_constant_expression): Don't call returns.
* decl.cc (check_goto): Don't check cdtor_label.
(start_preparsed_function): And don't set it.
(finish_constructor_body, finish_destructor_body): Remove.
(finish_function_body): Don't call them.
* typeck.cc (check_return_expr): Handle cdtor_returns_this here.
* semantics.cc (finish_return_stmt): Not here.

2 years agotree-optimization/104658 - avoid mixing mask & non-mask vector defs
Richard Biener [Tue, 22 Feb 2022 15:02:27 +0000 (16:02 +0100)]
tree-optimization/104658 - avoid mixing mask & non-mask vector defs

When pattern recognition fails to sanitize all defs of a mask
producing operation and the respective def is external or constant
we end up trying to produce a VECTOR_BOOLEAN_TYPE_P constructor
which in turn ends up exposing stmts like

  <signed-boolean:1> _135 = _49 ? -1 : 0;

which isn't handled well in followup SLP and generates awful code.

We do rely heavily on pattern recognition to sanitize mask vs.
data uses of bools but that fails here which means we also should
fail vectorization.  That avoids ICEing because of such stmts
and it also avoids generating weird code which makes the
vectorization not profitable.

The following patch simply disallows external VECTOR_BOOLEAN_TYPE_P
defs and arranges the promote to external code to instead promote
mask uses to extern (that's just a short-cut here).

I've also looked at aarch64 and with SVE and a fixed vector length
for the gcc.target/i386/pr101636.c testcase.  I see similar vectorization
(using <signed-boolean:4>) there but it's hard to decide whether the
old, the new or no vectorization is better for this.  The code
generated with traditional integer masks isn't as awkward but we
still get the != 0 promotion done for each scalar element which
doesn't look like intended - this operation should be visible upfront.

That also means some cases will now become a missed optimization
that needs to be fixed by bool pattern recognition.  But that can
possibly be delayed to GCC 13.

2022-02-22  Richard Biener  <rguenther@suse.de>

PR tree-optimization/104658
* tree-vect-slp.cc (vect_slp_convert_to_external): Do not
create VECTOR_BOOLEAN_TYPE_P extern defs.  Reset the vector
type on nodes we promote.
(vectorizable_bb_reduc_epilogue): Deal with externalized
root.
* tree-vect-stmts.cc (vect_maybe_update_slp_op_vectype): Do
not allow VECTOR_BOOLEAN_TYPE_P extern defs.

* gcc.target/i386/pr104658.c: New testcase.

2 years agotree-optimization/103116 - SLP permutes and peeling for gaps
Richard Biener [Wed, 4 May 2022 08:43:07 +0000 (10:43 +0200)]
tree-optimization/103116 - SLP permutes and peeling for gaps

The testcase shows that we can end up with a contiguous access across
loop iterations but by means of permutations the elements accessed
might only cover parts of a vector.  In this case we end up with
GROUP_GAP == 0 but still need to avoid accessing excess elements
in the last loop iterations.  Peeling for gaps is designed to cover
this but a single scalar iteration might not cover all of the excess
elements.  The following ensures peeling for gaps is done in this
situation and when that isn't sufficient because we need to peel
more than one iteration (gcc.dg/vect/pr103116-2.c), fail the SLP
vectorization.

2022-05-04  Richard Biener  <rguenther@suse.de>

PR tree-optimization/103116
* tree-vect-stmts.cc (get_group_load_store_type): Handle the
case we need peeling for gaps even though GROUP_GAP is zero.

* gcc.dg/vect/pr103116-1.c: New testcase.
* gcc.dg/vect/pr103116-2.c: Likewise.

2 years agoRemove dead code.
Martin Liska [Wed, 4 May 2022 12:48:53 +0000 (14:48 +0200)]
Remove dead code.

gcc/ChangeLog:

* gengtype-state.cc (read_a_state_token): Remove dead code.
* ipa-profile.cc (ipa_profile_read_summary_section): Likewise.

2 years agoFold more vector constants early
Richard Biener [Fri, 25 Mar 2022 07:43:45 +0000 (08:43 +0100)]
Fold more vector constants early

In PR105049 we had

  return VIEW_CONVERT_EXPR<U>( VEC_PERM_EXPR < {<<< Unknown tree: compound_literal_expr
        V D.1984 = { 0 }; >>>, { 0 }} , {<<< Unknown tree: compound_literal_expr
        V D.1985 = { 0 }; >>>, { 0 }} , { 0, 0 } >  & {(short int) SAVE_EXPR <c>, (short int) SAVE_EXPR <c>});

where we gimplify the init CTORs to

  _1 = {{ 0 }, { 0 }};
  _2 = {{ 0 }, { 0 }};

instead of to vector constants.  The following makes sure to simplify the
CTORs to VECTOR_CSTs during gimplification by re-ordering the simplification
to after CTOR flag recomputation and gimplification of the elements.

2022-03-25  Richard Biener  <rguenther@suse.de>

* gimplify.cc (gimplify_init_constructor): First gimplify,
then simplify the result to a VECTOR_CST.

2 years agogenconditions: Add support for targets without non-trivial insn conditions
Jakub Jelinek [Wed, 4 May 2022 10:01:56 +0000 (12:01 +0200)]
genconditions: Add support for targets without non-trivial insn conditions

Somebody complained on IRC that when writing a new backend one can get
an error while compiling build/gencondmd.cc.
The problem is that when host compiler is g++ 3 or later (or when
bootstrapping), we compile it with g++ -std=c++11 -pedantic and
the generated insn_conditions array contains pairs
{ "cond", __builtin_constant_p (cond) ? (int) (cond) : -1 },
where cond is some non-trivial instruction condition.  Now if a target
uses "" for all the conditions (admittedly unlikely for non-trivial
target), the initializer for insn_conditions[] is {} and that is
pedantically rejected because C++ doesn't support zero-sized arrays.

The following patch fixes that by adding an artificial termination
element and skips that during the walk.

2022-05-04  Jakub Jelinek  <jakub@redhat.com>

* genconditions.cc (write_conditions): Append a { nullptr, -1 }
element at the end of insn_conditions.
(write_writer): Use ARRAY_SIZE (insn_conditions) - 1 instead of
ARRAY_SIZE (insn_conditions).

2 years agolibsanitizer: update test that mixes fake and real stack
Martin Liska [Mon, 2 May 2022 11:58:49 +0000 (13:58 +0200)]
libsanitizer: update test that mixes fake and real stack

gcc/testsuite/ChangeLog:

* c-c++-common/asan/alloca_loop_unpoisoning.c: Do not combine
fake and real stack.

2 years agolibsanitizer: Update Makefile.am files.
Martin Liska [Mon, 2 May 2022 11:20:06 +0000 (13:20 +0200)]
libsanitizer: Update Makefile.am files.

libsanitizer/ChangeLog:

* tsan/Makefile.am: Update Makefile.am files.
* hwasan/Makefile.am: Likewise.
* sanitizer_common/Makefile.am: Likewise.
* Makefile.in: Re-generate.
* asan/Makefile.in: Likewise.
* hwasan/Makefile.in: Likewise.
* interception/Makefile.in: Likewise.
* libbacktrace/Makefile.in: Likewise.
* lsan/Makefile.in: Likewise.
* sanitizer_common/Makefile.in: Likewise.
* tsan/Makefile.in: Likewise.
* ubsan/Makefile.in: Likewise.

2 years agolibsanitizer: Apply local patches
H.J. Lu [Tue, 20 Jul 2021 17:46:51 +0000 (10:46 -0700)]
libsanitizer: Apply local patches

2 years agolibsanitizer: merge from upstream (0a1bcab9f3bf75c4c5d3e53bafb3eeb80320af46).
Martin Liska [Tue, 3 May 2022 10:56:26 +0000 (12:56 +0200)]
libsanitizer: merge from upstream (0a1bcab9f3bf75c4c5d3e53bafb3eeb80320af46).

2 years agoarm: Restrict support of vectors of boolean immediates (PR target/104662)
Christophe Lyon [Tue, 19 Apr 2022 15:34:04 +0000 (17:34 +0200)]
arm: Restrict support of vectors of boolean immediates (PR target/104662)

This simple patch avoids the ICE described in the PR:
internal compiler error: in simd_valid_immediate, at config/arm/arm.cc:12866

with an early exit from simd_valid_immediate if we are trying to
handle a vector of booleans and MVE is not enabled.

We still get an ICE when compiling the existing
gcc.dg/rtl/arm/mve-vxbi.c without -march=armv8.1-m.main+mve:

error: unrecognizable insn:
(insn 7 5 8 2 (set (reg:V4BI 114)
        (const_vector:V4BI [
                (const_int 1 [0x1])
                (const_int 0 [0]) repeated x2
                (const_int 1 [0x1])
            ])) -1
     (nil))
during RTL pass: ira

but there's little we can do since the testcase explicitly creates
vectors of booleans which do need MVE.

That is the reason why I do not add a testcase.

2022-04-19  Christophe Lyon  <christophe.lyon@arm.com>

PR target/104662
* config/arm/arm.cc (simd_valid_immediate): Exit when input is a
vector of booleans and MVE is not enabled.

2 years agoc++: Don't emit deprecated warnings or unavailable errors on lambda declarations
Jakub Jelinek [Wed, 4 May 2022 08:07:36 +0000 (10:07 +0200)]
c++: Don't emit deprecated warnings or unavailable errors on lambda declarations

On the following testcase, we emit deprecated warnings or unavailable errors
even on merge declarations of those lambdas (the dg-bogus directives), while
IMHO we should emit them only when something actually calls those lambdas.

The following patch temporarily disables that diagnostics during
maybe_add_lambda_conv_op.

PR2173R1 also says that ambiguity between attribute-specifier-seq at the
end of requires-clause and attribute-specifier-seq from lambda-expression
should be resolved to attribute-specifier-seq for the latter.  Do we need
to do anything about that?  I mean, can a valid requires-clause end with
an attribute-specifier-seq?  Say operator int [[]] is valid primary
expression, but requires operator int [[]] isn't valid, nor is
requires operator int, no?

2022-05-04  Jakub Jelinek  <jakub@redhat.com>

* lambda.cc: Include decl.h.
(maybe_add_lambda_conv_op): Temporarily override deprecated_state to
UNAVAILABLE_DEPRECATED_SUPPRESS.

* g++.dg/cpp23/lambda-attr1.C: New test.
* g++.dg/cpp23/lambda-attr2.C: New test.

2 years agohwasan: support new dg-output format.
Martin Liska [Wed, 4 May 2022 07:57:17 +0000 (09:57 +0200)]
hwasan: support new dg-output format.

Supports change in libsanitizer where it newly reports:
READ of size 4 at 0xffffffffc3d4 tags: 02/01(00) (ptr/mem) in thread T0

So the 'tags' contains now 3 entries compared to 2 entries.

gcc/testsuite/ChangeLog:

* c-c++-common/hwasan/alloca-outside-caught.c: Update dg-output.
* c-c++-common/hwasan/heap-overflow.c: Likewise.
* c-c++-common/hwasan/hwasan-thread-access-parent.c: Likewise.
* c-c++-common/hwasan/large-aligned-1.c: Likewise.
* c-c++-common/hwasan/stack-tagging-basic-1.c: Likewise.

2 years agodebug/105158 - improve debug stmt retaining for forwarder removal
Richard Biener [Tue, 5 Apr 2022 13:23:54 +0000 (15:23 +0200)]
debug/105158 - improve debug stmt retaining for forwarder removal

Currently when we cannot move debug stmt from a forwarder to the
destination block we drop/reset them.  But in some cases as for
the testcase we can move them to the predecessor when that has
a single successor and we can insert after the last stmt of the
block.  That allows us to preserve debug info here.

2022-04-05  Richard Biener  <rguenther@suse.de>

PR debug/105158
* tree-cfgcleanup.cc (move_debug_stmts_from_forwarder):
Move debug stmts to the predecessor if moving to the
destination is not possible.
(remove_forwarder_block): Adjust.
(remove_forwarder_block_with_phi): Likewise.

2 years agoLTO plugin: modernize a bit.
Martin Liska [Wed, 5 Jan 2022 09:10:19 +0000 (10:10 +0100)]
LTO plugin: modernize a bit.

include/ChangeLog:

* plugin-api.h (enum ld_plugin_tag): Do not set implicit enum
values.

lto-plugin/ChangeLog:

* lto-plugin.c (struct plugin_objfile): Use bool for offset
field.
(exec_lto_wrapper): Assign true/false to bool variables.
(process_offload_section): Likewise.
(claim_file_handler): Likewise.
(onload): Likewise.

2 years agoDaily bump.
GCC Administrator [Wed, 4 May 2022 00:16:24 +0000 (00:16 +0000)]
Daily bump.

2 years agoUpdate gcc sv.po
Joseph Myers [Tue, 3 May 2022 22:16:26 +0000 (22:16 +0000)]
Update gcc sv.po

* sv.po: Update.

2 years agoc++: make finish_non_static_data_member SFINAE enabled [PR105351]
Patrick Palka [Tue, 3 May 2022 19:21:26 +0000 (15:21 -0400)]
c++: make finish_non_static_data_member SFINAE enabled [PR105351]

Here since finish_non_static_data_member isn't SFINAE enabled, we
incorrectly emit an error when considering the first overload rather
than silently discarding it:

sfinae33.C: In substitution of ‘template<class T> A<T::value> f() [with T = B]’:
sfinae33.C:11:7:   required from here
sfinae33.C:5:31: error: invalid use of non-static data member ‘B::value’
    5 | template<class T> A<T::value> f();
      |                               ^

This patch makes the function SFINAE enabled in the usual way: give it a
complain parameter, check it before emitting an error, and pass it through
appropriately.

PR c++/105351

gcc/cp/ChangeLog:

* cp-tree.h (finish_non_static_data_member): Add defaulted
complain parameter.
* pt.cc (tsubst_copy_and_build): Pass complain to
finish_non_static_data_member.
* semantics.cc (finish_non_static_data_member): Respect complain
parameter.
(finish_qualified_id_expr): Pass complain to
finish_non_static_data_member.

gcc/testsuite/ChangeLog:

* g++.dg/template/sfinae33.C: New test.

2 years agotestsuite: libgcc function name for PRU
Dimitar Dimitrov [Sat, 2 Apr 2022 09:13:16 +0000 (12:13 +0300)]
testsuite: libgcc function name for PRU

Update the match rules to accommodate the non-standard libgcc function
names for PRU backend.

gcc/testsuite/ChangeLog:

* gcc.c-torture/compile/attr-complex-method-2.c: Accept both __divdc3
and __gnu_divdc3 as valid libgcc function names.
* gcc.dg/complex-6.c: Ditto for __mulsc3.
* gcc.dg/complex-7.c: Ditto for __muldc3.

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
2 years agotestsuite: Skip cases for default_packed targets
Dimitar Dimitrov [Fri, 15 Apr 2022 19:58:50 +0000 (22:58 +0300)]
testsuite: Skip cases for default_packed targets

The memchr test cases expect padding to be present in structures.  But
this is not true for targets which pack by default.  Skip these test
cases in order to avoid static assert errors when checking field offsets.

gcc/testsuite/ChangeLog:

* gcc.dg/memchr.c: Skip for default_packed targets.
* gcc.dg/memcmp-3.c: Ditto.

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
2 years agotestsuite: Annotate Wattributes-8.c for default_packed
Dimitar Dimitrov [Sun, 3 Apr 2022 09:27:16 +0000 (12:27 +0300)]
testsuite: Annotate Wattributes-8.c for default_packed

Place markers in test case to handle targets which pack structures by
default. Validated on pru-none-elf.

gcc/testsuite/ChangeLog:

* gcc.dg/Wattributes-8.c: Add annotations for default_packed
targets.

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
2 years agotestsuite: Mark that PRU lowers DI alu ops by itself
Dimitar Dimitrov [Sun, 3 Apr 2022 10:24:52 +0000 (13:24 +0300)]
testsuite: Mark that PRU lowers DI alu ops by itself

PRU target defines DI patterns for logical ALU operations.

gcc/testsuite/ChangeLog:

* gcc.dg/lower-subreg-1.c: Skip for PRU.

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
2 years agotestsuite: Skip gcc.dg/Wno-frame-address.c for PRU
Dimitar Dimitrov [Sun, 3 Apr 2022 13:11:27 +0000 (16:11 +0300)]
testsuite: Skip gcc.dg/Wno-frame-address.c for PRU

Access to arbitrary stack frames is not supported on PRU.

gcc/testsuite/ChangeLog:

* gcc.dg/Wno-frame-address.c: Skip for PRU target.

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
2 years agoPR tree-optimization/102950: Improved EVRP for signed BIT_XOR_EXPR.
Roger Sayle [Tue, 3 May 2022 18:38:50 +0000 (14:38 -0400)]
PR tree-optimization/102950: Improved EVRP for signed BIT_XOR_EXPR.

This patch fixes PR tree-optimization/102950, which is a P2 regression,
by providing better range bounds for BIT_XOR_EXPR, BIT_AND_EXPR and
BIT_IOR_EXPR on signed integer types.  In general terms, any binary
bitwise operation on sign-extended or zero-extended integer types will
produce results that are themselves sign-extended or zero-extended.
More precisely, we can derive signed bounds from the number of leading
redundant sign bit copies, from the equation:
clrsb(X op Y) >= min (clrsb (X), clrsb(Y))
and from the property that for any (signed or unsigned) range [lb, ub]
that clrsb([lb, ub]) >= min (clrsb(lb), clrsb(ub)).

These can be used to show that [-1, 0] op [-1, 0] is [-1, 0] or that
[-128, 127] op [-128, 127] is [-128, 127], even when tracking nonzero
bits would result in VARYING (as every bit can be 0 or 1).  This is
equivalent to determining the minimum type precision in which the
operation can be performed then sign extending the result.

One additional refinement is to observe that X ^ Y can never be
zero if the ranges of X and Y don't overlap, i.e. X can't be equal
to Y.

Previously, the expression "(int)(char)a ^ 233" in the PR was considered
VARYING, but with the above changes now has the range [-256, -1][1, 255],
which is sufficient to optimize away the call to foo.

2022-05-03  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
PR tree-optimization/102950
* range-op.cc (wi_optimize_signed_bitwise_op): New function to
determine bounds of bitwise operations on signed types.
(operator_bitwise_and::wi_fold): Call the above function.
(operator_bitwise_or::wi_fold): Likewise.
(operator_bitwise_xor::wi_fold): Likewise.  Additionally, the
result can't be zero if the operands can't be equal.

gcc/testsuite/ChangeLog
PR tree-optimization/102950
* gcc.dg/pr102950.c: New test case.
* gcc.dg/tree-ssa/evrp10.c: New test case.

2 years agoObjective-C, NeXT: Adjust symbol marking to match host tools.
Iain Sandoe [Mon, 2 May 2022 18:42:49 +0000 (19:42 +0100)]
Objective-C, NeXT: Adjust symbol marking to match host tools.

Current host tools mark some additional symbols as 'no dead strip' and also
expose one additional group to the linker.  This does not affect older Darwin
versions or x86_64, but omitting these changes results in link errors for
aarch64.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
gcc/ChangeLog:

* config/darwin.cc (darwin_label_is_anonymous_local_objc_name): Make
protocol class methods linker-visible.

gcc/objc/ChangeLog:

* objc-next-runtime-abi-02.cc (next_runtime_abi_02_protocol_decl): Do
not dead-strip the runtime meta-data symbols.
(build_v2_classrefs_table): Likewise.
(build_v2_protocol_list_address_table): Likewise.

2 years ago[PR105324] libstdc++: testsuite: pr105324 requires FP from_char
Alexandre Oliva [Tue, 3 May 2022 17:57:15 +0000 (14:57 -0300)]
[PR105324] libstdc++: testsuite: pr105324 requires FP from_char

The floating-point overloads of from_char are only declared if
_GLIBCXX_HAVE_USELOCALE is #defined as nonzero.  That's exposed from
charconv as __cpp_lib_to_chars >= 201611L, so guard the test body with
that.

for  libstdc++-v3/ChangeLog

PR c++/105324
* testsuite/20_util/from_chars/pr105324.cc: Guard test body
with conditional for floating-point overloads of from_char.

2 years agoi386: Optimize _mm_storeu_si16 w/o SSE4 [PR105079]
Uros Bizjak [Tue, 3 May 2022 15:59:40 +0000 (17:59 +0200)]
i386: Optimize _mm_storeu_si16 w/o SSE4 [PR105079]

Optimize _mm_storeu_si16 to use MOVD from a SSE to an integer register
instead of PEXTRW from a low word of the SSE register to an integer reg.

Avoid the transformation when optimizing for size for targets without
TARGET_INTER_UNIT_MOVES_FROM_VEC capability, where the transformation
results in two moves via a memory location.

2022-05-03  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

PR target/105079
* config/i386/sse.md (*vec_extract<mode>_0_mem): New pre-reload
define_insn_and_split pattern.

gcc/testsuite/ChangeLog:

PR target/105079
* gcc.target/i386/pr105079.c: New test.
* gcc.target/i386/pr95483-1.c (dg-options): Use -msse4.1.

2 years agodfp.m4: Add missing license header
Christophe Lyon [Fri, 29 Apr 2022 13:11:11 +0000 (14:11 +0100)]
dfp.m4: Add missing license header

It seems the license header was omitted when dfp.m4 was originally
contributed in 2010 (commit 3c39bca6bbb5, r0-102573 or svn r163815.

This copies the license from libdecnumber/configure.ac since dfp.m4
was originally extracted from that file.

2022-04-29  Christophe Lyon  <christophe.lyon@arm.com>

config/
* dfp.m4: Add license header.

2 years agomiddle-end/105083 - check prerequesites in scev_initialize
Richard Biener [Tue, 3 May 2022 10:48:43 +0000 (12:48 +0200)]
middle-end/105083 - check prerequesites in scev_initialize

2022-05-03  Richard Biener  <rguenther@suse.de>

PR middle-end/105083
* tree-scalar-evolution.cc (scev_initialize): Verify we
have appropriate loop state.
* tree-ssa-dce.cc (perform_tree_ssa_dce): Re-order SCEV and
loop init and finalization.

2 years agomiddle-end/105461 - opts processing of -fvar-tracking
Richard Biener [Tue, 3 May 2022 08:36:30 +0000 (10:36 +0200)]
middle-end/105461 - opts processing of -fvar-tracking

The flag_var_tracking reset in finish_options doesn't match the
condition in process_options, in particular we fail to reset it
when the option was specified on the command line.  The following
fixes this and also alters the debug info level guard to match
the one in process_options.

2022-05-03  Richard Biener  <rguenther@suse.de>

PR middle-end/105461
* opts.cc (finish_options): Match the condition to
disable flag_var_tracking to that of process_options.

* gcc.dg/pr105461.c: New testcase.

2 years agoFixup OPTION_SET_P usage in finish_options
Richard Biener [Tue, 3 May 2022 08:23:51 +0000 (10:23 +0200)]
Fixup OPTION_SET_P usage in finish_options

When some code was moved from process_options to finish_options,
uses of OPTION_SET_P were not replaced with references to the
opts_set option set.  The following fixes this.

2022-05-03  Richard Biener  <rguenther@suse.de>

* opts.cc: #undef OPTIONS_SET_P.
(finish_options): Use opts_set instead of OPTIONS_SET_P.

2 years agotree-optimization/105394 - vector lowering of compares
Richard Biener [Fri, 29 Apr 2022 09:54:45 +0000 (11:54 +0200)]
tree-optimization/105394 - vector lowering of compares

The following fixes missing handling of non-integer mode but
masked (SVE or MVE) compares in vector lowering by using the
appropriate mask element width to extract the components and
adjust the index.

2022-04-29  Richard Biener  <rguenther@suse.de>

PR tree-optimization/105394
* tree-vect-generic.cc (expand_vector_condition): Adjust
comp_width for non-integer mode masks as well.

2 years agoOpenMP, libgomp: Add new runtime routine omp_get_mapped_ptr.
Marcel Vollweiler [Tue, 3 May 2022 06:56:44 +0000 (23:56 -0700)]
OpenMP, libgomp: Add new runtime routine omp_get_mapped_ptr.

This patch adds the OpenMP runtime routine "omp_get_mapped_ptr" which was
introduced in OpenMP 5.1.

gcc/ChangeLog:

* omp-low.cc (omp_runtime_api_call): Added get_mapped_ptr to
omp_runtime_apis array.

libgomp/ChangeLog:

* libgomp.map: Added omp_get_mapped_ptr.
* libgomp.texi: Tagged omp_get_mapped_ptr as supported.
* omp.h.in: Added omp_get_mapped_ptr.
* omp_lib.f90.in: Added interface for omp_get_mapped_ptr.
* omp_lib.h.in: Likewise.
* target.c (omp_get_mapped_ptr): Added implementation of
omp_get_mapped_ptr.
* testsuite/libgomp.c-c++-common/get-mapped-ptr-1.c: New test.
* testsuite/libgomp.c-c++-common/get-mapped-ptr-2.c: New test.
* testsuite/libgomp.c-c++-common/get-mapped-ptr-3.c: New test.
* testsuite/libgomp.c-c++-common/get-mapped-ptr-4.c: New test.
* testsuite/libgomp.fortran/get-mapped-ptr-1.f90: New test.
* testsuite/libgomp.fortran/get-mapped-ptr-2.f90: New test.
* testsuite/libgomp.fortran/get-mapped-ptr-3.f90: New test.
* testsuite/libgomp.fortran/get-mapped-ptr-4.f90: New test.

2 years agotestsuite: vect: update unaligned message
Alexandre Oliva [Wed, 27 Apr 2022 21:23:01 +0000 (18:23 -0300)]
testsuite: vect: update unaligned message

gcc.dg/vect/costmodel/ppc/costmodel-vect-31a.c covers ppc variants
that accept and reject misaligned accesses.  The message that it
expects for rejection was removed in the gcc-11 development cycle by
commit r11-1969.  The patch adjusted multiple tests to use the message
introduced in r11-1945, but missed this one.

for  gcc/testsuite/ChangeLog

* gcc.dg/vect/costmodel/ppc/costmodel-vect-31a.c: Update
the expected message for the case in which unaligned accesses
are not allowed.

2 years agoDaily bump.
GCC Administrator [Tue, 3 May 2022 00:16:25 +0000 (00:16 +0000)]
Daily bump.

2 years agoc++: improve template-id location
Jason Merrill [Sat, 30 Apr 2022 09:45:02 +0000 (05:45 -0400)]
c++: improve template-id location

On PR102629 I noticed that we were giving the entire lambda as the location
for this template-id.

gcc/cp/ChangeLog:

* pt.cc (tsubst_copy_and_build) [TEMPLATE_ID_EXPR]: Copy location.
(do_auto_deduction): Use expr location.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/lambda-pack-init7.C: Check column number.

2 years agoc++: also note name used in enclosing class
Jason Merrill [Thu, 31 Mar 2022 20:18:58 +0000 (16:18 -0400)]
c++: also note name used in enclosing class

While looking at PR96645 I noticed that while we were diagnosing names
changing meaning in the full class context, we weren't doing this for
lookups in nested class bodies.

Note that this breaks current range-v3; I've submitted a pull request to fix
its violation of the rule.

gcc/cp/ChangeLog:

* class.cc (maybe_note_name_used_in_class): Note in all enclosing
classes.  Remember location of use.
(note_name_declared_in_class): Adjust.

gcc/testsuite/ChangeLog:

* g++.dg/lookup/name-clash13.C: New test.
* g++.dg/lookup/name-clash14.C: New test.
* g++.dg/lookup/name-clash15.C: New test.
* g++.dg/lookup/name-clash16.C: New test.

2 years agox86: Add missing .note.GNU-stack to assembly source
H.J. Lu [Fri, 29 Apr 2022 17:26:24 +0000 (10:26 -0700)]
x86: Add missing .note.GNU-stack to assembly source

Add .note.GNU-stack assembly source to avoid linker warning:

ld: warning: /tmp/ccPZSZ7Z.o: missing .note.GNU-stack section implies executable stack
ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
FAIL: gcc.target/i386/iamcu/test_3_element_struct_and_unions.c compilation,  -O0

PR testsuite/105433
* gcc.target/i386/iamcu/asm-support.S: Add .note.GNU-stack.
* gcc.target/x86_64/abi/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx512f/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx512fp16/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx512fp16/m256h/asm-support.S: Likewise.
* gcc.target/x86_64/abi/avx512fp16/m512h/asm-support.S: Likewise.
* gcc.target/x86_64/abi/ms-sysv/do-test.S: Likewise.

2 years agoFortran: Add location info to OpenMP tree nodes
Sandra Loosemore [Fri, 25 Mar 2022 04:02:34 +0000 (21:02 -0700)]
Fortran: Add location info to OpenMP tree nodes

gcc/fortran/
* trans-openmp.cc (gfc_trans_omp_critical): Set location on OMP
tree node.
(gfc_trans_omp_do): Likewise.
(gfc_trans_omp_masked): Likewise.
(gfc_trans_omp_do_simd): Likewise.
(gfc_trans_omp_scope): Likewise.
(gfc_trans_omp_taskgroup): Likewise.
(gfc_trans_omp_taskwait): Likewise.
(gfc_trans_omp_distribute): Likewise.
(gfc_trans_omp_taskloop): Likewise.
(gfc_trans_omp_master_masked_taskloop): Likewise.

2 years agoc++: uses_template_parms cleanups
Marek Polacek [Wed, 27 Apr 2022 22:36:29 +0000 (18:36 -0400)]
c++: uses_template_parms cleanups

gcc/cp/ChangeLog:

* cp-tree.h (uses_template_parms): Adjust declaration.
* pt.cc (uses_template_parms): Return bool.  Use a RAII sentinel.

2 years agoAssume a call is expensive when it mismatches
Richard Biener [Wed, 13 Apr 2022 13:43:01 +0000 (15:43 +0200)]
Assume a call is expensive when it mismatches

This makes sure to not consider calls to builtin decls with
mismatching arguments as inexpensive.

2022-04-13  Richard Biener  <rguenther@suse.de>

* tree-scalar-evolution.cc (expression_expensive_p):
Never consider mismatched calls as cheap.

2 years agotree-optimization/104240 - SLP discovery with swapped comparisons
Richard Biener [Mon, 2 May 2022 10:01:51 +0000 (12:01 +0200)]
tree-optimization/104240 - SLP discovery with swapped comparisons

The following extends SLP discovery to handle swapped operands
in comparisons.

2022-05-02  Richard Biener  <rguenther@suse.de>

PR tree-optimization/104240
* tree-vect-slp.cc (op1_op0_map): New.
(vect_get_operand_map): Handle compares.
(vect_build_slp_tree_1): Support swapped operands for
tcc_comparison.

* gcc.dg/vect/bb-slp-pr104240.c: New testcase.

2 years agolibstdc++: Don't use std::tolower in <charconv> [PR103911]
Patrick Palka [Mon, 2 May 2022 11:01:33 +0000 (07:01 -0400)]
libstdc++: Don't use std::tolower in <charconv> [PR103911]

As with std::isdigit in r12-6281-gc83ecfbe74a5cf, we shouldn't be using
std::tolower in <charconv> either.

PR libstdc++/103911

libstdc++-v3/ChangeLog:

* src/c++17/floating_from_chars.cc (find_end_of_float): Accept
two delimeters for the exponent part in the form of a possibly
NULL string of length two.  Don't use std::tolower.
(pattern): Adjust calls to find_end_of_float accordingly.

2 years agolibstdc++: case-sensitivity in hexfloat std::from_chars [PR105441]
Patrick Palka [Mon, 2 May 2022 11:00:48 +0000 (07:00 -0400)]
libstdc++: case-sensitivity in hexfloat std::from_chars [PR105441]

The hexfloat parser for binary32/64 added in r12-6645-gcc3bf3404e4b1c
overlooked that the exponent part can also begin with an uppercase 'P'.

PR libstdc++/105441

libstdc++-v3/ChangeLog:

* src/c++17/floating_from_chars.cc (__floating_from_chars_hex):
Also accept 'P' as the start of the exponent.
* testsuite/20_util/from_chars/7.cc: Add corresponding testcase.

2 years agoexpand: Throw away non-external decls without varpool nodes [PR105415]
Jakub Jelinek [Mon, 2 May 2022 09:30:58 +0000 (11:30 +0200)]
expand: Throw away non-external decls without varpool nodes [PR105415]

The following testcase fails -fcompare-debug on aarch64-linux.  The problem
is that for the n variable we create a varpool node, then remove it again
because the var isn't really used, but it keeps being referenced in debug
stmts/insns with -g.  Later during sched1 pass we ask whether the n var
can be modified through some store to an anchored variable and with -g
we create a new varpool node for it again just so that we can find its
ultimate alias target.  Even later on we create some cgraph node for the
loop parallelization, but as there has been an extra varpool node creation
in between, we get higher node->order with -g than without.

The patch fixes that by throwing variables without varpool nodes away
during expansion time, they are very unlikely to actually end up with
useful debug info anyway.

I've bootstrapped/regtested the following on x86_64-linux and i686-linux,
then bootstrapped with the patch reverted, reapplied the patch and did make
cc1plus in stage3.  The debug section sizes are identical, .debug_info and
.debug_loc is identical too, so I think we don't lose any debug info through
it.
So at least on cc1plus it makes no difference.

2022-05-02  Jakub Jelinek  <jakub@redhat.com>

PR debug/105415
* cfgexpand.cc (expand_debug_expr): Don't make_decl_rtl_for_debug
if there is no symtab node for the VAR_DECL.

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

2 years agogcov: Fix first time gcov info dump
Sebastian Huber [Mon, 2 May 2022 06:44:16 +0000 (08:44 +0200)]
gcov: Fix first time gcov info dump

This patch fixes an issue introduced by commit
ef9a53feae5701953da9161afef2aea0329ec8b2:

gcc --coverage main.c && ./a.out
libgcov profiling error:a-main.gcda:Error writing

gcc/ChangeLog:

* gcov-io.cc (gcov_rewrite):  Clear the file error status.

2 years agotree-optimization/105437 - BB vect with extern defs of throwing stmts
Richard Biener [Mon, 2 May 2022 07:30:27 +0000 (09:30 +0200)]
tree-optimization/105437 - BB vect with extern defs of throwing stmts

We have to watch out for vectorized stmt insert locations if the
def from the last stmt alters control flow.  We constrain region
building so we know the def is outside of the current region
and thus we can insert at the region start point.

2022-05-02  Richard Biener  <rguenther@suse.de>

PR tree-optimization/105437
* tree-vect-slp.cc (vect_schedule_slp_node): Handle the
case where last_stmt alters control flow.

* g++.dg/vect/pr105437.cc: New testcase.

2 years agoUse CASE_CONVERT in a few more cases
Richard Biener [Wed, 12 Jan 2022 09:42:32 +0000 (10:42 +0100)]
Use CASE_CONVERT in a few more cases

This uses CASE_CONVERT more which eases eventual removal of NOP_EXPR.

2022-04-29  Richard Biener  <rguenther@suse.de>

gcc/cp/
* constexpr.cc (fold_simple_1): Use CASE_CONVERT.
* cp-gimplify.cc (cp_fold): Likewise.
* pt.cc (tsubst_copy): Likewise.

gcc/
* dojump.cc (do_jump): Use CASE_CONVERT.
* tree-ssa-dom.cc (edge_info::derive_equivalences): Likewise.

2 years agosystem.h: Include <initializer_list> in system.h unconditionally
Jakub Jelinek [Mon, 2 May 2022 05:10:14 +0000 (07:10 +0200)]
system.h: Include <initializer_list> in system.h unconditionally

On Sun, May 01, 2022 at 07:06:53PM +0100, Jonathan Wakely wrote:
> > >> the reason is that "gcc/analyzer/region-model.cc” uses initializer_lists, and it seems that <initializer_list>
> > >> is not transitively included by any used headers for _LIBCPP_VERSION < 4000.  I fixed that locally by
> > >> adding initializer_list into system.h (and adding INCLUDE_INITIALIZER_LIST to the top of gcc/analyzer/region-model.cc)
> > >> - with that change those versions do bootstrap and test OK***
> > >
> > > From what I can see, with libstdc++ it works because <utility> which is
> > > included by system.h includes <initializer_list>.
> > > If I rename initializer_list in analyzer/region-model.ii to initializer_listx, I
> > > also get:
> > > ../../gcc/analyzer/region-model.cc: In function ‘void ana::selftest::test_binop_svalue_folding()’:
> > > ../../gcc/analyzer/region-model.cc:4966:48: error: deducing from brace-enclosed initializer list requires ‘#include <initializer_list>’
> > > 4508 |
> > >  +++ |+#include <initializer_list>
> > > 4509 | static void
> > > ......
> > > 4966 |     for (auto op : {BIT_IOR_EXPR, TRUTH_OR_EXPR})
> > >      |                                                ^
> > > ../../gcc/analyzer/region-model.cc:4978:49: error: deducing from brace-enclosed initializer list requires ‘#include <initializer_list>’
> > > 4978 |     for (auto op : {BIT_AND_EXPR, TRUTH_AND_EXPR})
> > >      |                                                 ^
> > >
> > > I think we have 2 options, one is do what you wrote above,
> > > INCLUDE_INITIALIZER_LIST defined before system.h to get #include <initializer_list>.
> > > The other option is just to include that unconditionally, it is a very small
> > > header.  For libstdc++ it will make no difference as it is included anyway
> > > and the header is really small there, libc++ includes <cstddef> which isn't
> > > normally included and system.h includes <stddef.h> instead.
> >
> > I’d say unconditionally would be OK. I suppose the chance that any host
> > C++ is good enough to build GCC as-is but fails to provide
> > <initializer_list> is zero?
> >
>
> Yes, definitely.
>
> > I’d be OK to do this change without a new RC even.

2022-05-02  Jakub Jelinek  <jakub@redhat.com>

* system.h: Include initializer_list.

2 years agolibgcov: add ATTRIBUTE_UNUSED for dump_string
Martin Liska [Mon, 2 May 2022 04:46:05 +0000 (06:46 +0200)]
libgcov: add ATTRIBUTE_UNUSED for dump_string

Mitigates the following clang warning:
libgcc/libgcov-driver.c:416:1: warning: unused function 'dump_string' [-Wunused-function]

libgcc/ChangeLog:

* libgcov-driver.c: Add ATTRIBUTE_UNUSED.

2 years agoDaily bump.
GCC Administrator [Mon, 2 May 2022 00:16:24 +0000 (00:16 +0000)]
Daily bump.

2 years agors6000: "Y" is DS-form, not DQ-form
Segher Boessenkool [Tue, 26 Apr 2022 21:30:44 +0000 (21:30 +0000)]
rs6000: "Y" is DS-form, not DQ-form

2022-05-01  Segher Boessenkool  <segher@kernel.crashing.org>

* config/rs6000/constraints.md (Y constraint): Fix comment.

2 years agoDenormalize VR_VARYING to VR_RANGE before passing it to set_range_info_raw.
Aldy Hernandez [Fri, 29 Apr 2022 20:46:25 +0000 (22:46 +0200)]
Denormalize VR_VARYING to VR_RANGE before passing it to set_range_info_raw.

We are ICEing in set_range_info_raw because value_range_kind cannot be
VR_VARYING, since SSA_NAME_RANGE_TYPE can only hold VR_RANGE /
VR_ANTI_RANGE.  Most of the time setting a VR_VARYING as a global
range makes no sense.  However, we can have a range spanning the
entire domain (VR_RANGE of [MIN,MAX] which is essentially a
VR_VARYING), if the nonzero bits are set.

This was working before because set_range_info_raw allows setting
VR_RANGE of [MIN, MAX].  However, when going through an irange, we
normalize this to a VR_VARYING, thus causing the ICE.  It's
interesting that other calls to set_range_info with an irange haven't
triggered this.

One solution would be to just ignore VR_VARYING and bail, since
set_range_info* is really an update of the current range semantic
wise.  After all, we keep the nonzero bits which provide additional
info.  But this would be a change in behavior, so not suitable until
after GCC 12 is released.  So in order to keep with current behavior
we can just denormalize the varying to VR_RANGE.

Tested on x86-64 Linux.

    PR tree-optimization/105432

gcc/ChangeLog:

* tree-ssanames.cc (set_range_info): Denormalize VR_VARYING to
VR_RANGE before passing a piecewise range to set_range_info_raw.

2 years agoDaily bump.
GCC Administrator [Sun, 1 May 2022 00:16:18 +0000 (00:16 +0000)]
Daily bump.

2 years agogengtype: remove "tree_exp" special attribute
Patrick Palka [Sat, 30 Apr 2022 14:56:49 +0000 (10:56 -0400)]
gengtype: remove "tree_exp" special attribute

The function comment for adjust_field_tree_exp says this attribute is
for handling expression trees whose operands may contain pointers to RTL
instead of to trees.  But ever since r0-59671-gac45df5dba5804, which
fixed/removed the last two tree codes for which this was possible
(WITH_CLEANUP_EXPR and GOTO_SUBROUTINE_EXPR), this special attribute is
mostly a no-op.

This patch removes it and instead just annotates struct tree_exp
with the "length" attribute directly.  Not sure it makes a difference,
but I use %h instead of %0 in the attribute string to be consistent with
the other uses of the "length" attribute within tree-core.h.

This changes the code generated for TS_EXP handling in gt-cp-tree.h from:

  case TS_EXP:
    gt_ggc_m_9tree_node ((*x).generic.exp.typed.type);
    switch ((int) (TREE_CODE ((tree) &(*x))))
      {
      default:
{
  size_t i3;
  size_t l3 = (size_t)(TREE_OPERAND_LENGTH ((tree) &(*x)));
  for (i3 = 0; i3 != l3; i3++) {
    gt_ggc_m_9tree_node ((*x).generic.exp.operands[i3]);
  }
}
break;
      }
    break;

to:

  case TS_EXP:
    {
      size_t l3 = (size_t)(TREE_OPERAND_LENGTH ((tree)&((*x).generic.exp)));
      gt_ggc_m_9tree_node ((*x).generic.exp.typed.type);
      {
size_t i3;
for (i3 = 0; i3 != l3; i3++) {
  gt_ggc_m_9tree_node ((*x).generic.exp.operands[i3]);
}
      }
    }

which seems equivalent and simpler.

gcc/ChangeLog:

* gengtype.cc (adjust_field_tree_exp): Remove.
(adjust_field_type): Don't handle the "tree_exp" special attribute.
* tree-core.h (struct tree_exp): Remove "special" and "desc"
attributes.  Add "length" attribute.

2 years agoc-family: attribute ((aligned, mode)) [PR100545]
Jason Merrill [Fri, 15 Apr 2022 20:27:05 +0000 (16:27 -0400)]
c-family: attribute ((aligned, mode)) [PR100545]

The problem here was that handle_mode_attribute clobbered the changes of any
previous attribute, only copying type qualifiers to the new type.  And
common_handle_aligned_attribute had previously set up the typedef, so when
we later called set_underlying_type it saw DECL_ORIGINAL_TYPE set and just
returned, even though handle_mode_attribute had messed up the TREE_TYPE.
So, let's fix handle_mode_attribute to copy attributes, alignment, and
typedefness to the new type.

PR c/100545

gcc/c-family/ChangeLog:

* c-attribs.cc (handle_mode_attribute): Copy attributes, aligned,
and typedef.
* c-common.cc (set_underlying_type): Add assert.

gcc/testsuite/ChangeLog:

* c-c++-common/attr-mode-1.c: New test.
* c-c++-common/attr-mode-2.c: New test.

2 years agoDaily bump.
GCC Administrator [Sat, 30 Apr 2022 00:16:27 +0000 (00:16 +0000)]
Daily bump.

2 years agoc++: reorganize friend template matching [PR91618]
Jason Merrill [Fri, 8 Apr 2022 17:48:25 +0000 (13:48 -0400)]
c++: reorganize friend template matching [PR91618]

The the different calling of check_explicit_specialization for class and
namespace scope friends bothered me, so this patch combines them.

PR c++/91618
PR c++/96604

gcc/cp/ChangeLog:

* friend.cc (do_friend): Call check_explicit_specialization here.
* decl.cc (grokdeclarator): Not here.
* decl2.cc (check_classfn): Or here.

2 years agoc++: alias CTAD and member alias templates [PR104470]
Jason Merrill [Wed, 27 Apr 2022 15:13:24 +0000 (11:13 -0400)]
c++: alias CTAD and member alias templates [PR104470]

In this testcase, we were trying to substitute into
variant<Foo<T>>::__accepted_type, but failed to look it up because
variant<Foo<T>> doesn't exist.  In other cases we already rewrite such
things into a dependent reference; we need to do that for alias templates as
well.

This caused some testsuite regressions on alias uses outside of deduction
guides, so I've made all of this rewriting conditional on a new tf_dguide
tsubst flag.

PR c++/104470

gcc/cp/ChangeLog:

* cp-tree.h (enum tsubst_flags): Add tf_dguide.
* pt.cc (tsubst_aggr_type): Check it.
(tsubst_baselink, tsubst_copy): Check it.
(maybe_dependent_member_ref): Check it.
(instantiate_alias_template): Handle it.
(build_deduction_guide): Set it.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/explicit11.C: Second example also ill-formed.
* g++.dg/cpp2a/class-deduction-alias12.C: New test.

2 years agoc++: lambda capture dependent type [PR82980]
Jason Merrill [Thu, 14 Apr 2022 18:09:13 +0000 (14:09 -0400)]
c++: lambda capture dependent type [PR82980]

The stage 4 patch limited direct propagation of dependent type to capture
field/proxy to the "current instantiation", but many more types should be
suitable as well.

PR c++/82980

gcc/cp/ChangeLog:

* lambda.cc (type_deducible_expression_p): Allow more types.

2 years agoc++: tidy auto deduction
Jason Merrill [Fri, 29 Apr 2022 18:21:47 +0000 (14:21 -0400)]
c++: tidy auto deduction

In r185768 I added the !FUNCTION_DECL check, but we might as well just check
for variable; nothing else should take this path, and asserting as much
doesn't regress anything.

gcc/cp/ChangeLog:

* decl.cc (cp_finish_decl): Only consider auto for vars.

2 years agoc++: pedwarn for empty unnamed enum in decl [PR67048]
Marek Polacek [Thu, 28 Apr 2022 20:50:06 +0000 (16:50 -0400)]
c++: pedwarn for empty unnamed enum in decl [PR67048]

[dcl.dcl]/5 says that

  enum { };

is ill-formed, and since r197742 we issue a pedwarn.  However, the
pedwarn also fires for

   enum { } x;

which is well-formed.  So only warn when {} is followed by a ;.  This
should be correct since you can't have "enum {}, <whatever>" -- that
produces "expected unqualified-id before ',' token".

PR c++/67048

gcc/cp/ChangeLog:

* parser.cc (cp_parser_enum_specifier): Warn about empty unnamed enum
only when it's followed by a semicolon.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/enum42.C: New test.

2 years agoc++: check completeness after auto deduction [PR80351]
Jason Merrill [Thu, 24 Mar 2022 01:01:20 +0000 (18:01 -0700)]
c++: check completeness after auto deduction [PR80351]

Normally we check for incomplete type in start_decl, but that obviously
doesn't work for auto variables. Thanks to Pokechu22 for the analysis and
testcases:

"When cp_finish_decl calls cp_apply_type_quals_to_decl on a const auto or
constexpr auto variable, the type might not be complete the first time
(this happened when auto deduces to an initializer_list).
cp_apply_type_quals_to_decl removes the const qualifier if the type is
not complete, which is appropriate for grokdeclarator, on the assumption
that the type will be complete when called by cp_finish_decl."

PR c++/80351

gcc/cp/ChangeLog:

* decl.cc (cp_finish_decl): Check completeness of deduced type.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/constexpr-77482.C: Adjust message.
* g++.dg/cpp1y/auto-fn27.C: Likewise.
* g++.dg/cpp1y/lambda-generic-variadic22.C: Likewise.
* g++.dg/cpp1z/decomp54.C: Likewise.
* g++.dg/cpp0x/initlist-const1.C: New test.
* g++.dg/warn/Wunused-var-37.C: New test.
* g++.dg/warn/Wunused-var-38.C: New test.
* g++.dg/warn/Wunused-var-39.C: New test.

2 years agoFix exchanged period and letter in gfortan.texi.
Thomas Koenig [Fri, 29 Apr 2022 17:57:05 +0000 (19:57 +0200)]
Fix exchanged period and letter in gfortan.texi.

gcc/fortran/ChangeLog:

* gfortran.texi: Fix exchanged period and letter.

2 years agoipa: Release body of clone_of when removing its last clone (PR 100413)
Martin Jambor [Fri, 29 Apr 2022 15:38:15 +0000 (17:38 +0200)]
ipa: Release body of clone_of when removing its last clone (PR 100413)

In the PR, the verifier complains that we did not manage to remove the
body of a node and it is right.  The node is kept for materialization
of two clones but after one is materialized, the other one is removed
as unneeded (as a part of delete_unreachable_blocks_update_callgraph).
The problem is that the node removal does not check for this situation
and can leave the clone_of node there with a body attached to it even
though there is no use for it any more.  This patch does checks for it
and handles the situation in a simlar way that
cgraph_node::materialize_clone does it, except that it also has to be
careful that the removed node itself does not have any clones, which
would still need the clone_of's body.  Failing to do that results in a
bootstrap failure.

gcc/ChangeLog:

2022-04-27  Martin Jambor  <mjambor@suse.cz>

PR ipa/100413
* cgraph.cc (cgraph_node::remove): Release body of the node this
is clone_of if appropriate.

gcc/testsuite/ChangeLog:

2022-04-27  Martin Jambor  <mjambor@suse.cz>

PR ipa/100413
* g++.dg/ipa/pr100413.C: New test.

2 years agoaarch64: Add option to pr105219 testcase
Andre Vieira [Fri, 29 Apr 2022 15:31:08 +0000 (16:31 +0100)]
aarch64: Add option to pr105219 testcase

Add option that originally caused testcase to fail for aarch64.

gcc/testsuite/ChangeLog:

PR tree-optimization/105219
* gcc.dg/vect/pr105219.c: Add aarch64 target option.

2 years agoc++: Add fixed test [PR83596]
Marek Polacek [Fri, 29 Apr 2022 13:52:55 +0000 (09:52 -0400)]
c++: Add fixed test [PR83596]

This was fixed by r269078.

PR c++/83596

gcc/testsuite/ChangeLog:

* g++.dg/cpp1z/nontype5.C: New test.

2 years agolibstdc++: Add missing exports for ppc64le --with-long-double-format=ibm [PR105417]
Jonathan Wakely [Fri, 29 Apr 2022 11:17:13 +0000 (12:17 +0100)]
libstdc++: Add missing exports for ppc64le --with-long-double-format=ibm [PR105417]

The --with-long-double-abi=ibm build is missing some exports that are
present in the --with-long-double-abi=ieee build. Those symbols never
should have been exported at all, but now that they have been, they
should be exported consistently by both ibm and ieee.

This simply defines them as aliases for equivalent symbols that are
already present. The abi-tag on num_get::_M_extract_int isn't really
needed, because it only uses a std::string as a local variable, not in
the return type or function parameters, so it's safe to define the
_M_extract_int[abi:cxx11] symbols as aliases for the corresponding
function without the abi-tag.

This causes some new symbols to be added to the GLIBCXX_3.4.29 version
for the ibm long double build mode, but there is no advantage to adding
them to 3.4.30 for that build. That would just create more
inconsistencies.

libstdc++-v3/ChangeLog:

PR libstdc++/105417
* config/abi/post/powerpc64-linux-gnu/baseline_symbols.txt:
Regenerate.
* src/c++11/compatibility-ldbl-alt128.cc [_GLIBCXX_USE_DUAL_ABI]:
Define __gnu_ieee128::num_get<C>::_M_extract_int[abi:cxx11]<I>
symbols as aliases for corresponding symbols without abi-tag.

2 years agoc++: Add fixed test [PR78244]
Marek Polacek [Fri, 29 Apr 2022 13:38:40 +0000 (09:38 -0400)]
c++: Add fixed test [PR78244]

This was finally fixed for GCC 11 by r11-434.

PR c++/78244

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/Wnarrowing20.C: New test.

2 years agoc++: Add fixed test [PR71424]
Marek Polacek [Fri, 29 Apr 2022 13:33:08 +0000 (09:33 -0400)]
c++: Add fixed test [PR71424]

This was fixed by r12-6329-g4f6bc28fc7dd86.

PR c++/71424

gcc/testsuite/ChangeLog:

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

2 years agoc++: using in diagnostics [PR102987]
Jason Merrill [Thu, 14 Apr 2022 21:35:35 +0000 (17:35 -0400)]
c++: using in diagnostics [PR102987]

The decl pretty-printing code wasn't looking at the flags parameter, so we
were printing 'using' in the middle of an expression.

PR c++/102987

gcc/cp/ChangeLog:

* error.cc (dump_decl) [USING_DECL]: Respect flags.

gcc/testsuite/ChangeLog:

* g++.dg/diagnostic/using1.C: Check pretty-printing.

2 years agoc++: dump alias-declaration scope
Jason Merrill [Thu, 31 Mar 2022 22:15:24 +0000 (18:15 -0400)]
c++: dump alias-declaration scope

An alias can't be declared with a qualified-id in actual code, but in
diagnostics we want to know which scope it belongs to, and I think a
nested-name-specifier is the best way to provide that.

gcc/cp/ChangeLog:

* error.cc (dump_decl): Check TFF_UNQUALIFIED_NAME.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/alias-decl-1.C: Expect qualified name.

2 years agoc++: Improve diagnostics for template args terminated with >= or >>= [PR104319]
Jakub Jelinek [Fri, 29 Apr 2022 11:50:10 +0000 (13:50 +0200)]
c++: Improve diagnostics for template args terminated with >= or >>= [PR104319]

As mentioned in the PR, for C++98 we have diagnostics that expect
>> terminating template arguments to be a mistake for > > (C++11
said it has to be treated that way), while if user trying to spare the
spacebar doesn't separate > from following = or >> from following =,
the diagnostics is confusing, while clang suggests adding space in between.

The following patch does that for >= and >>= too.

For some strange reason the error recovery emits further errors,
not really sure what's going on because I overwrite the token->type
like the code does for the C++11 >> case or for the C++98 >> cases,
but at least the first error is nicer (well, for the C++98 nested
template case and >>= I need to overwrite it to > and so the = is lost,
so perhaps some follow-up errors are needed for that case).

2022-04-29  Jakub Jelinek  <jakub@redhat.com>

PR c++/104319
* parser.cc (cp_parser_template_argument): Treat >= like C++98 >>
after a type id by setting maybe_type_id and aborting tentative
parse.
(cp_parser_enclosed_template_argument_list): Handle
CPP_GREATER_EQ like misspelled CPP_GREATER CPP_RQ and
CPP_RSHIFT_EQ like misspelled CPP_GREATER CPP_GREATER_EQ
or CPP_RSHIFT CPP_EQ or CPP_GREATER CPP_GREATER CPP_EQ.
(cp_parser_next_token_ends_template_argument_p): Return true
also for CPP_GREATER_EQ and CPP_RSHIFT_EQ.

* g++.dg/parse/template28.C: Adjust expected diagnostics.
* g++.dg/parse/template30.C: New test.

2 years agolibstdc++: Update Solaris baselines for GCC 12.1
Rainer Orth [Fri, 29 Apr 2022 11:44:49 +0000 (13:44 +0200)]
libstdc++: Update Solaris baselines for GCC 12.1

The following patch updates the Solaris baselines for GCC 12.1.

Tested on i386-pc-solaris2.11 and sparc-sun-solaris2.11 (Solaris 11.3
and 11.4 in each case).

The only (expected) difference between the 11.3 and 11.4 versions is

--- baseline_symbols.txt.s113s 2022-04-28 10:37:11.464068450 +0000
+++ baseline_symbols.txt.s114s 2022-04-27 16:54:31.995636805 +0000
@@ -4070,3 +4070,3 @@
-FUNC:_ZSt10from_charsPKcS0_RdSt12chars_format@@GLIBCXX_3.4.30
-FUNC:_ZSt10from_charsPKcS0_ReSt12chars_format@@GLIBCXX_3.4.30
-FUNC:_ZSt10from_charsPKcS0_RfSt12chars_format@@GLIBCXX_3.4.30
+FUNC:_ZSt10from_charsPKcS0_RdSt12chars_format@@GLIBCXX_3.4.29
+FUNC:_ZSt10from_charsPKcS0_ReSt12chars_format@@GLIBCXX_3.4.29
+FUNC:_ZSt10from_charsPKcS0_RfSt12chars_format@@GLIBCXX_3.4.29

which is handled by the fix for PR libstdc++/103407.  I'm using the 11.4
version here.

2022-04-27  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

libstdc++-v3:
* config/abi/post/i386-solaris/baseline_symbols.txt: Regenerate.
* config/abi/post/i386-solaris/amd64/baseline_symbols.txt:
Likewise.
* config/abi/post/sparc-solaris/baseline_symbols.txt: Likewise.
* config/abi/post/sparc-solaris/sparcv9/baseline_symbols.txt:
Likewise.

2 years agoi386: Optimize double-word negation [PR51954]
Uros Bizjak [Fri, 29 Apr 2022 11:27:48 +0000 (13:27 +0200)]
i386: Optimize double-word negation [PR51954]

Introduce peephole2 pattern to convert from:

   mov %esi, %edx
   negl %eax
   adcl $0, %edx
   negl %edx
 to:
   xorl %edx, %edx
   negl %eax
   sbbl %esi, %edx

This conversion is profitable only when initial move is found.  Otherwise,
additional move to a temporary together with clearing xor is needed.

2022-04-29  Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog:

PR target/51954
* config/i386/i386.md (adcl/neg -> sbb peephole): New peephole2.
gcc/testsuite/ChangeLog:

PR target/51954
* gcc.target/i386/pr51954.c: New test.

2 years agoFix is_gimple_condexpr vs is_gimple_condexpr_for_cond
Richard Biener [Mon, 11 Apr 2022 10:18:48 +0000 (12:18 +0200)]
Fix is_gimple_condexpr vs is_gimple_condexpr_for_cond

The following fixes wrongly used is_gimple_condexpr and makes
canonicalize_cond_expr_cond honor either, delaying final checking
to callers where all but two in ifcombine are doing the correct
thing already.

This fixes bugs but is now mainly in preparation for making
COND_EXPRs in GIMPLE assignments no longer have a GENERIC expression
as condition operand like we already transitioned VEC_COND_EXPR earlier.

2022-04-11  Richard Biener  <rguenther@suse.de>

* gimple-expr.cc (is_gimple_condexpr): Adjust comment.
(canonicalize_cond_expr_cond): Move here from gimple.cc,
allow both COND_EXPR and GIMPLE_COND forms.
* gimple-expr.h (canonicalize_cond_expr_cond): Declare.
* gimple.cc (canonicalize_cond_expr_cond): Remove here.
* gimple.h (canonicalize_cond_expr_cond): Likewise.
* gimple-loop-versioning.cc (loop_versioning::version_loop):
Use is_gimple_condexpr_for_cond.
* tree-parloops.cc (gen_parallel_loop): Likewise.
* tree-ssa-ifcombine.cc (ifcombine_ifandif): Check for
a proper cond expr after canonicalize_cond_expr_cond.
Use is_gimple_condexpr_for_cond where appropriate.
* tree-ssa-loop-manip.cc (determine_exit_conditions): Likewise.
* tree-vect-loop-manip.cc (slpeel_add_loop_guard): Likewise.

2 years agoAdd gsi_after_labels overload for gimple_seq
Richard Biener [Tue, 1 Feb 2022 09:48:07 +0000 (10:48 +0100)]
Add gsi_after_labels overload for gimple_seq

The following adds gsi_after_labels for gimple_seq so I do not have
to open-code it.  I took the liberty to remove the two #defines
wrapping gsi_start_1 and gsi_last_1 as we now have C++ references.

2022-02-01  Richard Biener  <rguenther@suse.de>

* gimple-iterator.h (gsi_after_labels): Add overload for
gimple_seq.
(gsi_start_1): Rename to gsi_start and take a reference.
(gsi_last_1): Likewise.
* gimple-iterator.cc (gsi_for_stmt): Use gsi_start.
* omp-low.cc (lower_rec_input_clauses): Likewise.
(lower_omp_scan): Likewise.

2 years agotree-optimization/105431 - another overflow in powi handling
Richard Biener [Fri, 29 Apr 2022 06:45:48 +0000 (08:45 +0200)]
tree-optimization/105431 - another overflow in powi handling

This avoids undefined signed overflow when calling powi_as_mults_1.

2022-04-29  Richard Biener  <rguenther@suse.de>

PR tree-optimization/105431
* tree-ssa-math-opts.cc (powi_as_mults_1): Make n unsigned.
(powi_as_mults): Use absu_hwi.
(gimple_expand_builtin_powi): Remove now pointless n != -n
check.

2 years agoMove common code from range-op.cc to header files.
Aldy Hernandez [Thu, 28 Apr 2022 18:19:14 +0000 (20:19 +0200)]
Move common code from range-op.cc to header files.

In preparation for the agnostication of ranger, this patch moves
common code that can be shared between non-integer ranges (initially
pointers) into the relevant header files.

This is a relatively non-invasive change, as any changes that would
need to be ported to GCC 12, would occur in the range-op entries
themselves, not in the supporting glue which I'm moving.

Tested and benchmarked on x86-64 Linux.

gcc/ChangeLog:

* range-op.cc (empty_range_varying): Move to range-op.h.
(range_true): Move to range.h.
(range_false): Same.
(range_true_and_false): Same.
(enum bool_range_state): Move to range-op.h.
(relop_early_resolve): Same.
(operator_equal::op1_op2_relation): Abstract code to...
(equal_op1_op2_relation): ...here.
(operator_not_equal::op1_op2_relation): Abstract code to...
(not_equal_op1_op2_relation): ...here.
(operator_lt::op1_op2_relation): Abstract code to...
(lt_op1_op2_relation): ...here.
(operator_le::op1_op2_relation): Abstract code to...
(le_op1_op2_relation): ...here.
(operator_gt::op1_op2_relation): Abstract code to...
(gt_op1_op2_relation): ...here.
(operator_ge::op1_op2_relation): Abstract code to...
(ge_op1_op2_relation): ...here.
(class range_op_table): Move to range-op.h.
* range-op.h (equal_op1_op2_relation): Moved from range-op.cc.
(not_equal_op1_op2_relation): Same.
(lt_op1_op2_relation): Same.
(le_op1_op2_relation): Same.
(gt_op1_op2_relation): Same.
(ge_op1_op2_relation): Same.
(enum bool_range_state): Same.
(get_bool_state): Same.
(empty_range_varying): Same.
(relop_early_resolve): Same.
(class range_op_table): Same.
* range.h (range_true): Same.
(range_false): Same.
(range_true_and_false): Same.

2 years agoRemove various deprecated methods in class irange.
Aldy Hernandez [Mon, 14 Mar 2022 08:57:48 +0000 (09:57 +0100)]
Remove various deprecated methods in class irange.

This patch cleans up some irange methods in preparation for other
cleanups later in the cycle.

First, we prefer the reference overloads for union and intersect as
the pointer versions have been deprecated for a couple releases.

Also, I've renamed the legacy union/intersect whose only function was
to provide additional verbosity for VRP into
legacy_verbose_{union,intersect}.  This is a temporary rename to serve
as a visual reminder of which of the methods are bound for the chopping
block when the legacy code gets removed later this cycle.

Tested on x86-64 Linux.

gcc/ChangeLog:

* gimple-fold.cc (size_must_be_zero_p): Use reference
instead of pointer
* gimple-ssa-evrp-analyze.cc
(evrp_range_analyzer::record_ranges_from_incoming_edge): Rename
intersect to legacy_verbose_intersect.
* ipa-cp.cc (ipcp_vr_lattice::meet_with_1): Use reference instead
of pointer.
* tree-ssa-dom.cc (dom_jt_simplifier::simplify): Use value_range
instead of value_range_equiv.
* tree-vrp.cc (extract_range_from_plus_minus_expr): Use reference
instead of pointer.
(find_case_label_range): Same.
* value-range-equiv.cc (value_range_equiv::intersect): Rename to...
(value_range_equiv::legacy_verbose_intersect): ...this.
(value_range_equiv::union_): Rename to...
(value_range_equiv::legacy_verbose_union_): ...this.
* value-range-equiv.h (class value_range_equiv): Rename union and
intersect to legacy_verbose_{intersect,union}.
* value-range.cc (irange::union_): Rename to...
(irange::legacy_verbose_union_): ...this.
(irange::intersect): Rename to...
(irange::legacy_verbose_intersect): ...this.
* value-range.h (irange::union_): Rename union_ to
legacy_verbose_union.
(irange::intersect): Rename intersect to legacy_verbose_intersect.
* vr-values.cc (vr_values::update_value_range): Same.
(vr_values::extract_range_for_var_from_comparison_expr): Same.
(vr_values::extract_range_from_cond_expr): Rename union_ to
legacy_verbose_union.
(vr_values::extract_range_from_phi_node): Same.

2 years agoPrefer global range info setters that take a range.
Aldy Hernandez [Mon, 7 Mar 2022 13:56:34 +0000 (14:56 +0100)]
Prefer global range info setters that take a range.

This patch consolidates the multiple ways we have of storing global
ranges into one accepting a range.

In an upcoming patch series later this cycle we will be providing a
way to store iranges globally, as opposed to the mechanism we have now
which squishes wider ranges into value_range's.  This is preparation
for such work.

Tested and benchmarked on x86-64 Linux.

gcc/ChangeLog:

* gimple-ssa-evrp-analyze.cc
(evrp_range_analyzer::set_ssa_range_info): Use *range_info methods
that take a range.
* gimple-ssa-sprintf.cc (try_substitute_return_value): Same.
* ipa-prop.cc (ipcp_update_vr): Same.
* tree-inline.cc (remap_ssa_name): Same.
* tree-ssa-copy.cc (fini_copy_prop): Same.
* tree-ssa-math-opts.cc (optimize_spaceship): Same.
* tree-ssa-phiopt.cc (replace_phi_edge_with_variable): Same.
* tree-ssa-pre.cc (insert_into_preds_of_block): Same.
* tree-ssa-sccvn.cc (eliminate_dom_walker::eliminate_stmt): Same.
* tree-ssa-strlen.cc (set_strlen_range): Same.
(strlen_pass::handle_builtin_string_cmp): Same.
* tree-ssanames.cc (set_range_info): Make static.
(duplicate_ssa_name_range_info): Make static and add a new variant
calling the static.
* tree-ssanames.h (set_range_info): Remove version taking wide ints.
(duplicate_ssa_name_range_info): Remove version taking a
range_info_def and replace with a version taking SSA names.
* tree-vect-loop-manip.cc (vect_gen_vector_loop_niters): Use *range_info methods
that take a range.
(vect_do_peeling): Same.
* tree-vrp.cc (vrp_asserts::remove_range_assertions): Same.
* vr-values.cc (simplify_truth_ops_using_ranges): Same.

2 years agoCall set_undefined from irange constructor.
Aldy Hernandez [Mon, 7 Mar 2022 13:49:57 +0000 (14:49 +0100)]
Call set_undefined from irange constructor.

Small clean up to use set_undefined instead of duplicating the
functionality therein.

Tested on x86-64 Linux.

gcc/ChangeLog:

* value-range.h (irange::irange): Use set_undefined.

2 years agoMake irange::intersect(wide_int, wide_int) private.
Aldy Hernandez [Mon, 7 Mar 2022 13:48:58 +0000 (14:48 +0100)]
Make irange::intersect(wide_int, wide_int) private.

This method should have been private, and somehow seeped into the API.

Tested and benchmarked on x86-64 Linux.

gcc/ChangeLog:

* gimple-range-cache.h (non_null_ref::adjust_range): Do not use
irange::intersect (wide_int, wide_int).
* gimple-range-fold.cc (adjust_pointer_diff_expr): Same.
(adjust_imagpart_expr): Same.
* value-range.h (irange::intersect (wide_int, wide_int)): Make
private.

2 years agotree-optimization/104322 - remove dead code in vectorizable_reduction
Richard Biener [Tue, 1 Feb 2022 10:32:11 +0000 (11:32 +0100)]
tree-optimization/104322 - remove dead code in vectorizable_reduction

The PR points out dead code after previous refactoring.

2022-02-01  Richard Biener  <rguenther@suse.de>

PR tree-optimization/104322
* tree-vect-loop.cc (vectorizable_reduction): Remove dead code.

2 years agoc++, coroutines: Partial reversion of r12-8308-g15a176a833f23e [PR105426].
Iain Sandoe [Thu, 28 Apr 2022 19:06:29 +0000 (20:06 +0100)]
c++, coroutines: Partial reversion of r12-8308-g15a176a833f23e [PR105426].

The changes to fix PR 105287 included a tightening of the constraints on which
variables are promoted to frame copies.  This has exposed that we are failing
to name some variables that should be promoted.

We avoid the use of DECL_UID to build anonymous symbols since that might not
be stable for -fcompare-debug.

The long-term fix is to address the cases where the naming has been missed,
but for the short-term (and for the GCC-12 branch) backing out the additional
constraint is proposed.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
PR c++/105426

gcc/cp/ChangeLog:

* coroutines.cc (register_local_var_uses): Allow promotion of unnamed
temporaries to coroutine frame copies.

2 years agomiddle-end/105376 - invalid REAL_CST for DFP constant
Richard Biener [Wed, 27 Apr 2022 06:28:31 +0000 (08:28 +0200)]
middle-end/105376 - invalid REAL_CST for DFP constant

We are eventually ICEing in decimal_to_decnumber on non-decimal
REAL_VALUE_TYPE that creep in from uses of build_real (..., dconst*)
for DFP types.  The following extends the decimal_to_decnumber
special-casing of dconst* to build_real, avoiding the bogus REAL_CSTs
from creeping into the IL and modified to ones not handled by
the decimal_to_decnumber special casing.  It also makes sure to
ICE for not handled dconst* values at the point we build the REAL_CST.

2022-04-27  Richard Biener  <rguenther@suse.de>

PR middle-end/105376
* tree.cc (build_real): Special case dconst* arguments
for decimal floating point types.

* gcc.dg/pr105376.c: New testcase.

2 years agoada: bump Library_Version to 13.
Martin Liska [Fri, 29 Apr 2022 04:34:02 +0000 (06:34 +0200)]
ada: bump Library_Version to 13.

gcc/ada/ChangeLog:

* gnatvsn.ads: Bump Library_Version to 13.

2 years agoc++: traits, array of unknown bound of incomplete
Jason Merrill [Wed, 23 Mar 2022 16:25:18 +0000 (12:25 -0400)]
c++: traits, array of unknown bound of incomplete

My r161129 changed check_trait_type to reject arrays of unknown bound of
incomplete type, but I can't find a rationale for that, and now think it's
wrong: the standard just requires that the type be "complete, cv void, or an
array of unknown bound."  I imagine that allowing arrays of unknown bound is
because an array of unknown bound can't change from incomplete to complete
later in the translation unit, so there's no caching problem.

gcc/cp/ChangeLog:

* semantics.cc (check_trait_type): Don't check completeness
of element type of array of unknown bound.

gcc/testsuite/ChangeLog:

* g++.dg/ext/unary_trait_incomplete.C: Adjust.

2 years agoc++: typeid and instantiation [PR102651]
Jason Merrill [Fri, 15 Apr 2022 04:11:00 +0000 (00:11 -0400)]
c++: typeid and instantiation [PR102651]

PR49387 was a problem with initially asking for a typeid for a class
template specialization before it was complete, and later actually filling
in the descriptor when the class was complete, and thus disagreeing on the
form of the descriptor.  I fixed that by forcing the class to be complete,
but this testcase shows why that approach is problematic.  So instead let's
adjust the type of the descriptor later if needed.

PR c++/102651
PR c++/49387

gcc/cp/ChangeLog:

* rtti.cc (get_tinfo_decl_direct): Don't complete_type.
(emit_tinfo_decl): Update tdesc type if needed.

gcc/testsuite/ChangeLog:

* g++.dg/rtti/typeid-complete1.C: New test.

2 years agoc++: Add diagnostic when operator= is used as truth cond [PR25689]
Zhao Wei Liew [Tue, 15 Feb 2022 09:44:29 +0000 (17:44 +0800)]
c++: Add diagnostic when operator= is used as truth cond [PR25689]

When compiling the following code with g++ -Wparentheses, GCC does not
warn on the if statement. For example, there is no warning for this code:

struct A {
A& operator=(int);
operator bool();
};

void f(A a) {
if (a = 0); // no warning
}

This is because a = 0 is a call to operator=, which GCC does not handle.

This patch fixes this issue by handling calls to operator= when deciding
to warn.

Bootstrapped and regression tested on x86_64-pc-linux-gnu.

PR c++/25689

gcc/cp/ChangeLog:

* call.cc (extract_call_expr): Return a NULL_TREE on failure
instead of asserting.
(build_new_method_call): Suppress -Wparentheses diagnostic for
MODIFY_EXPR.
* semantics.cc (is_assignment_op_expr_p): Add function to check
if an expression is a call to an op= operator expression.
(maybe_convert_cond): Handle the case of a op= operator expression
for the -Wparentheses diagnostic.

gcc/testsuite/ChangeLog:

* g++.dg/warn/Wparentheses-31.C: New test.

Signed-off-by: Zhao Wei Liew <zhaoweiliew@gmail.com>
2 years agoDaily bump.
GCC Administrator [Fri, 29 Apr 2022 00:16:26 +0000 (00:16 +0000)]
Daily bump.