Commit Graph

203109 Commits

Author SHA1 Message Date
Gaius Mulley
63fb0bedb8 PR modula2/110779 SysClock can not read the clock (Darwin portability fixes)
This patch adds corrections to defensively check against glibc functions,
structures and contains fallbacks.  These fixes were required under Darwin.

gcc/m2/ChangeLog:

	PR modula2/110779
	* gm2-libs-iso/SysClock.mod (EpochTime): New procedure.
	(GetClock): Call EpochTime if the C time functions are
	unavailable.
	* gm2-libs-iso/wrapclock.def (istimezone): New function
	definition.

libgm2/ChangeLog:

	PR modula2/110779
	* configure: Regenerate.
	* configure.ac: Provide special case test for Darwin cross
	configuration.
	(GLIBCXX_CONFIGURE): New statement.
	(GLIBCXX_CHECK_GETTIMEOFDAY): New statement.
	(GLIBCXX_ENABLE_LIBSTDCXX_TIME): New statement.
	* libm2iso/wrapclock.cc: New sys/time.h conditional include.
	(sys/syscall.h): Conditional include.
	(unistd.h): Conditional include.
	(GetTimeRealtime): Re-implement.
	(SetTimeRealtime): Re-implement.
	(timezone): Re-implement.
	(istimezone): New function.
	(daylight): Re-implement.
	(isdst): Re-implement.
	(tzname): Re-implement.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2023-08-12 18:17:41 +01:00
Gaius Mulley
46905fcde0 PR modula2/108119 disable m2rte plugin by default
This patch disables the m2rte plugin by default.  The driver
will only append the -fplugin=m2rte command line option for cc1gm2
if -fm2-plugin is present.  It only enabled providing ENABLE_PLUGIN
is defined.  gcc/m2/Make-file.in will only build and install m2rte
if enable_plugin is yes.

gcc/m2/ChangeLog:

	PR modula2/108119
	* Make-lang.in (M2RTE_PLUGIN_SO): Assigned to
	plugin/m2rte$(exeext).so if enable_plugin is yes.
	(m2.all.cross): Replace plugin/m2rte$(soext) with
	$(M2RTE_PLUGIN_SO).
	(m2.all.encap): Replace plugin/m2rte$(soext) with
	$(M2RTE_PLUGIN_SO).
	(m2.install-plugin): Add dummy rule when enable_plugin
	is not yes.
	(plugin/m2rte$(exeext).so): Add dummy rule when enable_plugin
	is not yes.
	(m2/stage2/cc1gm2$(exeext)): Replace plugin/m2rte$(soext) with
	$(M2RTE_PLUGIN_SO).
	(m2/stage1/cc1gm2$(exeext)): Replace plugin/m2rte$(soext) with
	$(M2RTE_PLUGIN_SO).
	* gm2spec.cc (lang_specific_driver): Set need_plugin to false
	by default.

gcc/testsuite/ChangeLog:

	PR modula2/108119
	* gm2/iso/check/fail/iso-check-fail.exp (gm2_init_iso): Add -fm2-plugin.
	* gm2/switches/auto-init/fail/switches-auto-init-fail.exp
	(gm2_init_iso): Add -fm2-plugin.
	* gm2/switches/check-all/pim2/fail/switches-check-all-pim2-fail.exp
	(gm2_init_pim2): Add -fm2-plugin.
	* gm2/switches/check-all/plugin/iso/fail/switches-check-all-plugin-iso-fail.exp
	(gm2_init_iso): Add -fm2-plugin.
	* gm2/switches/check-all/plugin/pim2/fail/switches-check-all-plugin-pim2-fail.exp
	(gm2_init_pim2): Add -fm2-plugin.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2023-08-12 13:43:14 +01:00
Jakub Jelinek
8441841a1b Add stdckdint.h header for C23
This patch adds <stdckdint.h> header, which defines ckd_{add,sub,mul}
using __builtin_{add,sub,mul}_overflow.  As requested, it doesn't
pedantically diagnose things which work just fine, e.g. inputs with
plain char, bool, bit-precise integer or enumerated types and
result pointer to plain char or bit-precise integer.
The header will #include_next <stdckdint.h> so that C library can supply
its part if the header implementation in the future needs to be split
between parts under the control of the compiler and parts under the
control of C library.

2023-08-12  Jakub Jelinek  <jakub@redhat.com>

	* Makefile.in (USER_H): Add stdckdint.h.
	* ginclude/stdckdint.h: New file.

	* gcc.dg/stdckdint-1.c: New test.
	* gcc.dg/stdckdint-2.c: New test.
2023-08-12 09:42:58 +02:00
Juzhe-Zhong
9890f37701 RISC-V: Add TAREGT_VECTOR check into VLS modes
This patch fixes bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110994

This is caused VLS modes incorrect codes int register allocation.

The original case trigger the ICE is fortran code but I can reproduce
with a C code.

gcc/ChangeLog:

	PR target/110994
	* config/riscv/riscv-opts.h (TARGET_VECTOR_VLS): Add TARGET_VETOR.

gcc/testsuite/ChangeLog:

	PR target/110994
	* gcc.target/riscv/rvv/autovec/vls/pr110994.c: New test.
2023-08-12 12:42:28 +08:00
Patrick Palka
8be20733b3 tree-pretty-print: delimit TREE_VEC with braces
This makes the generic pretty printer print braces around a TREE_VEC,
like we do for CONSTRUCTOR.  This should improve readability of nested
TREE_VECs in particular.

gcc/ChangeLog:

	* tree-pretty-print.cc (dump_generic_node) <case TREE_VEC>:
	Delimit output with braces.
2023-08-11 21:13:52 -04:00
Patrick Palka
f50f603cbf c++: bogus warning w/ deduction guide in anon ns [PR106604]
Here we're unintentionally issuing a "declared static but never defined"
warning from wrapup_namespace_globals for a deduction guide declared in
an anonymous namespace.  This patch fixes this by giving deduction guides
a dummy DECL_INITIAL, which suppresses the warning and also allows us to
simplify redeclaration checking for them.

Co-authored-by: Jason Merrill <jason@redhat.com>

	PR c++/106604

gcc/cp/ChangeLog:

	* decl.cc (redeclaration_error_message): Remove special handling
	for deduction guides.
	(grokfndecl): Give deduction guides a dummy DECL_INITIAL.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1z/class-deduction74.C: Expect "defined" instead
	of "declared" in the repeated deduction guide diagnostics.
	* g++.dg/cpp1z/class-deduction116.C: New test.
2023-08-11 21:13:23 -04:00
Ken Matsui
066c260ad0
libstdc++: Use __bool_constant entirely
This patch uses __bool_constant entirely instead of integral_constant<bool>
in the type_traits header, specifically for true_type, false_type,
and bool_constant.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (true_type): Use __bool_constant
	instead.
	(false_type): Likewise.
	(bool_constant): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-08-11 17:54:45 -07:00
Juzhe-Zhong
685abdb4a1 RISC-V: Fix vec_series expander[PR110985]
This patch fix bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110985

gcc/ChangeLog:
	PR target/110985
	* config/riscv/riscv-v.cc (expand_vec_series): Refactor the expander.

gcc/testsuite/ChangeLog:
	PR target/110985
	* gcc.target/riscv/rvv/autovec/vls-vlmax/pr110985.c: New test.
2023-08-12 08:38:34 +08:00
Juzhe-Zhong
e80c55e4ca RISC-V: Allow CONST_VECTOR for VLS modes
This patch enables COSNT_VECTOR for VLS modes.

void foo1 (int * __restrict a)
{
    for (int i = 0; i < 16; i++)
      a[i] = 8;
}

void foo2 (int * __restrict a)
{
    for (int i = 0; i < 16; i++)
      a[i] = i;
}

Compile option: -O3 --param=riscv-autovec-preference=scalable

Before this patch:

foo1:
        lui     a5,%hi(.LC0)
        addi    a5,a5,%lo(.LC0)
        vsetivli        zero,4,e32,m1,ta,ma
        addi    a4,a0,16
        vle32.v v1,0(a5)
        vse32.v v1,0(a0)
        vse32.v v1,0(a4)
        addi    a4,a0,32
        vse32.v v1,0(a4)
        addi    a0,a0,48
        vse32.v v1,0(a0)
        ret
foo2:
        lui     a5,%hi(.LC1)
        addi    a5,a5,%lo(.LC1)
        vsetivli        zero,4,e32,m1,ta,ma
        vle32.v v1,0(a5)
        lui     a5,%hi(.LC2)
        addi    a5,a5,%lo(.LC2)
        vse32.v v1,0(a0)
        vle32.v v1,0(a5)
        lui     a5,%hi(.LC3)
        addi    a4,a0,16
        addi    a5,a5,%lo(.LC3)
        vse32.v v1,0(a4)
        vle32.v v1,0(a5)
        addi    a4,a0,32
        lui     a5,%hi(.LC4)
        vse32.v v1,0(a4)
        addi    a0,a0,48
        addi    a5,a5,%lo(.LC4)
        vle32.v v1,0(a5)
        vse32.v v1,0(a0)
        ret

After this patch:

foo1:
	vsetivli	zero,16,e32,mf2,ta,ma
	vmv.v.i	v1,8
	vse32.v	v1,0(a0)
	ret
	.size	foo1, .-foo1
	.align	1
	.globl	foo2
	.type	foo2, @function
foo2:
	vsetivli	zero,16,e32,mf2,ta,ma
	vid.v	v1
	vse32.v	v1,0(a0)
	ret

gcc/ChangeLog:

	* config/riscv/autovec.md: Add VLS CONST_VECTOR.
	* config/riscv/riscv.cc (riscv_const_insns): Ditto.
	* config/riscv/vector.md: Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/vls/def.h: Add VLS CONST_VECTOR tests.
	* gcc.target/riscv/rvv/autovec/vls/const-1.c: New test.
	* gcc.target/riscv/rvv/autovec/vls/const-2.c: New test.
	* gcc.target/riscv/rvv/autovec/vls/const-3.c: New test.
	* gcc.target/riscv/rvv/autovec/vls/const-4.c: New test.
	* gcc.target/riscv/rvv/autovec/vls/const-5.c: New test.
	* gcc.target/riscv/rvv/autovec/vls/series-1.c: New test.
	* gcc.target/riscv/rvv/autovec/vls/series-2.c: New test.
	* gcc.target/riscv/rvv/autovec/vls/series-3.c: New test.
	* gcc.target/riscv/rvv/autovec/vls/series-4.c: New test.
2023-08-12 08:37:04 +08:00
GCC Administrator
886afed635 Daily bump. 2023-08-12 00:17:36 +00:00
Jonathan Wakely
003016a408 libstdc++: Fix std::format_to_n return value [PR110990]
When writing to a contiguous iterator, std::format_to_n(out, n, ...)
always returns out + n, even if it wrote fewer than n characters to the
iterator.

The problem is in the _M_finish() member function of the _Iter_sink
specialization for contiguous iterators. _M_finish() calls _M_overflow()
to update its count of characters written, so it can return the count of
characters that would be written if there was room. But _M_overflow()
assumes it's only called when the buffer is full, and so switches to the
internal buffer. _M_finish() then thinks that if the internal buffer is
in use, we already wrote at least n characters and so returns out+n as
the output position.

We can fix the problem by adding a check in _M_overflow() so that we
don't update the count and switch to the internal buffer unless we've
run out of room, i.e. _M_unused().size() is zero. The caller then needs
to be prepared for _M_count not being the final total, and so add
_M_used.size() to it.

However, there's not actually any need for _M_finish() to call
_M_overflow() to get the count. We now need to use _M_count and
_M_used.size() to get the total anyway so _M_overflow() doesn't help
with that. And we don't need to use _M_overflow() to flush unwritten
characters to the output, because the specialization for contiguous
iterators always writes directly to the output without buffering (except
when we've exceeded the maximum number of characters, in which case we
want to discard the buffered characters anyway). So _M_finish() can be
simplified and can avoid calling _M_overflow().

This change also fixes some member functions of other sink classes to
only call _M_overflow() when there are characters in the buffer, which
is needed to meet _M_overflow's precondition that _M_used().size()!=0.

libstdc++-v3/ChangeLog:

	PR libstdc++/110990
	* include/std/format (_Seq_sink::get): Only call _M_overflow if
	its precondition is met.
	(_Iter_sink::_M_finish): Likewise.
	(_Iter_sink<C, ContigIter>::_M_overflow): Only switch to the
	internal buffer after running out of space.
	(_Iter_sink<C, ContigIter>::_M_finish): Do not use _M_overflow.
	(_Counting_sink::count): Likewise.
	* testsuite/std/format/functions/format_to_n.cc: Check cases
	where the output fits into the buffer.
2023-08-11 23:27:59 +01:00
David Malcolm
325f9e8880 analyzer: new warning: -Wanalyzer-unterminated-string [PR105899]
This patch adds new functions to the analyzer for checking that
an argument at a callsite is a pointer to a valid null-terminated
string, and uses this for the following known functions:

- error (param 3, the format string)
- error_at_line (param 5, the format string)
- putenv
- strchr (1st param)
- strcpy (2nd param)
- strdup

Currently the check merely detects pointers to unterminated string
constants, and adds a new -Wanalyzer-unterminated-string to complain
about that.  I'm experimenting with detecting other ways in which
a buffer can fail to be null-terminated, and for other problems with
such buffers, but this patch at least adds the framework for wiring
up the check to specific parameters of known_functions.

gcc/analyzer/ChangeLog:
	PR analyzer/105899
	* analyzer.opt (Wanalyzer-unterminated-string): New.
	* call-details.cc
	(call_details::check_for_null_terminated_string_arg): New.
	* call-details.h
	(call_details::check_for_null_terminated_string_arg): New decl.
	* kf-analyzer.cc (class kf_analyzer_get_strlen): New.
	(register_known_analyzer_functions): Register it.
	* kf.cc (kf_error::impl_call_pre): Check that format arg is a
	valid null-terminated string.
	(kf_putenv::impl_call_pre): Likewise for the sole param.
	(kf_strchr::impl_call_pre): Likewise for the first param.
	(kf_strcpy::impl_call_pre): Likewise for the second param.
	(kf_strdup::impl_call_pre): Likewise for the sole param.
	* region-model.cc (get_strlen): New.
	(struct call_arg_details): New.
	(inform_about_expected_null_terminated_string_arg): New.
	(class unterminated_string_arg): New.
	(region_model::check_for_null_terminated_string_arg): New.
	* region-model.h
	(region_model::check_for_null_terminated_string_arg): New decl.

gcc/ChangeLog:
	PR analyzer/105899
	* doc/analyzer.texi (__analyzer_get_strlen): New.
	* doc/invoke.texi: Add -Wanalyzer-unterminated-string.

gcc/testsuite/ChangeLog:
	PR analyzer/105899
	* gcc.dg/analyzer/analyzer-decls.h (__analyzer_get_strlen): New.
	* gcc.dg/analyzer/error-1.c (test_error_unterminated): New.
	(test_error_at_line_unterminated): New.
	* gcc.dg/analyzer/null-terminated-strings-1.c: New test.
	* gcc.dg/analyzer/putenv-1.c (test_unterminated): New.
	* gcc.dg/analyzer/strchr-1.c (test_unterminated): New.
	* gcc.dg/analyzer/strcpy-1.c (test_unterminated): New.
	* gcc.dg/analyzer/strdup-1.c (test_unterminated): New.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2023-08-11 18:08:43 -04:00
Jeff Law
db08a096e4 [committed] Fix subdi3 synthesis on rx port
Some of Andrew's recent match.pd changes triggered a regression in my tester
for the rx processor for c-torture/execute/pr66940.c which would be exposed
only during an LTO compilation.

Specifically the subdi3_internal pattern had the wrong idiom to detect a carry
from the high word into the low word.  It had the wrong opcode and the operands
were reversed.

This resulted in combine doing a simplification that was valid according to the
presented RTL, but which ultimately got the wrong result.

I would often say this was a latent bug.  But the testsuite shows
builtin-arith-overflow-14 and builtin-arith-overflow-p18 failures are fixed as
well.  So it's been visible indefinitely, but nobody's ever looked into those
failures.

Committed to the trunk.

gcc/
	* config/rx/rx.md (subdi3): Fix test for borrow.
2023-08-11 15:54:12 -06:00
Juzhe-Zhong
5bfb5e772f VECT: Fix ICE on MASK_LEN_{LOAD, STORE} when no LEN recorded[PR110989]
This ICE is caused because of this situation:

mask__49.21_99 = vect__17.19_96 == { 0.0, ... };
...
vect__6.24_107 = .MASK_LEN_LOAD (vectp.22_105, 32B, mask__49.21_99, POLY_INT_CST [2, 2], 0);

The MASK_LEN_LOAD is using real MASK which is produced by the EQ comparison wheras the LEN
is the dummy LEN which is the vectorization factor.

In this situation, we didn't enter 'vect_record_loop_len' since there is no LEN loop control.
Then 'LOOP_VINFO_RGROUP_IV_TYPE' is not suitable type for 'build_int_cst' used for producing
LEN argument for 'MASK_LEN_LOAD', so use sizetype instead which is perfectly matching
RVV length requirement.

gcc/ChangeLog:
	PR middle-end/110989
	* tree-vect-stmts.cc (vectorizable_store): Replace iv_type with sizetype.
	(vectorizable_load): Ditto.

gcc/testsuite/ChangeLog:
	PR middle-end/110989
	* gcc.target/riscv/rvv/autovec/pr110989.c: New test.
2023-08-12 05:50:35 +08:00
Patrick O'Neill
2b1b804de2 RISC-V: Specify -mabi for ztso testcases
On rv32 targets, this patch fixes ztso testcases errors like this:
cc1: error: ABI requires '-march=rv32'

2023-08-11 Patrick O'Neill <patrick@rivosinc.com>

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/amo-table-ztso-amo-add-1.c: Add -mabi=lp64d
	to dg-options.
	* gcc.target/riscv/amo-table-ztso-amo-add-2.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-amo-add-3.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-amo-add-4.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-amo-add-5.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-1.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-2.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-3.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-4.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-5.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-6.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-7.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-fence-1.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-fence-2.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-fence-3.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-fence-4.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-fence-5.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-load-1.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-load-2.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-load-3.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-store-1.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-store-2.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-store-3.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-1.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-2.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-3.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-4.c: Ditto.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-5.c: Ditto.

Signed-off-by: Patrick O'Neill <patrick@rivosinc.com>
2023-08-11 13:45:48 -07:00
Jonathan Wakely
ce6c4d3b4d libstdc++: Implement C++20 std::chrono::parse [PR104167]
This adds the missing C++20 features to <chrono>.

I've implemented my proposed resolutions to LWG issues 3960, 3961, and
3962. There are some unimplemented flags such as %OI which I think are
not implementable in general. It might be possible to use na_llanginfo
with ALT_DIGITS, but that isn't available on all targets. I intend to
file another LWG issue about that.

libstdc++-v3/ChangeLog:

	PR libstdc++/104167
	* include/bits/chrono_io.h (operator|=, operator|): Add noexcept
	to _ChronoParts operators.
	(from_stream, parse): Define new functions.
	(__detail::_Parse, __detail::_Parser): New class templates.
	* include/std/chrono (__cpp_lib_chrono): Define to 201907L for
	C++20.
	* include/std/version (__cpp_lib_chrono): Likewise.
	* testsuite/20_util/duration/arithmetic/constexpr_c++17.cc:
	Adjust expected value of feature test macro.
	* testsuite/20_util/duration/io.cc: Test parsing.
	* testsuite/std/time/clock/file/io.cc: Likewise.
	* testsuite/std/time/clock/gps/io.cc: Likewise.
	* testsuite/std/time/clock/system/io.cc: Likewise.
	* testsuite/std/time/clock/tai/io.cc: Likewise.
	* testsuite/std/time/clock/utc/io.cc: Likewise.
	* testsuite/std/time/day/io.cc: Likewise.
	* testsuite/std/time/month/io.cc: Likewise.
	* testsuite/std/time/month_day/io.cc: Likewise.
	* testsuite/std/time/weekday/io.cc: Likewise.
	* testsuite/std/time/year/io.cc: Likewise.
	* testsuite/std/time/year_month/io.cc: Likewise.
	* testsuite/std/time/year_month_day/io.cc: Likewise.
	* testsuite/std/time/syn_c++20.cc: Check value of macro and for
	the existence of parse and from_stream in namespace chrono.
	* testsuite/std/time/clock/local/io.cc: New test.
	* testsuite/std/time/parse.cc: New test.
2023-08-11 19:58:06 +01:00
Jose E. Marchesi
f93a612fc4 bpf: liberate R9 for general register allocation
We were reserving one of the hard registers in BPF in order to
implement dynamic stack allocation: alloca and VLAs. However, there is
kernel code that has inline assembly that requires all the non-fixed
registers to be available for register allocation.

This patch:

1. Liberates r9 that is now available for register allocation.

2. Adds a check to GCC so it errors out if the user tries to do
   dynamic stack allocation.  A couple of tests are added for this.

3. Changes xbpf so it no longer saves and restores callee-saved
   registers.  A couple of tests for this have been removed.

4. Adds bpf-*-* to the list of targets that do not support alloca in
   target-support.exp.

Tested in host x86_64-linux-gnu and target bpf-unknown-none.

gcc/ChangeLog

	* config/bpf/bpf.md (allocate_stack): Define.
	* config/bpf/bpf.h (FIRST_PSEUDO_REGISTER): Make room for fake
	stack pointer register.
	(FIXED_REGISTERS): Adjust accordingly.
	(CALL_USED_REGISTERS): Likewise.
	(REG_CLASS_CONTENTS): Likewise.
	(REGISTER_NAMES): Likewise.
	* config/bpf/bpf.cc (bpf_compute_frame_layout): Do not reserve
	space for callee-saved registers.
	(bpf_expand_prologue): Do not save callee-saved registers in xbpf.
	(bpf_expand_epilogue): Do not restore callee-saved registers in
	xbpf.

gcc/testsuite/ChangeLog

	* lib/target-supports.exp (check_effective_target_alloca): BPF
	target does not support alloca.
	* gcc.target/bpf/diag-alloca-1.c: New test.
	* gcc.target/bpf/diag-alloca-2.c: Likewise.
	* gcc.target/bpf/xbpf-callee-saved-regs-1.c: Remove test.
	* gcc.target/bpf/xbpf-callee-saved-regs-2.c: Likewise.
	* gcc.target/bpf/regs-availability-1.c: Likewise.
2023-08-11 20:34:57 +02:00
Jose E. Marchesi
6103df1e4f bpf: allow exceeding max num of args in BPF when always_inline
BPF currently limits the number of registers used to pass arguments to
functions to five registers.  There is a check for this at function
expansion time.  However, if a function is guaranteed to be always
inlined (and its body never generated) by virtue of the always_inline
attribute, it can "receive" any number of arguments.

Tested in host x86_64-linux-gnu and target bpf-unknown-none.

gcc/ChangeLog

	* config/bpf/bpf.cc (bpf_function_arg_advance): Do not complain
	about too many arguments if function is always inlined.

gcc/testsuite/ChangeLog

	* gcc.target/bpf/diag-funargs-inline-1.c: New test.
	* gcc.target/bpf/diag-funargs.c: Adapt test.
2023-08-11 20:34:56 +02:00
Eric Feng
38c00edd65 analyzer: More features for CPython analyzer plugin [PR107646]
This patch adds known function subclasses for Python/C API functions
PyList_New, PyLong_FromLong, and PyList_Append. It also adds new
optional parameters for
region_model::get_or_create_region_for_heap_alloc, allowing for the
newly allocated region to immediately transition from the start state to
the assumed non-null state in the malloc state machine if desired.
Finally, it adds a new procedure, dg-require-python-h, intended as a
directive in Python-related analyzer tests, to append necessary Python
flags during the tests' build process.

The main warnings we gain in this patch with respect to the known function
subclasses mentioned are leak related. For example:

rc3.c: In function ‘create_py_object’:
│
rc3.c:21:10: warning: leak of ‘item’ [CWE-401] [-Wanalyzer-malloc-leak]
│
   21 |   return list;
      │
      |          ^~~~
│
  ‘create_py_object’: events 1-4
│
    |
│
    |    4 |   PyObject* item = PyLong_FromLong(10);
│
    |      |                    ^~~~~~~~~~~~~~~~~~~
│
    |      |                    |
│
    |      |                    (1) allocated here
│
    |      |                    (2) when ‘PyLong_FromLong’ succeeds
│
    |    5 |   PyObject* list = PyList_New(2);
│
    |      |                    ~~~~~~~~~~~~~
│
    |      |                    |
│
    |      |                    (3) when ‘PyList_New’ fails
│
    |......
│
    |   21 |   return list;
│
    |      |          ~~~~
│
    |      |          |
│
    |      |          (4) ‘item’ leaks here; was allocated at (1)
│

Some concessions were made to
simplify the analysis process when comparing kf_PyList_Append with the
real implementation. In particular, PyList_Append performs some
optimization internally to try and avoid calls to realloc if
possible. For simplicity, we assume that realloc is called every time.
Also, we grow the size by just 1 (to ensure enough space for adding a
new element) rather than abide by the heuristics that the actual implementation
follows.

gcc/analyzer/ChangeLog:
	PR analyzer/107646
	* call-details.h: New function.
	* region-model.cc (region_model::get_or_create_region_for_heap_alloc):
	New optional parameters.
	* region-model.h (class region_model): New optional parameters.
	* sm-malloc.cc (on_realloc_with_move): New function.
	(region_model::transition_ptr_sval_non_null): New function.

gcc/testsuite/ChangeLog:
	PR analyzer/107646
	* gcc.dg/plugin/analyzer_cpython_plugin.c: Analyzer support for
	PyList_New, PyList_Append, PyLong_FromLong
	* gcc.dg/plugin/plugin.exp: New test.
	* lib/target-supports.exp: New procedure.
	* gcc.dg/plugin/cpython-plugin-test-2.c: New test.

Signed-off-by: Eric Feng <ef2648@columbia.edu>
2023-08-11 13:33:12 -04:00
Patrick Palka
63bd36be99 c++: dependently scoped template-id in type-req [PR110927]
Here we're incorrectly rejecting the first type-requirement at parse
time with

  concepts-requires35.C:14:56: error: ‘typename A<T>::B’ is not a template [-fpermissive]

We also incorrectly reject the second type-requirement at satisfaction time
with

  concepts-requires35.C:17:34: error: ‘typename A<int>::B’ names ‘template<class U> struct A<int>::B’, which is not a type

and similarly for the third type-requirement.  This seems to happen only
within a type-requirement; if we instead use e.g. an alias template then
it works as expected.

The difference ultimately seems to be that during parsing of a using-decl,
we pass check_dependency_p=true to cp_parser_nested_name_specifier_opt
whereas for a type-requirement we pass check_dependency_p=false.
Passing =false causes cp_parser_template_id for the dependently-scoped
template-id B<bool> to create a TYPE_DECL of TYPENAME_TYPE (with
TYPENAME_IS_CLASS_P unexpectedly set in the last two cases) whereas
passing =true causes it to return a TEMPLATE_ID_EXPR.  We then call
make_typename_type on this TYPE_DECL which does the wrong thing.

Since there seems to be no justification for using check_dependency_p=false
here, the simplest fix seems to be to pass check_dependency_p=true instead,
matching the behavior of cp_parser_elaborated_type_specifier.

	PR c++/110927

gcc/cp/ChangeLog:

	* parser.cc (cp_parser_type_requirement): Pass
	check_dependency_p=true instead of =false.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/concepts-requires35.C: New test.
2023-08-11 13:26:02 -04:00
Patrick Palka
ca26766547 c++: recognize in-class var tmpl partial spec [PR71954]
This makes us recognize member variable template partial specializations
defined directly inside the class body.  It seems we mainly just need to
call check_explicit_specialization when we see a static TEMPLATE_ID_EXPR
data member, which sets SET_DECL_TEMPLATE_SPECIALIZATION for us and which
we otherwise don't call (for the out-of-class case we call it from
grokvardecl).

We also need to make finish_member_template_decl return NULL_TREE for
such partial specializations, matching its behavior for class template
partial specializations, so that later we don't try to register it as a
separate member declaration.

	PR c++/71954

gcc/cp/ChangeLog:

	* decl.cc (grokdeclarator): Pass 'dname' instead of
	'unqualified_id' as the name when building the VAR_DECL for a
	static data member.  Call check_explicit_specialization for a
	TEMPLATE_ID_EXPR such member.
	* pt.cc (finish_member_template_decl): Return NULL_TREE
	instead of 'decl' when DECL_TEMPLATE_SPECIALIZATION is not
	set.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp1y/var-templ84.C: New test.
	* g++.dg/cpp1y/var-templ84a.C: New test.
2023-08-11 13:25:58 -04:00
Jonathan Wakely
9e33d71834 libstdc++: Do not call log10(0.0) in std::format [PR110860]
Calling log10(0.0) returns -inf which has undefined behaviour when
converted to an integer. We only need to use log10 for large values
anyway. If the value is zero then the larger buffer is only needed due
to a large precision, so we don't need to use log10 to estimate the
number of digits for the significand.

libstdc++-v3/ChangeLog:

	PR libstdc++/110860
	* include/std/format (__formatter_fp::format): Do not call log10
	with zero values.
2023-08-11 18:20:48 +01:00
Eric Feng
20db5cab7a MAINTAINERS: Add myself to write after approval
ChangeLog:

	* MAINTAINERS: Add myself.

Signed-off-by: Eric Feng <ef2648@columbia.edu>
2023-08-11 13:07:23 -04:00
Patrick Palka
1531de6375 c++: improve debug_tree for templated types/decls
gcc/cp/ChangeLog:

	* ptree.cc (cxx_print_decl): Check for DECL_LANG_SPECIFIC and
	TS_DECL_COMMON only when necessary.  Print DECL_TEMPLATE_INFO
	for all decls that have it, not just VAR_DECL or FUNCTION_DECL.
	Also print DECL_USE_TEMPLATE.
	(cxx_print_type): Print TYPE_TEMPLATE_INFO.
	<case BOUND_TEMPLATE_TEMPLATE_PARM>: Don't print TYPE_TI_ARGS
	anymore.
	<case TEMPLATE_TYPE/TEMPLATE_PARM>: Print TEMPLATE_TYPE_PARM_INDEX
	instead of printing the index, level and original level
	individually.
2023-08-11 12:50:52 -04:00
Patrick Palka
a4238f6db8 tree-pretty-print: handle COMPONENT_REF with non-decl RHS
In the C++ front end, a COMPONENT_REF's second operand isn't always a
decl (at least at template parse time).  This patch makes the generic
pretty printer not ICE when printing such a COMPONENT_REF.

gcc/ChangeLog:

	* tree-pretty-print.cc (dump_generic_node) <case COMPONENT_REF>:
	Don't call component_ref_field_offset if the RHS isn't a decl.
2023-08-11 12:17:24 -04:00
John David Anglin
834d1422c2 Use strtol instead of std::stoi [PR110646]
Implementation of std::stoi was overlooked on hppa-hpux, so use
strtol instead.

2023-08-11  John David Anglin  <danglin@gcc.gnu.org>

gcc/ChangeLog:

	PR bootstrap/110646
	* gensupport.cc(class conlist): Use strtol instead of std::stoi.
2023-08-11 15:44:37 +00:00
Thomas Neumann
c46bded78f preserve base pointer for __deregister_frame [PR110956]
Original bug report: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110956
Rainer Orth successfully tested the patch on Solaris with a full bootstrap.

Some uncommon unwinding table encodings need to access the base pointer
for address computations. We do not have that information in calls to
__deregister_frame_info_bases, and previously simply used nullptr as
base pointer. That is usually fine, but for some Solaris i386 shared
libraries that results in wrong address computations.

To fix this problem we now associate the unwinding object with
the table pointer itself, which is always known, in addition to
the PC range. When deregistering a frame, we first locate the object
using the table pointer, and then use the base pointer stored within
the object to compute the PC range.

libgcc/ChangeLog:
	PR libgcc/110956
	* unwind-dw2-fde.c: Associate object with address of unwinding
	table.
2023-08-11 09:20:27 -06:00
Vladimir N. Makarov
ef96754d8a [LRA]: Implement output stack pointer reloads
LRA prohibited output stack pointer reloads but it resulted in LRA
failure for AVR target which has no arithmetic insns working with the
stack pointer register.  Given patch implements the output stack
pointer reloads.

gcc/ChangeLog:

	* lra-constraints.cc (goal_alt_out_sp_reload_p): New flag.
	(process_alt_operands): Set the flag.
	(curr_insn_transform): Modify stack pointer offsets if output
	stack pointer reload is generated.
2023-08-11 11:14:02 -04:00
Jonathan Wakely
c19b542a17 libstdc++: Handle invalid values in std::chrono pretty printers
This avoids an IndexError exception when printing invalid chrono::month
or chrono::weekday values.

libstdc++-v3/ChangeLog:

	* python/libstdcxx/v6/printers.py (StdChronoCalendarPrinter):
	Check for out-of-range month an weekday indices.
	* testsuite/libstdc++-prettyprinters/chrono.cc: Check invalid
	month and weekday values.
2023-08-11 14:33:01 +01:00
Jonathan Wakely
7723684faf libstdc++: Revert accidentally committed change to bits/stl_iterator.h
In commit r14-3134-g9cb2a7c8d54b1f I only meant to change some uses of
__clamp_iter_cat to use __iter_category_t, I didn't mean to commit the
additional change introducing __clamped_iter_cat_t. This reverts that
part.

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h (__clamped_iter_cat_t): Remove.
2023-08-11 14:33:01 +01:00
Joseph Myers
4d9bc81a5d config: Fix host -rdynamic detection for build != host != target
The GCC_ENABLE_PLUGINS configure logic for detecting whether -rdynamic
is necessary and supported uses an appropriate objdump for $host
binaries (running on $build) in cases where $host is $build or
$target.

However, it is missing such logic in the case where $host is neither
$build nor $target, resulting in the compilers not being linked with
-rdynamic and plugins not being usable with such a compiler.  In fact
$ac_cv_prog_OBJDUMP, as used when $build = $host, is always an objdump
for $host binaries that runs on $build; that is, it's appropriate to
use in this case as well.

Tested in such a configuration that it does result in cc1 being linked
with -rdynamic as expected.  Also bootstrapped with no regressions for
x86_64-pc-linux-gnu.

config/
	* gcc-plugin.m4 (GCC_ENABLE_PLUGINS): Use
	export_sym_check="$ac_cv_prog_OBJDUMP -T" also when host is not
	build or target.

gcc/
	* configure: Regenerate.

libcc1/
	* configure: Regenerate.
2023-08-11 13:20:07 +00:00
Richard Biener
798a880a0b tree-optimization/110979 - fold-left reduction and partial vectors
When we vectorize fold-left reductions with partial vectors but
no target operation available we use a vector conditional to force
excess elements to zero.  But that doesn't correctly preserve
the sign of zero.  The following patch disables partial vector
support when we have to do that and also need to honor rounding
modes other than round-to-nearest.  When round-to-nearest is in
effect and we have to preserve the sign of zero instead use
negative zero for the excess elements.

	PR tree-optimization/110979
	* tree-vect-loop.cc (vectorizable_reduction): For
	FOLD_LEFT_REDUCTION without target support make sure
	we don't need to honor signed zeros and sign dependent rounding.

	* gcc.dg/torture/pr110979.c: New testcase.
2023-08-11 15:03:31 +02:00
Richard Biener
3a13884b23 Improve BB vectorization opt-info
The following makes us more correctly print the used vector size
when doing BB vectorization and also print all involved SLP graph
roots, not just the random one we ended up picking as leader.
In particular the last bit improves diffing opt-info between
different GCC revs but it also requires some testsuite adjustments.

	* tree-vect-slp.cc (vect_slp_region): Provide opt-info for all SLP
	subgraph entries.  Dump the used vector size based on the
	SLP subgraph entry root vector type.

	* g++.dg/vect/slp-pr87105.cc: Adjust.
	* gcc.dg/vect/bb-slp-17.c: Likewise.
	* gcc.dg/vect/bb-slp-20.c: Likewise.
	* gcc.dg/vect/bb-slp-21.c: Likewise.
	* gcc.dg/vect/bb-slp-22.c: Likewise.
	* gcc.dg/vect/bb-slp-subgroups-2.c: Likewise.
2023-08-11 13:07:37 +02:00
Pan Li
6a8203b7dc RISC-V: Support RVV VFMSUB rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFMSUB as the below samples.

* __riscv_vfmsub_vv_f32m1_rm
* __riscv_vfmsub_vv_f32m1_rm_m
* __riscv_vfmsub_vf_f32m1_rm
* __riscv_vfmsub_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfmsub_frm): New class for vfmsub frm.
	(vfmsub_frm): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfmsub_frm): New function declaration.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-msub.c: New test.
2023-08-11 18:44:09 +08:00
Juzhe-Zhong
59d789b348 VECT: Add vec_mask_len_{load_lanes,store_lanes} patterns
This patch is add vec_mask_len_{load_lanes,store_stores} autovectorization patterns.

Here we want to support this following autovectorization:

void
foo (int8_t *__restrict a,
int8_t *__restrict b,
int8_t *__restrict cond,
int n)
{
  for (intptr_t i = 0; i < n; ++i)
    {
      if (cond[i])
        a[i] = b[i * 2] + b[i * 2 + 1];
    }
}

ARM SVE IR:

https://godbolt.org/z/cro1Eqc6a

  # loop_mask_60 = PHI <next_mask_82(4), max_mask_81(3)>
  ...
  mask__39.12_63 = vect__3.11_61 != { 0, ... };
  vec_mask_and_66 = loop_mask_60 & mask__39.12_63;
  ...
  vect_array.15 = .MASK_LOAD_LANES (_57, 8B, vec_mask_and_66);
  ...

For RVV, we would like to see IR:

  loop_len = SELECT_VL;
  ...
  mask__39.12_63 = vect__3.11_61 != { 0, ... };
  ...
  vect_array.15 = .MASK_LEN_LOAD_LANES (_57, 8B, mask__39.12_63, loop_len, bias);
  ...

Bootstrap and Regression on X86 passed.

Ok for trunk ?

gcc/ChangeLog:

	* doc/md.texi: Add vec_mask_len_{load_lanes,store_lanes} patterns.
	* internal-fn.cc (expand_partial_load_optab_fn): Ditto.
	(expand_partial_store_optab_fn): Ditto.
	* internal-fn.def (MASK_LEN_LOAD_LANES): Ditto.
	(MASK_LEN_STORE_LANES): Ditto.
	* optabs.def (OPTAB_CD): Ditto.
2023-08-11 18:37:17 +08:00
Pan Li
bcda361daa RISC-V: Support RVV VFNMADD rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFNMADD as the below samples.

* __riscv_vfnmadd_vv_f32m1_rm
* __riscv_vfnmadd_vv_f32m1_rm_m
* __riscv_vfnmadd_vf_f32m1_rm
* __riscv_vfnmadd_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfnmadd_frm): New class for vfnmadd frm.
	(vfnmadd_frm): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfnmadd_frm): New function declaration.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-nmadd.c: New test.
2023-08-11 16:22:03 +08:00
Drew Ross
9f9334921b match.pd: Implement missed optimization ((x ^ y) & z) | x -> (z & y) | x [PR109938]
Adds a simplification for ((x ^ y) & z) | x to be folded into
(z & y) | x. Merges this simplification with ((x | y) & z) | x -> (z & y) | x
to prevent duplicate pattern.

2023-08-11  Drew Ross  <drross@redhat.com>
	    Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/109938
	* match.pd (((x ^ y) & z) | x -> (z & y) | x): New simplification.

	* gcc.c-torture/execute/pr109938.c: New test.
	* gcc.dg/tree-ssa/pr109938.c: New test.
2023-08-11 10:20:13 +02:00
Pan Li
797334e931 RISC-V: Support RVV VFMADD rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFMADD as the below samples.

* __riscv_vfmadd_vv_f32m1_rm
* __riscv_vfmadd_vv_f32m1_rm_m
* __riscv_vfmadd_vf_f32m1_rm
* __riscv_vfmadd_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfmadd_frm): New class for vfmadd frm.
	(vfmadd_frm_obj): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfmadd_frm): New function definition.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-madd.c: New test.
2023-08-11 15:40:04 +08:00
Pan Li
cd9150e2a8 RISC-V: Support RVV VFNMSAC rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFNMSAC for the below samples.

* __riscv_vfnmsac_vv_f32m1_rm
* __riscv_vfnmsac_vv_f32m1_rm_m
* __riscv_vfnmsac_vf_f32m1_rm
* __riscv_vfnmsac_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfnmsac_frm): New class for vfnmsac frm.
	(vfnmsac_frm_obj): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfnmsac_frm): New function definition.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-nmsac.c: New test.
2023-08-11 15:39:15 +08:00
Jakub Jelinek
607d9d50ee c: Add __typeof_unqual__ and __typeof_unqual support
As I mentioned in my stdckdint.h mail, I think having __ prefixed
keywords for the typeof_unqual keyword which can be used in earlier
language modes can be useful, not all code can be switched to C23
right away.

The following patch implements that.  It keeps the non-C23 behavior
for it for the _Noreturn functions to stay compatible with how
__typeof__ behaves.

I think we don't need it for C++, in C++ we have standard
traits to remove qualifiers etc.

2023-08-11  Jakub Jelinek  <jakub@redhat.com>

gcc/
	* doc/extend.texi (Typeof): Document typeof_unqual
	and __typeof_unqual__.
gcc/c-family/
	* c-common.cc (c_common_reswords): Add __typeof_unqual
	and __typeof_unqual__ spellings of typeof_unqual.
gcc/c/
	* c-parser.cc (c_parser_typeof_specifier): Handle
	__typeof_unqual and __typeof_unqual__ as !is_std.
gcc/testsuite/
	* gcc.dg/c11-typeof-2.c: New test.
	* gcc.dg/c11-typeof-3.c: New test.
	* gcc.dg/gnu11-typeof-3.c: New test.
	* gcc.dg/gnu11-typeof-4.c: New test.
2023-08-11 09:34:15 +02:00
Andrew Pinski
f956c23264 Fix PR 110954: wrong code with cmp | !cmp
This was an oversight on my part forgetting that
cmp will might have a different true value than all ones
but will have a value of 1 in most cases.
This means if we have `(f < 0) | !(f < 0)` we would
optimize this to -1 rather than just 1.

This is version 2 of the patch.
Decided to go down a different route than just checking if
the precission was 1 inside bitwise_inverted_equal_p.
So instead bitwise_inverted_equal_p gets passed an argument
that will be set if there was a comparison that was being compared
and the user of bitwise_inverted_equal_p decides what needs to be done.
In most uses of bitwise_inverted_equal_p, the check will be
`!wascmp || element_precision (type) == 1` .
But in the case of `a & ~a` and `a ^| ~a` we can handle the case
of wascmp by using constant_boolean_node isntead.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

	PR tree-optimization/110954

gcc/ChangeLog:

	* generic-match-head.cc (bitwise_inverted_equal_p): Add
	wascmp argument and set it accordingly.
	* gimple-match-head.cc (bitwise_inverted_equal_p): Add
	wascmp argument to the macro.
	(gimple_bitwise_inverted_equal_p): Add
	wascmp argument and set it accordingly.
	* match.pd (`a & ~a`, `a ^| ~a`): Update call
	to bitwise_inverted_equal_p and handle wascmp case.
	(`(~x | y) & x`, `(~x | y) & x`, `a?~t:t`): Update
	call to bitwise_inverted_equal_p and check to see
	if was !wascmp or if precision was 1.

gcc/testsuite/ChangeLog:

	* gcc.c-torture/execute/pr110954-1.c: New test.
2023-08-10 23:51:07 -07:00
Martin Uecker
68783211f6 c: Support for -Wuseless-cast [PR84510]
Add support for Wuseless-cast C (and ObjC).

	PR c/84510

gcc/c/:
	* c-typeck.cc (build_c_cast): Add warning.

gcc/c-family/:
	* c.opt: Enable warning for C and ObjC.

gcc/:
	* doc/invoke.texi: Update.

gcc/testsuite/:
	* gcc.dg/Wuseless-cast.c: New test.
2023-08-11 07:00:25 +02:00
Pan Li
ee8a844d02 RISC-V: Support RVV VFMSAC rounding mode intrinsic API
This patch would like to support the rounding mode API for the
VFMSAC for the below samples.

* __riscv_vfmsac_vv_f32m1_rm
* __riscv_vfmsac_vv_f32m1_rm_m
* __riscv_vfmsac_vf_f32m1_rm
* __riscv_vfmsac_vf_f32m1_rm_m

Signed-off-by: Pan Li <pan2.li@intel.com>

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc
	(class vfmsac_frm): New class for vfmsac frm.
	(vfmsac_frm_obj): New declaration.
	(BASE): Ditto.
	* config/riscv/riscv-vector-builtins-bases.h: Ditto.
	* config/riscv/riscv-vector-builtins-functions.def
	(vfmsac_frm): New function definition

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-msac.c: New test.
2023-08-11 11:19:28 +08:00
GCC Administrator
4271b7422f Daily bump. 2023-08-11 00:16:45 +00:00
Jonathan Wakely
ecfd8c7ffe libstdc++: Fix out-of-bounds read in format string "{:{}." [PR110974]
libstdc++-v3/ChangeLog:

	PR libstdc++/110974
	* include/std/format (_Spec::_S_parse_width_or_precision): Check
	for empty range before dereferencing iterator.
	* testsuite/std/format/string.cc: Check for expected exception.
	Fix expected exception message in test_pr110862() and actually
	call it.
2023-08-10 23:31:37 +01:00
Jonathan Wakely
f48a542396 libstdc++: Fix std::format for localized floats [PR110968]
The __formatter_fp::_M_localize function just returns an empty string if
the formatting locale is the C locale, as there is nothing to do. But
the caller was assuming that the returned string contains the localized
string. The caller should use the original string if _M_localize returns
an empty string.

libstdc++-v3/ChangeLog:

	PR libstdc++/110968
	* include/std/format (__formatter_fp::format): Check return
	value of _M_localize.
	* testsuite/std/format/functions/format.cc: Check classic
	locale.
2023-08-10 23:31:37 +01:00
Jonathan Wakely
9cb2a7c8d5 libstdc++: Use alias template for iterator_category [PR110970]
This renames __iterator_category_t to __iter_category_t, for consistency
with std::iter_value_t, std::iter_difference_t and std::iter_reference_t
in C++20. Then use __iter_category_t in <bits/stl_iterator.h>, which
fixes the problem of the missing 'typename' that Clang 15 incorrectly
still requires.

libstdc++-v3/ChangeLog:

	PR libstdc++/110970
	* include/bits/stl_iterator.h (__detail::__move_iter_cat): Use
	__iter_category_t.
	(iterator_traits<common_iterator<I, S>>::_S_iter_cat): Likewise.
	(__detail::__basic_const_iterator_iter_cat): Likewise.
	* include/bits/stl_iterator_base_types.h (__iterator_category_t):
	Rename to __iter_category_t.
2023-08-10 23:31:37 +01:00
Jan Hubicka
39204ae9dd Fix division by zero in loop splitting
Profile update I added to tree-ssa-loop-split can divide by zero in
situation that the conditional is predicted with 0 probability which
is triggered by jump threading update in the testcase.

gcc/ChangeLog:

	PR middle-end/110923
	* tree-ssa-loop-split.cc (split_loop): Watch for division by zero.

gcc/testsuite/ChangeLog:

	PR middle-end/110923
	* gcc.dg/tree-ssa/pr110923.c: New test.
2023-08-11 00:23:14 +02:00
Patrick O'Neill
0ac323238e RISC-V: Add Ztso atomic mappings
The RISC-V Ztso extension currently has no effect on generated code.
With the additional ordering constraints guarenteed by Ztso, we can emit
more optimized atomic mappings than the RVWMO mappings.

This PR implements the Ztso psABI mappings[1].

[1] https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/391

2023-08-08 Patrick O'Neill <patrick@rivosinc.com>

gcc/ChangeLog:

	* common/config/riscv/riscv-common.cc: Add Ztso and mark Ztso as
	dependent on 'a' extension.
	* config/riscv/riscv-opts.h (MASK_ZTSO): New mask.
	(TARGET_ZTSO): New target.
	* config/riscv/riscv.cc (riscv_memmodel_needs_amo_acquire): Add
	Ztso case.
	(riscv_memmodel_needs_amo_release): Add Ztso case.
	(riscv_print_operand): Add Ztso case for LR/SC annotations.
	* config/riscv/riscv.md: Import sync-rvwmo.md and sync-ztso.md.
	* config/riscv/riscv.opt: Add Ztso target variable.
	* config/riscv/sync.md (mem_thread_fence_1): Expand to RVWMO or
	Ztso specific insn.
	(atomic_load<mode>): Expand to RVWMO or Ztso specific insn.
	(atomic_store<mode>): Expand to RVWMO or Ztso specific insn.
	* config/riscv/sync-rvwmo.md: New file. Seperate out RVWMO
	specific load/store/fence mappings.
	* config/riscv/sync-ztso.md: New file. Seperate out Ztso
	specific load/store/fence mappings.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/amo-table-ztso-amo-add-1.c: New test.
	* gcc.target/riscv/amo-table-ztso-amo-add-2.c: New test.
	* gcc.target/riscv/amo-table-ztso-amo-add-3.c: New test.
	* gcc.target/riscv/amo-table-ztso-amo-add-4.c: New test.
	* gcc.target/riscv/amo-table-ztso-amo-add-5.c: New test.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-1.c: New test.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-2.c: New test.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-3.c: New test.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-4.c: New test.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-5.c: New test.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-6.c: New test.
	* gcc.target/riscv/amo-table-ztso-compare-exchange-7.c: New test.
	* gcc.target/riscv/amo-table-ztso-fence-1.c: New test.
	* gcc.target/riscv/amo-table-ztso-fence-2.c: New test.
	* gcc.target/riscv/amo-table-ztso-fence-3.c: New test.
	* gcc.target/riscv/amo-table-ztso-fence-4.c: New test.
	* gcc.target/riscv/amo-table-ztso-fence-5.c: New test.
	* gcc.target/riscv/amo-table-ztso-load-1.c: New test.
	* gcc.target/riscv/amo-table-ztso-load-2.c: New test.
	* gcc.target/riscv/amo-table-ztso-load-3.c: New test.
	* gcc.target/riscv/amo-table-ztso-store-1.c: New test.
	* gcc.target/riscv/amo-table-ztso-store-2.c: New test.
	* gcc.target/riscv/amo-table-ztso-store-3.c: New test.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-1.c: New test.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-2.c: New test.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-3.c: New test.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-4.c: New test.
	* gcc.target/riscv/amo-table-ztso-subword-amo-add-5.c: New test.

Signed-off-by: Patrick O'Neill <patrick@rivosinc.com>
2023-08-10 14:07:38 -07:00
Jan Hubicka
937591d236 Fix profile update in duplicat_loop_body_to_header_edge for loops with 0 count_in
this patch makes duplicate_loop_body_to_header_edge to not drop profile counts to
uninitialized when count_in is 0.  This happens because profile_probability in 0 count
is undefined.

gcc/ChangeLog:

	* cfgloopmanip.cc (duplicate_loop_body_to_header_edge): Special case loops with
	0 iteration count.
2023-08-10 19:01:43 +02:00