Commit Graph

206696 Commits

Author SHA1 Message Date
Vladimir N. Makarov
989e67f827 [PR112918][LRA]: Fixing IRA ICE on m68k
Some GCC tests on m68K port of LRA is failed on `maximum number of
generated reload insns per insn achieved`.  The problem is in that for
subreg reload LRA can not narrow reg class more from ALL_REGS to
GENERAL_REGS and then to data regs or address regs.  The patch permits
narowing reg class from reload insns if this results in succesful
matching of reg operand.

gcc/ChangeLog:

	PR rtl-optimization/112918
	* lra-constraints.cc (SMALL_REGISTER_CLASS_P): Move before in_class_p.
	(in_class_p): Restrict condition for narrowing class in case of
	allow_all_reload_class_changes_p.
	(process_alt_operands): Pass true for
	allow_all_reload_class_changes_p in calls of in_class_p.
	(curr_insn_transform): Ditto for reg operand win.
2023-12-18 17:14:50 -05:00
Uros Bizjak
86b6daefc8 i386: Eliminate redundant compare between set{z,nz} and j{z,nz}
Eliminate redundant compare between set{z,nz} and j{z,nz}:
setz %al; test %al,%al; jz <...> -> setz %al; jnz <...> and
setnz %al, test %al,%al; jz <...> -> setnz %al; jz <...>.

We can use the original Zero-flag value instead of setting the
temporary register and testing it for zero.

gcc/ChangeLog:

	* config/i386/i386.md (redundant compare peephole2):
	New peephole2 pattern.
2023-12-18 22:18:56 +01:00
Harald Anlauf
b77691a90f Fortran: update DATE_AND_TIME intrinsic for Fortran 2018 [PR96580]
Fortran 2018 allows a non-default integer kind for its VALUES argument if
it has a decimal exponent range of at least four.  Update checks, library
implementation and documentation.

gcc/fortran/ChangeLog:

	PR fortran/96580
	* check.cc (array_size_check): New helper function.
	(gfc_check_date_and_time): Use it for checking minimum size of
	VALUES argument.  Update kind check to Fortran 2018.
	* intrinsic.texi: Fix documentation of DATE_AND_TIME.

libgfortran/ChangeLog:

	PR fortran/96580
	* intrinsics/date_and_time.c (date_and_time): Handle VALUES argument
	for kind=2 and kind=16 (if available).

gcc/testsuite/ChangeLog:

	PR fortran/96580
	* gfortran.dg/date_and_time_2.f90: New test.
	* gfortran.dg/date_and_time_3.f90: New test.
	* gfortran.dg/date_and_time_4.f90: New test.
2023-12-18 20:32:52 +01:00
Andreas Krebbel
f85fdf59c9 IBM Z: Cover weak symbols with -munaligned-symbols
With the recently introduced -munaligned-symbols option byte-sized
variables which are resolved externally are considered to be
potentially misaligned.
However, this should rather also be applied to symbols which resolve
locally if they are weak. Done with this patch.

gcc/ChangeLog:

	* config/s390/s390.cc (s390_encode_section_info): Replace
	SYMBOL_REF_LOCAL_P with decl_binds_to_current_def_p.

gcc/testsuite/ChangeLog:

	* gcc.target/s390/unaligned-2.c: New test.
2023-12-18 19:42:37 +01:00
Andrew Pinski
4554a151d0 SCCP: Fix ODR issues when compiling with LTO [PR 113054}
The problem here is that in C++ structs and classes have a
linkage too so the type vertex is not considered local to
the TU but will conflict with the globally defined one
in graphds.h.  The simple way to fix this is to wrap the ones
defined locally in gimple-ssa-sccopy.cc inside an anonymous namespace
and they are now considered locally to that TU.

Committed as obvious after a bootstrap/test on x86_64.

gcc/ChangeLog:

	PR tree-optimization/113054
	* gimple-ssa-sccopy.cc: Wrap the local types
	with an anonymous namespace.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
2023-12-18 08:35:48 -08:00
Richard Biener
88a398a487 middle-end/111975 - dump -> GIMPLE FE roundtrip improvements
The following improves the manual work needed to make a -gimple dump
valid input to the GIMPLE FE.  First of all it recognizes the 'sizetype'
tree and dumps it as __SIZETYPE__, then it changes dumping vector types
without name from 'vector(n) T' to 'T [[gnu::vector_size(n')]]' which
we can parse in most relevant contexts (and that's shorter than
using __attribute__).  Third it avoids a NULL_TREE TMR_STEP when
it would be one, an optimization that's re-done when generating RTL.

	PR middle-end/111975
	* tree-pretty-print.cc (dump_generic_node): Dump
	sizetype as __SIZETYPE__ with TDF_GIMPLE.
	Dump unnamed vector types as T [[gnu::vector_size(n)]] with
	TDF_GIMPLE.
	* tree-ssa-address.cc (create_mem_ref_raw): Never generate
	a NULL STEP when INDEX is specified.
2023-12-18 15:25:50 +01:00
Pan Li
ac9c81dd76 RISC-V: Rename the rvv test case.
As title.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/pr112432-42.c: Moved to...
	* gcc.target/riscv/rvv/base/pr112431-42.c: ...here.

Signed-off-by: Pan Li <pan2.li@intel.com>
2023-12-18 21:41:16 +08:00
Gerald Pfeifer
04538248c3 install: Drop hppa*-hp-hpux10, remove old notes on hppa*-hp-hpux11
gcc:
	PR target/69374
	* doc/install.texi (Specific) <hppa*-hp-hpux10>: Remove section.
	(Specific) <hppa*-hp-hpux11>: Remove references to GCC 2.95 and
	3.0. Also libffi has been ported now.
2023-12-18 21:39:22 +08:00
Juzhe-Zhong
b3b2799b87 RISC-V: Support one more overlap for wv instructions
For 'wv' instructions, e.g. vwadd.wv vd,vs2,vs1.

vs2 has same EEW as vd.
vs1 has smaller than vd.

So, vs2 can overlap with vd, but vs1 can only overlap highest-number of vd
when LMUL of vs1 is greater than 1.

We already have supported overlap for vs1 LMUL >= 1.
But I forget vs1 LMUL < 1, vs2 can overlap vd even though vs1 totally can not overlap vd.

Consider the reduction auto-vectorization:

int64_t
reduc_plus_int (int *__restrict a, int n)
{
  int64_t r = 0;
  for (int i = 0; i < n; ++i)
    r += a[i];
  return r;
}

When we use --param=riscv-autovec-lmul=m2, the codegen is good to us because we already supported
overlap for source EEW32 LMUL1 -> dest EEW64 LMUL2.

--param=riscv-autovec-lmul=m2:

reduc_plus_int:
        ble     a1,zero,.L4
        vsetvli a5,zero,e64,m2,ta,ma
        vmv.v.i v2,0
.L3:
        vsetvli a5,a1,e32,m1,tu,ma
        slli    a4,a5,2
        sub     a1,a1,a5
        vle32.v v1,0(a0)
        add     a0,a0,a4
        vwadd.wv        v2,v2,v1
        bne     a1,zero,.L3
        li      a5,0
        vsetivli        zero,1,e64,m1,ta,ma
        vmv.s.x v1,a5
        vsetvli a5,zero,e64,m2,ta,ma
        vredsum.vs      v2,v2,v1
        vmv.x.s a0,v2
        ret
.L4:
        li      a0,0
        ret

However, default LMUL (--param=riscv-autovec-lmul=m1) generates redundant vmv1r since
it is EEW32 LMUL=MF2 -> EEW64 LMUL = 1

Before this patch:

reduc_plus_int:
        ble     a1,zero,.L4
        vsetvli a5,zero,e64,m1,ta,ma
        vmv.v.i v1,0
.L3:
        vsetvli a5,a1,e32,mf2,tu,ma
        slli    a4,a5,2
        sub     a1,a1,a5
        vle32.v v2,0(a0)
        vmv1r.v v3,v1                  ---->  This should be removed.
        add     a0,a0,a4
        vwadd.wv        v1,v3,v2       ---->  vs2 should be v1
        bne     a1,zero,.L3
        li      a5,0
        vsetivli        zero,1,e64,m1,ta,ma
        vmv.s.x v2,a5
        vsetvli a5,zero,e64,m1,ta,ma
        vredsum.vs      v1,v1,v2
        vmv.x.s a0,v1
        ret
.L4:
        li      a0,0
        ret

After this patch:

reduc_plus_int:
	ble	a1,zero,.L4
	vsetvli	a5,zero,e64,m1,ta,ma
	vmv.v.i	v1,0
.L3:
	vsetvli	a5,a1,e32,mf2,tu,ma
	slli	a4,a5,2
	sub	a1,a1,a5
	vle32.v	v2,0(a0)
	add	a0,a0,a4
	vwadd.wv	v1,v1,v2
	bne	a1,zero,.L3
	li	a5,0
	vsetivli	zero,1,e64,m1,ta,ma
	vmv.s.x	v2,a5
	vsetvli	a5,zero,e64,m1,ta,ma
	vredsum.vs	v1,v1,v2
	vmv.x.s	a0,v1
	ret
.L4:
	li	a0,0
	ret

	PR target/112432

gcc/ChangeLog:

	* config/riscv/riscv.md (none,W21,W42,W84,W43,W86,W87): Add W0.
	(none,W21,W42,W84,W43,W86,W87,W0): Ditto.
	* config/riscv/vector.md: Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/pr112432-42.c: New test.
2023-12-18 21:19:23 +08:00
Richard Biener
5bca321faa c/111975 - GIMPLE FE dumping and parsing of TARGET_MEM_REF
The following adds dumping of TARGET_MEM_REF in -gimple form and
adds parsing of it to the GIMPLE FE.

	PR c/111975
gcc/c/
	* gimple-parser.cc (c_parser_gimple_postfix_expression):
	Parse TARGET_MEM_REF extended operands for __MEM.

gcc/
	* tree-pretty-print.cc (dump_mem_ref): Use TDF_GIMPLE path
	also for TARGET_MEM_REF and amend it.

gcc/testsuite/
	* gcc.dg/gimplefe-52.c: New testcase.
2023-12-18 12:58:06 +01:00
Juzhe-Zhong
8c5d1d1388 RISC-V: Enable vect test for RV32
gcc/testsuite/ChangeLog:

	* lib/target-supports.exp: Add RV32.
2023-12-18 19:10:51 +08:00
Jakub Jelinek
000155e8ee libgomp: Make libgomp.c/declare-variant-1.c test x86 specific
As written earlier, this test was written with the x86 specifics in mind
and adding dg-final directives for it for other arches makes it unreadable.
If a declare variant call can be resolved in gimple already as in the
aarch64 or gcn cases, it can be done in gcc.dg/gomp/ and I believe we have
tests like that already, the point of the test is that it is not known
during gimplification time which exact call should be chosen as it depends
on which declare simd clone it will be in.

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

	* testsuite/libgomp.c/declare-variant-1.c: Restrict the test to x86,
	drop because of that unneeded target selector from other directives
	and remove the aarch64 specific ones.
2023-12-18 11:57:39 +01:00
Juzhe-Zhong
10493cd4c1 RISC-V: Fix natural regsize for fixed-vlmax of -march=rv64gc_zve32f
This patch fixes 12 ICEs of "full coverage" testing:
Running target riscv-sim/-march=rv64gc_zve32f/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.dg/torture/pr96513.c   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  (internal compiler error: Segmentation fault)
FAIL: gcc.dg/torture/pr96513.c   -O3 -g  (internal compiler error: Segmentation fault)

Running target riscv-sim/-march=rv64gc_zve32f/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=m4/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.dg/torture/pr111048.c   -O2  (internal compiler error: Segmentation fault)
FAIL: gcc.dg/torture/pr111048.c   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  (internal compiler error: Segmentation fault)
FAIL: gcc.dg/torture/pr111048.c   -O3 -g  (internal compiler error: Segmentation fault)

FAIL: gcc.dg/torture/pr96513.c   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  (internal compiler error: Segmentation fault)
FAIL: gcc.dg/torture/pr96513.c   -O3 -g  (internal compiler error: Segmentation fault)

Running target riscv-sim/-march=rv64gc_zve32f/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=m8/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.dg/torture/pr96513.c   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  (internal compiler error: Segmentation fault)
FAIL: gcc.dg/torture/pr96513.c   -O3 -g  (internal compiler error: Segmentation fault)

Running target riscv-sim/-march=rv64gc_zve32f/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-preference=fixed-vlmax
FAIL: gcc.c-torture/execute/20000801-1.c   -O2  (internal compiler error: Segmentation fault)
FAIL: gcc.c-torture/execute/20000801-1.c   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  (internal compiler error: Segmentation fault)
FAIL: gcc.c-torture/execute/20000801-1.c   -O3 -g  (internal compiler error: Segmentation fault)

The root cause of those ICEs is vector register size = 32bits, wheras scalar register size = 64bit.
That is, vector regsize < scalar regsize on -march=rv64gc_zve32f FIXED-VLMAX.

So the original natural regsize using scalar register size is incorrect. Instead, we should return minimum regsize between vector regsize and scalar regsize.

gcc/ChangeLog:

	* config/riscv/riscv.cc (riscv_regmode_natural_size): Fix ICE for
	FIXED-VLMAX of -march=rv32gc_zve32f.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/bug-4.c: New test.
	* gcc.target/riscv/rvv/autovec/bug-5.c: New test.
	* gcc.target/riscv/rvv/autovec/bug-6.c: New test.
2023-12-18 18:15:45 +08:00
Jakub Jelinek
5347263b34 tree-object-size: Robustify alloc_size attribute handling [PR113013]
The following testcase ICEs because we aren't careful enough with
alloc_size attribute.  We do check that such an argument exists
(although wouldn't handle correctly functions with more than INT_MAX
arguments), but didn't check that it is scalar integer, the ICE is
trying to fold_convert a structure to sizetype.

Given that the attribute can also appear on non-prototyped functions
where the arguments aren't known, I don't see how the FE could diagnose
that and because we already handle the case where argument doesn't exist,
I think we should also verify the argument is scalar integer convertible
to sizetype.  Furthermore, given this is not just in diagnostics but
used for code generation, I think it is better to punt on arguments with
larger precision then sizetype, the upper bits are then truncated.

The patch also fixes some formatting issues and avoids duplication of the
fold_convert, plus removes unnecessary check for if (arg1 >= 0), that is
always the case after if (arg1 < 0) return ...;

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

	PR tree-optimization/113013
	* tree-object-size.cc (alloc_object_size): Return size_unknown if
	corresponding argument(s) don't have integral type or have integral
	type with higher precision than sizetype.  Don't check arg1 >= 0
	uselessly.  Compare argument indexes against gimple_call_num_args
	in unsigned type rather than int.  Formatting fixes.

	* gcc.dg/pr113013.c: New test.
2023-12-18 09:59:28 +01:00
Jakub Jelinek
994214334f testsuite: Fix up abi-tag25a.C test for C++11
Line 11 of abi-tag25.C is wrapped in #if __cpp_variable_templates
which isn't defined for -std=c++11, so we can't expect a warning
in that case either.

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

	* g++.dg/abi/abi-tag25a.C: Expect second dg-warning only for c++14
	and later.
2023-12-18 09:49:11 +01:00
Pan Li
2c0c3368de RISC-V: Bugfix for the RVV const vector
This patch would like to fix one bug of const vector for interleave.
Assume we need to generate interleave const vector like below.

 V = {{4, -4, 3, -3, 2, -2, 1, -1,}

Before this patch:
vsetvl a3, zero, e64, m8, ta, ma
vid.v       v8            v8 =  {0, 1, 2, 3, 4}
li          a6, -1
vmul.vx     v8, v8, a6    v8 =  {-0, -1, -2, -3, -4}
vadd.vi     v24, v8, 4    v24 = { 4,  3,  2,  1,  0}
vadd.vi     v8, v8, -4    v8 =  {-4, -5, -6, -7, -8}
li          a6, 32
vsll.vx     v8, v8, a6    v8 =  {0, -4, 0, -5, 0, -6, 0, -7,} for e32
vor         v24, v24, v8  v24 = {4, -4, 3, -5, 2, -6, 1, -7,} for e32

After this patch:
vsetvli a6,zero,e64,m8,ta,ma
vid.v  v8                  v8 =  {0, 1, 2, 3, 4}
li a7,-1
vmul.vx v16,v8,a7         v16 = {-0, -1, -2, -3, -4}
vaddvi v16,v16,4          v16 = { 4,  3,  2,  1, 0}
vaddvi v8,v8,-4           v8 =  {-4, -3, -2, -1, 0}
li a7,32
vsll.vx v8,v8,a7          v8 =  {0, -4, 0, -3, 0, -2,} for e32
vor.vv v16,v16,v8         v8 =  {4, -4, 3, -3, 2, -2,} for e32

It is not easy to add asm check stable enough for this case, as we need
to check the vadd -4 target comes from the vid output, which crosses 4
instructions up to point. Thus there is no test here and will be covered
by gcc.dg/vect/pr92420.c in the underlying patches.

gcc/ChangeLog:

	* config/riscv/riscv-v.cc (expand_const_vector): Take step2
	instead of step1 for second series.

Signed-off-by: Pan Li <pan2.li@intel.com>
2023-12-18 15:49:21 +08:00
xuli
7b4d6734b8 testsuite: Fix cpymem-1.c dump checks under different riscv-sim for RVV.
gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/cpymem-1.c: Fix checks.
2023-12-18 07:11:12 +00:00
Yang Yujie
ecedb59617 libphobos: Update build scripts for LoongArch64.
libphobos/ChangeLog:

	* m4/druntime/cpu.m4: Support loongarch* targets.
	* libdruntime/Makefile.am: Same.
	* libdruntime/Makefile.in: Regenerate.
	* configure: Regenerate.
2023-12-18 10:04:31 +08:00
Yang Yujie
a281f87f0d libruntime: Add fiber context switch code for LoongArch.
libphobos/ChangeLog:

	* libdruntime/config/loongarch/switchcontext.S: New file.
2023-12-18 10:04:22 +08:00
liushuyu
00d7c37df2 LoongArch: Add support for D frontend.
gcc/ChangeLog:

	* config.gcc: Add loongarch-d.o to d_target_objs for LoongArch
	architecture.
	* config/loongarch/t-loongarch: Add object target for loongarch-d.cc.
	* config/loongarch/loongarch-d.cc
	(loongarch_d_target_versions): add interface function to define builtin
	D versions for LoongArch architecture.
	(loongarch_d_handle_target_float_abi): add interface function to define
	builtin D traits for LoongArch architecture.
	(loongarch_d_register_target_info): add interface function to register
	loongarch_d_handle_target_float_abi function.
	* config/loongarch/loongarch-d.h
	(loongarch_d_target_versions): add function prototype.
	(loongarch_d_register_target_info): Likewise.

libphobos/ChangeLog:

	* configure.tgt: Enable libphobos for LoongArch architecture.
	* libdruntime/gcc/sections/elf.d: Add TLS_DTV_OFFSET constant for
	LoongArch64.
	* libdruntime/gcc/unwind/generic.d: Add __aligned__ constant for
	LoongArch64.
2023-12-18 10:04:10 +08:00
xuli
73aeec31c5 RISC-V: Add viota missed avl_type attribute
This patch fixes the following FAIL when LMUL = 8:

riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medany/--param=riscv-autovec-lmul=m8/--param=riscv-autovec-preference=scalable
FAIL: gcc.dg/vect/slp-multitypes-2.c execution test

The rootcause is we missed viota avl_type, so we end up with incorrect vsetvl configuration:

vsetvli	zero,a2,e64,m8,ta,ma
viota.m	v16,v0

'a2' value is a garbage value.

After this patch:

vsetvli	a4,zero,e64,m8,ta,ma
viota.m	v16,v0

gcc/ChangeLog:

	* config/riscv/vector.md: Add viota avl_type attribute.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/bug-2.c: New test.
2023-12-18 01:17:05 +00:00
Pan Li
2c3e4d18b2 RISC-V: Fix POLY INT handle bug
This patch fixes the following FAIL:
Running target
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=m8
FAIL: gcc.dg/vect/fast-math-vect-complex-3.c execution test

The root cause is we generate incorrect codegen for (const_poly_int:DI
[549755813888, 549755813888])

Before this patch:

li      a7,0
vmv.v.x v0,a7

After this patch:

csrr    a2,vlenb
slli    a2,a2,33
vmv.v.x v0,a2

gcc/ChangeLog:

	* config/riscv/riscv.cc (riscv_expand_mult_with_const_int):
	Change int into HOST_WIDE_INT.
	(riscv_legitimize_poly_move): Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/bug-3.c: New test.

Signed-off-by: Pan Li <pan2.li@intel.com>
2023-12-18 08:31:06 +08:00
GCC Administrator
5440b59e93 Daily bump. 2023-12-18 00:17:21 +00:00
Harald Anlauf
5060825aa7 Fortran: fix argument passing to CONTIGUOUS,TARGET dummy [PR97592]
gcc/fortran/ChangeLog:

	PR fortran/97592
	* trans-expr.cc (gfc_conv_procedure_call): For a contiguous dummy
	with the TARGET attribute, the effective argument may still be
	contiguous even if the actual argument is not simply-contiguous.
	Allow packing to be decided at runtime by _gfortran_internal_pack.

gcc/testsuite/ChangeLog:

	PR fortran/97592
	* gfortran.dg/contiguous_15.f90: New test.
2023-12-17 18:29:57 +01:00
Xi Ruoyao
fbaac6f1f0
LoongArch: Add alslsi3_extend
Following the instruction cost fix, we are generating

    alsl.w $a0, $a0, $a0, 4

instead of

    li.w  $t0, 17
    mul.w $a0, $t0

for "x * 4", because alsl.w is 4 times faster than mul.w.  But we didn't
have a sign-extending pattern for alsl.w, causing an extra slli.w
instruction generated to sign-extend $a0.  Add the pattern to remove the
redundant extension.

gcc/ChangeLog:

	* config/loongarch/loongarch.md (alslsi3_extend): New
	define_insn.
2023-12-17 19:23:29 +08:00
Xi Ruoyao
50b3f596bd
LoongArch: Fix instruction costs [PR112936]
Replace the instruction costs in loongarch_rtx_cost_data constructor
based on micro-benchmark results on LA464 and LA664.

This allows optimizations like "x * 17" to alsl, and "x * 68" to alsl
and slli.

gcc/ChangeLog:

	PR target/112936
	* config/loongarch/loongarch-def.cc
	(loongarch_rtx_cost_data::loongarch_rtx_cost_data): Update
	instruction costs per micro-benchmark results.
	(loongarch_rtx_cost_optimize_size): Set all instruction costs
	to (COSTS_N_INSNS (1) + 1).
	* config/loongarch/loongarch.cc (loongarch_rtx_costs): Remove
	special case for multiplication when optimizing for size.
	Adjust division cost when TARGET_64BIT && !TARGET_DIV32.
	Account the extra cost when TARGET_CHECK_ZERO_DIV and
	optimizing for speed.

gcc/testsuite/ChangeLog

	PR target/112936
	* gcc.target/loongarch/mul-const-reduction.c: New test.
2023-12-17 19:23:28 +08:00
Xi Ruoyao
5f3f112795
LoongArch: Include rtl.h for COSTS_N_INSNS instead of hard coding our own
With loongarch-def.cc switched from C to C++, we can include rtl.h for
COSTS_N_INSNS, instead of hard coding our own.

THis is a non-functional change for now, but it will make the code more
future-proof in case COSTS_N_INSNS in rtl.h would be changed.

gcc/ChangeLog:

	* config/loongarch/loongarch-def.cc (rtl.h): Include.
	(COSTS_N_INSNS): Remove the macro definition.
2023-12-17 19:23:28 +08:00
Gerald Pfeifer
da70c5b171 install: Streamline the hppa*-hp-hpux* section
gcc:

	PR target/69374
	* doc/install.texi (Specific) <hppa*-hp-hpux*>: Remove a note on
	GCC 4.3.
	Remove details on how the HP assembler, which we document as not
	working, breaks.
	<hppa*-hp-hpux11>: Note that only the HP linker is supported.
2023-12-17 15:13:39 +08:00
Gerald Pfeifer
f73a00b735 doc: Remove references to buildstat.html
gcc:

	PR other/69374
	* doc/install.texi (Installing GCC): Remove reference to
	buildstat.html.
	(Testing): Ditto.
	(Final install): Remove section on submitting information for
	buildstat.html. Adjust the request for feedback.
2023-12-17 09:18:28 +08:00
GCC Administrator
7e6f0faa8b Daily bump. 2023-12-17 00:17:30 +00:00
Jonathan Wakely
1f7acbf042 libstdc++: Fix bootstrap on AIX due to fileno macro
On AIX fileno is a function-like macro, so enclose the name in
parentheses to ensure we use the real function.

libstdc++-v3/ChangeLog:

	* src/c++23/print.cc (__open_terminal(FILE*)): Avoid fileno
	macro.
2023-12-16 23:52:30 +00:00
Nathaniel Shead
cb76f46c97 c++: Seed namespaces for bindings [PR106363]
Currently the first depset for an EK_BINDING is not seeded. This breaks
the attached testcase as then the namespace is not considered referenced
yet during streaming, but we've already finished importing.

There doesn't seem to be any particular reason I could find for skipping
the first depset for bindings, and removing the condition doesn't appear
to cause any test failures, so this patch removes that check.

	PR c++/106363

gcc/cp/ChangeLog:

	* module.cc (module_state::write_cluster): Don't skip first
	depset for bindings.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/pr106363_a.C: New test.
	* g++.dg/modules/pr106363_b.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2023-12-17 10:38:35 +11:00
David Malcolm
7abc7aae56 analyzer: add sarif properties for bounds checking diagnostics
As a followup to r14-6057-g12b67d1e13b3cf, add SARIF property bags
for -Wanalyzer-out-of-bounds, to help with debugging these warnings.
This was very helpful with PR analyzer/112792.

gcc/analyzer/ChangeLog:
	* analyzer.cc: Include "tree-pretty-print.h" and
	"diagnostic-event-id.h".
	(tree_to_json): New.
	(diagnostic_event_id_to_json): New.
	(bit_offset_to_json): New.
	(byte_offset_to_json): New.
	* analyzer.h (tree_to_json): New decl.
	(diagnostic_event_id_to_json): New decl.
	(bit_offset_to_json): New decl.
	(byte_offset_to_json): New decl.
	* bounds-checking.cc: Include "diagnostic-format-sarif.h".
	(out_of_bounds::maybe_add_sarif_properties): New.
	(concrete_out_of_bounds::maybe_add_sarif_properties): New.
	(concrete_past_the_end::maybe_add_sarif_properties): New.
	(symbolic_past_the_end::maybe_add_sarif_properties): New.
	* region-model.cc (region_to_value_map::to_json): New.
	(region_model::to_json): New.
	* region-model.h (region_to_value_map::to_json): New decl.
	(region_model::to_json): New decl.
	* store.cc (bit_range::to_json): New.
	(byte_range::to_json): New.
	* store.h (bit_range::to_json): New decl.
	(byte_range::to_json): New decl.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2023-12-16 16:19:36 -05:00
David Malcolm
30d9a3a698 json: fix escaping of object keys
gcc/ChangeLog:
	* json.cc (print_escaped_json_string): New, taken from
	string::print.
	(object::print): Use it for printing keys.
	(string::print): Move implementation to
	print_escaped_json_string.
	(selftest::test_writing_objects): Add a key containing
	quote, backslash, and control characters.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2023-12-16 16:16:33 -05:00
H.J. Lu
308e9d693c libstdc++: Update some baseline_symbols.txt (x32)
* config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt:
	Updated.
2023-12-16 10:43:27 -08:00
Ken Matsui
61d6dee992
libstdc++: Optimize std::remove_pointer compilation performance
This patch optimizes the compilation performance of std::remove_pointer
by dispatching to the new remove_pointer built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (remove_pointer): Use __remove_pointer
	built-in trait.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:40 -08:00
Ken Matsui
4b11101365
libstdc++: Optimize std::is_object compilation performance
This patch optimizes the compilation performance of std::is_object
by dispatching to the new __is_object built-in trait.

libstdc++-v3/ChangeLog:
	* include/std/type_traits (is_object): Use __is_object built-in
	trait.
	(is_object_v): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:39 -08:00
Ken Matsui
cdd4387c5b
libstdc++: Optimize std::is_function compilation performance
This patch optimizes the compilation performance of std::is_function
by dispatching to the new __is_function built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_function): Use __is_function
	built-in trait.
	(is_function_v): Likewise. Optimize its implementation.  Move
	this under is_const_v as this depends on is_const_v.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:38 -08:00
Ken Matsui
e86cfcaef2
libstdc++: Optimize std::is_reference compilation performance
This patch optimizes the compilation performance of std::is_reference
by dispatching to the new __is_reference built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_reference): Use __is_reference
	built-in trait.
	(is_reference_v): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:36 -08:00
Ken Matsui
fa454b8dd0
libstdc++: Optimize std::is_member_object_pointer compilation performance
This patch optimizes the compilation performance of
std::is_member_object_pointer by dispatching to the new
__is_member_object_pointer built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_member_object_pointer): Use
	__is_member_object_pointer built-in trait.
	(is_member_object_pointer_v): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:35 -08:00
Ken Matsui
53f9d0cc07
libstdc++: Optimize std::is_member_function_pointer compilation performance
This patch optimizes the compilation performance of
std::is_member_function_pointer by dispatching to the new
__is_member_function_pointer built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_member_function_pointer): Use
	__is_member_function_pointer built-in trait.
	(is_member_function_pointer_v): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:34 -08:00
Ken Matsui
d95e54347f
libstdc++: Optimize std::is_member_pointer compilation performance
This patch optimizes the compilation performance of std::is_member_pointer
by dispatching to the new __is_member_pointer built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_member_pointer): Use
	__is_member_pointer built-in trait.
	(is_member_pointer_v): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:33 -08:00
Ken Matsui
4a235f8eb0
libstdc++: Optimize std::is_scoped_enum compilation performance
This patch optimizes the compilation performance of std::is_scoped_enum
by dispatching to the new __is_scoped_enum built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_scoped_enum): Use
	__is_scoped_enum built-in trait.
	(is_scoped_enum_v): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:32 -08:00
Ken Matsui
8843cff6c9
libstdc++: Optimize std::is_bounded_array compilation performance
This patch optimizes the compilation performance of std::is_bounded_array
by dispatching to the new __is_bounded_array built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_bounded_array_v): Use
	__is_bounded_array built-in trait.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:31 -08:00
Ken Matsui
7fd9c349e4
libstdc++: Optimize std::is_array compilation performance
This patch optimizes the compilation performance of std::is_array
by dispatching to the new __is_array built-in trait.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (is_array): Use __is_array built-in
	trait.
	(is_array_v): Likewise.

Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
2023-12-16 08:59:30 -08:00
David Malcolm
5f1bed2a7a analyzer: use bit-level granularity for concrete bounds-checking [PR112792]
PR analyzer/112792 reports false positives from -fanalyzer's
bounds-checking on certain packed structs containing bitfields e.g.
in the Linux kernel's drivers/dma/idxd/device.c:

union msix_perm {
  struct {
    u32 rsvd2 : 8;
    u32 pasid : 20;
  };
  u32 bits;
} __attribute__((__packed__));

The root cause is that the bounds-checking is done using byte offsets
and ranges; in the above, an access of "pasid" is treated as a 32-bit
access starting one byte inside the union, thus accessing byte offsets
1-4 when only offsets 0-3 are valid.

This patch updates the bounds-checking to use bit offsets and ranges
wherever possible - for concrete offsets and capacities.  In the above
accessing "pasid" is treated as bits 8-27 of a 32-bit region, fixing the
false positive.

Symbolic offsets and ranges are still handled at byte granularity.

gcc/analyzer/ChangeLog:
	PR analyzer/112792
	* bounds-checking.cc
	(out_of_bounds::oob_region_creation_event_capacity): Rename
	"capacity" to "byte_capacity".  Layout fix.
	(out_of_bounds::::add_region_creation_events): Rename
	"capacity" to "byte_capacity".
	(class concrete_out_of_bounds): Rename m_out_of_bounds_range to
	m_out_of_bounds_bits and convert from a byte_range to a bit_range.
	(concrete_out_of_bounds::get_out_of_bounds_bytes): New.
	(concrete_past_the_end::concrete_past_the_end): Rename param
	"byte_bound" to "bit_bound".  Initialize m_byte_bound.
	(concrete_past_the_end::subclass_equal_p): Update for renaming
	of m_byte_bound to m_bit_bound.
	(concrete_past_the_end::m_bit_bound): New field.
	(concrete_buffer_overflow::concrete_buffer_overflow): Convert
	param "range" from byte_range to bit_range.  Rename param
	"byte_bound" to "bit_bound".
	(concrete_buffer_overflow::emit): Update for bits vs bytes.
	(concrete_buffer_overflow::describe_final_event): Split
	into...
	(concrete_buffer_overflow::describe_final_event_as_bytes): ...this
	(concrete_buffer_overflow::describe_final_event_as_bits): ...and
	this.
	(concrete_buffer_over_read::concrete_buffer_over_read): Convert
	param "range" from byte_range to bit_range.  Rename param
	"byte_bound" to "bit_bound".
	(concrete_buffer_over_read::emit): Update for bits vs bytes.
	(concrete_buffer_over_read::describe_final_event): Split into...
	(concrete_buffer_over_read::describe_final_event_as_bytes):
	...this
	(concrete_buffer_over_read::describe_final_event_as_bits): ...and
	this.
	(concrete_buffer_underwrite::concrete_buffer_underwrite): Convert
	param "range" from byte_range to bit_range.
	(concrete_buffer_underwrite::describe_final_event): Split into...
	(concrete_buffer_underwrite::describe_final_event_as_bytes):
	...this
	(concrete_buffer_underwrite::describe_final_event_as_bits): ...and
	this.
	(concrete_buffer_under_read::concrete_buffer_under_read): Convert
	param "range" from byte_range to bit_range.
	(concrete_buffer_under_read::describe_final_event): Split into...
	(concrete_buffer_under_read::describe_final_event_as_bytes):
	...this
	(concrete_buffer_under_read::describe_final_event_as_bits): ...and
	this.
	(region_model::check_region_bounds): Use bits for concrete values,
	and rename locals to indicate whether we're dealing with bits or
	bytes.  Specifically, replace "num_bytes_sval" with
	"num_bits_sval", and get it from reg's "get_bit_size_sval".
	Replace "num_bytes_tree" with "num_bits_tree".  Rename "capacity"
	to "byte_capacity".  Rename "cst_capacity_tree" to
	"cst_byte_capacity_tree".  Replace "offset" and
	"num_bytes_unsigned" with "bit_offset" and "num_bits_unsigned"
	respectively, converting from byte_offset_t to bit_offset_t.
	Replace "out" and "read_bytes" with "bits_outside" and "read_bits"
	respectively, converting from byte_range to bit_range.  Convert
	"buffer" from byte_range to bit_range.  Replace "byte_bound" with
	"bit_bound".
	* region.cc (region::get_bit_size_sval): New.
	(offset_region::get_bit_offset): New.
	(offset_region::get_bit_size_sval): New.
	(sized_region::get_bit_size_sval): New.
	(bit_range_region::get_bit_size_sval): New.
	* region.h (region::get_bit_size_sval): New vfunc.
	(offset_region::get_bit_offset): New decl.
	(offset_region::get_bit_size_sval): New decl.
	(sized_region::get_bit_size_sval): New decl.
	(bit_range_region::get_bit_size_sval): New decl.
	* store.cc (bit_range::intersects_p): New, based on
	byte_range::intersects_p.
	(bit_range::exceeds_p): New, based on byte_range::exceeds_p.
	(bit_range::falls_short_of_p): New, based on
	byte_range::falls_short_of_p.
	(byte_range::intersects_p): Delete.
	(byte_range::exceeds_p): Delete.
	(byte_range::falls_short_of_p): Delete.
	* store.h (bit_range::intersects_p): New overload.
	(bit_range::exceeds_p): New.
	(bit_range::falls_short_of_p): New.
	(byte_range::intersects_p): Delete.
	(byte_range::exceeds_p): Delete.
	(byte_range::falls_short_of_p): Delete.

gcc/testsuite/ChangeLog:
	PR analyzer/112792
	* c-c++-common/analyzer/out-of-bounds-pr112792.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2023-12-16 09:03:16 -05:00
Paul Thomas
9a1105b770 Fortran: Prevent unwanted finalization with -w option [PR112459]
2023-12-16  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
	PR fortran/112459
	* trans-array.cc (gfc_trans_array_constructor_value): Replace
	gfc_notification_std with explicit logical expression that
	selects F2003/2008 and excludes -std=default/gnu.
	* trans-expr.cc (gfc_conv_expr): Ditto.

gcc/testsuite/
	PR fortran/112459
	* gfortran.dg/pr112459.f90: New test.
2023-12-16 13:59:45 +00:00
Paul Thomas
5ae6f524f5 Fortran: Fix problems with class array function selectors [PR112834]
2023-12-16  Paul Thomas  <pault@gcc.gnu.org>

gcc/fortran
	PR fortran/112834
	* match.cc (build_associate_name): Fix whitespace issues.
	(select_type_set_tmp): If the selector is of unknown type, go
	the SELECT TYPE selector to see if this is a function and, if
	the result is available, use its typespec.
	* parse.cc (parse_associate): Again, use the function result if
	the type of the selector result is unknown.
	* trans-stmt.cc (trans_associate_var): The expression has to be
	of type class, for class_target to be true. Convert and fix
	class functions. Pass the fixed expression.

	PR fortran/111853
	* resolve.cc (gfc_expression_rank): Avoid null dereference.

gcc/testsuite/
	PR fortran/112834
	* gfortran.dg/associate_63.f90 : New test.

	PR fortran/111853
	* gfortran.dg/pr111853.f90 : New test.
2023-12-16 13:26:47 +00:00
Nathaniel Shead
39f9c426f5 c++: Fix unchecked use of CLASSTYPE_AS_BASE [PR113031]
My previous commit (naively) assumed that a TREE_CODE of RECORD_TYPE or
UNION_TYPE was sufficient for optype to be considered a "class type".
However, this does not account for e.g. template type parameters of
record or union type. This patch corrects to check for CLASS_TYPE_P
before checking for as-base conversion.

	PR c++/113031

gcc/cp/ChangeLog:

	* constexpr.cc (cxx_fold_indirect_ref_1): Check for CLASS_TYPE
	before using CLASSTYPE_AS_BASE.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/pr113031.C: New test.

Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
2023-12-16 15:09:50 +11:00
Andrew Carlotti
0cfde688e2 [aarch64] Add function multiversioning support
This adds initial support for function multiversioning on aarch64 using
the target_version and target_clones attributes.  This loosely follows
the Beta specification in the ACLE [1], although with some differences
that still need to be resolved (possibly as follow-up patches).

Existing function multiversioning implementations are broken in various
ways when used across translation units.  This includes placing
resolvers in the wrong translation units, and using symbol mangling that
callers to unintentionally bypass the resolver in some circumstances.
Fixing these issues for aarch64 will require modifications to our ACLE
specification.  It will also require further adjustments to existing
middle end code, to facilitate different mangling and resolver
placement while preserving existing target behaviours.

The list of function multiversioning features specified in the ACLE is
also inconsistent with the list of features supported in target option
extensions.  I intend to resolve some or all of these inconsistencies at
a later stage.

The target_version attribute is currently only supported in C++, since
this is the only frontend with existing support for multiversioning
using the target attribute.  On the other hand, this patch happens to
enable multiversioning with the target_clones attribute in Ada and D, as
well as the entire C family, using their existing frontend support.

This patch also does not support the following aspects of the Beta
specification:

- The target_clones attribute should allow an implicit unlisted
  "default" version.
- There should be an option to disable function multiversioning at
  compile time.
- Unrecognised target names in a target_clones attribute should be
  ignored (with an optional warning).  This current patch raises an
  error instead.

[1] https://github.com/ARM-software/acle/blob/main/main/acle.md#function-multi-versioning

gcc/ChangeLog:

	* config/aarch64/aarch64-feature-deps.h (fmv_deps_<FEAT_NAME>):
	Define aarch64_feature_flags mask foreach FMV feature.
	* config/aarch64/aarch64-option-extensions.def: Use new macros
	to define FMV feature extensions.
	* config/aarch64/aarch64.cc (aarch64_option_valid_attribute_p):
	Check for target_version attribute after processing target
	attribute.
	(aarch64_fmv_feature_data): New.
	(aarch64_parse_fmv_features): New.
	(aarch64_process_target_version_attr): New.
	(aarch64_option_valid_version_attribute_p): New.
	(get_feature_mask_for_version): New.
	(compare_feature_masks): New.
	(aarch64_compare_version_priority): New.
	(build_ifunc_arg_type): New.
	(make_resolver_func): New.
	(add_condition_to_bb): New.
	(dispatch_function_versions): New.
	(aarch64_generate_version_dispatcher_body): New.
	(aarch64_get_function_versions_dispatcher): New.
	(aarch64_common_function_versions): New.
	(aarch64_mangle_decl_assembler_name): New.
	(TARGET_OPTION_VALID_VERSION_ATTRIBUTE_P): New implementation.
	(TARGET_OPTION_EXPANDED_CLONES_ATTRIBUTE): New implementation.
	(TARGET_OPTION_FUNCTION_VERSIONS): New implementation.
	(TARGET_COMPARE_VERSION_PRIORITY): New implementation.
	(TARGET_GENERATE_VERSION_DISPATCHER_BODY): New implementation.
	(TARGET_GET_FUNCTION_VERSIONS_DISPATCHER): New implementation.
	(TARGET_MANGLE_DECL_ASSEMBLER_NAME): New implementation.
	* config/aarch64/aarch64.h (TARGET_HAS_FMV_TARGET_ATTRIBUTE):
	Set target macro.
	* config/arm/aarch-common.h (enum aarch_parse_opt_result): Add
	new value to report duplicate FMV feature.
	* common/config/aarch64/cpuinfo.h: New file.

libgcc/ChangeLog:

	* config/aarch64/cpuinfo.c (enum CPUFeatures): Move to shared
	copy in gcc/common

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/options_set_17.c: Reorder expected flags.
	* gcc.target/aarch64/cpunative/native_cpu_0.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_13.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_16.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_17.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_18.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_19.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_20.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_21.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_22.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_6.c: Ditto.
	* gcc.target/aarch64/cpunative/native_cpu_7.c: Ditto.
2023-12-16 00:41:22 +00:00