Commit Graph

189942 Commits

Author SHA1 Message Date
Jonathan Wakely
9664c46545 libstdc++: Remove dg-error that no longer happens
There was a c++11_only dg-error in this testcase, for a "body of
constexpr function is not a return statement" diagnostic that was bogus,
but happened because the return statement was ill-formed. A change to
G++ earlier this month means that diagnostic is no longer emitted, so
remove the dg-error.

libstdc++-v3/ChangeLog:

	* testsuite/20_util/tuple/comparison_operators/overloaded2.cc:
	Remove dg-error for C++11_only error.
2021-11-25 23:12:15 +00:00
Jonathan Wakely
b8018e5c5e libstdc++: Make std::pointer_traits SFINAE-friendly [PR96416]
This implements the resolution I'm proposing for LWG 3545, to avoid hard
errors when using std::to_address for types that make pointer_traits
ill-formed.

Consistent with std::iterator_traits, instantiating std::pointer_traits
for a non-pointer type will be well-formed, but give an empty type with
no member types. This avoids the problematic cases for std::to_address.
Additionally, the pointer_to member is now only declared when the
element type is not cv void (and for C++20, when the function body would
be well-formed). The rebind member was already SFINAE-friendly in our
implementation.

libstdc++-v3/ChangeLog:

	PR libstdc++/96416
	* include/bits/ptr_traits.h (pointer_traits): Reimplement to be
	SFINAE-friendly (LWG 3545).
	* testsuite/20_util/pointer_traits/lwg3545.cc: New test.
	* testsuite/20_util/to_address/1_neg.cc: Adjust dg-error line.
	* testsuite/20_util/to_address/lwg3545.cc: New test.
2021-11-25 23:12:14 +00:00
Jan Hubicka
1b0acc4b80 Remove forgotten early return in ipa_value_range_from_jfunc
gcc/ChangeLog:

	* ipa-cp.c (ipa_value_range_from_jfunc): Remove forgotten early return.

gcc/testsuite/ChangeLog:

	* gcc.dg/ipa/inline10.c: New test.
2021-11-25 23:58:48 +01:00
Jonathan Wakely
82c3657dd7 libstdc++: Do not use memset in constexpr calls to ranges::fill_n [PR101608]
libstdc++-v3/ChangeLog:

	PR libstdc++/101608
	* include/bits/ranges_algobase.h (__fill_n_fn): Check for
	constant evaluation before using memset.
	* testsuite/25_algorithms/fill_n/constrained.cc: Check
	byte-sized values as well.
2021-11-25 20:03:13 +00:00
Roger Sayle
6ea5fb3cc7 PR middle-end/103406: Check for Inf before simplifying x-x.
This is a simple one line fix to the regression PR middle-end/103406,
where x - x is being folded to 0.0 even when x is +Inf or -Inf.
In GCC 11 and previously, we'd check whether the type honored NaNs
(which implicitly covered the case where the type honors infinities),
but my patch to test whether the operand could potentially be NaN
failed to also check whether the operand could potentially be Inf.

2021-11-25  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	PR middle-end/103406
	* match.pd (minus @0 @0): Check tree_expr_maybe_infinite_p.

gcc/testsuite/ChangeLog
	PR middle-end/103406
	* gcc.dg/pr103406.c: New test case.
2021-11-25 19:02:06 +00:00
Florian Weimer
9488d24206 libgcc: Split FDE search code from PT_GNU_EH_FRAME lookup
This allows switching to a different implementation for
PT_GNU_EH_FRAME lookup in a subsequent commit.

This moves some of the PT_GNU_EH_FRAME parsing out of the glibc loader
lock that is implied by dl_iterate_phdr.  However, the FDE is already
parsed outside the lock before this change, so this does not introduce
additional crashes in case of a concurrent dlclose.

libgcc/ChangeLog:

	* unwind-dw2-fde-dip.c (struct unw_eh_callback_data): Add hdr.
	Remove func, ret.
	(find_fde_tail): New function.  Split from
	_Unwind_IteratePhdrCallback.  Move the result initialization
	from _Unwind_Find_FDE.
	(_Unwind_Find_FDE): Updated to call find_fde_tail.
2021-11-25 18:43:55 +01:00
Martin Jambor
5bc4cb0412
ipa: Teach IPA-CP transformation about IPA-SRA modifications (PR 103227)
PR 103227 exposed an issue with ordering of transformations of IPA
passes.  IPA-CP can create clones for constants passed by reference
and at the same time IPA-SRA can also decide that the parameter does
not need to be a pointer (or an aggregate) and plan to convert it
into (a) simple scalar(s).  Because no intermediate clone is created
just for the purpose of ordering the transformations and because
IPA-SRA transformation is implemented as part of clone
materialization, the IPA-CP transformation happens only afterwards,
reversing the order of the transformations compared to the ordering of
analyses.

IPA-CP transformation looks at planned substitutions for values passed
by reference or in aggregates but finds that all the relevant
parameters no longer exist.  Currently it subsequently simply gives
up, leading to clones created for no good purpose (and huge regression
of 548.exchange_r.  This patch teaches it recognize the situation,
look up the new scalarized parameter and perform value substitution on
it.  On my desktop this has recovered the lost exchange2 run-time (and
some more).

I have disabled IPA-SRA in a Fortran testcase so that the dumping from
the transformation phase can still be matched in order to verify that
IPA-CP understands the IL after verifying that it does the right thing
also with IPA-SRA.

gcc/ChangeLog:

2021-11-23  Martin Jambor  <mjambor@suse.cz>

	PR ipa/103227
	* ipa-prop.h (ipa_get_param): New overload.  Move bits of the existing
	one to the new one.
	* ipa-param-manipulation.h (ipa_param_adjustments): New member
	function get_updated_index_or_split.
	* ipa-param-manipulation.c
	(ipa_param_adjustments::get_updated_index_or_split): New function.
	* ipa-prop.c (adjust_agg_replacement_values): Reimplement, add
	capability to identify scalarized parameters and perform substitution
	on them.
	(ipcp_transform_function): Create descriptors earlier, handle new
	return values of adjust_agg_replacement_values.

gcc/testsuite/ChangeLog:

2021-11-23  Martin Jambor  <mjambor@suse.cz>

	PR ipa/103227
	* gcc.dg/ipa/pr103227-1.c: New test.
	* gcc.dg/ipa/pr103227-3.c: Likewise.
	* gcc.dg/ipa/pr103227-2.c: Likewise.
	* gfortran.dg/pr53787.f90: Disable IPA-SRA.
2021-11-25 18:16:31 +01:00
Aldy Hernandez
415f9ee404 path solver: Revert computation of ranges in gimple order.
Revert the patch below, as it may slow down compilation with large CFGs.

	commit 8acbd7bef6
	Author: Aldy Hernandez <aldyh@redhat.com>
	Date:   Wed Nov 24 09:43:36 2021 +0100

	    path solver: Compute ranges in path in gimple order.

gcc/ChangeLog:

	* gimple-range-path.cc (path_range_query::compute_ranges_defined): Remove.
	(path_range_query::compute_ranges_in_block): Revert to bitmap order.
	* gimple-range-path.h: Remove compute_ranges_defined.
2021-11-25 17:34:31 +01:00
Andrew Stubbs
58d50a5dd6 amdgcn: Fix ICE generating CFI [PR103396]
gcc/ChangeLog:

	PR target/103396
	* config/gcn/gcn.c (move_callee_saved_registers): Ensure that the
	number of spilled registers is counted correctly.
2021-11-25 16:04:00 +00:00
Andrew MacLeod
1598bd47b2 Add the testcase for this PR to the testsuite.
Various ranger-enabled patches like threading and VRP2 can do this now, so add the testcase for posterity.

	gcc/testsuite/
	PR tree-optimization/102648
	* gcc.dg/pr102648.c: New.
2021-11-25 09:02:28 -05:00
Jan Hubicka
a2ae4e9ac3 Initialize node_is_self_scc in ipa_node_params::ipa_node_params
gcc/ChangeLog:

2021-11-25  Jan Hubicka  <hubicka@ucw.cz>

	* ipa-prop.h (ipa_node_params::ipa_node_params): Initialize
	node_is_self_scc.
2021-11-25 14:48:14 +01:00
Andrew MacLeod
661c02e54e Check for equivalences between PHI argument and def.
If a PHI argument on an edge is equivalent with the DEF, then it doesn't
provide any new information, defer processing it unless they are all
equivalences.

	PR tree-optimization/103359
	gcc/
	* gimple-range-fold.cc (fold_using_range::range_of_phi): If arg is
	equivalent to def, don't initially include it's range.

	gcc/testsuite/
	* gcc.dg/pr103359.c: New.
2021-11-25 08:44:27 -05:00
Jan Hubicka
f4e470d44e Do not check gimple_static_cahin in ref_maybe_used_by_call_p_1
gcc/ChangeLog:

2021-11-25  Jan Hubicka  <hubicka@ucw.cz>

	* tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Do not check
	gimple_static_chain.
2021-11-25 14:44:04 +01:00
Richard Biener
4eda2eee0e Remove dead code and function
The only use of get_alias_symbol is gated by a gcc_unreachable (),
so the following patch gets rid of it.

2021-11-24  Richard Biener  <rguenther@suse.de>

	* cgraphunit.c (symbol_table::output_weakrefs): Remove
	unreachable init.
	(get_alias_symbol): Remove now unused function.
2021-11-25 14:23:44 +01:00
Richard Biener
8addb0b127 Continue RTL verifying in rtl_verify_fallthru
One case used fatal_insn which does not return which isn't
intended as can be seen by the following erro = 1.  The following
change refactors this to inline the relevant parts of fatal_insn
instead and continue validating the RTL IL.

2021-11-25  Richard Biener  <rguenther@suse.de>

	* cfgrtl.c (rtl_verify_fallthru): Do not stop verifying
	with fatal_insn.
	(skip_insns_after_block): Remove unreachable break and continue.
2021-11-25 14:23:44 +01:00
Richard Biener
0fdd1804ee Remove never looping loop in label_rtx_for_bb
This refactors the IL "walk" in a way to avoid the loop which will
never iterate.

2021-11-25  Richard Biener  <rguenther@suse.de>

	* cfgexpand.c (label_rtx_for_bb): Remove dead loop construct.
2021-11-25 14:23:44 +01:00
Richard Biener
555b8cc390 Introduce REG_SET_EMPTY_P
This avoids a -Wunreachable-code diagnostic with EXECUTE_IF_*
in case the first iteration will exit the loop.  For the case
in thread_jump using bitmap_empty_p looks preferable so this
adds REG_SET_EMPTY_P to make that available for register sets.

2021-11-25  Richard Biener  <rguenther@suse.de>

	* regset.h (REG_SET_EMPTY_P): New macro.
	* cfgcleanup.c (thread_jump): Use REG_SET_EMPTY_P.
2021-11-25 14:23:44 +01:00
Martin Liska
1167d4890f docs: Add missing @option keyword.
gcc/ChangeLog:

	* doc/invoke.texi: Use @option for -Wuninitialized.
2021-11-25 12:15:20 +01:00
Aldy Hernandez
d1c1919ef8 path solver: Move boolean import code to compute_imports.
In a follow-up patch I will be pruning the set of exported ranges
within blocks to avoid unnecessary work.  In order to do this, all the
interesting SSA names must be in the internal import bitmap ahead of
time.  I had already abstracted them out into compute_imports, but I
missed the boolean code.  This fixes the oversight.

There's a net gain of 25 threadable paths, which is unexpected but
welcome.

Tested on x86-64 & ppc64le Linux.

gcc/ChangeLog:

	PR tree-optimization/103254
	* gimple-range-path.cc (path_range_query::compute_ranges): Move
	exported boolean code...
	(path_range_query::compute_imports): ...here.
2021-11-25 11:52:23 +01:00
Aldy Hernandez
8acbd7bef6 path solver: Compute ranges in path in gimple order.
Andrew's patch for this PR103254 papered over some underlying
performance issues in the path solver that I'd like to address.

We are currently solving the SSA's defined in the current block in
bitmap order, which amounts to random order for all purposes.  This is
causing unnecessary recursion in gori.  This patch changes the order
to gimple order, thus solving dependencies before uses.

There is no change in threadable paths with this change.

Tested on x86-64 & ppc64le Linux.

gcc/ChangeLog:

	PR tree-optimization/103254
	* gimple-range-path.cc (path_range_query::compute_ranges_defined): New
	(path_range_query::compute_ranges_in_block): Move to
	compute_ranges_defined.
	* gimple-range-path.h (compute_ranges_defined): New.
2021-11-25 11:51:21 +01:00
Jakub Jelinek
94912212d3 match.pd: Fix up the recent bitmask_inv_cst_vector_p simplification [PR103417]
The following testcase is miscompiled since the r12-5489-g0888d6bbe97e10
changes.
The simplification triggers on
(x & 4294967040U) >= 0U
and turns it into:
x <= 255U
which is incorrect, it should fold to 1 because unsigned >= 0U is always
true and normally the
/* Non-equality compare simplifications from fold_binary  */
     (if (wi::to_wide (cst) == min)
       (if (cmp == GE_EXPR)
        { constant_boolean_node (true, type); })
simplification folds that, but this simplification was done earlier.

The simplification correctly doesn't include lt which has the same
reason why it shouldn't be handled, we'll fold it to 0 elsewhere.

But, IMNSHO while it isn't incorrect to handle le and gt there, it is
unnecessary.  Because (x & cst) <= 0U and (x & cst) > 0U should
never appear, again in
/* Non-equality compare simplifications from fold_binary  */
we have a simplification for it:
       (if (cmp == LE_EXPR)
        (eq @2 @1))
       (if (cmp == GT_EXPR)
        (ne @2 @1))))
This is done for
  (cmp (convert?@2 @0) uniform_integer_cst_p@1)
and so should be done for both integers and vectors.
As the bitmask_inv_cst_vector_p simplification only handles
eq and ne for signed types, I think it can be simplified to just
following patch.

2021-11-25  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/103417
	* match.pd ((X & Y) CMP 0): Only handle eq and ne.  Commonalize
	common tests.

	* gcc.c-torture/execute/pr103417.c: New test.
2021-11-25 10:47:24 +01:00
Jakub Jelinek
531dae29a6 bswap: Improve perform_symbolic_merge [PR103376]
Thinking more about it, perhaps we could do more for BIT_XOR_EXPR.
We could allow masked1 == masked2 case for it, but would need to
do something different than the
  n->n = n1->n | n2->n;
we do on all the bytes together.
In particular, for masked1 == masked2 if masked1 != 0 (well, for 0
both variants are the same) and masked1 != 0xff we would need to
clear corresponding n->n byte instead of setting it to the input
as x ^ x = 0 (but if we don't know what x and y are, the result is
also don't know).  Now, for plus it is much harder, because not only
for non-zero operands we don't know what the result is, but it can
modify upper bytes as well.  So perhaps only if current's byte
masked1 && masked2 set the resulting byte to 0xff (unknown) iff
the byte above it is 0 and 0, and set that resulting byte to 0xff too.
Also, even for | we could instead of return NULL just set the resulting
byte to 0xff if it is different, perhaps it will be masked off later on.

This patch just punts on plus if both corresponding bytes are non-zero,
otherwise implements the above.

2021-11-25  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/103376
	* gimple-ssa-store-merging.c (perform_symbolic_merge): For
	BIT_IOR_EXPR, if masked1 && masked2 && masked1 != masked2, don't
	punt, but set the corresponding result byte to MARKER_BYTE_UNKNOWN.
	For BIT_XOR_EXPR similarly and if masked1 == masked2 and the
	byte isn't MARKER_BYTE_UNKNOWN, set the corresponding result byte to
	0.

	* gcc.dg/optimize-bswapsi-7.c: New test.
2021-11-25 10:38:33 +01:00
Jakub Jelinek
8e86218f05 c++: Return early in apply_late_template_attributes if there are no late attribs [PR101180]
The r12-299-ga0fdff3cf33f7284 change can result in cplus_decl_attributes being called
even if there are no late attributes (but at least one early attribute) in
apply_late_template_attributes.  This patch fixes that, so that we return early
if there are no late attrs, only arrange for TYPE_ATTRIBUTES to get the early
attribute list.

2021-11-25  Jakub Jelinek  <jakub@redhat.com>

	PR c++/101180
	* pt.c (apply_late_template_attributes): Return early if there are no
	dependent attributes.
2021-11-25 08:39:35 +01:00
Jakub Jelinek
b38c9cf6d5 c++: Implement C++23 P2128R6 - Multidimensional subscript operator [PR102611]
The following patch implements the C++23 Multidimensional subscript operator
P2128R6 paper.
As C++20 and older only allow a single expression in between []s (albeit
for C++20 with a deprecation warning if it is a comma expression) and even
in C++23 and for the coming years I think the vast majority of subscript
expressions will still have a single expression and even in C++23 it is
quite special, as e.g. the builtin operator requires exactly one
assignment expression, the patch attempts to optimize for that case and
if possible not to slow down that common case (or use more memory for it).
So, already during parsing it differentiates between that (uses a single
index_exp tree in that case) and the new cases (zero or two+ expressions
in the list), for which it sets index_exp to NULL_TREE and uses a
releasing_vec instead similarly to how e.g. finish_call_expr uses it.
In call.c it introduces new functions build_op_subscript{,_1} which are
something in between build_new_op{,_1} and build_op_call{,_1}.
The former requires fixed number of arguments (and the patch still uses
it for the common case of subscript with exactly one index expression),
the latter handles variable number of arguments but is too CALL_EXPR specific
and handles various cases that are unnecessary for the subscript.
Right now the subscript for 0 or 2+ expressions doesn't need to deal with
builtin candidates and so is quite simple.

As discussed in the paper, for backwards compatibility, if for 2+ index
expressions build_op_subscript fails (called with tf_none) and the
expressions together form a valid comma expression (again checked with
tf_none), it is used that C++20-ish way with a pedwarn about it, but if
even that fails, build_op_subscript is called again with standard complain
flags to diagnose it in the new way.  And similarly for the builtin case.

The -Wcomma-subscript warning used to be enabled by default unless
-Wno-deprecated.  Since the C/C++98..20 behavior is no longer deprecated,
but ill-formed or changed meaning, it is now for C++23 enabled by
default regardless of -Wno-deprecated and controls the pedwarn (but not the
errors emitted if something wasn't valid before and isn't valid in C++23
either).

2021-11-25  Jakub Jelinek  <jakub@redhat.com>

	PR c++/102611
gcc/
	* doc/invoke.texi (-Wcomma-subscript): Document that for
	-std=c++20 the option isn't enabled by default with -Wno-deprecated
	but for -std=c++23 it is.
gcc/c-family/
	* c-opts.c (c_common_post_options): Enable -Wcomma-subscript by
	default for C++23 regardless of warn_deprecated.
	* c-cppbuiltin.c (c_cpp_builtins): Predefine
	__cpp_multidimensional_subscript=202110L for C++23.
gcc/cp/
	* cp-tree.h (build_op_subscript): Implement P2128R6
	- Multidimensional subscript operator.  Declare.
	(class releasing_vec): Add release method.
	(grok_array_decl): Remove bool argument, add vec<tree, va_gc> **
	and tsubst_flags_t arguments.
	(build_min_non_dep_op_overload): Declare another overload.
	* parser.c (cp_parser_parenthesized_expression_list_elt): New function.
	(cp_parser_postfix_open_square_expression): Mention C++23 syntax in
	function comment.  For C++23 parse zero or more than one initializer
	clauses in expression list, adjust grok_array_decl caller.
	(cp_parser_parenthesized_expression_list): Use
	cp_parser_parenthesized_expression_list_elt.
	(cp_parser_builtin_offsetof): Adjust grok_array_decl caller.
	* decl.c (grok_op_properties): For C++23 don't check number
	of arguments of operator[].
	* decl2.c (grok_array_decl): Remove decltype_p argument, add
	index_exp_list and complain arguments.  If index_exp is NULL,
	handle *index_exp_list as the subscript expression list.
	* tree.c (build_min_non_dep_op_overload): New overload.
	* call.c (add_operator_candidates, build_over_call): Adjust comments
	for removal of build_new_op_1.
	(build_op_subscript): New function.
	* pt.c (tsubst_copy_and_build_call_args): New function.
	(tsubst_copy_and_build) <case ARRAY_REF>: If second
	operand is magic CALL_EXPR with ovl_op_identifier (ARRAY_REF)
	as CALL_EXPR_FN, tsubst CALL_EXPR arguments including expanding
	pack expressions in it and call grok_array_decl instead of
	build_x_array_ref.
	<case CALL_EXPR>: Use tsubst_copy_and_build_call_args.
	* semantics.c (handle_omp_array_sections_1): Adjust grok_array_decl
	caller.
gcc/testsuite/
	* g++.dg/cpp2a/comma1.C: Expect different diagnostics for C++23.
	* g++.dg/cpp2a/comma3.C: Likewise.
	* g++.dg/cpp2a/comma4.C: Expect diagnostics for C++23.
	* g++.dg/cpp2a/comma5.C: Expect different diagnostics for C++23.
	* g++.dg/cpp23/feat-cxx2b.C: Test __cpp_multidimensional_subscript
	predefined macro.
	* g++.dg/cpp23/subscript1.C: New test.
	* g++.dg/cpp23/subscript2.C: New test.
	* g++.dg/cpp23/subscript3.C: New test.
	* g++.dg/cpp23/subscript4.C: New test.
	* g++.dg/cpp23/subscript5.C: New test.
	* g++.dg/cpp23/subscript6.C: New test.
2021-11-25 08:36:20 +01:00
H.J. Lu
f88e507801 pr103194-5.c: Replace long with int64_t
Replace long with int64_t to work with -mx32.

	* gcc.target/i386/pr103194-5.c: Include <stdint.h>.
	Replace long with int64_t.
2021-11-24 20:19:06 -08:00
GCC Administrator
d9ca4b45bd Daily bump. 2021-11-25 00:16:29 +00:00
Jan Hubicka
16e8539050 Fix handling of static chain in ipa_merge_modref_summary_after_inlining
gcc/ChangeLog:

2021-11-24  Jan Hubicka  <hubicka@ucw.cz>

	* ipa-modref.c (implicit_eaf_flags_for_edge_and_arg): Break out from...
	(modref_merge_call_site_flags): ... here.
	(ipa_merge_modref_summary_after_inlining): Use it.

gcc/testsuite/ChangeLog:

2021-11-24  Jan Hubicka  <hubicka@ucw.cz>

	* gcc.c-torture/execute/pr103405.c: New test.
2021-11-24 22:28:12 +01:00
Thomas Schwinge
9e026da720 Reduce scope of a few 'class loop *loop' variables
Further clean-up after commit e41ba804ba
"Use range-based for loops for traversing loops".  No functional change.

	gcc/
	* cfgloop.c (verify_loop_structure): Reduce scope of
	'class loop *loop' variable.
	* ipa-fnsummary.c (analyze_function_body): Likewise.
	* loop-init.c (fix_loop_structure): Likewise.
	* loop-invariant.c (calculate_loop_reg_pressure): Likewise.
	* predict.c (predict_loops): Likewise.
	* tree-loop-distribution.c (loop_distribution::execute): Likewise.
	* tree-vectorizer.c (pass_vectorize::execute): Likewise.
2021-11-24 21:38:11 +01:00
Andrew MacLeod
5deacf6058 Directly resolve range_of_stmt dependencies.
All ranger API entries eventually call range_of_stmt to ensure there is an
initial global value to work with.  This can cause very deep call chains when
satisfied via the normal API.  Instead, push any dependencies onto a stack
and evaluate them in a depth first manner, mirroring what would have happened
via the normal API calls.

	PR tree-optimization/103231
	gcc/
	* gimple-range.cc (gimple_ranger::gimple_ranger): Create stmt stack.
	(gimple_ranger::gimple_ranger): Delete stmt stack.
	(gimple_ranger::range_of_stmt): Process depenedencies if they have no
	global cache entry.
	(gimple_ranger::prefill_name): New.
	(gimple_ranger::prefill_stmt_dependencies): New.
	* gimple-range.h (class gimple_ranger): Add prototypes.
2021-11-24 09:03:07 -05:00
Andrew MacLeod
d986ff50b4 Split return functionality of get_non_stale_global_range.
Get_non_stale_global_range returns true only when there is a cache entry that
is not out of date.  Change it so that it returns true if there was a cache
value, but return the temporal comparison result in an auxiallary flag.

	* gimple-range-cache.cc (ranger_cache::get_global_range): Always
	return a range, return if it came from the cache or not.
	(get_non_stale_global_range): Rename to get_global_range, and return
	the temporal state in a flag.
	* gimple-range-cache.h (get_non_stale_global_range): Rename and adjust.
	* gimple-range.cc (gimple_ranger::range_of_expr): No need to query
	get_global_range.
	(gimple_ranger::range_of_stmt): Adjust for global cache temporal state
	returned in a flag.
2021-11-24 09:03:07 -05:00
Andrew MacLeod
a031bb7a58 Range-on-edge trace tweak.
Trace formatting gets out of sync when range on edge is called with a constant.

	* gimple-range.cc (gimple_ranger::range_on_edge): Call trailer when
	a constant is encountered to terminate the trace.
2021-11-24 09:03:07 -05:00
Jonathan Wakely
3b2337831a libstdc++: Add xfail to some printer tests for debug mode
The type printers are not substituting std::string for
std::basic_string<char> in debug mode, mark some tests as xfail.

libstdc++-v3/ChangeLog:

	* testsuite/libstdc++-prettyprinters/80276.cc: Add xfail for
	debug mode.
	* testsuite/libstdc++-prettyprinters/libfundts.cc: Likewise.
2021-11-24 13:20:26 +00:00
Jonathan Wakely
a04b73e15b libstdc++: Replace hyphens in effective target keywords
An effective target like foo-bar-baz will match a target selector of
*-*-* and cause problems in the testsuite. Several libstdc++ et keywords
are of the form foo-bar, which could still be a problem for *-*
selectors.

Replace hyphens with underscores in the et keywords "debug-mode",
"cxx11-abi", etc.

libstdc++-v3/ChangeLog:

	* testsuite/lib/libstdc++.exp: Rename effective target keywords
	to avoid dashes in the name.
	* testsuite/*: Update effective targe keywords.
2021-11-24 13:20:26 +00:00
Maciej W. Rozycki
29e1cbdc0c PR middle-end/103059: reload: Also accept ASHIFT with indexed addressing
Correct a `vax-netbsdelf' target regression ultimately caused by commit
c605a8bf92 ("VAX: Accept ASHIFT in address expressions") (needed for
LRA) and as of commit 4a960d548b ("Avoid invalid loop transformations
in jump threading registry.") causing a build error in libgcc:

.../libgcc/libgcov-driver.c: In function 'gcov_do_dump':
.../libgcc/libgcov-driver.c:686:1: error: insn does not satisfy its constraints:
  686 | }
      | ^
(insn 2051 2050 2052 185 (set (reg/f:SI 0 %r0 [555])
        (plus:SI (ashift:SI (mem/c:SI (plus:SI (reg/f:SI 13 %fp)
                        (const_int -28 [0xffffffffffffffe4])) [40 %sfp+-28 S4 A32])
                (const_int 3 [0x3]))
            (plus:SI (reg/v/f:SI 9 %r9 [orig:176 fn_buffer ] [176])
                (const_int 24 [0x18])))) ".../libgcc/libgcov-driver.c":172:40 614 {movaddrdi}
     (nil))
during RTL pass: postreload
.../libgcc/libgcov-driver.c:686:1: internal compiler error: in extract_constrain_insn, at recog.c:2670
0x1122a5ff _fatal_insn(char const*, rtx_def const*, char const*, int, char const*)
	.../gcc/rtl-error.c:108
0x1122a697 _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
	.../gcc/rtl-error.c:118
0x111b5f2f extract_constrain_insn(rtx_insn*)
	.../gcc/recog.c:2670
0x11143eef reload_cse_simplify_operands
	.../gcc/postreload.c:407
0x11142fdb reload_cse_simplify
	.../gcc/postreload.c:132
0x11143533 reload_cse_regs_1
	.../gcc/postreload.c:238
0x11142ce7 reload_cse_regs
	.../gcc/postreload.c:66
0x1114af33 execute
	.../gcc/postreload.c:2355
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.

This is because reload does not recognize the ASHIFT form of scaled
indexed addressing that the offending commit enabled the backend to
produce, and as seen in the RTL above lets the pseudo holding the
index part become the original memory reference rather than reloading it
into a hard register.

Fix it then by adding said form to reload, removing the build failure
and numerous similar regressions throughout `vax-netbsdelf' test suites
run with the source as at right before the build regression.

Cf. <https://gcc.gnu.org/pipermail/gcc-patches/2021-March/567256.html>,
and commit 6b3034eaba ("lra: Canonicalize mult to shift in address
reloads").

	gcc/
	PR middle-end/103059
	* reload.c (find_reloads_address_1): Also accept the ASHIFT form
	of indexed addressing.
	(find_reloads): Adjust accordingly.
2021-11-24 13:15:06 +00:00
Richard Biener
6180f5c8d6 tree-optimization/103168 - Improve VN of pure function calls
This improves value-numbering of calls that read memory, calls
to const functions with aggregate arguments and calls to
pure functions where the latter include const functions we
demoted to pure for the fear of interposing with a less
optimized version.  Note that for pure functions we do not
handle functions that access global memory.

2021-11-24  Richard Biener  <rguenther@suse.de>
	    Jan Hubicka  <jh@suse.cz>

	PR tree-optimization/103168
	* ipa-modref.h (struct modref_summary): Add load_accesses.
	* ipa-modref.c (modref_summary::finalize): Initialize load_accesses.
	* tree-ssa-sccvn.c (visit_reference_op_call): Use modref
	info to walk the virtual use->def chain to CSE const/pure
	function calls possibly reading from memory.

	* g++.dg/tree-ssa/pr103168.C: New testcase.
2021-11-24 12:40:36 +01:00
Thomas Schwinge
fdd34569e7 Restore previous OpenACC implicit data clauses ordering [PR103244]
Follow-up for recent commit b7e2048063
"openmp: Relax handling of implicit map vs. existing device mappings".

As discussed, we likely also for OpenACC ought to use
'OMP_CLAUSE_MAP_RUNTIME_IMPLICIT_P' and do the appropriate implicit clauses
ordering -- but that's for a separate step.

	gcc/
	PR middle-end/103244
	* gimplify.c (gimplify_adjust_omp_clauses): Restore previous
	OpenACC behavior.
	gcc/testsuite/
	PR middle-end/103244
	* c-c++-common/goacc/combined-reduction.c: Revert/expect previous
	OpenACC behavior.
	* c-c++-common/goacc/firstprivate-mappings-1.c: Likewise.
	* c-c++-common/goacc/mdc-1.c: Likewise.
	* g++.dg/goacc/firstprivate-mappings-1.C: Likewise.
2021-11-24 11:59:03 +01:00
Martin Liska
c2e681059b jit: Initialize function::m_blocks in ctor
This resolves the problem reported here:
https://mail.gnu.org/archive/html/bug-gnu-emacs/2021-11/msg00606.html
https://bugzilla.opensuse.org/show_bug.cgi?id=1192951

gcc/jit/ChangeLog:

	* jit-playback.c (function): Initialize m_blocks vector.
2021-11-24 11:29:15 +01:00
Tobias Burnus
be60f80247 Update GMP/MPFR/MPC/ISL version in contrib/download_prerequisites
contrib/
	* download_prerequisites: Update to gmp-6.2.1, mpfr-4.1.0,
	mpc-1.2.1 and isl-0.24.
	* prerequisites.md5: Update hash.
	* prerequisites.sha512: Likewise.
2021-11-24 11:10:06 +01:00
Richard Biener
d9ca2ca381 middle-end/103193 - avoid canonicalizing <= and >= to == for floats
This avoids doing aforementioned canoncalization when -ftrapping-math
is in effect and we honor NaNs.

2021-11-15  Richard Biener  <rguenther@suse.de>

	PR middle-end/103193
	* match.pd: Avoid canonicalizing (le/ge @0 @0) to (eq @0 @0)
	with NaNs and -ftrapping-math.
2021-11-24 11:02:13 +01:00
Jakub Jelinek
5bca26742c openmp: Fix up handling of kind(host) and kind(nohost) in ACCEL_COMPILERs [PR103384]
As the testcase shows, we weren't handling kind(host) and kind(nohost) properly
in the ACCEL_COMPILERs, the code written in there is valid for the host
compiler only, where if we are maybe offloaded, we defer resolution after IPA,
otherwise return 0 for kind(nohost) and accept it for kind(host).  Note,
omp_maybe_offloaded is false after IPA.  If ACCEL_COMPILER is defined, it is
the other way around, but also we know we are after IPA.

2021-11-24  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/103384
gcc/
	* omp-general.c (omp_context_selector_matches): For ACCEL_COMPILER,
	return 0 for kind(host) and continue for kind(nohost).
libgomp/
	* testsuite/libgomp.c/declare-variant-2.c: New test.
2021-11-24 10:30:32 +01:00
Jakub Jelinek
709716b9f4 attribs: Fix ICEs on attributes starting with _ [PR103365]
As the patch shows, we have quite a few asserts that we don't call
lookup_attribute etc. with attr_name that starts with an underscore,
to make sure nobody is trying to call it with non-canonicalized
attribute name like "__cold__" instead of "cold".
We canonicalize only attributes that start with 2 underscores and end
with 2 underscores though.
Before Marek's patch, that wasn't an issue, we had no attributes like
"_foo" or "__bar_" etc., so lookup_scoped_attribute_spec would
always return NULL for those and we wouldn't try to register them,
look them up etc., just with -Wattributes would warn about them.
But now, as the new testcases show, users can actually request such
attributes to be ignored, and we ICE for those during
register_scoped_attribute and when that is fixed, ICE later on when
somebody uses those attributes because they will be looked up
to find out that they should be ignored.

So, the following patch instead of or in addition to, depending on
how performance sensitive a particular spot is, checking that
attribute doesn't start with underscore allows attribute
names that start with underscore as long as it doesn't canonicalize
(i.e. doesn't start and end with 2 underscores).
In addition to that, I've noticed lookup_attribute_by_prefix
was calling get_attribute_name twice unnecessarily, and 2 tests
were running in c++98 mode with -std=c++98 -std=c++11 which IMHO
isn't useful because -std=c++11 testing is done too when testing
all language versions.

2021-11-24  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/103365
	* attribs.h (lookup_attribute): Allow attr_name to start with
	underscore, as long as canonicalize_attr_name returns false.
	(lookup_attribute_by_prefix): Don't call get_attribute_name twice.
	* attribs.c (extract_attribute_substring): Reimplement using
	canonicalize_attr_name.
	(register_scoped_attribute): Change gcc_assert into
	gcc_checking_assert, verify !canonicalize_attr_name rather than
	that str.str doesn't start with '_'.

	* c-c++-common/Wno-attributes-1.c: Require effective target
	c || c++11 and drop dg-additional-options.
	* c-c++-common/Wno-attributes-2.c: Likewise.
	* c-c++-common/Wno-attributes-4.c: New test.
	* c-c++-common/Wno-attributes-5.c: New test.
2021-11-24 10:08:35 +01:00
Jakub Jelinek
04eccbbe3d bswap: Fix up symbolic merging for xor and plus [PR103376]
On Mon, Nov 22, 2021 at 08:39:42AM -0000, Roger Sayle wrote:
> This patch implements PR tree-optimization/103345 to merge adjacent
> loads when combined with addition or bitwise xor.  The current code
> in gimple-ssa-store-merging.c's find_bswap_or_nop alreay handles ior,
> so that all that's required is to treat PLUS_EXPR and BIT_XOR_EXPR in
> the same way at BIT_IOR_EXPR.

Unfortunately they aren't exactly the same.  They work the same if always
at least one operand (or corresponding byte in it) is known to be 0,
0 | 0 = 0 ^ 0 = 0 + 0 = 0.  But for | also x | x = x for any other x,
so perform_symbolic_merge has been accepting either that at least one
of the bytes is 0 or that both are the same, but that is wrong for ^
and +.

The following patch fixes that by passing through the code of binary
operation and allowing non-zero masked1 == masked2 through only
for BIT_IOR_EXPR.

Thinking more about it, perhaps we could do more for BIT_XOR_EXPR.
We could allow masked1 == masked2 case for it, but would need to
do something different than the
  n->n = n1->n | n2->n;
we do on all the bytes together.
In particular, for masked1 == masked2 if masked1 != 0 (well, for 0
both variants are the same) and masked1 != 0xff we would need to
clear corresponding n->n byte instead of setting it to the input
as x ^ x = 0 (but if we don't know what x and y are, the result is
also don't know).  Now, for plus it is much harder, because not only
for non-zero operands we don't know what the result is, but it can
modify upper bytes as well.  So perhaps only if current's byte
masked1 && masked2 set the resulting byte to 0xff (unknown) iff
the byte above it is 0 and 0, and set that resulting byte to 0xff too.
Also, even for | we could instead of return NULL just set the resulting
byte to 0xff if it is different, perhaps it will be masked off later on.

2021-11-24  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/103376
	* gimple-ssa-store-merging.c (perform_symbolic_merge): Add CODE
	argument.  If CODE is not BIT_IOR_EXPR, ensure that one of masked1
	or masked2 is 0.
	(find_bswap_or_nop_1, find_bswap_or_nop,
	imm_store_chain_info::try_coalesce_bswap): Adjust
	perform_symbolic_merge callers.

	* gcc.c-torture/execute/pr103376.c: New test.
2021-11-24 09:54:44 +01:00
Richard Biener
52554dde7b Avoid redundant get_loop_body calls in IVOPTs
This removes redundant get_loop_body calls in IVOPTs by passing
around the body we're gathering early.

2021-11-23  Richard Biener  <rguenther@suse.de>

	* tree-ssa-loop-ivopts.c (find_givs): Take loop body as
	argument instead of re-computing it.
	(find_interesting_uses): Likewise.
	(find_induction_variables): Pass through loop body.
	(tree_ssa_iv_optimize_loop): Pass down loop body.
2021-11-24 09:03:05 +01:00
Tamar Christina
755c2e7d71 middle-end: Fix failures with bitclear patterns on signed values
During testing after rebasing to commit I noticed a failing testcase with the
bitmask compare patch.

Consider the following C++ testcase:

#include <compare>

#define A __attribute__((noipa))
A bool f5 (double i, double j) { auto c = i <=> j; return c >= 0; }

This turns into a comparison against chars, on systems where chars are signed
the pattern inserts an unsigned convert such that it's able to do the
transformation.

i.e.:

  # RANGE [-1, 2]
  # c$_M_value_22 = PHI <-1(3), 0(2), 2(5), 1(4)>
  # RANGE ~[3, 254]
  _11 = (unsigned char) c$_M_value_22;
  _19 = _11 <= 1;
  # .MEM_24 = VDEF <.MEM_6(D)>
  D.10434 ={v} {CLOBBER};
  # .MEM_14 = VDEF <.MEM_24>
  D.10407 ={v} {CLOBBER};
  # VUSE <.MEM_14>
  return _19;

instead of:

  # RANGE [-1, 2]
  # c$_M_value_5 = PHI <-1(3), 0(2), 2(5), 1(4)>
  # RANGE [-2, 2]
  _3 = c$_M_value_5 & -2;
  _19 = _3 == 0;
  # .MEM_24 = VDEF <.MEM_6(D)>
  D.10440 ={v} {CLOBBER};
  # .MEM_14 = VDEF <.MEM_24>
  D.10413 ={v} {CLOBBER};
  # VUSE <.MEM_14>
  return _19;

This causes much worse codegen under -ffast-math due to phiops no longer
recognizing the pattern.  It turns out that phiopts spaceship_replacement is
looking for the exact form that was just changed.

The comments seems to suggest this code only checks for (res & ~1) == 0 but the
implementation seems to suggest it's broader.

As such I added a case to check to see if the value comparison we found is a
type cast.  and strips away the type cast and continues.

In match.pd the typecasts are only added for signed comparisons to == 0 and != 0
which are then rewritten into comparisons with 1.

As such I only check for 1 and LE and GT, which is what match.pd would have
rewritten it to.

This fixes the regression but this is not code I 100% understand, since I don't
really know the semantics of the spaceship operator so would appreciate an extra
look.

gcc/ChangeLog:

	* tree-ssa-phiopt.c (spaceship_replacement): Handle new canonical
	codegen.
2021-11-24 06:39:05 +00:00
Tamar Christina
0888d6bbe9 middle-end: Convert bitclear <imm> + cmp<cc> #0 into cm<cc2> <imm2>
This optimizes the case where a mask Y which fulfills ~Y + 1 == pow2 is used to
clear a some bits and then compared against 0 into one without the masking and
a compare against a different bit immediate.

We can do this for all unsigned compares and for signed we can do it for
comparisons of EQ and NE:

(x & (~255)) == 0 becomes x <= 255. Which for leaves it to the target to
optimally deal with the comparison.

This transformation has to be done in the mid-end because in RTL you don't have
the signs of the comparison operands and if the target needs an immediate this
should be floated outside of the loop.

The RTL loop invariant hoisting is done before split1.

i.e.

void fun1(int32_t *x, int n)
{
    for (int i = 0; i < (n & -16); i++)
      x[i] = (x[i]&(~255)) == 0;
}

now generates:

.L3:
        ldr     q0, [x0]
        cmhs    v0.4s, v2.4s, v0.4s
        and     v0.16b, v1.16b, v0.16b
        str     q0, [x0], 16
        cmp     x0, x1
        bne     .L3

and floats the immediate out of the loop.

instead of:

.L3:
        ldr     q0, [x0]
        bic     v0.4s, #255
        cmeq    v0.4s, v0.4s, #0
        and     v0.16b, v1.16b, v0.16b
        str     q0, [x0], 16
        cmp     x0, x1
        bne     .L3

In order to not break IVopts and CSE I have added a
requirement for the scalar version to be single use.

gcc/ChangeLog:

	* tree.c (bitmask_inv_cst_vector_p): New.
	* tree.h (bitmask_inv_cst_vector_p): New.
	* match.pd: Use it in new bitmask compare pattern.

gcc/testsuite/ChangeLog:

	* gcc.dg/bic-bitmask-10.c: New test.
	* gcc.dg/bic-bitmask-11.c: New test.
	* gcc.dg/bic-bitmask-12.c: New test.
	* gcc.dg/bic-bitmask-13.c: New test.
	* gcc.dg/bic-bitmask-14.c: New test.
	* gcc.dg/bic-bitmask-15.c: New test.
	* gcc.dg/bic-bitmask-16.c: New test.
	* gcc.dg/bic-bitmask-17.c: New test.
	* gcc.dg/bic-bitmask-18.c: New test.
	* gcc.dg/bic-bitmask-19.c: New test.
	* gcc.dg/bic-bitmask-2.c: New test.
	* gcc.dg/bic-bitmask-20.c: New test.
	* gcc.dg/bic-bitmask-21.c: New test.
	* gcc.dg/bic-bitmask-22.c: New test.
	* gcc.dg/bic-bitmask-23.c: New test.
	* gcc.dg/bic-bitmask-3.c: New test.
	* gcc.dg/bic-bitmask-4.c: New test.
	* gcc.dg/bic-bitmask-5.c: New test.
	* gcc.dg/bic-bitmask-6.c: New test.
	* gcc.dg/bic-bitmask-7.c: New test.
	* gcc.dg/bic-bitmask-8.c: New test.
	* gcc.dg/bic-bitmask-9.c: New test.
	* gcc.dg/bic-bitmask.h: New test.
	* gcc.target/aarch64/bic-bitmask-1.c: New test.
2021-11-24 06:38:18 +00:00
Marek Polacek
d71d019f63 c++: Fix missing NSDMI diagnostic in C++98 [PR103347]
Here the problem is that we aren't detecting a NSDMI in C++98:

struct A {
  void *x = NULL;
};

because maybe_warn_cpp0x uses input_location and that happens to point
to NULL which comes from a system header.  Jakub suggested changing the
location to the '=', thereby avoiding the system header problem.  To
that end, I've added a new location_t member into cp_declarator.  This
member is used when this declarator is part of an init-declarator.  The
rest of the changes is obvious.  I've also taken the liberty of adding
loc_or_input_loc, since I want to avoid checking for UNKNOWN_LOCATION.

	PR c++/103347

gcc/cp/ChangeLog:

	* cp-tree.h (struct cp_declarator): Add a location_t member.
	(maybe_warn_cpp0x): Add a location_t parameter with a default argument.
	(loc_or_input_loc): New.
	* decl.c (grokdeclarator): Use loc_or_input_loc.  Pass init_loc down
	to maybe_warn_cpp0x.
	* error.c (maybe_warn_cpp0x): Add a location_t parameter.  Use it.
	* parser.c (make_declarator): Initialize init_loc.
	(cp_parser_member_declaration): Set init_loc.
	(cp_parser_condition): Likewise.
	(cp_parser_init_declarator): Likewise.
	(cp_parser_parameter_declaration): Likewise.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/nsdmi-warn1.C: New test.
	* g++.dg/cpp0x/nsdmi-warn1.h: New file.
2021-11-24 00:22:10 -05:00
Jason Merrill
9bf69a8558 timevar: Add auto_cond_timevar class
The auto_timevar sentinel class for starting and stopping timevars was added
in 2014, but doesn't work for the many uses of timevar_cond_start/stop in
the C++ front end.  So let's add one that does.

This allows us to remove a lot of wrapper functions that were just used to
call timevar_cond_stop on all exits from the function.

gcc/ChangeLog:

	* timevar.h (class auto_cond_timevar): New.

gcc/cp/ChangeLog:

	* call.c
	* decl.c
	* name-lookup.c:
	Use auto_cond_timevar instead of timevar_cond_start/stop.
	Remove wrapper functions.
2021-11-23 20:25:47 -05:00
liuhongt
7df89377a7 Enhance optimize_atomic_bit_test_and to handle truncation.
r12-5102-gfb161782545224f5 improves integer bit test on
__atomic_fetch_[or|and]_* returns only for nop_convert, .i.e.

transfrom

  mask_5 = 1 << bit_4(D);
  mask.0_1 = (unsigned int) mask_5;
  _2 = __atomic_fetch_or_4 (a_7(D), mask.0_1, 0);
  t1_9 = (int) _2;
  t2_10 = mask_5 & t1_9;

to

  mask_5 = 1 << n_4(D);
  mask.1_1 = (unsigned int) mask_5;
  _11 = .ATOMIC_BIT_TEST_AND_SET (&pscc_a_1_4, n_4(D), 0);
  _8 = (int) _11;

And this patch extend the original patch to handle truncation.
.i.e.

transform

  long int mask;
  mask_8 = 1 << n_7(D);
  mask.0_1 = (long unsigned int) mask_8;
  _2 = __sync_fetch_and_or_8 (&pscc_a_2_3, mask.0_1);
  _3 = (unsigned int) _2;
  _4 = (unsigned int) mask_8;
  _5 = _3 & _4;
  _6 = (int) _5;

to

  long int mask;
  mask_8 = 1 << n_7(D);
  mask.0_1 = (long unsigned int) mask_8;
  _14 = .ATOMIC_BIT_TEST_AND_SET (&pscc_a_2_3, n_7(D), 0);
  _5 = (unsigned int) _14;
  _6 = (int) _5;

2021-11-17  Hongtao Liu  <hongtao.liu@intel.com>
	    H.J. Lu  <hongjiu.lu@intel.com>

gcc/ChangeLog:

	PR tree-optimization/103194
	* match.pd (gimple_nop_atomic_bit_test_and_p): Extended to
	match truncation.
	* tree-ssa-ccp.c (gimple_nop_convert): Declare.
	(optimize_atomic_bit_test_and): Enhance
	optimize_atomic_bit_test_and to handle truncation.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/pr103194-2.c: New test.
	* gcc.target/i386/pr103194-3.c: New test.
	* gcc.target/i386/pr103194-4.c: New test.
	* gcc.target/i386/pr103194-5.c: New test.
	* gcc.target/i386/pr103194.c: New test.
2021-11-24 09:00:58 +08:00
GCC Administrator
e1d4359264 Daily bump. 2021-11-24 00:16:29 +00:00
Martin Sebor
2dd56aed3e Issue -Waddress also for reference members [PR96507].
Resolves:
PR c++/96507 - missing -Waddress for member references

gcc/cp/ChangeLog:

	PR c++/96507
	* typeck.c (warn_for_null_address): Handle reference members.

gcc/testsuite/ChangeLog:

	PR c++/96507
	* g++.dg/warn/Waddress-8.C: New test.
2021-11-23 15:36:03 -07:00