197426 Commits

Author SHA1 Message Date
Jakub Jelinek
8872df3538 testsuite: Use -mnofpu for rx-*-* in ieee testsuite [PR107046]
add_options_for_ieee has:
    if { [istarget alpha*-*-*]
         || [istarget sh*-*-*] } {
       return "$flags -mieee"
    }
    if { [istarget rx-*-*] } {
       return "$flags -mnofpu"
    }
but ieee.exp doesn't use add_options_for_ieee, instead it has:
if { [istarget "alpha*-*-*"]
     || [istarget "sh*-*-*"] } then {
  lappend additional_flags "-mieee"
}
among other things (plus -ffloat-store on some arches etc.).

The following patch adds the rx -mnofpu similarly in the hope
of fixing ieee.exp FAILs on rx.

Preapproved in the PR by Jeff, committed to trunk.

2022-12-06  Jakub Jelinek  <jakub@redhat.com>

	PR testsuite/107046
	* gcc.c-torture/execute/ieee/ieee.exp: For rx-*-* append
	-mnofpu.
2022-12-06 11:39:51 +01:00
Richard Biener
926f5059bb tree-optimization/104475 - improve access diagnostics
When we end up isolating a nullptr path it happens we diagnose
accesses to offsetted nullptr objects.  The current diagnostics
have no good indication that this happens so the following records
the fact that our heuristic detected a nullptr based access in
the access_ref structure and sets up diagnostics to inform
of that detail.  The diagnostic itself could probably be
improved here but its API is twisted and the necessary object
isn't passed around.

Instead of just

...bits/atomic_base.h:655:34: warning: 'unsigned int __atomic_fetch_and_4(volatile void*, unsigned int, int)' writing 4 bytes into a region of size 0 overflows the destination [-Wstringop-overflow=]

we now add

In member function 'void QFutureInterfaceBase::setThrottled(bool)':
cc1plus: note: destination object is likely at address zero

	PR tree-optimization/104475
	* pointer-query.h (access_ref::ref_nullptr_p): New flag.
	* pointer-query.cc (access_ref::access_ref): Initialize
	ref_nullptr_p.
	(compute_objsize_r): Set ref_nullptr_p if we treat it that way.
	(access_ref::inform_access): If ref was treated as nullptr
	based, indicate that.
2022-12-06 11:21:53 +01:00
Jakub Jelinek
a0ee2e5225 range-op-float: Improve binary reverse operations
On Mon, Dec 05, 2022 at 02:29:36PM +0100, Aldy Hernandez wrote:
> > So like this for multiplication op1/2_range if it passes bootstrap/regtest?
> > For division I'll need to go to a drawing board...
>
> Sure, looks good to me.

Ulrich just filed PR107972, so in the light of that PR the following patch
attempts to do that differently.

As for testcase, I've tried both attached testcases, but unfortunately it
seems that in neither of the cases we actually figure out that res range
is finite (or for last function non-zero ordered).  So there is further
work needed on that.

2022-12-06  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/107972
	* range-op-float.cc (frange_drop_infs): New function.
	(float_binary_op_range_finish): Add DIV_OP2 argument.  If DIV_OP2 is
	false and lhs is finite or if DIV_OP2 is true and lhs is non-zero and
	not NAN, r must be finite too.
	(foperator_div::op2_range): Pass true to DIV_OP2 of
	float_binary_op_range_finish.
2022-12-06 10:26:09 +01:00
Jakub Jelinek
0525a7fad2 range-op-float: Fix up ICE in lower_bound [PR107975]
According to https://gcc.gnu.org/pipermail/gcc-regression/2022-December/077258.html
my patch caused some ICEs, e.g. the following testcase ICEs.
The problem is that lower_bound and upper_bound methods on a france assert
that the range isn't VR_NAN or VR_UNDEFINED.
All the op1_range/op2_range methods already return early if lhs.undefined_p,
but the other cases (when lhs is VR_NAN or the other opN is VR_NAN or
VR_UNDEFINED) aren't.  float_binary_op_range_finish will DTRT for those
cases already.

2022-12-06  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/107975
	* range-op-float.cc (foperator_mult::op1_range,
	foperator_div::op1_range, foperator_div::op2_range): Just
	return float_binary_op_range_finish result if lhs is known
	NAN, or the other operand is known NAN or UNDEFINED.

	* gcc.dg/pr107975.c: New test.
2022-12-06 10:23:55 +01:00
Tobias Burnus
9f80367e53 libgomp.texi: Fix a OpenMP 5.2 and a TR11 impl-status item
libgomp/
	* libgomp.texi (OpenMP 5.2): Add missing 'the'.
	(TR11): Add missing '@tab N @tab'.
2022-12-06 09:51:12 +01:00
Richard Biener
790ff87f67 tree-optimization/104165 - bougs -Warray-bounds, add testcase
The following adds the testcase from the description which was
fixed by r13-2894-gbe4a6551ed37c1.

	PR tree-optimization/104165
	* g++.dg/warn/Warray-bounds-pr104165-1.C: New testcase.
2022-12-06 08:23:56 +01:00
Iain Sandoe
6a6f2cbf9a testsuite, X86, Darwin: Fix bf16 ABI tests for Mach-O/MacOS ABI.
These tests have failed since introduction since they assume that the
assembler output is ELF and that the ABI targeted supports the addressing.

For Darwin, Mach-O and ABI we need to make several changes:
1. Use the __USER_LABEL__PREFIX__
2. Remove the use of ELF-specific constructs (.size, .type etc.)
3. We cannot make direct access to common variables in the ABI, so that we
   must move these to BSS.

These changes are made in darwin-specific asm files.

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

gcc/testsuite/ChangeLog:

	* gcc.target/x86_64/abi/bf16/abi-bf16.exp: Use separate asm for Darwin.
	* gcc.target/x86_64/abi/bf16/m256bf16/abi-bf16-ymm.exp: Likewise.
	* gcc.target/x86_64/abi/bf16/m512bf16/abi-bf16-zmm.exp: Likewise.
	* gcc.target/x86_64/abi/bf16/args.h: Make xmm_regs, x87_regs extern.
	* gcc.target/x86_64/abi/bf16/m256bf16/args.h: Likewise.
	* gcc.target/x86_64/abi/bf16/m512bf16/args.h: Likewise.
	* gcc.target/x86_64/abi/bf16/asm-support-darwin.S: New file.
	* gcc.target/x86_64/abi/bf16/m256bf16/asm-support-darwin.S: New file.
	* gcc.target/x86_64/abi/bf16/m512bf16/asm-support-darwin.S: New file.
2022-12-06 04:59:58 +00:00
Prathamesh Kulkarni
769370f3e2 aarch64: Use dup and zip1 for interleaving elements in vector initializer.
gcc/ChangeLog:
	* config/aarch64/aarch64.cc (aarch64_expand_vector_init): Use dup
	and zip1 for interleaving elements in vector initializer.

gcc/testsuite/ChangeLog:
	* gcc.target/aarch64/interleave-init-1.c: New test.
2022-12-06 06:51:14 +05:30
GCC Administrator
e6f93f450d Daily bump. 2022-12-06 00:17:36 +00:00
Richard Biener
0d14720f93 middle-end/40635 - SSA update losing PHI arg loations
The following fixes an issue where SSA update loses PHI argument
locations when updating PHI nodes it didn't create as part of the
SSA update.  For the case where the reaching def is the same as
the current argument opt to do nothing and for the case where the
PHI argument already has a location keep that (that's an indication
the PHI node wasn't created as part of the update SSA process).

	PR middle-end/40635
	* tree-into-ssa.cc (rewrite_update_phi_arguments): Only
	update the argument when the reaching definition is different
	from the current argument.  Keep an existing argument
	location.

	* gcc.dg/uninit-pr40635.c: New testcase.
2022-12-05 16:50:49 +01:00
Richard Biener
d492d50f64 tree-optimization/106868 - bogus -Wdangling-pointer diagnostic
The testcase shows we mishandle the case where there's a pass-through
of a pointer through a function like memcpy.  The following adjusts
handling of this copy case to require a taken address and adjust
the PHI case similarly.

	PR tree-optimization/106868
	* gimple-ssa-warn-access.cc (pass_waccess::gimple_call_return_arg_ref):
	Inline into single user ...
	(pass_waccess::check_dangling_uses): ... here and adjust the
	call and the PHI case to require that ref.aref is the address
	of the decl.

	* gcc.dg/Wdangling-pointer-pr106868.c: New testcase.
2022-12-05 14:55:44 +01:00
Jakub Jelinek
109148dd16 match.pd: Don't fold nan < x etc. for -ftrapping-math [PR106805]
As reported in the PR, the following pr106805.c testcase is miscompiled
with the default -ftrapping-math, because we fold all the comparisons into
constants and don't raise any exceptions.

The match.pd pattern handles just simple comparisons, from those
EQ/NE are quiet and don't raise exceptions on anything but sNaN, while
GT/GE/LT/LE are signaling and do raise exceptions even on qNaN.

fold_relational_const handles this IMHO correctly:
      /* Handle the cases where either operand is a NaN.  */
      if (real_isnan (c0) || real_isnan (c1))
        {
          switch (code)
            {
            case EQ_EXPR:
            case ORDERED_EXPR:
              result = 0;
              break;

            case NE_EXPR:
            case UNORDERED_EXPR:
            case UNLT_EXPR:
            case UNLE_EXPR:
            case UNGT_EXPR:
            case UNGE_EXPR:
            case UNEQ_EXPR:
              result = 1;
              break;

            case LT_EXPR:
            case LE_EXPR:
            case GT_EXPR:
            case GE_EXPR:
            case LTGT_EXPR:
              if (flag_trapping_math)
                return NULL_TREE;
              result = 0;
              break;

            default:
              gcc_unreachable ();
            }

          return constant_boolean_node (result, type);
        }
by folding the signaling comparisons only if -fno-trapping-math.
The following patch does the same in match.pd.

Unfortunately the pr106805.c testcase still fails, but no longer because of
match.pd, but on the trunk because of the still unresolved ranger problems
(same issue as for fold-overflow-1.c etc.) and on 12 branch (and presumably
trunk too) somewhere during expansion the comparisons are also expanded
into constants (which is ok for -fno-trapping-math, but not ok with that).

Though, I think the patch is a small step in the direction, so I'd like
to commit this patch without the gcc.dg/pr106805.c testcase for now.

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

	PR middle-end/106805
	* match.pd (cmp @0 REAL_CST@1): Don't optimize x cmp NaN
	or NaN cmp x to false/true for cmp >/>=/</<= if -ftrapping-math.

	* c-c++-common/pr57371-4.c: Revert 2021-09-19 changes.
	* c-c++-common/pr57371-5.c: New test.
	* gcc.c-torture/execute/ieee/fp-cmp-6.x: Add -fno-trapping-math.
	* gcc.c-torture/execute/ieee/fp-cmp-9.c: New test.
	* gcc.c-torture/execute/ieee/fp-cmp-9.x: New file.
2022-12-05 11:54:45 +01:00
Jakub Jelinek
4500baaccb range-op-float: Fix up multiplication and division reverse operation [PR107879]
While for the normal cases it seems to be correct to implement
reverse multiplication (op1_range/op2_range) through division
with float_binary_op_range_finish, reverse division (op1_range)
through multiplication with float_binary_op_range_finish or
(op2_range) through division with float_binary_op_range_finish,
as e.g. following testcase shows for the corner cases it is
incorrect.
Say on the testcase we are doing reverse multiplication, we
have [-0., 0.] range (no NAN) on lhs and VARYING on op1 (or op2).
We implement that through division, because x from
lhs = x * op2
is
x = lhs / op2
For the division, [-0., 0.] / VARYING is computed (IMHO correctly)
as [-0., 0.] +-NAN, because 0 / anything but 0 or NAN is still
0 and 0 / 0 is NAN and ditto 0 / NAN.  And then we just
float_binary_op_range_finish, which figures out that because lhs
can't be NAN, neither operand can be NAN.  So, the end range is
[-0., 0.].  But that is not correct for the reverse multiplication.
When the result is 0, if op2 can be zero, then x can be anything
(VARYING), to be precise anything but INF (unless result can be NAN),
because anything * 0 is 0 (or NAN for INF).  While if op2 must be
non-zero, then x must be 0.  Of course the sign logic
(signbit(x) = signbit(lhs) ^ signbit(op2)) still holds, so it actually
isn't full VARYING if both lhs and op2 have known sign bits.
And going through other corner cases one by one shows other differences
between what we compute for the corresponding forward operation and
what we should compute for the reverse operations.
The following patch is slightly conservative and includes INF
(in case of result including 0 and not NAN) in the ranges or
0 in the ranges (in case of result including INF and not NAN).
The latter is what happens anyway because we flush denormals to 0,
and the former just not to deal with all the corner cases.
So, the end test is that for reverse multiplication and division
op2_range the cases we need to adjust to VARYING or VARYING positive
or VARYING negative are if lhs and op? ranges both contain 0,
or both contain some infinity, while for division op1_range the
corner case is if lhs range contains 0 and op2 range contains INF or vice
versa.  Otherwise I believe ranges from the corresponding operation
are ok, or could be slightly more conservative (e.g. for
reverse multiplication, if op? range is singleton INF and lhs
range doesn't include any INF, then x's range should be UNDEFINED or
known NAN (depending on if lhs can be NAN), while the division computes
[-0., 0.] +-NAN; or similarly if op? range is only 0 and lhs range
doesn't include 0, division would compute +INF +-NAN, or -INF +-NAN,
or (for lack of multipart franges -INF +INF +-NAN just VARYING +-NAN),
while again it is UNDEFINED or known NAN.

Oh, and I found by code inspection wrong condition for the division's
known NAN result, due to thinko it would trigger not just when
both operands are known to be 0 or both are known to be INF, but
when either both are known to be 0, or at least one is known to be INF.

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

	PR tree-optimization/107879
	* range-op-float.cc (foperator_mult::op1_range): If both
	lhs and op2 ranges contain zero or both ranges contain
	some infinity, set r range to zero_to_inf_range depending on
	signbit_known_p.
	(foperator_div::op2_range): Similarly for lhs and op1 ranges.
	(foperator_div::op1_range): If lhs range contains zero and op2
	range contains some infinity or vice versa, set r range to
	zero_to_inf_range depending on signbit_known_p.
	(foperator_div::rv_fold): Fix up condition for returning known NAN.
2022-12-05 11:17:42 +01:00
Richard Biener
44c8402d35 tree-optimization/107833 - invariant motion of uninit uses
The following fixes a wrong-code bug caused by loop invariant motion
hoisting an expression using an uninitialized value outside of its
controlling condition causing IVOPTs to use that to rewrite a defined
value.  PR107839 is a similar case involving a bogus uninit diagnostic.

	PR tree-optimization/107833
	PR tree-optimization/107839
	* cfghooks.cc: Include tree.h.
	* tree-ssa-loop-im.cc (movement_possibility): Wrap and
	make stmts using any ssa_name_maybe_undef_p operand
	to preserve execution.
	(loop_invariant_motion_in_fun): Call mark_ssa_maybe_undefs
	to init maybe-undefined status.
	* tree-ssa-loop-ivopts.cc (ssa_name_maybe_undef_p,
	ssa_name_set_maybe_undef, ssa_name_any_use_dominates_bb_p,
	mark_ssa_maybe_undefs): Move ...
	* tree-ssa.cc: ... here.
	* tree-ssa.h (ssa_name_any_use_dominates_bb_p,
	mark_ssa_maybe_undefs): Declare.
	(ssa_name_maybe_undef_p, ssa_name_set_maybe_undef): Define.

	* gcc.dg/torture/pr107833.c: New testcase.
	* gcc.dg/uninit-pr107839.c: Likewise.
2022-12-05 10:22:53 +01:00
Scott Snyder
824542bec2 plugins/107964 - install contracts.h
contracts.h is included by cp-tree.h so needs to be installed for
plugins.

	PR plugins/107964
gcc/cp/
	* Make-lang.in (CP_PLUGIN_HEADERS): Install contracts.h
2022-12-05 09:21:49 +01:00
Andrew Pinski
5c11d74856 tree-optimization/107956 - ICE with NULL call LHS
The following adds a missing check for a NULL call LHS in the
vector pattern recognizer.

	PR tree-optimization/107956
	* tree-vect-patterns.cc (vect_recog_mask_conversion_pattern):
	Check for NULL LHS on masked loads.
2022-12-05 09:11:33 +01:00
Kewen Lin
380d62c14c gimple-fold: Refine gimple_fold_partial_load_store_mem_ref [PR107412]
Following Richard's review comments, this patch is to use
untruncated type for the length used for IFN_LEN_{LOAD,STORE}
instead of "unsigned int" for better robustness.  It also
avoid to use to_constant and tree arithmetic for subtraction.

Co-authored-by: Richard Sandiford  <richard.sandiford@arm.com>

	PR tree-optimization/107412

gcc/ChangeLog:

	* gimple-fold.cc (gimple_fold_partial_load_store_mem_ref): Use
	untruncated type for the length, and avoid to_constant and tree
	arithmetic for subtraction.
2022-12-04 23:27:08 -06:00
GCC Administrator
102f3cef56 Daily bump. 2022-12-05 00:17:24 +00:00
Harald Anlauf
24b9337d1f Fortran: error recovery simplifying UNPACK for insufficient FIELD [PR107922]
gcc/fortran/ChangeLog:

	PR fortran/107922
	* simplify.cc (gfc_simplify_unpack): Terminate simplification when
	array-valued argument FIELD does not provide enough elements.

gcc/testsuite/ChangeLog:

	PR fortran/107922
	* gfortran.dg/unpack_field_1.f90: New test.
2022-12-04 20:59:03 +01:00
Harald Anlauf
98d6e4b6f1 Fortran: fix typo in documentation of intrinsic FLOOR [PR107870]
gcc/fortran/ChangeLog:

	PR fortran/107870
	* intrinsic.texi: Fix typo in documentation of intrinsic FLOOR.
	Describe the optional KIND argument to intrinsics as a scalar
	constant expression, in accordance with the current standard.
2022-12-04 20:27:34 +01:00
Harald Anlauf
9123863828 Fortran: error recovery handling invalid CLASS variable [PR107899]
gcc/fortran/ChangeLog:

	PR fortran/107899
	* resolve.cc (resolve_deallocate_expr): Avoid NULL pointer dereference
	on invalid CLASS variable.

gcc/testsuite/ChangeLog:

	PR fortran/107899
	* gfortran.dg/pr107899.f90: New test.
2022-12-04 20:27:34 +01:00
Patrick Palka
079add3ad3 c++: pack in requires-expr parm list [PR107417]
Here find_parameter_packs_r isn't detecting the pack T inside the
requires-expr's parameter list ultimately because cp_walk_trees
deliberately avoids walking the list so as to avoid false positives in
the unexpanded pack checker.

But it should still be fine to walk the TREE_TYPE of each parameter,
which we already need to do from for_each_template_parm_r, and is
sufficient to fix the testcase.

	PR c++/107417

gcc/cp/ChangeLog:

	* pt.cc (for_each_template_parm_r) <case REQUIRES_EXPR>: Move
	walking of the TREE_TYPE of each parameter to ...
	* tree.cc (cp_walk_subtrees) <case REQUIRES_EXPR>: ... here.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-requires33.C: New test.
2022-12-04 10:47:24 -05:00
Iain Sandoe
a044c9d259 libstdc++, Darwin: Limit recursive mutex init to OS versions needing it.
The problem described in pr 51906 was fixed in the next OS release.  Limit the
workaround to systems that need it.

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

libstdc++-v3/ChangeLog:

	* config/os/bsd/darwin/os_defines.h
	(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC): Limit use of this macro
	to OS versions that need it.
2022-12-04 14:55:07 +00:00
Iain Sandoe
e76a44bf68 libstdc++, Darwin: Fix weak attribute to use __weak__ instead of weak.
The text for _GLIBCXX_WEAK_DEFINITION has used 'weak' for the attribute name,
since its intoduction.  Amend to use the implementation namespace '__weak__'
version.

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

libstdc++-v3/ChangeLog:

	* config/os/bsd/darwin/os_defines.h (_GLIBCXX_WEAK_DEFINITION): Use the
	implementation namespace for the weak attribute.
2022-12-04 10:48:48 +00:00
Iain Sandoe
7fe8aca8a6 libsanitizer, Darwin: Restrict build to Darwin 16 or newer.
The latest import has added dependencies on system resources that are not
present until Darwin 16.  It might be possible to work around these for
earlier systems, but in the short-term we have to disable the build so that
bootstrap completes.

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

libsanitizer/ChangeLog:

	* configure.tgt: Restrict build to Darwin 16 or newer.
2022-12-04 10:41:53 +00:00
Iain Sandoe
58a7b1e354 coroutines: Do not promote temporaries that will be elided.
We usually need to 'promote' (i.e. save to the coroutine frame) any temporary
variable that is in a target expression that must persist across an await
expression.  However, if the TE is just used as a direct initializer for
another object it will be elided - and we should not promote it since that
would lead to a DTOR call for something that is never constructed.

Since we now have a mechanism to tell if TEs will be elided, use that.

Although the PRs referenced initially appear to be different issues, they all
stem from this.

Co-Authored-By: Adrian Perl <adrian.perl@web.de>
Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>

	PR c++/100611
	PR c++/101367
	PR c++/101976
	PR c++/99576

gcc/cp/ChangeLog:

	* coroutines.cc (find_interesting_subtree): Do not promote temporaries
	that are only used as direct initializers for some other object.

gcc/testsuite/ChangeLog:

	* g++.dg/coroutines/pr100611.C: New test.
	* g++.dg/coroutines/pr101367.C: New test.
	* g++.dg/coroutines/pr101976.C: New test.
	* g++.dg/coroutines/pr99576_1.C: New test.
	* g++.dg/coroutines/pr99576_2.C: New test.
2022-12-04 10:39:36 +00:00
GCC Administrator
8c45e67ac6 Daily bump. 2022-12-04 00:17:06 +00:00
Patrick Palka
b3912122c9 c++: substituting CONST_DECL_USING_P enumerators [PR103081]
We implement class-scope using enum by injecting clones of the enum's
CONST_DECLs as fields of the class, for which CONST_DECL_USING_P is
true, so that qualified lookup naturally finds the enumerators.
Substitution into such a CONST_DECL currently ICEs however, because we
assume the DECL_CONTEXT is always the ENUMERAL_TYPE (which has
TYPE_VALUES) but in this case it's the RECORD_TYPE for the class scope
(which has TYPE_FIELDS).

Since these CONST_DECLs appear to always be non-dependent, this patch
fixes this by shortcutting substitution for CONST_DECLs that have
non-dependent DECL_CONTEXT.  This subsumes the existing (and seemingly
dead) DECL_NAMESPACE_SCOPE_P early exit test and also benefits
substitution into ordinary non-dependent CONST_DECLs.

	PR c++/103081

gcc/cp/ChangeLog:

	* pt.cc (tsubst_copy) <case CONST_DECL>: Generalize
	early exit test for namespace-scope decls to check dependence of
	the enclosing scope instead.  Remove dead early exit test.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/using-enum-10.C: New test.
	* g++.dg/cpp2a/using-enum-10a.C: New test.
2022-12-03 10:28:25 -05:00
Alexandre Oliva
93574914e4 [testsuite] [riscv] skip ssa-sink-18.c
On riscv64, despite being lp64, we choose two IV candidates as on arm,
which prevents some of the expected sinking.  Add an xfail for it.


for  gcc/testsuite/ChangeLog

	* gcc.dg/tree-ssa/ssa-sink-18.c: xfail sink2 on riscv64.
2022-12-02 21:55:25 -03:00
Alexandre Oliva
cebd317578 [testsuite] [riscv] uninit-pred-9_b bogus warning
Like other platforms, riscv hits the uninitialized warning because the
optimizations don't eliminate the nonviable path that would enable it
to be omitted.


for  gcc/testsuite/ChangeLog

	* gcc.dg/uninit-pred-9_b.c: Add riscv*-*-* to the xfail list
	for the bogus warning.
2022-12-02 21:55:24 -03:00
GCC Administrator
596dbfff88 Daily bump. 2022-12-03 00:17:18 +00:00
Harald Anlauf
36a4ee406b Fortran: intrinsic MERGE shall use all its arguments [PR107874]
gcc/testsuite/ChangeLog:

	PR fortran/107874
	* gfortran.dg/merge_1.f90: Avoid recursive I/O.
2022-12-02 22:34:38 +01:00
David Malcolm
e24fe1283c analyzer: introduce struct event_loc_info
gcc/analyzer/ChangeLog:
	* analyzer.h (struct event_loc_info): New forward decl.
	* bounds-checking.cc: Use event_loc_info throughout to bundle the
	loc, fndecl, depth triples.
	* call-info.cc: Likewise.
	* checker-event.cc: Likewise.
	* checker-event.h (struct event_loc_info): New decl.  Use it
	throughout to bundle the loc, fndecl, depth triples.
	* checker-path.cc: Likewise.
	* checker-path.h: Likewise.
	* diagnostic-manager.cc: Likewise.
	* engine.cc: Likewise.
	* infinite-recursion.cc: Likewise.
	* pending-diagnostic.cc: Likewise.
	* pending-diagnostic.h: Likewise.
	* region-model.cc: Likewise.
	* sm-signal.cc: Likewise.
	* varargs.cc: Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-12-02 16:30:52 -05:00
David Malcolm
f5758fe5b4 analyzer: fixes to region creation messages [PR107851]
In r13-2573-gc81b60b8c6ff3d I split up the analyzer's region-creation
events to describe the memory space and capacity of the region as two
separate events to avoid combinatorial explosion of message wordings.

However I didn't take into account r13-1405-ge6c3bb379f515b which
added a pending_diagnostic::describe_region_creation_event vfunc which
could change the wording of region creation events.

Hence for:

#include <stdlib.h>
#include <stdint.h>

void test ()
{
  int32_t *ptr = malloc (1);
  free (ptr);
}

trunk currently emits:

  Compiler Explorer (x86_64 trunk): https://godbolt.org/z/e3Td7c9s5:

<source>: In function 'test':
<source>:6:18: warning: allocated buffer size is not a multiple of the pointee's size [CWE-131] [-Wanalyzer-allocation-size]
    6 |   int32_t *ptr = malloc (1);
      |                  ^~~~~~~~~~
  'test': events 1-3
    |
    |    6 |   int32_t *ptr = malloc (1);
    |      |                  ^~~~~~~~~~
    |      |                  |
    |      |                  (1) allocated 1 bytes here
    |      |                  (2) allocated 1 bytes here
    |      |                  (3) assigned to 'int32_t *' {aka 'int *'} here; 'sizeof (int32_t {aka int})' is '4'
    |

where events (1) and (2) are different region_creation_events that have
had their wording overridden (also, with a "1 bytes" issue).

This patch reorganizes region creation events so that each
pending_diagnostic instead creates the events that is appropriate for it,
and the events have responsibility for their own wording.

With this patch, the above emits:

<source>: In function 'test':
<source>:6:18: warning: allocated buffer size is not a multiple of the pointee's size [CWE-131] [-Wanalyzer-allocation-size]
    6 |   int32_t *ptr = malloc (1);
      |                  ^~~~~~~~~~
  'test': events 1-2
    |
    |    6 |   int32_t *ptr = malloc (1);
    |      |                  ^~~~~~~~~~
    |      |                  |
    |      |                  (1) allocated 1 byte here
    |      |                  (2) assigned to 'int32_t *' {aka 'int *'} here; 'sizeof (int32_t {aka int})' is '4'
    |

fixing the duplicate event, and fixing the singular/plural issue.

gcc/analyzer/ChangeLog:
	PR analyzer/107851
	* analyzer.cc (make_label_text_n): Convert param "n" from int to
	unsigned HOST_WIDE_INT.
	* analyzer.h (make_label_text_n): Likewise for decl.
	* bounds-checking.cc: Include "analyzer/checker-event.h" and
	"analyzer/checker-path.h".
	(out_of_bounds::add_region_creation_events): New.
	(concrete_past_the_end::describe_region_creation_event): Replace
	with...
	(concrete_past_the_end::add_region_creation_events): ...this.
	(symbolic_past_the_end::describe_region_creation_event): Delete.
	* checker-event.cc (region_creation_event::region_creation_event):
	Update for dropping all member data.
	(region_creation_event::get_desc): Delete, splitting out into
	region_creation_event_memory_space::get_desc,
	region_creation_event_capacity::get_desc, and
	region_creation_event_debug::get_desc.
	(region_creation_event_memory_space::get_desc): New.
	(region_creation_event_capacity::get_desc): New.
	(region_creation_event_allocation_size::get_desc): New.
	(region_creation_event_debug::get_desc): New.
	* checker-event.h: Include "analyzer/program-state.h".
	(enum rce_kind): Delete.
	(class region_creation_event): Drop all member data.
	(region_creation_event::region_creation_event): Make protected.
	(region_creation_event::get_desc): Delete.
	(class region_creation_event_memory_space): New.
	(class region_creation_event_capacity): New.
	(class region_creation_event_allocation_size): New.
	(class region_creation_event_debug): New.
	* checker-path.cc (checker_path::add_region_creation_events): Add
	"pd" param.  Call pending_diangnostic::add_region_creation_events.
	Update for conversion of RCE_DEBUG to region_creation_event_debug.
	* checker-path.h (checker_path::add_region_creation_events): Add
	"pd" param.
	* diagnostic-manager.cc (diagnostic_manager::build_emission_path):
	Pass pending_diagnostic to
	emission_path::add_region_creation_events.
	(diagnostic_manager::build_emission_path): Pass path_builder to
	add_event_on_final_node.
	(diagnostic_manager::add_event_on_final_node): Add "pb" param.
	Pass pending_diagnostic to
	emission_path::add_region_creation_events.
	(diagnostic_manager::add_events_for_eedge): Pass
	pending_diagnostic to emission_path::add_region_creation_events.
	* diagnostic-manager.h
	(diagnostic_manager::add_event_on_final_node): Add "pb" param.
	* pending-diagnostic.cc
	(pending_diagnostic::add_region_creation_events): New.
	* pending-diagnostic.h (struct region_creation): Delete.
	(pending_diagnostic::describe_region_creation_event): Delete.
	(pending_diagnostic::add_region_creation_events): New vfunc.
	* region-model.cc: Include "analyzer/checker-event.h" and
	"analyzer/checker-path.h".
	(dubious_allocation_size::dubious_allocation_size): Initialize
	m_has_allocation_event.
	(dubious_allocation_size::describe_region_creation_event): Delete.
	(dubious_allocation_size::describe_final_event): Update for
	replacement of m_allocation_event with m_has_allocation_event.
	(dubious_allocation_size::add_region_creation_events): New.
	(dubious_allocation_size::m_allocation_event): Replace with...
	(dubious_allocation_size::m_has_allocation_event): ...this.

gcc/testsuite/ChangeLog:
	PR analyzer/107851
	* gcc.dg/analyzer/allocation-size-4.c: Update expected wording.
	* gcc.dg/analyzer/allocation-size-multiline-1.c: New test.
	* gcc.dg/analyzer/allocation-size-multiline-2.c: New test.
	* gcc.dg/analyzer/out-of-bounds-multiline-1.c: Update expected
	wording.
	* gcc.dg/analyzer/out-of-bounds-multiline-2.c: New test.
	* gcc.dg/analyzer/out-of-bounds-read-char-arr.c: Update expected
	wording.
	* gcc.dg/analyzer/out-of-bounds-read-int-arr.c: Likewise.
	* gcc.dg/analyzer/out-of-bounds-write-char-arr.c: Likewise.
	* gcc.dg/analyzer/out-of-bounds-write-int-arr.c: Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-12-02 16:30:51 -05:00
Marek Polacek
1998db0fa1 testsuite: Adjust dg-error for -fimplicit-constexpr
Some of the new tests were failing with -fimplicit-constexpr.  This
patch adjusts the expected diagnostic.  Tested with

GXX_TESTSUITE_STDS=98,11,14,17,20,23 make check-c++ RUNTESTFLAGS="--target_board=unix\{,-fimplicit-constexpr\} dg.exp=spaceship-eq3.C"

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/constexpr-ex1.C: Adjust dg-error.
	* g++.dg/cpp23/constexpr-nonlit10.C: Adjust dg-warning.
	* g++.dg/cpp23/constexpr-nonlit11.C: Likewise.
	* g++.dg/cpp2a/spaceship-eq3.C: Add dg-error.
2022-12-02 14:47:45 -05:00
Bernhard Reutner-Fischer
d19aa6af66 c++: Set the locus of the function result decl
gcc/cp/ChangeLog:

	* decl.cc (grokdeclarator): Build RESULT_DECL.
	(start_preparsed_function): Copy location from template.
	* semantics.cc (apply_deduced_return_type): Handle
	arg != current_function_decl.
	* method.cc (implicitly_declare_fn): Use it.

gcc/ChangeLog:

	* function.cc (init_function_start): Use DECL_RESULT location
	for -Waggregate-return warning.

gcc/testsuite/ChangeLog:

	* g++.dg/diagnostic/return-type-loc1.C: New test.

Co-authored-by: Jason Merrill <jason@redhat.com>
2022-12-02 14:17:53 -05:00
Andrew MacLeod
76dd48f895 Fix a few incorrect accesses.
This consists of 3 changes which stronger type checking has indicated
are incorrect.

	gcc/
	* fold-const.cc (fold_unary_loc): Check TREE_TYPE of node.
	(tree_invalid_nonnegative_warnv_p): Likewise.

	gcc/c-family/
	* c-attribs.cc (handle_deprecated_attribute): Use type when
	using TYPE_NAME.
2022-12-02 11:50:05 -05:00
Jason Merrill
6d3c634c8b driver: fix validate_switches logic
Under the old logic for validate_switches, once suffix or starred got set,
they stayed set for all later switches found in the spec.  So for e.g.

%{g*:%{%:debug-level-gt(0):

Once we see g*, starred is set.  Then we see %:, and it sees that as a
zero-length switch, which because starred is still set, matches any and all
command-line options.  So targets that use such a spec accept all options in
the driver, while ones that don't reject some, such as the recent
-nostdlib++.

This patch fixes the inconsistency, so all targets would complain about
-nostdlib++, and then sets SKIPOPT for it so they don't.

gcc/ChangeLog:

	* gcc.cc (validate_switches): Reset suffix/starred on loop.

gcc/cp/ChangeLog:

	* g++spec.cc (lang_specific_driver): Set SKIPOPT for nostdlib++.
2022-12-02 10:38:32 -05:00
Vladimir N. Makarov
70596a0fb2 LRA: Check hard reg availability of pseudo and its subreg for pseudo reload
Do not reload subreg pseudo if there are hard regs for subreg mode
but there are no hard regs for pseudo mode.

        PR target/106462

gcc/ChangeLog:

	* lra-constraints.cc (curr_insn_transform): Check available hard
	regs for pseudo and its subreg to decide what to reload.

gcc/testsuite/ChangeLog:

	* gcc.target/mips/pr106462.c: New test.
2022-12-02 08:24:03 -05:00
liuhongt
e55251f3d3 Improve ix86_expand_fast_convert_bf_to_sf with new extendbfsf2_1.
After supporting extendbfsf2_1, ix86_expand_fast_convert_bf_to_sf can
be improved with pslld either.
CONST_INT_P is not handled since constant shift can be optimized off.

gcc/ChangeLog:

	* config/i386/i386-expand.cc
	(ix86_expand_fast_convert_bf_to_sf): Use extendbfsf2_1 for
	nonimmediate operand.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/cbranchbf4.c: New test.
2022-12-02 20:30:22 +08:00
Martin Liska
71e800747e gcc: regenerate configure
gcc/ChangeLog:

	* configure: Regenerate.
2022-12-02 12:38:57 +01:00
GCC Administrator
b35680ec3d Daily bump. 2022-12-02 11:25:05 +00:00
Jakub Jelinek
b3237a2c68 i386: Save/restore recog_data in ix86_vector_duplicate_value [PR106577]
On Tue, Aug 16, 2022 at 09:14:06AM +0100, Richard Sandiford via Gcc-patches wrote:
> IMO the correct low-effort fix is to save and restore recog_data
> in ix86_vector_duplicate_value.  It's a relatively big copy,
> but the current code is pretty wasteful anyway (allocating at
> least a new SET and INSN for every query).  Compared to the
> overhead of doing that, a copy to and from the stack shouldn't
> be too bad.

The following patch does that.
It isn't the first spot in the compiler that does that, not even the first
spot in the i386 backend.
In i386-expand.cc beyond these 2 recog_memoized calls there is one in
expand_vselect, but I think it is unlikely we'd run into these issues trying
to expand new permutations from splitters.

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

	PR target/106577
	* config/i386/i386-expand.cc (ix86_vector_duplicate_value): Save/restore
	recog_data around recog_memoized calls.

	* gcc.target/i386/pr106577.c: New test.
2022-12-02 11:08:45 +01:00
Jakub Jelinek
f133055185 c++: Incremental fix for g++.dg/gomp/for-21.C [PR84469]
The PR84469 patch I've just posted regresses the for-21.C testcase,
when in OpenMP loop there are at least 2 associated loops and
in a template outer structured binding with non type dependent expression
is used in the expressions of some inner loop, we don't diagnose those
any longer, as the (weirdly worded) diagnostics was only done during
finish_id_expression -> mark_used which for the inner loop expressions
happens before the structured bindings are finalized.  When in templates,
mark_used doesn't diagnose uses of non-deduced variables, and if the
range for expression is type dependent, it is similarly diagnosed during
instantiation.  But newly with the PR84469 fix if the range for expression
is not type dependent, there is no place that would diagnose it, as during
instantiation the structured bindings are already deduced.

This patch ensures that the bug of using structured bindings from one
associated loop in other associated loops is diagnosed by the
c_omp_check_loop_iv code by ensuring that cp_finish_decomp is called
already during cp_convert_omp_range_for if the artificial iterator
has been successfully auto-deduced.

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

	PR c++/84469
gcc/c-family/
	* c-omp.cc (c_omp_is_loop_iterator): For range for with structured
	binding return TREE_VEC_LENGTH (d->declv) even if decl is equal
	to any of the structured binding decls.
gcc/cp/
	* parser.cc (cp_convert_omp_range_for): After do_auto_deduction if
	!processing_template_decl call cp_finish_decomp with
	processing_template_decl temporarily incremented.
gcc/testsuite/
	* g++.dg/gomp/for-21.C (f3, f6, f9): Adjust expected diagnostics.
	* g++.dg/gomp/for-22.C: New test.
2022-12-02 10:30:16 +01:00
Jakub Jelinek
ee4f25999f c++: Deduce range for structured bindings if expression is not type dependent [PR84469]
As shown on the decomp56.C testcase, if the range for expression
when using structured bindings is not type dependent, we deduce
the finish the structured binding types only when not in template
(cp_convert_range_for takes care of that), but if in templates,
do_range_for_auto_deduction is called instead and it doesn't handle
structured bindings.  During instantiation they are handled later,
but during the parsing keeping the structured bindings type
dependent when they shouldn't be changes behavior.
The following patch calls cp_finish_decomp even from
do_range_for_auto_deduction.
The patch regresses the OpenMP g++.dg/gomp/for-21.C test (3 errors
are gone), I'll post an incremental patch for it momentarily.

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

	PR c++/84469
	* parser.cc (do_range_for_auto_deduction): Add DECOMP_FIRST_NAME
	and DECOMP_CNT arguments.  Call cp_finish_decomp if DECL
	is a structured binding.
	(cp_parser_range_for): Adjust do_range_for_auto_deduction caller.
	(cp_convert_omp_range_for): Likewise.

	* g++.dg/cpp1z/decomp56.C: New test.
	* g++.dg/gomp/pr84469.C: New test.
2022-12-02 10:29:11 +01:00
Michael Collison
6508d5e5a1 match.pd: rewrite select to branchless expression
This patches transforms ((x & 0x1) == 0) ? y : z <op> y -into
(-(typeof(y))(x & 0x1) & z) <op> y, where op is a '^' or a '|'. It also
transforms (cond (and (x , 0x1) != 0), (z op y), y ) into (-(and (x ,
0x1)) & z ) op y.

Matching this patterns allows GCC to generate branchless code for one of
the functions in coremark.

	* match.pd ((x & 0x1) == 0) ? y : z <op> y
	-> (-(typeof(y))(x & 0x1) & z) <op> y.

	* gcc.dg/tree-ssa/branchless-cond.c: New test.
2022-12-02 09:22:01 +01:00
Richard Biener
5b50850c3c Add --param max-unswitch-depth
The following adds a --param to limit the depth of unswitched loop
nests.  One can use --param max-unswitch-depth=1 to disable unswitching
of outer loops (the innermost loop will then be unswitched).

	PR tree-optimization/107946
	* params.opt (-param=max-unswitch-depth=): New.
	* doc/invoke.texi (--param=max-unswitch-depth): Document.
	* tree-ssa-loop-unswitch.cc (init_loop_unswitch_info): Honor
	--param=max-unswitch-depth
2022-12-02 08:04:11 +01:00
Eric Gallager
a710f3ce74 PR59447: --with-dwarf2 implies "(or later)"
This patch includes "(or later)" in the documentation of the gcc
subdirectory's --with-dwarf2 configure flag. Closes PR59447.

gcc/ChangeLog:

	PR bootstrap/59447
	* configure: Regenerate.
	* configure.ac: Document --with-dwarf2 flag as also
	applying to later DWARF standards.
	* doc/install.texi: Likewise.
2022-12-02 01:08:45 -05:00
David Malcolm
0b737090a6 analyzer: handle comparisons against negated symbolic values [PR107948]
gcc/analyzer/ChangeLog:
	PR analyzer/107948
	* region-model-manager.cc
	(region_model_manager::maybe_fold_binop): Fold (0 - VAL) to -VAL.
	* region-model.cc (region_model::eval_condition): Handle e.g.
	"-X <= 0" as equivalent to X >= 0".

gcc/testsuite/ChangeLog:
	PR analyzer/107948
	* gcc.dg/analyzer/feasibility-pr107948.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-12-01 21:28:55 -05:00
David Malcolm
5cb7d28dcf analyzer: add test coverage for string ops
gcc/testsuite/ChangeLog:
	* gcc.dg/analyzer/string-ops-concat-pair.c: New test.
	* gcc.dg/analyzer/string-ops-dup.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-12-01 21:28:55 -05:00