Commit Graph

194549 Commits

Author SHA1 Message Date
Richard Biener
bd9837bc3c Teach VN about masked/len stores
The following teaches VN to handle reads from .MASK_STORE and
.LEN_STORE.  For this push_partial_def is extended first for
convenience so we don't have to handle the full def case in the
caller (possibly other paths can be simplified then).  Also
the partial definition stored value can have an offset applied
so we don't have to build a fake RHS when we register the pieces
of an existing store.

	PR tree-optimization/106365
	* tree-ssa-sccvn.cc (pd_data::rhs_off): New field determining
	the offset to start encoding of RHS from.
	(vn_walk_cb_data::vn_walk_cb_data): Initialize it.
	(vn_walk_cb_data::push_partial_def): Allow the first partial
	definition to be fully providing the def.  Offset RHS
	before encoding if requested.
	(vn_reference_lookup_3): Initialize def_rhs everywhere.
	Add support for .MASK_STORE and .LEN_STORE (partial) definitions.

	* gcc.target/i386/vec-maskstore-vn.c: New testcase.
2022-07-21 13:05:42 +02:00
Marc Poulhiès
f4ed610d02 MAINTAINERS: Add myself as Ada front end co-maintainer
Add myself as Ada front end co-maintainer.

ChangeLog:
	* MAINTAINERS: Add myself as Ada front end co-maintainer.
2022-07-21 11:05:17 +02:00
Richard Biener
6877993c4d Add alias disambiguation for vectorizer load/store IFNs
The following adds support for MASK_STORE, MASK_LOAD and friends
to call_may_clobber_ref_p and ref_maybe_used_by_call_p.  Since
they all use a special argument to specify TBAA they are not really
suited for fnspec handling thus the manual support.

	* tree-ssa-alias.cc (ref_maybe_used_by_call_p_1): Special-case
	store internal functions and IFN_MASK_LOAD, IFN_LEN_LOAD
	and IFN_MASK_LOAD_LANES.
	(call_may_clobber_ref_p_1): Special-case IFN_MASK_STORE,
	IFN_LEN_STORE and IFN_MASK_STORE_LANES.
2022-07-21 08:59:37 +02:00
David Malcolm
742377ed0f analyzer: bulletproof taint warnings against NULL m_arg
gcc/analyzer/ChangeLog:
	* sm-taint.cc (tainted_array_index::emit): Bulletproof against
	NULL m_arg.
	(tainted_array_index::describe_final_event): Likewise.
	(tainted_size::emit): Likewise.
	(tainted_size::describe_final_event): Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-20 21:34:17 -04:00
David Malcolm
a6c192e80a analyzer: fix ICE on untracked decl_regions [PR106374]
gcc/analyzer/ChangeLog:
	PR analyzer/106374
	* region.cc (decl_region::get_svalue_for_initializer): Bail out on
	untracked regions.

gcc/testsuite/ChangeLog:
	PR analyzer/106374
	* gcc.dg/analyzer/untracked-2.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-20 21:34:03 -04:00
GCC Administrator
e7dfd87445 Daily bump. 2022-07-21 00:16:34 +00:00
Jonathan Wakely
87a9bfe86d libstdc++: Fix std::common_iterator triviality [PR100823]
This fixes the remaining problem reported in the PR, that the special
members should be trivial.  This can be done by constraining the
non-trivial versions and adding defaulted overloads that will be used
when the union members are trivial.

Making these members trivial alters the argument passing ABI and so
isn't suitable for backporting to release branches.

libstdc++-v3/ChangeLog:

	PR libstdc++/100823
	* include/bits/stl_iterator.h (common_iterator): Define
	destructor, copy constructor and move constructor as trivial
	when the underlying types allow.
	* testsuite/24_iterators/common_iterator/100823.cc: Check
	triviality of special members.
2022-07-20 23:38:48 +01:00
Jonathan Wakely
56c999860b libstdc++: Fix std::common_iterator assignment [PR100823]
This fixes the following conformance problems reported in the PR:

- Move constructor and move assignment should be defined.
- Copy assignment from a valueless object should be allowed.

Assignment is completely rewritten by this patch, as the previous
version had a number of problems. The converting assignment failed to
handle the case of assigning a new value to a valueless object, which
should work. It only accepted lvalue arguments, so wasn't usable to
implement the move assignment operator. Finally, it enforced the
precondition that the argument is not valueless, which is correct for
the converting assignment but not for the copy assignment.

A new _M_assign member is added to handle all cases of assignment
(copying from an lvalue, moving from an rvalue, and converting from a
different type). The not valueless precondition is checked in the
converting assignment before calling _M_assign, so isn't enforced for
copy and move assignment. The new function no longer uses a switch, so
handles valueless objects as the LHS or RHS of the assignment.

libstdc++-v3/ChangeLog:

	PR libstdc++/100823
	* include/bits/stl_iterator.h (common_iterator): Define move
	constructor and move assignment operator.
	(common_iterator::_M_assign): New function implementing
	assignment.
	(common_iterator::operator=): Use _M_assign.
	(common_iterator::_S_valueless): New constant.
	* testsuite/24_iterators/common_iterator/100823.cc: New test.
2022-07-20 23:38:37 +01:00
Jonathan Wakely
3b5567c3ec libstdc++: Fix minor bugs in std::common_iterator
The noexcept-specifier for some std::common_iterator constructors was
incorrectly using an rvalue as the first argument of
std::is_nothrow_assignable_v. This gave the wrong answer for some types,
e.g. std::common_iterator<int*, S>, because an rvalue of scalar type
cannot be assigned to.

Also fix the friend declaration to use the same constraints as on the
definition of the class template. G++ fails to diagnose this error, due
to PR c++/96830.

Finally, the copy constructor was using std::move for its argument
in some cases, which should be removed.

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (common_iterator): Fix incorrect
	uses of is_nothrow_assignable_v. Fix inconsistent constraints on
	friend declaration. Do not move argument in copy constructor.
	* testsuite/24_iterators/common_iterator/1.cc: Check for
	noexcept constructibnle/assignable.
2022-07-20 23:34:20 +01:00
David Malcolm
5e830693dd analyzer: update "tainted" state of RHS in comparisons [PR106373]
Doing so fixes various false positives from
-Wanalyzer-tainted-array-index at -O1 and above (e.g. seen on the
Linux kernel)

gcc/analyzer/ChangeLog:
	PR analyzer/106373
	* sm-taint.cc (taint_state_machine::on_condition): Potentially
	update the state of the RHS as well as the LHS.

gcc/testsuite/ChangeLog:
	PR analyzer/106373
	* gcc.dg/analyzer/torture/taint-read-index-3.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-20 17:25:35 -04:00
Harald Anlauf
26bbe78f77 Fortran: fix parsing of omp task affinity iterator clause [PR101330]
gcc/fortran/ChangeLog:

	PR fortran/101330
	* openmp.cc (gfc_match_iterator): Remove left-over code from
	development that could lead to a crash on invalid input.

gcc/testsuite/ChangeLog:

	PR fortran/101330
	* gfortran.dg/gomp/affinity-clause-7.f90: New test.
2022-07-20 20:40:23 +02:00
Alexander Monakov
daa36cfc2f Avoid registering __builtin_setjmp_receiver label twice [PR101347]
The testcase in the PR demonstrates how it is possible for one
__builtin_setjmp_receiver label to appear in
nonlocal_goto_handler_labels list twice (after the block with
__builtin_setjmp_setup referring to it was duplicated).

remove_node_from_insn_list did not account for this possibility and
removed only the first copy from the list. Add an assert verifying that
duplicates are not present.

To avoid adding a label to the list twice, move registration of the
label from __builtin_setjmp_setup handling to __builtin_setjmp_receiver.

gcc/ChangeLog:

	PR rtl-optimization/101347
	* builtins.cc (expand_builtin) [BUILT_IN_SETJMP_SETUP]: Move
	population of nonlocal_goto_handler_labels from here ...
	(expand_builtin) [BUILT_IN_SETJMP_RECEIVER]: ... to here.
	* rtlanal.cc (remove_node_from_insn_list): Verify that a
	duplicate is not present in the remainder of the list.
2022-07-20 16:12:34 +03:00
Alexander Monakov
8694390e2b Remove unused remove_node_from_expr_list
This function remains unused since remove_node_from_insn_list was cloned
from it.

gcc/ChangeLog:

	* rtl.h (remove_node_from_expr_list): Remove declaration.
	* rtlanal.cc (remove_node_from_expr_list): Remove (no uses).
2022-07-20 16:10:29 +03:00
Richard Biener
5f59d0f2d9 Improve SLP codegen, avoiding unnecessary TREE_ADDRESSABLE
The following adjusts vectorizer code generation to avoid splitting
out address increments for invariant addresses which causes objects
to get TREE_ADDRESSABLE when not necessary.

	* tree-vect-data-refs.cc (bump_vector_ptr): Return an
	invariant updated address when the input was invariant.
2022-07-20 14:05:07 +02:00
liuhongt
78d5e125c0 Move pass_cse_sincos after vectorizer.
__builtin_cexpi can't be vectorized since there's gap between it and
vectorized sincos version(In libmvec, it passes a double and two
double pointer and returns nothing.) And it will lose some
vectorization opportunity if sin & cos are optimized to cexpi before
vectorizer.

I'm trying to add vect_recog_cexpi_pattern to split cexpi to sin and
cos, but it failed vectorizable_simd_clone_call since NULL is returned
by cgraph_node::get (fndecl).  So alternatively, the patch try to move
pass_cse_sincos after vectorizer, just before pas_cse_reciprocals.

Also original pass_cse_sincos additionaly expands pow&cabs, this patch
split that part into a separate pass named pass_expand_powcabs which
remains the old pass position.

gcc/ChangeLog:

	* passes.def: (Split pass_cse_sincos to pass_expand_powcabs
	and pass_cse_sincos, and move pass_cse_sincos after vectorizer).
	* timevar.def (TV_TREE_POWCABS): New timevar.
	* tree-pass.h (make_pass_expand_powcabs): Split from pass_cse_sincos.
	* tree-ssa-math-opts.cc (gimple_expand_builtin_cabs): Ditto.
	(class pass_expand_powcabs): Ditto.
	(pass_expand_powcabs::execute): Ditto.
	(make_pass_expand_powcabs): Ditto.
	(pass_cse_sincos::execute): Remove pow/cabs expand part.
	(make_pass_cse_sincos): Ditto.

gcc/testsuite/ChangeLog:

	* gcc.dg/pow-sqrt-synth-1.c: Adjust testcase.
2022-07-20 16:11:21 +08:00
liuhongt
f9d4c3b45c Lower complex type move to enable vectorization for complex type load&store.
2022-07-20  Richard Biener  <richard.guenther@gmail.com>
	    Hongtao Liu  <hongtao.liu@intel.com>

gcc/ChangeLog:

	PR tree-optimization/106010
	* tree-complex.cc (init_dont_simulate_again): Lower complex
	type move.
	(expand_complex_move): Also expand COMPLEX_CST for rhs.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr106010-1a.c: New test.
	* gcc.target/i386/pr106010-1b.c: New test.
	* gcc.target/i386/pr106010-1c.c: New test.
	* gcc.target/i386/pr106010-2a.c: New test.
	* gcc.target/i386/pr106010-2b.c: New test.
	* gcc.target/i386/pr106010-2c.c: New test.
	* gcc.target/i386/pr106010-3a.c: New test.
	* gcc.target/i386/pr106010-3b.c: New test.
	* gcc.target/i386/pr106010-3c.c: New test.
	* gcc.target/i386/pr106010-4a.c: New test.
	* gcc.target/i386/pr106010-4b.c: New test.
	* gcc.target/i386/pr106010-4c.c: New test.
	* gcc.target/i386/pr106010-5a.c: New test.
	* gcc.target/i386/pr106010-5b.c: New test.
	* gcc.target/i386/pr106010-5c.c: New test.
	* gcc.target/i386/pr106010-6a.c: New test.
	* gcc.target/i386/pr106010-6b.c: New test.
	* gcc.target/i386/pr106010-6c.c: New test.
	* gcc.target/i386/pr106010-7a.c: New test.
	* gcc.target/i386/pr106010-7b.c: New test.
	* gcc.target/i386/pr106010-7c.c: New test.
	* gcc.target/i386/pr106010-8a.c: New test.
	* gcc.target/i386/pr106010-8b.c: New test.
	* gcc.target/i386/pr106010-8c.c: New test.
	* gcc.target/i386/pr106010-9a.c: New test.
	* gcc.target/i386/pr106010-9b.c: New test.
	* gcc.target/i386/pr106010-9c.c: New test.
	* gcc.target/i386/pr106010-9d.c: New test.
2022-07-20 16:06:25 +08:00
David Malcolm
68871a008e analyzer: don't track string literals in the store [PR106359]
Doing so speeds up -fanalyzer from taking over 4 hours to under a
minute on the Linux kernel's sound/soc/codecs/cs47l90.c

gcc/analyzer/ChangeLog:
	PR analyzer/106359
	* region.h (string_region::tracked_p): New.
	* store.cc (binding_cluster::binding_cluster): Move here from
	store.h.  Add assertion that base_region is tracked_p.
	* store.h (binding_cluster::binding_cluster): Move to store.cc.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-19 20:22:18 -04:00
GCC Administrator
7c0c10db24 Daily bump. 2022-07-20 00:16:34 +00:00
Andrew MacLeod
dbb093f4f1 Resolve complicated join nodes in range_from_dom.
Join nodes which carry outgoing ranges on incoming edges are uncommon,
but can still be resolved by setting the dominator range, and then
calculating incoming edges.  Avoid doing so if one of the incoing edges
is not dominated by the same dominator.

	* gimple-range-cache.cc (ranger_cache::range_from_dom): Check
	  for incoming ranges on join nodes and add to worklist.
2022-07-19 18:05:49 -04:00
Andrew MacLeod
b0cc57cd76 Remove recursion from range_from_dom.
Avoid calling range_of_dom recursively by putting all nodes to be
calculated on the worklist, and figure out which kind they are
when removed from the list.

	* gimple-range-cache.cc (ranger_cache::resolve_dom): New.
	(ranger_cache::range_from_dom): Put all nodes to be calculated
	in the worklist and resolve after the dom walk.
	* gimple-range-cache.h (resolve_dom): New prototype.
2022-07-19 18:05:49 -04:00
Harald Anlauf
f838d15641 Fortran: error recovery on invalid array reference of non-array [PR103590]
gcc/fortran/ChangeLog:

	PR fortran/103590
	* resolve.cc (find_array_spec): Change function result to bool to
	enable error recovery.  Generate error message for invalid array
	reference of non-array entity instead of an internal error.
	(gfc_resolve_ref): Use function result from find_array_spec for
	error recovery.

gcc/testsuite/ChangeLog:

	PR fortran/103590
	* gfortran.dg/associate_54.f90: Adjust.
	* gfortran.dg/associate_59.f90: New test.
2022-07-19 23:25:08 +02:00
François Dumont
c66dc02384 libstdc++: Complete __gnu_debug::string Standard conformity
Add testsuite/testsuite_string.h header to help testing __gnu_debug::basic_string like
std::basic_string depending on _GLIBCXX_DEBUG.

Add using of base type methods in __gnu_debug::basic_string to make use of the method
overloads when there is no debug version.

Fix _GLIBCXX_DEBUG_PEDANTIC assertions in <debug/string>. This header has to be used directly
like __gnu_debug::string, it is not included by _GLIBCXX_DEBUG. It means that
_GLIBCXX_DEBUG_PEDANTIC is not considered to define __glibcxx_check_string and
__glibcxx_check_string_len which are then empty macros. Now those macros are defined
directly in <debug/string> and properly consider _GLIBCXX_DEBUG_PEDANTIC.

libstdc++-v3/ChangeLog:

	* include/debug/debug.h [_GLIBCXX_DEBUG](__glibcxx_requires_string): Define
	using _GLIBCXX_DEBUG_PEDASSERT.
	[_GLIBCXX_DEBUG](__glibcxx_requires_string_len): Likewise.
	* include/debug/macros.h
	(__glibcxx_check_string, __glibcxx_check_string_len): Move...
	* include/debug/string
	(__glibcxx_check_string, __glibcxx_check_string_len): ...here. And define depending
	on _GLIBCXX_DEBUG_PEDANTIC no matter if _GLIBCXX_DEBUG is defined.
	Add using of std::string find, rfind, find_first_of, find_last_of, find_first_not_of
	and find_last_not_of. Remove debug implementations having no debug assertion.
	* testsuite/util/testsuite_string.h: New file. Provides __gnu_test::string and
	__gnu_test::wtring which definition depends on _GLIBCXX_DEBUG.
	* testsuite/21_strings/basic_string/debug/find1_neg.cc: New test case.
	* testsuite/21_strings/basic_string/debug/find2_neg.cc: New test case.
	* testsuite/21_strings/basic_string/operations/find/char/1.cc:
	Include <testsuite_string.h> and use __gnu_test::string.
	* testsuite/21_strings/basic_string/operations/find/char/2.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/char/3.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/char/4.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/char/5.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/char/6.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/wchar_t/1.cc:
	Include <testsuite_string.h> and use __gnu_test::wstring.
	* testsuite/21_strings/basic_string/operations/find/wchar_t/2.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/wchar_t/3.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/wchar_t/4.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/wchar_t/5.cc: Likewise.
	* testsuite/21_strings/basic_string/operations/find/wchar_t/6.cc: Likewise.
2022-07-19 20:07:28 +02:00
Patrick Palka
68f37670ef c++: shortcut bad reference binding [PR94894]
In case of l/rvalue or cv-qual mismatch during reference binding, we
try to give more helpful diagnostics by computing a bad conversion that
allows the mismatch.  But in doing so, we may end up considering and
instantiating a conversion function that could induce a hard error and
in turn cause us to reject otherwise valid code.  We could just give up
on producing a better diagnostic here, but ideally we'd preserve the
better diagnostics for invalid code while avoiding unnecessary template
instantiations for valid code.

To that end, this patch adapts the bad conversion shortcutting mechanism
from r12-3346-g47543e5f9d1fc5 to additionally handle this situation.
The main observation from there is that during overload resolution, if we
know we have a strictly viable candidate then we don't need to distinguish
between an unviable and non-strictly viable candidate.  Thus we don't
need to distinguish between an invalid and bad conversion either, which
is what this patch exploits.  Of course, we don't know whether we have a
strictly viable candidate until after the fact, so we still need to
remember when we deferred distinguishing between an invalid and bad
conversion.  This patch adds a special conversion kind ck_deferred_bad
for this purpose.

	PR c++/94894
	PR c++/105766
	PR c++/106201

gcc/cp/ChangeLog:

	* call.cc (enum conversion_kind): Add ck_deferred_bad enumerator.
	(has_next): Return false for it.
	(reference_binding): Return a ck_deferred_bad conversion instead
	of an actual bad conversion when LOOKUP_SHORTCUT_BAD_CONVS is set.
	Remove now obsolete early exit for the incomplete TO case.
	(implicit_conversion_1): Don't mask out LOOKUP_SHORTCUT_BAD_CONVS.
	(add_function_candidate): Set LOOKUP_SHORTCUT_BAD_CONVS iff
	shortcut_bad_convs.
	(missing_conversion_p): Also return true for a ck_deferred_bad
	conversion.
	* cp-tree.h (LOOKUP_SHORTCUT_BAD_CONVS): Define.

gcc/testsuite/ChangeLog:

	* g++.dg/conversion/ref8.C: New test.
	* g++.dg/conversion/ref9.C: New test.
2022-07-19 14:04:13 -04:00
Alexander Monakov
7a158a5776 tree-cfg: check placement of returns_twice calls
When a returns_twice call has an associated abnormal edge, the edge
corresponds to the "second return" from the call. It wouldn't make sense
if any executable statements appeared between the call and the
destination of the edge (they wouldn't be re-executed upon the "second
return"), so verify that.

gcc/ChangeLog:

	* tree-cfg.cc (gimple_verify_flow_info): Check placement of
	returns_twice calls.
2022-07-19 17:16:17 +03:00
Alexander Monakov
26cea5f108 tree-cfg: do not duplicate returns_twice calls
A returns_twice call may have associated abnormal edges that correspond
to the "second return" from the call. If the call is duplicated, the
copies of those edges also need to be abnormal, but e.g. tracer does not
enforce that. Just prohibit the (unlikely to be useful) duplication.

gcc/ChangeLog:

	* cfghooks.cc (duplicate_block): Expand comment.
	* tree-cfg.cc (gimple_can_duplicate_bb_p): Reject blocks with
	calls that may return twice.
2022-07-19 17:16:17 +03:00
Alexander Monakov
76c3f0dc2f tree-ssa-sink: do not sink to in front of setjmp
gcc/ChangeLog:

	* tree-ssa-sink.cc (select_best_block): Punt if selected block
	has incoming abnormal edges.

gcc/testsuite/ChangeLog:

	* gcc.dg/setjmp-7.c: New test.
2022-07-19 17:16:08 +03:00
Jonathan Wakely
465802c0d4 c++: Enable __has_builtin for new reference binding built-ins
The new built-ins need to be detectable using __has_builtin, and the
library should use that to check for them.

This fixes an error with Clang when C++23 is enabled.

gcc/cp/ChangeLog:

	* cp-objcp-common.cc (names_builtin_p): Return true for
	RID_REF_CONSTRUCTS_FROM_TEMPORARY and
	RID_REF_CONVERTS_FROM_TEMPORARY.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (__cpp_lib_reference_from_temporary)
	(reference_constructs_from_temporary)
	(reference_converts_from_temporary): Only define when the
	built-ins are available.
2022-07-19 15:12:27 +01:00
Alexander Monakov
4a8aab9a23 .gitignore: do not ignore config.h
GCC does not support in-tree builds at the moment, so .gitignore
concealing artifacts of accidental in-tree ./configure run may cause
confusion. Un-ignore config.h, which is known to break the build.

ChangeLog:

	* .gitignore: Do not ignore config.h.
2022-07-19 17:07:04 +03:00
Marco Falke
20ab397224 libstdc++: Make __from_chars_alnum_to_val conversion explicit
The optimizations from commit r12-8175-ga54137c88061c7 introduced a
clang integer sanitizer error.

Fix this with an explicit static_cast, similar to the fix for PR 96766.

libstdc++-v3/ChangeLog:

	* include/std/charconv (__from_chars_alnum_to_val): Replace
	implicit conversion from int to unsigned char with explicit
	cast.
2022-07-19 14:56:42 +01:00
David Malcolm
2c044ff123 analyzer: fix taint handling of switch statements [PR106321]
PR analyzer/106321 reports false positives from
-Wanalyzer-tainted-array-index on switch statements, seen e.g.
in the Linux kernel in drivers/vfio/pci/vfio_pci_core.c, where
vfio_pci_core_ioctl has:

    |  744 |                 switch (info.index) {
    |      |                 ~~~~~~  ~~~~~~~~~~
    |      |                 |           |
    |      |                 |           (8) ...to here
    |      |                 (9) following ‘case 0 ... 5:’ branch...
    |......
    |  751 |                 case VFIO_PCI_BAR0_REGION_INDEX ... VFIO_PCI_BAR5_REGION_INDEX:
    |      |                 ~~~~
    |      |                 |
    |      |                 (10) ...to here

and then a false complaint about "use of attacker-controlled value
‘info.index’ in array lookup without upper-bounds checking", where
info.index has clearly had its bounds checked by the switch/case.

It turns out that when I rewrote switch handling for the analyzer in
r12-3101-g8ca7fa84a3af35, I removed notifications to state machines
about the constraints on cases.

This patch fixes that oversight by adding a new on_bounded_ranges vfunc
for region_model_context, called on switch statement edges, which calls
a new state_machine vfunc.  It implements it for the "taint" state
machine, so that it updates the "has bounds" flags at out-edges for
switch statements, based on whether the bounds from the edge appear to
actually constrain the switch index.

gcc/analyzer/ChangeLog:
	PR analyzer/106321
	* constraint-manager.h (bounded_ranges::get_count): New.
	(bounded_ranges::get_range): New.
	* engine.cc (impl_region_model_context::on_bounded_ranges): New.
	* exploded-graph.h (impl_region_model_context::on_bounded_ranges):
	New decl.
	* region-model.cc (region_model::apply_constraints_for_gswitch):
	Potentially call ctxt->on_bounded_ranges.
	* region-model.h (region_model_context::on_bounded_ranges): New
	vfunc.
	(noop_region_model_context::on_bounded_ranges): New.
	(region_model_context_decorator::on_bounded_ranges): New.
	* sm-taint.cc: Include "analyzer/constraint-manager.h".
	(taint_state_machine::on_bounded_ranges): New.
	* sm.h (state_machine::on_bounded_ranges): New.

gcc/testsuite/ChangeLog:
	PR analyzer/106321
	* gcc.dg/analyzer/torture/taint-read-index-2.c: Add test coverage
	for switch statements.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-19 09:53:39 -04:00
David Malcolm
434d521d11 analyzer: log out-edge description in exploded_graph::process_node
I found this logging tweak very helpful when working on
PR analyzer/106284.

gcc/analyzer/ChangeLog:
	* engine.cc (exploded_graph::process_node): Show any description
	of the out-edge when logging it for consideration.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-19 09:53:39 -04:00
Martin Liska
edf0c132b1 Remote trailing : for subheading.
gcc/ChangeLog:

	* doc/extend.texi: Remove trailing :.
2022-07-19 15:41:10 +02:00
Prathamesh Kulkarni
4c32313025 forwprop: Use lhs type instead of arg0 in folding VEC_PERM_EXPR.
gcc/ChangeLog:

	* tree-ssa-forwprop.cc (simplify_permutation): Use lhs type
	instead of TREE_TYPE (arg0) as result type in folding VEC_PERM_EXPR.
2022-07-19 17:45:41 +05:30
Sebastian Huber
f082bc79c1 RTEMS: Remove HAVE_POLL for libstdc++
The poll() function is not always available in RTEMS.

libstdc++-v3/ChangeLog:

	* configure: Regnerate.
	* configure.ac (newlib, *-rtems*): Remove HAVE_POLL.
2022-07-19 14:10:26 +02:00
Richard Biener
e4ff11a8f2 middle-end/106331 - fix mem attributes for string op arguments
get_memory_rtx tries hard to come up with a MEM_EXPR to record
in the memory attributes but in the last fallback fails to properly
account for an unknown offset and thus, as visible in this testcase,
incorrect alignment computed from set_mem_attributes.  The following
rectifies both parts.

	PR middle-end/106331
	* builtins.cc (get_memory_rtx): Compute alignment from
	the original address and set MEM_OFFSET to unknown when
	we create a MEM_EXPR from the base object of the address.

	* gfortran.dg/pr106331.f90: New testcase.
2022-07-19 11:16:34 +02:00
Richard Biener
0f129766fd lto/106334 - relax assert during WPA tree merging
The dwarf2out map of tree to symbol + offset is populated too early
when streaming in trees so that when WPA tree merging decides to
recycle them the mapping prevails and if we are unlucky the same
address is used for another tree with a symbol + offset DIE to
record.  The following mitigates the resulting ICE by relaxing the
assert, allowing re-use of a slot during WPA.  Delaying the register
would be better but it's already somewhat hairy and uglifying this
further doesn't look too important right now.

	PR lto/106334
	* dwarf2out.cc (dwarf2out_register_external_die): Allow
	map entry re-use during WPA.
2022-07-19 11:16:27 +02:00
Roger Sayle
40f6e59122 PR c/106264: Silence warnings from __builtin_modf et al.
This middle-end patch resolves PR c/106264 which is a spurious warning
regression caused by the tree-level expansion of modf, frexp and remquo
producing "expression has no-effect" when the built-in function's result
is ignored.  When these built-ins were first expanded at tree-level,
fold_builtin_n would blindly set TREE_NO_WARNING for all built-ins. Now
that we're more discerning, we should precisely call suppress_warning
selectively on those COMPOUND_EXPRs that need them.

2022-07-19  Roger Sayle  <roger@nextmovesoftware.com>
	    Richard Biener  <rguenther@suse.de>

gcc/ChangeLog
	PR c/106264
	* builtins.cc (fold_builtin_frexp): Call suppress_warning on
	COMPOUND_EXPR to silence spurious warning if result isn't used.
	(fold_builtin_modf): Likewise.
	(do_mpfr_remquo): Likewise.

gcc/testsuite/ChangeLog
	PR c/106264
	* gcc.dg/pr106264.c: New test case.
2022-07-19 08:39:43 +01:00
Takayuki 'January June' Suwa
2180cdd8a0 xtensa: Correct the relative RTX cost that corresponds to the Move Immediate "MOVI" instruction
This patch corrects the overestimation of the relative cost of
'(set (reg) (const_int N))' where N fits into the instruction itself.

In fact, such overestimation confuses the RTL loop invariant motion pass.
As a result, it brings almost no negative impact from the speed point of
view, but addtiional reg-reg move instructions and register allocation
pressure about the size.

    /* example, optimized for size */
    extern int foo(void);
    extern int array[16];
    void test_0(void) {
      unsigned int i;
      for (i = 0; i < sizeof(array)/sizeof(*array); ++i)
        array[i] = 1024;
    }
    void test_1(void) {
      unsigned int i;
      for (i = 0; i < sizeof(array)/sizeof(*array); ++i)
        array[i] = array[i] ? 1024 : 0;
    }
    void test_2(void) {
      unsigned int i;
      for (i = 0; i < sizeof(array)/sizeof(*array); ++i)
        array[i] = foo() ? 0 : 1024;
    }

    ;; before
	.literal_position
	.literal .LC0, array
    test_0:
	l32r	a3, .LC0
	movi.n	a2, 0
	movi	a4, 0x400	// OK
    .L2:
	s32i.n	a4, a3, 0
	addi.n	a2, a2, 1
	addi.n	a3, a3, 4
	bnei	a2, 16, .L2
	ret.n
	.literal_position
	.literal .LC1, array
    test_1:
	l32r	a2, .LC1
	movi.n	a3, 0
	movi	a5, 0x400	// NG
    .L6:
	l32i.n	a4, a2, 0
	beqz.n	a4, .L5
	mov.n	a4, a5		// should be "movi a4, 0x400"
    .L5:
	s32i.n	a4, a2, 0
	addi.n	a3, a3, 1
	addi.n	a2, a2, 4
	bnei	a3, 16, .L6
	ret.n
	.literal_position
	.literal .LC2, array
    test_2:
	addi	sp, sp, -32
	s32i.n	a12, sp, 24
	l32r	a12, .LC2
	s32i.n	a13, sp, 20
	s32i.n	a14, sp, 16
	s32i.n	a15, sp, 12
	s32i.n	a0, sp, 28
	addi	a13, a12, 64
	movi.n	a15, 0		// NG
	movi	a14, 0x400	// and wastes callee-saved registers (only 4)
    .L11:
	call0	foo
	mov.n	a3, a14		// should be "movi a3, 0x400"
	movnez	a3, a15, a2
	s32i.n	a3, a12, 0
	addi.n	a12, a12, 4
	bne	a12, a13, .L11
	l32i.n	a0, sp, 28
	l32i.n	a12, sp, 24
	l32i.n	a13, sp, 20
	l32i.n	a14, sp, 16
	l32i.n	a15, sp, 12
	addi	sp, sp, 32
	ret.n

    ;; after
	.literal_position
	.literal .LC0, array
    test_0:
	l32r	a3, .LC0
	movi.n	a2, 0
	movi	a4, 0x400	// OK
    .L2:
	s32i.n	a4, a3, 0
	addi.n	a2, a2, 1
	addi.n	a3, a3, 4
	bnei	a2, 16, .L2
	ret.n
	.literal_position
	.literal .LC1, array
    test_1:
	l32r	a2, .LC1
	movi.n	a3, 0
    .L6:
	l32i.n	a4, a2, 0
	beqz.n	a4, .L5
	movi	a4, 0x400	// OK
    .L5:
	s32i.n	a4, a2, 0
	addi.n	a3, a3, 1
	addi.n	a2, a2, 4
	bnei	a3, 16, .L6
	ret.n
	.literal_position
	.literal .LC2, array
    test_2:
	addi	sp, sp, -16
	s32i.n	a12, sp, 8
	l32r	a12, .LC2
	s32i.n	a13, sp, 4
	s32i.n	a0, sp, 12
	addi	a13, a12, 64
    .L11:
	call0	foo
	movi.n	a3, 0		// OK
	movi	a4, 0x400	// and less register allocation pressure
	moveqz	a3, a4, a2
	s32i.n	a3, a12, 0
	addi.n	a12, a12, 4
	bne	a12, a13, .L11
	l32i.n	a0, sp, 12
	l32i.n	a12, sp, 8
	l32i.n	a13, sp, 4
	addi	sp, sp, 16
	ret.n

gcc/ChangeLog:

	* config/xtensa/xtensa.cc (xtensa_rtx_costs):
	Change the relative cost of '(set (reg) (const_int N))' where
	N fits into signed 12-bit from 4 to 0 if optimizing for size.
	And use the appropriate macro instead of the bare number 4.
2022-07-18 20:17:13 -07:00
GCC Administrator
79fb1124c8 Daily bump. 2022-07-19 00:16:32 +00:00
François Dumont
63d182fb86 libstdc++: Enhance branching in std::inplace_merge and std::stable_sort
When we manage to allocate a buffer of the expected size we can simplify the code to
perform the expected algorithm.

libstdc++-v3/ChangeLog:

	* include/bits/stl_algo.h
	(__merge_adaptive): Adapt to merge only when buffer is large enough..
	(__merge_adaptive_resize): New, adapt merge when buffer is too small.
	(__inplace_merge): Adapt, use latter.
	(__stable_sort_adaptive): Adapt to sort only when buffer is large enough.
	(__stable_sort_adaptive_resize): New, adapt sort when buffer is too small.
	(__stable_sort): Adapt, use latter.
2022-07-18 22:40:10 +02:00
Andrew MacLeod
5e47c9333d Check if transitives need to be registered.
Whenever a relation is added, register_transitive is always called.
If neither operand was in a relation before, or this is not a new
relation, then there is no need to register transitives.

	PR tree-optimization/106280
	* value-relation.cc (dom_oracle::register_relation): Register
	transitives only when it is possible for there to be one.
	(dom_oracle::set_one_relation): Return NULL if this is an
	existing relation.
2022-07-18 15:48:13 -04:00
Maciej W. Rozycki
e9ee752bbe RISC-V/doc: Add index references for mrelax' and mriscv-attribute'
Add missing index references for the `-mrelax' and `-mriscv-attribute'
invocation options.

	gcc/
	* doc/invoke.texi (RISC-V Options): Add index references for
	`mrelax' and `mriscv-attribute'.
2022-07-18 16:47:21 +01:00
Maciej W. Rozycki
fa16bb8ac0 RISC-V/doc: Correct the formatting of `-mstack-protector-guard-reg='
Add missing second space around the `-mstack-protector-guard-reg='
invocation option.

	gcc/
	* doc/invoke.texi (Option Summary): Add missing second space
	around `-mstack-protector-guard-reg='.
2022-07-18 16:47:20 +01:00
Maciej W. Rozycki
7df79970bf RISC-V/doc: Correct the name of `-mriscv-attribute'
Correct the name of the `-mriscv-attribute' invocation option, including
a typo in the negated form.

	gcc/
	* doc/invoke.texi (Option Summary): Fix `-mno-riscv-attribute'.
	(RISC-V Options): Likewise, and `-mriscv-attribute'.
2022-07-18 16:47:20 +01:00
Claudiu Zissulescu
7501eec65c arc: Add ARCHS release 310a tune variant.
Add mtune and mcpu options for ARCHS release 310a type CPU. The
mtune=release31a is designed to be used as an alternative to the
mcpu=hs4x_rel31 option.
ARCHS4x release 31a uses DSP instructions which are implemented a bit
different than mpy9. Hence, use safer mpy2 option.

gcc/
	* config/arc/arc-arch.h (arc_tune_attr): Add
	ARC_TUNE_ARCHS4X_REL31A variant.
	* config/arc/arc.cc (arc_override_options): Tune options for
	release 310a.
	(arc_sched_issue_rate): Use correct enum.
	(arc600_corereg_hazard): Textual change.
	(arc_hazard): Add release 310a tunning.
	* config/arc/arc.md (tune): Update and take into consideration new
	tune option.
	(tune_dspmpy): Likewise.
	(tune_store): New attribute.
	* config/arc/arc.opt (mtune): New tune option.
	* config/arc/arcHS4x.md (hs4x_brcc0, hs4x_brcc1): New cpu units.
	(hs4x_brcc_op): New instruction rezervation.
	(hs4x_data_store_1_op): Likewise.
	* config/arc/arc-cpus.def (hs4x_rel31): New cpu variant.
	* config/arc/arc-tables.opt: Regenerate.
	* config/arc/t-multilib: Likewise.
	* doc/invoke.texi (ARC): Update mcpu and tune sections.

Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
2022-07-18 15:45:20 +03:00
Richard Biener
87f46a16ec Fix builtin vs non-builtin partition merge in loop distribution
When r7-6373-g40b6bff965d004 fixed a costing issue it failed to
make the logic symmetric which means that we now fuse
normal vs. builtin when the cost model says so but we don't fuse
builtin vs. normal.  The following fixes that, also allowing
the cost model to decide to fuse two builtin partitions as otherwise
an intermediate non-builtin can result in a partial merge as well.

	* tree-loop-distribution.cc (loop_distribution::distribute_loop):
	When computing cost-based merging do not disregard builtin
	classified partitions in some cases.

	* gcc.dg/tree-ssa/ldist-24.c: XFAIL.
	* gcc.dg/tree-ssa/ldist-36.c: Adjust expected outcome.
2022-07-18 14:42:51 +02:00
Claudiu Zissulescu
c8697735ab libgcc/arc: Update udivmodsi4 and make the lib safe for rf16
The ARC soft udivmodsi4 algorithm and as well as using umodsi3
for reduced register set configurations are wrong.

libgcc/
	* config/arc/lib2funcs.c (udivmodsi4): Update AND mask.
	* config/arc/lib1funcs.S (umodsi3): Don't use it for RF16
	configurations.
2022-07-18 15:00:53 +03:00
Richard Sandiford
7313381d2c arm: Replace arm_builtin_vectorized_function [PR106253]
This patch extends the fix for PR106253 to AArch32.  As with AArch64,
we were using ACLE intrinsics to vectorise scalar built-ins, even
though the two sometimes have different ECF_* flags.  (That in turn
is because the ACLE intrinsics should follow the instruction semantics
as closely as possible, whereas the scalar built-ins follow language
specs.)

The patch also removes the copysignf built-in, which only existed
for this purpose and wasn't a “real” arm_neon.h built-in.

Doing this also has the side-effect of enabling vectorisation of
rint and roundeven.  Logically that should be a separate patch,
but making it one would have meant adding a new int iterator
for the original set of instructions and then removing it again
when including new functions.

I've restricted the bswap tests to little-endian because we end
up with excessive spilling on big-endian.  E.g.:

        sub     sp, sp, #8
        vstr    d1, [sp]
        vldr    d16, [sp]
        vrev16.8        d16, d16
        vstr    d16, [sp]
        vldr    d0, [sp]
        add     sp, sp, #8
        @ sp needed
        bx      lr

Similarly, the copysign tests require little-endian because on
big-endian we unnecessarily load the constant from the constant pool:

        vldr.32 s15, .L3
        vdup.32 d0, d7[1]
        vbsl    d0, d2, d1
        bx      lr
.L3:
        .word   -2147483648

gcc/
	PR target/106253
	* config/arm/arm-builtins.cc (arm_builtin_vectorized_function):
	Delete.
	* config/arm/arm-protos.h (arm_builtin_vectorized_function): Delete.
	* config/arm/arm.cc (TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION):
	Delete.
	* config/arm/arm_neon_builtins.def (copysignf): Delete.
	* config/arm/iterators.md (nvrint_pattern): New attribute.
	* config/arm/neon.md (<NEON_VRINT:nvrint_pattern><VCVTF:mode>2):
	New pattern.
	(l<NEON_VCVT:nvrint_pattern><su_optab><VCVTF:mode><v_cmp_result>2):
	Likewise.
	(neon_copysignf<mode>): Rename to...
	(copysign<mode>3): ...this.

gcc/testsuite/
	PR target/106253
	* gcc.target/arm/vect_unary_1.c: New test.
	* gcc.target/arm/vect_binary_1.c: Likewise.
2022-07-18 12:57:10 +01:00
Claudiu Zissulescu
9c8349ee1a arc: Fix interrupt's epilogue.
The stack pointer adjustment in interrupt epilogue is happening after
restoring the ZOL registers which is wrong. Fixing this.

gcc/
	* config/arc/arc.cc (arc_expand_epilogue): Adjust the frame
	pointer first when in interrupts.

gcc/testsuite/
	* gcc.target/arc/interrupt-13.c: New file.

Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
2022-07-18 14:36:58 +03:00
Richard Biener
ce92603fbe Improve common reduction vs builtin code generation in loop distribution
loop distribution currently cannot handle the situation when the
last partition is a builtin but there's a common reduction in all
partitions (like the final IV value).  The following lifts this
restriction by making the last non-builtin partition provide the
definitions for the loop-closed PHI nodes.  Since we have heuristics
in place to avoid code generating builtins last writing a testcase
is difficult (but I ran into a case with other pending patches that
made the heuristic ineffective).  What's remaining is the inability
to preserve common reductions when all partitions could be builtins
(in some cases final value replacement could come to the rescue here).

	* tree-loop-distribution.cc (copy_loop_before): Add
	the ability to replace the original LC PHI defs.
	(generate_loops_for_partition): Pass through a flag
	whether to redirect original LC PHI defs.
	(generate_code_for_partition): Likewise.
	(loop_distribution::distribute_loop): Compute the partition
	that should provide the LC PHI defs for common reductions
	and pass that down.
2022-07-18 13:19:22 +02:00