Commit Graph

192502 Commits

Author SHA1 Message Date
Jason Merrill
d087b59527 c++: operator new lookup [PR98249]
The standard says, as we quote in the comment just above, that if we don't
find operator new in the allocated type, it should be looked up in the
global scope.  This is specifically ::, not just any namespace, and we
already give an error for an operator new declared in any other namespace.

	PR c++/98249

gcc/cp/ChangeLog:

	* call.cc (build_operator_new_call): Just look in ::.

gcc/testsuite/ChangeLog:

	* g++.dg/lookup/new3.C: New test.
2022-04-11 17:30:45 -04:00
Jonathan Wakely
b1124648ff libstdc++: Fix incorrect branch prediction hint in std::stacktrace
libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace::_Impl::_M_allocate):
	Change [[unlikely]] attribute to [[likely]].
2022-04-11 22:10:00 +01:00
Segher Boessenkool
0508f0b810 rs6000: Fix unpack for no-direct-move (PR103623)
The _dm alternative works fine for soft-float, but the _nodm variant
pattern is missing that alternative.  So, let's add that.

There probably should be an r,r,i alternative as well (or we can make it
rm,r,i), but that is for later.

2022-04-11  Segher Boessenkool  <segher@kernel.crashing.org>

	PR target/105213
	PR target/103623
	* config/rs6000/rs6000.md (unpack<mode>_nodm): Add m,r,i alternative.
2022-04-11 21:00:25 +00:00
Jakub Jelinek
1774ab8486 phiopt: Fix up debug handling in the (x != cst1 ? x : cst2) != cst3 opt [PR105218]
In the PR104639 optimization, I've added code to emit
  # DEBUG D#1 => arg != carg ? arg : oarg
instruction and replace debug uses of the phi with that debug
temp, so that the debug info is still accurrate.
Unfortunately, that is only correct if the middle-bb and
phi bb contain 1 and 2 predecessors, i.e. the ones that
we are using in the optimization (in particular middle-bb has
cond-bb as pred and phi bb cond-bb and middle-bb).
If that is not the case, then we can reach these from another bb
and so the arg SSA_NAME might not be valid there (its definition
doesn't dominate all incoming edges), or, even if it is valid,
might be wrong-debug, e.g. phi argument from some unrelated other
incoming edge might have the carg value that the debug stmt
remaps to oarg.  In theory we could check for that case and
if middle-bb doesn't have a single pred or phi bb 2 preds
check if arg SSA_NAME dominates the phi bb and if all other
phi arguments are expr_not_equal_to the carg value, but this patch
just uses a simpler approach and resets already if we have some
extra incoming edges.

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

	PR tree-optimization/105218
	* tree-ssa-phiopt.cc (value_replacement): If middle_bb has
	more than one predecessor or phi's bb more than 2 predecessors,
	reset phi result uses instead of adding a debug temp.

	* gcc.dg/pr105218.c: New test.
2022-04-11 19:06:59 +02:00
Jonathan Wakely
73da9ec556 libstdc++: Fix std::basic_stacktrace special members [PR105031]
The PR points out that there is a non-constant condition used for an
if-constexpr statement, but there are several other problems with the
copy, move and swap members of std::basic_stacktrace.

libstdc++-v3/ChangeLog:

	PR libstdc++/105031
	* include/std/stacktrace (basic_stacktrace::basic_stacktrace):
	Fix allocator usage in constructors.
	(basic_stacktrace::operator=(const basic_stacktrace&)): Do not
	try to reallocate using const allocator.
	(basic_stacktrace::operator=(basic_stacktrace&&)): Fix
	if-constexpr with non-constant condition. Do not allocate new
	storage if allocator propagates. Do not set _M_size if
	allocation fails.
	(basic_stacktrace::swap(basic_stacktrace&)): Fix typo. Add
	assertion that non-propagating allocators are equal.
	* testsuite/19_diagnostics/stacktrace/stacktrace.cc: New test.
2022-04-11 17:59:50 +01:00
Jonathan Wakely
bdb9639ee9 libstdc++: Improve behaviour of std::stacktrace::current
This prevents inlining the current() function to guarantee that it is
present in the stacktrace, then tells libbacktrace to skip that frame.

To avoid overflow in the int argument to __glibcxx_backtrace_simple, we
need to check if the skip parameter exceeds INT_MAX (which is possible
for 16-bit targets where short and int have the same width). We also
need to limit the size of the returned value to the max_depth parameter,
which was missing previously.

This also fixes basic_stacktrace::max_size() to not exceed the maximum
size supported by the allocator, which might be smaller than the maximum
value of size_type.

libstdc++-v3/ChangeLog:

	* include/std/stacktrace (basic_stacktrace::current): Duplicate
	implementation into each overload. Add noinline attribute and
	skip current frame.
	(basic_stacktrace::max_size()): Call _Impl::_S_max_size.
	(basic_stacktrace::_S_curr_cb()): New function defining lambda.
	(basic_stacktrace::_Impl::_S_max_size): New function defining
	maximum size in terms of allocator and size_type.
	(basic_stacktrace::_Impl::_M_allocate): Check against
	max_size().
	* testsuite/19_diagnostics/stacktrace/entry.cc: Call function
	for non-constexpr checks. Check line number is correct.
2022-04-11 17:59:08 +01:00
Alexandre Oliva
ab0f04e4df ppc: testsuite: require target effectively [PR104253]
The testcase was missing dg- before require-effective-target.

While at that, I'm also pruning the excess-error warning I got when
the test failed to be disabled because of the above.  I suppose it
might be useful for some target variants.


for gcc/testsuite/ChangeLog

	PR target/104253
	* gcc.target/powerpc/pr104253.c: Add missing dg- before
	require-effective-target.  Prune warning about -mfloat128
	possibly not being fully supported.
2022-04-11 12:11:10 -03:00
Alexandre Oliva
5ce08ecb15 c++: Tolerate cdtors returning this in constexpr
On targets that return this from cdtors, cxx_eval_call_expression may
flag flowing off the end of a dtor.  That's preempted for ctors, and
avoided entirely when dtors return void, but when they return this,
the return value should be conceptually disregarded, without making
room for such internal ABI details to make a program ill-formed, as in
g++.dg/cpp2a/constexpr-dtor12.C on arm-eabi.


for  gcc/cp/ChangeLog

	* constexpr.cc (cxx_eval_call_expression): Disregard dtor
	result.
2022-04-11 12:11:09 -03:00
Alexandre Oliva
396a013a58 c++: Set loc on call even if result is discarded
This patch fixes a divergence in line numbers in diagnostics and,
presumably, debug information, between targets whose cdtors return
this and those that don't.

The problem was visible in g++.dg/cpp2a/constexpr-dtor3.C: while the
dtor call in the cleanup for f4 was expected at the closing brace, on
returning-this targets it came up at the assignment.

The reason is convoluted: statements in cleanups have their location
information removed, to avoid bumpy debugger behavior, and then set to
the location of the end of the scope.

The cleanup dtor call has its locus cleared in both kinds of targets,
but the end-of-scope locus doesn't make it on returning-this targets.
The calls are wrapped with a cast-to-void to discard the unused return
value, and the existing logic only attached the locus to the
conversion NOP_EXPR.

The call thus remains locus-less.  When constexpr logic copies and
evals the body, it sets unset locations; while copying cleanups, the
locus is taken from the cleanup expression, rather than matching the
end-of-scope locus set by the parser.  So we end up with different
locations.

This patch sets the locus of the call even when it's wrapped by a
convert-to-void NOP_EXPR, so it won't diverge any more.


for  gcc/cp/ChangeLog

	* semantics.cc (set_cleanup_locs): Propagate locus to call
	wrapped in cast-to-void.
2022-04-11 12:11:08 -03:00
Kito Cheng
4132f6ba95 RISC-V: Support -misa-spec for arch-canonicalize and multilib-generator. [PR104853]
We migrate the default ISA spec version from 2.2 to 20191213, but those scripts
aren't updated at the same time, this patch is making both scripts support
different ISA spec versions.

gcc/ChangeLog:

	PR target/104853
	* config.gcc: Pass -misa-spec to arch-canonicalize and
	multilib-generator.
	* config/riscv/arch-canonicalize: Adding -misa-spec option.
	(SUPPORTED_ISA_SPEC): New.
	(arch_canonicalize): New argument `isa_spec`.
	Handle multiple ISA spec versions.
	* config/riscv/multilib-generator: Adding -misa-spec option.
2022-04-11 22:56:54 +08:00
Jonathan Wakely
c62b0f731b libstdc++: Move stacktrace tests to 19_diagnostics directory
This matches where the feature is defined in the current draft.

libstdc++-v3/ChangeLog:

	* testsuite/20_util/stacktrace/entry.cc: Moved to...
	* testsuite/19_diagnostics/stacktrace/entry.cc: ...here.
	* testsuite/20_util/stacktrace/synopsis.cc: Moved to...
	* testsuite/19_diagnostics/stacktrace/synopsis.cc: ...here.
	* testsuite/20_util/stacktrace/version.cc: Moved to...
	* testsuite/19_diagnostics/stacktrace/version.cc: ...here.
2022-04-11 15:53:22 +01:00
Jonathan Wakely
0df39b0803 libstdc++: Move Filesystem TS path definitions out of class body
This fixes some errors with clang caused by instantiating vector<_Cmpt>
before the _Cmpt type is complete.

libstdc++-v3/ChangeLog:

	* include/experimental/bits/fs_path.h (path): Define special
	members after path::_Cmpt is complete.
2022-04-11 15:53:22 +01:00
Kito Cheng
7d25f9b6f1 RISC-V: Sync arch-canonicalize and riscv-common.cc
Currently we are sync that manually, but I guess we should re-implement
arch-canonicalize in C++, so that we could reuse the stuffs from
riscv-common.cc.

gcc/ChangeLog:

	* config/riscv/arch-canonicalize: Add TODO item.
	(IMPLIED_EXT): Sync.
	(arch_canonicalize): Checking until no change.
2022-04-11 22:39:12 +08:00
Tamar Christina
78c718490b middle-end: Prevent the use of the cond inversion detection code when both conditions are external. [PR105197]
Previously ifcvt used to enforce that a mask A and the inverse of said mask be
represented as ~A. So for the masks

  _25 = _6 != 0;
  _44 = _4 != 0;

ifcvt would produce for an operation requiring the inverse of said mask

  _26 = ~_25;
  _43 = ~_44;

but now that VN is applied to the entire function body we get a simplification
on the mask and produce:

  _26 = _6 == 0;
  _43 = _4 == 0;

This in itself is not a problem semantically speaking (though it does create
more masks that need to be tracked) but when vectorizing the masked conditional
we would still detect _26 and _43 to be inverses of _25 and _44 and mark them
as requiring their operands be swapped.

When vectorizing we swap the operands but don't find the BIT_NOT_EXPR to remove
and so we leave the condition as is which produces invalid code:

------>vectorizing statement: _ifc__41 = _43 ? 0 : _ifc__40;
created new init_stmt: vect_cst__136 = { 0, ... }
add new stmt: _137 = mask__43.26_135 & loop_mask_111
note:  add new stmt: vect__ifc__41.27_138 = VEC_COND_EXPR <_137, vect__ifc__40.25_133, vect_cst__136>;

This fixes disabling the inversion detection code when the loop isn't masked
since both conditional would be external.  We'd then not use the new cond_code
and would incorrectly still swap the operands.

The resulting code is also better than GCC-11 with most operations now
predicated on the loop mask rather than a ptrue.

gcc/ChangeLog:

	PR target/105197
	* tree-vect-stmts.cc (vectorizable_condition): Prevent cond swap when
	not masked.

gcc/testsuite/ChangeLog:

	PR target/105197
	* gcc.target/aarch64/sve/pr105197-1.c: New test.
	* gcc.target/aarch64/sve/pr105197-2.c: New test.
2022-04-11 15:09:05 +01:00
Jason Merrill
790b02af6a c++: -Wplacement-new and anon union member [PR100370]
This bug was an object/value confusion; we are interested in the size
of *b.ip, but instead the code was calculating the size of b.ip itself.

This seems to be because compute_objsize will compute the size of whatever
object it can find in the argument: if you pass it a VAR_DECL, it gives you
the size of that variable.  If you pass it an ADDR_EXPR of a VAR_DECL, it
again gives you the size of the variable.  The way you can tell the
difference is by looking at the deref member of access_ref: if it's -1, the
argument is a pointer to the object.  Since that's what we're interested in,
we should check for that, like check_dangling_stores does.

This regressed some tests because compute_objsize_r was wrongly zeroing
deref in the POINTER_PLUS_EXPR handling; adding an offset to a pointer
doesn't change whether the pointer is itself a variable or a pointer to
one.  In fact, handling POINTER_PLUS_EXPR only really makes sense for deref
== -1, where we're adjusting a pointer to the variable.

	PR c++/100370

gcc/cp/ChangeLog:

	* init.cc (warn_placement_new_too_small): Check deref.

gcc/ChangeLog:

	* pointer-query.cc (compute_objsize_r) [POINTER_PLUS_EXPR]: Require
	deref == -1.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Wplacement-new-size-11.C: New test.
2022-04-11 08:37:03 -04:00
Jakub Jelinek
a42aa68bf1 phiopt: Optimize (x != cst1 ? x : cst2) != cst3 [PR104639]
Here is an attempt to resolve a P1 regression, where due to threading
changes we no longer optimize
bool foo(int i) {
    while (i == 4)
        i += 2;
    return i;
}
to just return i != 0; by enhancing the phiopt value_replacement
optimization.  Normally it will optimize x != cst1 ? x : cst1 to x.
Here we extend it to also optimize x != cst1 ? x : cst2 to x if
it (phi result) has a single immediate use which is a comparison
with some INTEGER_CST cst3 and we can prove that we don't care
whether x is cst1 or cst2 because both compare the same against cst3.

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

	PR tree-optimization/104639
	* tree-ssa-phiopt.cc: Include tree-ssa-propagate.h.
	(value_replacement): Optimize (x != cst1 ? x : cst2) != cst3
	into x != cst3.

	* gcc.dg/tree-ssa/pr104639-1.c: New test.
	* gcc.dg/tree-ssa/pr104639-2.c: New test.
2022-04-11 10:44:28 +02:00
Jakub Jelinek
083e8e66d2 c-family: Initialize ridpointers for __int128 etc. [PR105186]
The following testcase ICEs with C++ and is incorrectly rejected with C.
The reason is that both FEs use ridpointers identifiers for CPP_KEYWORD
and value or u.value for CPP_NAME e.g. when parsing attributes or OpenMP
directives etc., like:
         /* Save away the identifier that indicates which attribute
            this is.  */
         identifier = (token->type == CPP_KEYWORD)
           /* For keywords, use the canonical spelling, not the
              parsed identifier.  */
           ? ridpointers[(int) token->keyword]
           : id_token->u.value;

         identifier = canonicalize_attr_name (identifier);
I've tried to change those to use ridpointers only if non-NULL and otherwise
use the value/u.value even for CPP_KEYWORDS, but that was a large 10 hunks
patch.

The following patch instead just initializes ridpointers for the __intNN
keywords.  It can't be done earlier before we record_builtin_type as there
are 2 different spellings and if we initialize those ridpointers early, the
second record_builtin_type fails miserably.

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

	PR c++/105186
	* c-common.cc (c_common_nodes_and_builtins): After registering __int%d
	and __int%d__ builtin types, initialize corresponding ridpointers
	entry.

	* c-c++-common/pr105186.c: New test.
2022-04-11 10:41:07 +02:00
Jeff Law
8d331aab65 [committed] Minor bfin codegen bugfix
gcc/
	* config/bfin/bfin.md (rol_one): Fix pattern to indicate the
	sign bit of the source ends up in CC.
2022-04-10 23:02:48 -04:00
Kewen Lin
3ac111372e rs6000/test: Adjust p9-vec-length-{full,epil}-7.c [PR103196]
As PR103196 shows, complete unrolling pass still takes effect even
if we have specified the option "-fno-unroll-loops".  The loops in
that case are not expected to be transformed by it, otherwise the
expected counts change.  This patch is to add the disabling option
to make them not sensitive to complete unrolling.

	PR testsuite/103196

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/p9-vec-length-epil-7.c: Add option
	-fdisable-tree-cunroll.
	* gcc.target/powerpc/p9-vec-length-full-7.c: Likewise.
2022-04-10 21:50:44 -05:00
GCC Administrator
a1950f5282 Daily bump. 2022-04-11 00:16:26 +00:00
Harald Anlauf
54c5e064cc Fortran: fix checking of coshape specification in ALLOCATE statement
gcc/fortran/ChangeLog:

	PR fortran/105184
	* array.cc (match_subscript): Reject assumed size coarray
	specification with missing lower bound.
	* resolve.cc (resolve_allocate_expr): Fix logic for checking
	allocate-coshape-spec in ALLOCATE statement.

gcc/testsuite/ChangeLog:

	PR fortran/105184
	* gfortran.dg/coarray_44.f90: Adjust expected output.
	* gfortran.dg/coarray_allocate_11.f90: Likewise.
	* gfortran.dg/coarray_allocate_12.f90: New test.
2022-04-10 20:20:53 +02:00
GCC Administrator
71cac7de8f Daily bump. 2022-04-10 00:16:34 +00:00
David Malcolm
3d41408c5d analyzer: fix folding of regions involving unknown ptrs [PR103892]
PR analyzer/103892 reports a false positive from -Wanalyzer-double-free.

The root cause is the analyzer failing to properly handle "unknown"
symbolic regions, and thus confusing two different expressions.

Specifically, the analyzer eventually hits the complexity limit for
symbolic values, and starts using an "unknown" svalue for a pointer.
The analyzer uses
  symbolic_region(unknown_svalue([of ptr type]))
i.e.
  (*UNKNOWN_PTR)
in a few places to mean "we have an lvalue, but we're not going to
attempt to track what it is anymore".

"Unknown" should probably be renamed to "unknowable"; in theory, any
operation on such an unknown svalue should be also an unknown svalue.

The issue is that in various places where we create child regions, we
were failing to check for the parent region being (*UNKNOWN_PTR), and so
were erroneously creating regions based on (*UNKNOWN_PTR), such as
*(UNKNOWN_PTR + OFFSET).  The state-machine handling was erroneously
allowing e.g. INITIAL_VALUE (*(UNKNOWN_PTR + OFFSET)) to have state,
and thus we could record that such a value had had "free" called on it,
and thus eventually false report a double-free when a different
expression incorrectly "simplified" to the same expression.

This patch fixes things by checking when creating the various kinds of
child region for (*UNKNOWN_PTR) as the parent region, and simply
returning another (*UNKNOWN_PTR) for such child regions (using the
appropriate type).

Doing so fixes the false positive, and also fixes a state explosion on
this testcase, as the states at the program points more rapidly reach
a fixed point where everything is unknown.  I checked for other cases
that no longer needed -Wno-analyzer-too-complex; the only other one
seems to be gcc.dg/analyzer/pr96841.c, but that seems to already have
become redundant at some point before this patch.

gcc/analyzer/ChangeLog:
	PR analyzer/103892
	* region-model-manager.cc
	(region_model_manager::get_unknown_symbolic_region): New,
	extracted from...
	(region_model_manager::get_field_region): ...here.
	(region_model_manager::get_element_region): Use it here.
	(region_model_manager::get_offset_region): Likewise.
	(region_model_manager::get_sized_region): Likewise.
	(region_model_manager::get_cast_region): Likewise.
	(region_model_manager::get_bit_range): Likewise.
	* region-model.h
	(region_model_manager::get_unknown_symbolic_region): New decl.
	* region.cc (symbolic_region::symbolic_region): Handle sval_ptr
	having NULL type.
	(symbolic_region::dump_to_pp): Handle having NULL type.

gcc/testsuite/ChangeLog:
	PR analyzer/103892
	* gcc.dg/analyzer/pr103892.c: New test.
	* gcc.dg/analyzer/pr96841.c: Drop redundant
	-Wno-analyzer-too-complex.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-04-09 18:12:57 -04:00
Jan Hubicka
4943b75e9f Update semantic_interposition flag at analysis time
This patch solves problem with FE first finalizing function and then adding
-fno-semantic-interposition flag (by parsing optimization attribute).

gcc/ChangeLog:

2022-04-09  Jan Hubicka  <hubicka@ucw.cz>

	PR ipa/103376
	* cgraphunit.cc (cgraph_node::analyze): update semantic_interposition
	flag.

gcc/testsuite/ChangeLog:

2022-04-09  Jan Hubicka  <hubicka@ucw.cz>

	PR ipa/103376
	* gcc.c-torture/compile/pr103376.c: New test.
2022-04-09 21:22:58 +02:00
Jan Hubicka
aabb9a261e Propagate nondeterministic and side_effects flags in modref summary after inlining
gcc/ChangeLog:

2022-04-09  Jan Hubicka  <hubicka@ucw.cz>

	* ipa-modref.cc (ipa_merge_modref_summary_after_inlining): Propagate
	nondeterministic and side_effects flags.

gcc/testsuite/ChangeLog:

2022-04-09  Jan Hubicka  <hubicka@ucw.cz>

	* gcc.dg/ipa/pr105160.c: New test.
2022-04-09 21:07:07 +02:00
Xi Ruoyao
c8f7324e81
loongarch: testsuite: adapt stack-usage-1.c for LP64
LoongArch backend allocates two additional 8-byte stack slots for LP64,
one for saving $fp and another for saving the temporary value "1".
Ideally they are both unneeded, but (1) we're using -O0 so the code is
suboptimized by the nature; (2) any improvement (if possible) should be
deferred to GCC 13.  So for now simply adjust the test to make it pass.

gcc/testsuite/

	* gcc.dg/stack-usage-1.c: Adjust for LoongArch LP64.
2022-04-09 19:41:53 +08:00
Xi Ruoyao
6e34507862
loongarch: testsuite: skip builtin-apply2.c
On LoongArch, variadic functions use different arugment passing
conventions so this test is not valid (see the section named "Variadic
argument" in the [ELF ABI][1]) and should be skipped.

[1]: https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html

gcc/testsuite/

	* gcc.dg/builtin-apply2.c (dg-skip-if): Add loongarch*-*-*.
2022-04-09 19:41:53 +08:00
Jason Merrill
4822108e61 c++: constexpr non-trivial aggregate init [PR105191]
My patch for PR92385 made us use VEC_INIT_EXPR for aggregate initialization
of an array where some elements are not explicitly initialized.  Constexpr
handling of that was treating initialization from {} as equivalent to
value-initialization, which is problematic for classes with default member
initializers that make the default constructor non-trivial; in older
standard modes, not initializing all members makes a constructor
non-constexpr, but aggregate initialization is fine.

	PR c++/105191
	PR c++/92385

gcc/cp/ChangeLog:

	* tree.cc (build_vec_init_elt): Do {}-init for aggregates.
	* constexpr.cc (cxx_eval_vec_init): Only treat {} as value-init
	for non-aggregate types.
	(build_vec_init_expr): Also check constancy of explicit
	initializer elements.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/constexpr-array28.C: New test.
2022-04-08 23:25:54 -04:00
Jason Merrill
58586721c7 c++: friend implicit template instantiation [PR91618]
This rule that for a friend with a qualified name we try to find a
matching template was already in C++98, but it seems we never implemented
it, and nobody reported it until 2019.

This patch sets DECL_IMPLICIT_INSTANTIATION to signal to
check_explicit_specialization that we want to find a template, like
grokfndecl already did for explicit template args.  check_classfn also needs
to call it, as check_classfn is called after the call to
check_explicit_specialization in grokfndecl, whereas the call to
set_decl_namespace comes sooner.  This inconsistency is inelegant, but safer
at this point in the release cycle; I'll unify them in stage 1.

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

gcc/cp/ChangeLog:

	* name-lookup.cc (set_decl_namespace): Set
	DECL_IMPLICIT_INSTANTIATION if no non-template match.
	* pt.cc (check_explicit_specialization): Check it.
	* decl2.cc (check_classfn): Call it.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/friend7.C: Remove xfail.
	* g++.dg/template/friend72.C: New test.
	* g++.dg/template/friend72a.C: New test.
	* g++.dg/template/friend73.C: New test.
2022-04-08 21:50:46 -04:00
GCC Administrator
405eda0d34 Daily bump. 2022-04-09 00:16:56 +00:00
Jonathan Wakely
7b4495d3c4 libstdc++: Fix constraints on std::expected<void, E> constructor [PR105153]
libstdc++-v3/ChangeLog:

	PR libstdc++/105153
	* include/std/expected
	(expected<void,E>::expected(expected<U,G>&&)): Fix constraints.
	* testsuite/20_util/expected/cons.cc: Check constructor.
2022-04-08 18:30:07 +01:00
Jonathan Wakely
0dfaf56252 libstdc++: Fix std::expected<void, E>::swap(expected&) [PR105154]
libstdc++-v3/ChangeLog:

	PR libstdc++/105154
	* include/std/expected (expected<void, E>::swap): Set
	_M_has_value to false for objects that previously had a value.
	* testsuite/20_util/expected/swap.cc: Fix test to check void
	specialization.
2022-04-08 18:30:06 +01:00
Jonathan Wakely
29e355d0d6 libstdc++: Fix std::bad_expected_access constructor [PR105146]
libstdc++-v3/ChangeLog:

	PR libstdc++/105146
	* include/std/expected (bad_expected_access): Move constructor
	parameter.
	* testsuite/20_util/expected/bad.cc: New test.
2022-04-08 18:30:06 +01:00
Andre Vieira
5522dec054 aarch64: PR target/105157 Increase number of cores TARGET_CPU_DEFAULT can encode
This addresses the compile-time increase seen in the PR target/105157. This was
being caused by selecting the wrong core tuning, as when we added the latest
AArch64 the TARGET_CPU_generic tuning was pushed beyond the 0x3f mask we used
to encode both target cpu and attributes into TARGET_CPU_DEFAULT.

gcc/ChangeLog:

	PR target/105157
	* config.gcc: Shift ext_mask by TARGET_CPU_NBITS.
	* config/aarch64/aarch64.h (TARGET_CPU_NBITS): New macro.
	(TARGET_CPU_MASK): Likewise.
	(TARGET_CPU_DEFAULT): Use TARGET_CPU_NBITS.
	* config/aarch64/aarch64.cc (aarch64_get_tune_cpu): Use TARGET_CPU_MASK.
	(aarch64_get_arch): Likewise.
	(aarch64_override_options): Use TARGET_CPU_NBITS.
2022-04-08 15:12:23 +01:00
Richard Biener
e5453bcc21 tree-optimization/105198 - wrong code with predictive commoning
When predictive commoning looks for a looparound PHI it tries
to match the entry value definition (a load) up with the appropriate
member of the chain.  But it fails to consider stmts clobbering
the very same memory location inbetween the load and loop entry.

In theory we could be more clever on must aliases that would be
also picked up from a load (so not exactly stmt_kills_ref_p) and
use the stored value from that if it is an exact match.  But we
currently have no way to propagate this information inside predcom.

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

	PR tree-optimization/105198
	* tree-predcom.cc (find_looparound_phi): Check whether
	the found memory location of the entry value is clobbered
	inbetween the value we want to use and loop entry.

	* gcc.dg/torture/pr105198.c: New testcase.
2022-04-08 14:18:31 +02:00
Jakub Jelinek
04ecadbeae testsuite: Fix up 20050113-1.c test for i686-linux [PR105187]
The test FAILs on i686-linux if neither MMX isn't enabled, can be also
reproduced with
make check-gcc check-g++ RUNTESTFLAGS='--target_board=unix/-m32/-mno-mmx/-mno-sse dg-torture.exp=20050113-1.c'
on x86_64-linux.  Previously the test was in gcc.c-torture/compile/
where -w is added by default.

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

	PR c++/105187
	* c-c++-common/torture/20050113-1.c: Add dg-additional-options
	-Wno-psabi.
2022-04-08 09:51:02 +02:00
Jakub Jelinek
6e27436872 c: Error on va_arg with function type [PR105149]
In the PR Joseph said that the C standard for va_arg talks about
pointers to object type and as a function type is not object type,
it is invalid.

The following patch diagnoses it in the FE, instead of ICEing later on
when optimizations are turned on (and with -O0 doing something weird
at runtime).

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

	PR c/105149
	* c-typeck.cc (c_build_va_arg): Reject function types.

	* gcc.dg/pr105149.c: New test.
2022-04-08 09:16:30 +02:00
Jakub Jelinek
5e6597064b fold-const: Fix up make_range_step [PR105189]
The following testcase is miscompiled, because fold_truth_andor
incorrectly folds
(unsigned) foo () >= 0U && 1
into
foo () >= 0
For the unsigned comparison (which is useless in this case,
as >= 0U is always true, but hasn't been folded yet), previous
make_range_step derives exp (unsigned) foo () and +[0U, -]
range for it.  Next we process the NOP_EXPR.  We have special code
for unsigned to signed casts, already earlier punt if low or high
aren't representable in arg0_type or if it is a narrowing conversion.
For the signed to unsigned casts, I think if high is specified we
are still fine, as we punt for non-representable values in arg0_type,
n_high is then still representable and so was smaller or equal to
signed maximum and either low is not present (equivalent to 0U), or
low must be smaller or equal to high and so for unsigned exp
+[low, high] the signed exp +[n_low, n_high] will be correct.
Similarly, if both low and high aren't specified (always true or
always false), it is ok too.
But if we have for unsigned exp +[low, -] or -[low, -], using
+[n_low, -] or -[n_high, -] is incorrect.  Because low is smaller
or equal to signed maximum and high is unspecified (i.e. unsigned
maximum), when signed that range is a union of +[n_low, -] and
+[-, -1] which is equivalent to -[0, n_low-1], unless low
is 0, in that case we can treat it as [-, -].

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

	PR tree-optimization/105189
	* fold-const.cc (make_range_step): Fix up handling of
	(unsigned) x +[low, -] ranges for signed x if low fits into
	typeof (x).

	* g++.dg/torture/pr105189.C: New test.
2022-04-08 09:14:44 +02:00
Sergei Trofimovich
cef0372823 libgcc: IA64: don't compile glibc-based unwinder without libc headers
In --without-headers mode gcc fails to bootstrap on libgcc as:

    /build/build/./gcc/xgcc -B/build/build/./gcc/ ... -Dinhibit_libc -c fde-glibc.c
    ../../../gcc-12-20220403/libgcc/config/ia64/fde-glibc.c:33:10:
        fatal error: stdlib.h: No such file or directory

Most other linux targets are able to build the --without-headers
compiler without additional effort. This change adds IA64 to the fold.

The change drops part of the code that relies on DYNAMIC glibc
section traversal for backtraces.

Tested bootstrap of ia64-unknown-linux-gnu with and without libc
headers present.

libgcc/
	* config/ia64/fde-glibc.c: Make a no-op in inhibit_libc mode.
2022-04-08 08:01:06 +01:00
Richard Biener
b789c44c64 tree-optimization/105175 - avoid -Wvector-operation-performance
This avoids -Wvector-operation-performance diagnostics for vectorizer
produced code.  It's unfortunate the warning_at code in
tree-vect-generic.cc needs adjustments but the diagnostic suppression
code doesn't magically suppress those otherwise.

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

	PR tree-optimization/105175
	* tree-vect-stmts.cc (vectorizable_operation): Suppress
	-Wvector-operation-performance if using emulated vectors.
	* tree-vect-generic.cc (expand_vector_piecewise): Do not diagnose
	-Wvector-operation-performance when suppressed.
	(expand_vector_parallel): Likewise.
	(expand_vector_comparison): Likewise.
	(expand_vector_condition): Likewise.
	(lower_vec_perm): Likewise.
	(expand_vector_conversion): Likewise.

	* gcc.dg/pr105175.c: New testcase.
2022-04-08 08:34:06 +02:00
GCC Administrator
df00d10320 Daily bump. 2022-04-08 00:16:21 +00:00
Michael Meissner
45fb78c9c4 Disable float128 tests on VxWorks, PR target/104253.
In PR target/104253, it was pointed out the that test case added as part
of fixing the PR does not work on VxWorks because float128 is not
supported on that system.  I have modified the three tests for float128 so
that they are manually excluded on VxWorks systems.  In looking at the
code, I also added checks in check_effective_target_ppc_ieee128_ok to
disable the systems that will never support VSX instructions which are
required for float128 support (eabi, eabispe, darwin).

2022-04-07   Michael Meissner  <meissner@linux.ibm.com>

gcc/testsuite/
	PR target/104253
	* lib/target-supports.exp (check_ppc_float128_sw_available): Do
	not run float128 tests on VxWorks.
	(check_ppc_float128_hw_available): Likewise.
	(check_effective_target_ppc_ieee128_ok): Likewise.
2022-04-07 18:25:17 -04:00
Patrick Palka
7e7a96f774 c++: use after free during name lookup w/ modules [PR99479]
name_lookup::search_unqualified uses a statically allocated vector
in order to avoid repeated reallocation, under the assumption that
the function can't be called recursively.  With modules however,
this assumption turns out to be false, and search_unqualified can
be called recursively as demonstrated by the testcase in comment #19
of PR99479[1] where the recursive call causes the vector to get
reallocated which invalidates the reference to queue[ix] held by the
parent call.

This patch makes search_unqualified instead use an auto_vec with 16
elements of internal storage.  In turn we can simplify the API of some
member functions to take the vector by reference and return void.

[1]: https://gcc.gnu.org/PR99479#c19

	PR c++/99479

gcc/cp/ChangeLog:

	* name-lookup.cc (name_lookup::using_queue): Change to an
	auto_vec (with 16 elements of internal storage).
	(name_lookup::queue_namespace): Change return type to void,
	take queue parameter by reference and adjust function body
	accordingly.
	(name_lookup::do_queue_usings): Inline into ...
	(name_lookup::queue_usings): ... here.  As in queue_namespace.
	(name_lookup::search_unqualified): Don't make queue static,
	remove length variable, and adjust function body accordingly.
2022-04-07 16:09:52 -04:00
Tamar Christina
68163cc2de testsuite: delete slp scan from loop vect test.
I accidentally left in an slp1 check in the vect test which showed up as
UNRESOLVED and had missed it in the sum file.  This deletes that line.

gcc/testsuite/ChangeLog:

	PR testsuite/105196
	* gcc.dg/vect/complex/fast-math-complex-add-pattern-float.c: Remove slp1 check.
2022-04-07 19:53:43 +01:00
Tamar Christina
af3cadb59f AArch64: fix ls64 intrinsics expansion [PR104409]
The LS64 intrinsics used a machinery that's not safe to use unless being
called from a pragma instantiation.

This moves the initialization code to a new pragma for arm_acle.h.

gcc/ChangeLog:

	PR target/104409
	* config/aarch64/aarch64-builtins.cc (handle_arm_acle_h): New.
	(aarch64_general_init_builtins): Move LS64 code.
	* config/aarch64/aarch64-c.cc (aarch64_pragma_aarch64): Support
	arm_acle.h
	* config/aarch64/aarch64-protos.h (handle_arm_acle_h): New.
	* config/aarch64/arm_acle.h: Add pragma GCC aarch64 "arm_acle.h".
2022-04-07 16:48:05 +01:00
Richard Biener
8c0ebaf9f5 ipa/104303 - miscompilation of gnatmake
Modref attempts to track memory accesses relative to the base pointers
which are parameters of functions.
If it fails, it still makes difference between unknown memory access and
global memory access.  The second makes it possible to disambiguate with
memory that is not accessible from outside world (i.e. everything that does
not escape from the caller function).  This is useful so we do not punt
when unknown function is called.

The added ref_may_access_global_memory_p ends up using
ptr_deref_may_alias_global_p which does not consider escaped automatic
variables as global.  For modref those are still global since they
can be accessed from functions called.

The following adds a flag to the *_global_p APIs indicating whether
escaped local memory should be considered as global or not and
removes ref_may_access_global_memory_p in favor of using
ref_may_alias_global_p with the flag set to true.

2022-04-07  Richard Biener  <rguenther@suse.de>
	    Jan Hubicka  <hubicka@ucw.cz>

	PR ipa/104303
	* tree-ssa-alias.h (ptr_deref_may_alias_global_p,
	ref_may_alias_global_p, ref_may_alias_global_p,
	stmt_may_clobber_global_p, pt_solution_includes_global): Add
	bool parameters indicating whether escaped locals should be
	considered global.
	* tree-ssa-structalias.cc (pt_solution_includes_global):
	When the new escaped_nonlocal_p flag is true also consider
	pt->vars_contains_escaped.
	* tree-ssa-alias.cc (ptr_deref_may_alias_global_p):
	Pass down new escaped_nonlocal_p flag.
	(ref_may_alias_global_p): Likewise.
	(stmt_may_clobber_global_p): Likewise.
	(ref_may_alias_global_p_1): Likewise.  For decls also
	query the escaped solution if true.
	(ref_may_access_global_memory_p): Remove.
	(modref_may_conflict): Use ref_may_alias_global_p with
	escaped locals considered global.
	(ref_maybe_used_by_stmt_p): Adjust.
	* ipa-fnsummary.cc (points_to_local_or_readonly_memory_p):
	Likewise.
	* tree-ssa-dse.cc (dse_classify_store): Likewise.
	* trans-mem.cc (thread_private_new_memory): Likewise, but
	consider escaped locals global.
	* tree-ssa-dce.cc (mark_stmt_if_obviously_necessary): Likewise.

	* gnat.dg/concat5.adb: New.
	* gnat.dg/concat5_pkg1.adb: Likewise.
	* gnat.dg/concat5_pkg1.ads: Likewise.
	* gnat.dg/concat5_pkg2.adb: Likewise.
	* gnat.dg/concat5_pkg2.ads: Likewise.
2022-04-07 15:03:36 +02:00
David Malcolm
88b939b19a analyzer: fix leak false +ve with symbolic writes [PR102208]
PR analyzer/102208 reports false positives from -Wanalyzer-malloc-leak.
The root cause is the analyzer getting confused about symbolic writes
that could alias a pointer referencing a malloced buffer.

struct st
{
  void *ptr;
  int arr[10];
};

struct st test (int idx)
{
  struct st s;
  s.ptr = __builtin_malloc (1024);  /* (1) */
  s.arr[idx] = 42;                  /* (2) */
  return s;
}

When removing overlapping bindings at (2),
store::remove_overlapping_bindings was failing to pass on the
uncertainty_t *, and thus when clobbering the binding of s.ptr, the
heap-allocated pointer was not being added to the set of maybe-bound
svalues, and thus being treated as leaking.

This patch fixes this, so that s.ptr from (1) is treated as maybe-bound
after the write at (2), fixing the leak false postive.

Doing so requires the store to be smarter about how clobbering happens
with various combinations of concrete keys and symbolic keys within
concrete clusters and symbolic clusters, so that we don't lose warnings
about definite leaks.

gcc/analyzer/ChangeLog:
	PR analyzer/102208
	* store.cc (binding_map::remove_overlapping_bindings): Add
	"always_overlap" param, using it to generalize to the case where
	we want to remove all bindings.  Update "uncertainty" logic to
	only record maybe-bound values for cases where there is a symbolic
	write involved.
	(binding_cluster::mark_region_as_unknown): Split param "reg" into
	"reg_to_bind" and "reg_for_overlap".
	(binding_cluster::maybe_get_compound_binding): Pass "false" to
	binding_map::remove_overlapping_bindings new "always_overlap" param.
	(binding_cluster::remove_overlapping_bindings): Determine
	"always_overlap" and pass it to
	binding_map::remove_overlapping_bindings.
	(store::set_value): Pass uncertainty to remove_overlapping_bindings
	call.  Update for new param of
	binding_cluster::mark_region_as_unknown, passing both the base
	region of the iter_cluster, and the lhs_reg.
	(store::mark_region_as_unknown): Update for new param of
	binding_cluster::mark_region_as_unknown, passing "reg" for both.
	(store::remove_overlapping_bindings): Add param "uncertainty", and
	pass it on to call to
	binding_cluster::remove_overlapping_bindings.
	* store.h (binding_map::remove_overlapping_bindings): Add
	"always_overlap" param.
	(binding_cluster::mark_region_as_unknown): Split param "reg" into
	"reg_to_bind" and "reg_for_overlap".
	(store::remove_overlapping_bindings): Add param "uncertainty".

gcc/testsuite/ChangeLog:
	PR analyzer/102208
	* gcc.dg/analyzer/symbolic-9.c: New test.
	* gcc.dg/analyzer/torture/leak-pr102308-1.c: New test.
	* gcc.dg/analyzer/torture/leak-pr102308-2.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-04-07 08:33:26 -04:00
Richard Biener
27bfd13437 tree-optimization/105185 - simplify modref query in SCCVN
This simplifies the modref query for calls in SCCVN again after
r12-8019-g4be08315124281, avoiding an ICE when the modref
analyzed access lacks an actual argument on the caller side.
It effectively reverts r12-7531-gdc46350d44c294.

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

	PR tree-optimization/105185
	* tree-ssa-sccvn.cc (visit_reference_op_call): Simplify
	modref query again.

	* gcc.dg/torture/pr105185.c: New testcase.
2022-04-07 10:12:55 +02:00
Tamar Christina
024edf0895 AArch64: Fix left fold sum reduction RTL patterns [PR104049]
As the discussion in the PR pointed out the RTL we have for the REDUC_PLUS
patterns are wrong.  The UNSPECs are modelled as returning a vector and then
in an expand pattern we emit a vec_select of the 0th element to get the scalar.

This is incorrect as the instruction itself already only returns a single scalar
and by declaring it returns a vector it allows combine to push in a subreg into
the pattern, which causes reload to make duplicate moves.

This patch corrects this by removing the weird indirection and making the RTL
pattern model the correct semantics of the instruction immediately.

gcc/ChangeLog:

	PR target/104049
	* config/aarch64/aarch64-simd.md
	(aarch64_reduc_plus_internal<mode>): Fix RTL and rename to...
	(reduc_plus_scal_<mode>): ... This.
	(reduc_plus_scal_v4sf): Moved.
	(aarch64_reduc_plus_internalv2si): Fix RTL and rename to...
	(reduc_plus_scal_v2si): ... This.

gcc/testsuite/ChangeLog:

	PR target/104049
	* gcc.target/aarch64/vadd_reduc-1.c: New test.
	* gcc.target/aarch64/vadd_reduc-2.c: New test.
2022-04-07 08:27:53 +01:00
Tamar Christina
fdd81afcf1 testsuite: enable fast-math-complex-* testcases.
As pointed out in PR105095 these tests weren't running, mainly because the .exp
file contains a filter on the first character so it can distinguish between
fast-math-bb-slp-* and fast-math-*, my test started with `c` and so didn't get
found.

This patch adds `c` to the list of filters and also updates the output and
required guards for the testcases now that they run.

gcc/testsuite/ChangeLog:

	PR testsuite/105095
	* gcc.dg/vect/complex/fast-math-complex-add-double.c: Update for codegen.
	* gcc.dg/vect/complex/fast-math-complex-add-float.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-add-half-float.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-add-pattern-double.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-add-pattern-float.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-add-pattern-half-float.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-mla-half-float.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-mls-double.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-mls-float.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-mls-half-float.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-mul-double.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-mul-float.c: Likewise.
	* gcc.dg/vect/complex/fast-math-complex-mul-half-float.c: Likewise.
	* gcc.dg/vect/vect.exp: Add extra letter to filter.
2022-04-07 08:26:36 +01:00