Commit Graph

194676 Commits

Author SHA1 Message Date
Ian Lance Taylor
9f62ed218f Merge from trunk revision 5eb9f117a3. 2022-07-27 10:15:41 -07:00
Andrew Carlotti
5eb9f117a3 docs: Fix outdated reference to LOOPS_HAVE_MARKED_SINGLE_EXITS
gcc/ChangeLog:

	* doc/loop.texi: Refer to LOOPS_HAVE_RECORDED_EXITS instead.
2022-07-27 15:11:51 +01:00
Immad Mir
0f82c0ea8d analyzer: add get_meaning_for_state_change vfunc to fd_diagnostic in sm-fd.cc [PR106286]
This patch adds get_meaning_for_state_change vfunc to
fd_diagnostic in sm-fd.cc which could be used by SARIF output.

Lightly tested on x86_64 Linux.

gcc/analyzer/ChangeLog:
	PR analyzer/106286
	* sm-fd.cc:
	(fd_diagnostic::get_meaning_for_state_change): New.

gcc/testsuite/ChangeLog:
	PR analyzer/106286
	* gcc.dg/analyzer/fd-meaning.c: New test.

Signed-off-by: Immad Mir <mirimmad@outlook.com>
2022-07-27 19:16:43 +05:30
WANG Xuerui
c2481a6bb7
LoongArch: document -m[no-]explicit-relocs
gcc/ChangeLog:

	* doc/invoke.texi: Document -m[no-]explicit-relocs for
	LoongArch.
2022-07-27 21:08:51 +08:00
Maciej W. Rozycki
3cf07cc5e5 RISC-V: Remove duplicate backslashes from `stack_protect_set_<mode>'
Remove redundant duplicate backslash characters from \t sequences in the
output pattern of the `stack_protect_set_<mode>' RTL insn.

	gcc/
	* config/riscv/riscv.md (stack_protect_set_<mode>): Remove
	duplicate backslashes.
2022-07-27 11:09:43 +01:00
Maciej W. Rozycki
98cf74a2ad RISC-V: Add RTX costs for `if_then_else' expressions
Fix a performance regression from commit 391500af19 ("Do not ignore
costs of jump insns in combine."), a part of the m68k series for MODE_CC
conversion (<https://gcc.gnu.org/ml/gcc-patches/2019-11/msg01028.html>),
observed in soft-fp code in libgcc used by some of the embench-iot
benchmarks.

The immediate origin of the regression is the middle end, which in the
absence of cost information from the backend estimates the cost of an
RTL expression by assuming a single machine instruction for each of the
expression's subexpression.

So for `if_then_else', which takes 3 operands, the estimated cost is 3
instructions (i.e. 12 units) even though a branch instruction evaluates
it in a single machine cycle (ignoring the cost of actually taking the
branch of course, which is handled elsewhere).  Consequently an insn
sequence like:

(insn 595 594 596 43 (set (reg:DI 305)
        (lshiftrt:DI (reg/v:DI 160 [ R_f ])
            (const_int 55 [0x37]))) ".../libgcc/soft-fp/adddf3.c":46:3 216 {lshrdi3}
     (nil))
(insn 596 595 597 43 (set (reg:DI 304)
        (and:DI (reg:DI 305)
            (const_int 1 [0x1]))) ".../libgcc/soft-fp/adddf3.c":46:3 109 {anddi3}
     (expr_list:REG_DEAD (reg:DI 305)
        (nil)))
(jump_insn 597 596 598 43 (set (pc)
        (if_then_else (eq (reg:DI 304)
                (const_int 0 [0]))
            (label_ref:DI 1644)
            (pc))) ".../libgcc/soft-fp/adddf3.c":46:3 237 {*branchdi}
     (expr_list:REG_DEAD (reg:DI 304)
        (int_list:REG_BR_PROB 536870916 (nil)))
 -> 1644)

does not (anymore, as from the commit referred) get combined into:

(note 595 594 596 43 NOTE_INSN_DELETED)
(note 596 595 597 43 NOTE_INSN_DELETED)
(jump_insn 597 596 598 43 (parallel [
            (set (pc)
                (if_then_else (eq (zero_extract:DI (reg/v:DI 160 [ R_f ])
                            (const_int 1 [0x1])
                            (const_int 55 [0x37]))
                        (const_int 0 [0]))
                    (label_ref:DI 1644)
                    (pc)))
            (clobber (scratch:DI))
        ]) ".../libgcc/soft-fp/adddf3.c":46:3 243 {*branch_on_bitdi}
     (int_list:REG_BR_PROB 536870916 (nil))
 -> 1644)

This is because the new cost is incorrectly calculated as 28 units while
the cost of the original 3 instructions was 24:

rejecting combination of insns 595, 596 and 597
original costs 4 + 4 + 16 = 24
replacement cost 28

Before the commit referred the cost of jump instruction was ignored and
considered 0 (i.e. unknown) and a sequence of instructions of a known
cost used to win:

allowing combination of insns 595, 596 and 597
original costs 4 + 4 + 0 = 0
replacement cost 28

Add the missing costs for the 3 variants of `if_then_else' expressions
we currently define in the backend.

With the fix in place the cost of this particular `if_then_else' pattern
is 2 instructions or 8 units (because of the shift operation) and
therefore the ultimate cost of the original 3 RTL insns will work out at
16 units (4 + 4 + 8), however the replacement single RTL insn will cost
8 units only.

	gcc/
	* config/riscv/riscv.cc (riscv_rtx_costs) <IF_THEN_ELSE>: New
	case.
2022-07-27 11:09:42 +01:00
Jakub Jelinek
f9671b60f9 cgraphunit: Don't emit asm thunks for -dx [PR106261]
When -dx option is used (didn't know we have it and no idea what is it
useful for), we just expand functions to RTL and then omit all further
RTL passes, so the normal functions aren't actually emitted into assembly,
just variables.
The following testcase ICEs, because we don't emit the methods, but do
emit thunks pointing to that and those thunks have unwind info and rely on
at least some real functions to be emitted (which is normally the case,
thunks are only emitted for locally defined functions) because otherwise
there are no CIEs, only FDEs and dwarf2out is upset about it.

The following patch fixes that by not emitting assembly thunks for -dx
either.

2022-07-27  Jakub Jelinek  <jakub@redhat.com>

	PR debug/106261
	* cgraphunit.cc (cgraph_node::assemble_thunks_and_aliases): Don't
	output asm thunks for -dx.

	* g++.dg/debug/pr106261.C: New test.
2022-07-27 12:06:22 +02:00
Jakub Jelinek
cc078cf852 opts: Add an assertion to help static analyzers [PR106332]
This function would have UB if called with empty candidates vector
(accessing p[-1] where p is malloc (0) result).
As analyzed in the PR, we never call it with empty vector, so this just
adds an assertion to make it clear.

2022-07-27  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/106332
	* opts-common.cc (candidates_list_and_hint): Add gcc_assert
	that candidates is not an empty vector.
2022-07-27 12:04:50 +02:00
Jakub Jelinek
0bc1566dec testsuite: Add -Wno-psabi to pr94920 tests [PR94920]
These tests fail on ia32, because we get -Wpsabi warnings.
Fixed by adding -Wno-psabi.  The pr94920.C test still fails the
ABS_EXPR scan-tree-dump though, I think we'll need to add vect
options and use vect_int effective target or something similar.

2022-07-27  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/94920
	* g++.dg/pr94920.C: Add -Wno-psabi to dg-options.
	* g++.dg/pr94920-1.C: Add dg-additional-options -Wno-psabi.
2022-07-27 12:02:12 +02:00
Jakub Jelinek
3044a7a824 testsuite: Add extra ia32 options so that -fprefetch-loop-arrays works [PR106397]
-fprefetch-loop-arrays isn't supported on ia32 with just -march=i386 and
similar, the following patch adds extra options similar testcases use.

2022-07-27  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/106397
	* gcc.dg/pr106397.c: For ia32, add dg-additional-options
	-march=i686 -msse.
2022-07-27 12:00:36 +02:00
Richard Biener
800781f939 Fix Rogers e-mail in MAINTAINERS
I've made the mistake of cut&pasting the bouncing address at least
twice.

	* MAINTAINERS (Roger Sayle): Update e-mail address.
2022-07-27 11:38:39 +02:00
Xi Ruoyao
66434729a7
LoongArch: adjust the default of -mexplicit-relocs by checking gas feature
The assembly produced with -mexplicit-relocs is not supported by gas <=
2.39.  Check if the assembler supports explicit relocations and set the
default accordingly.

gcc/ChangeLog:

	* configure.ac (HAVE_AS_EXPLICIT_RELOCS): Define to 1 if the
	assembler supports explicit relocation for LoongArch.
	* configure: Regenerate.
	* config/loongarch/loongarch-opts.h (HAVE_AS_EXPLICIT_RELOCS):
	Define to 0 if not defined.
	* config/loongarch/genopts/loongarch.opt.in
	(TARGET_EXPLICIT_RELOCS): Default to HAVE_AS_EXPLICIT_RELOCS.
	* config/loongarch/loongarch.opt: Regenerate.
2022-07-27 10:19:55 +08:00
GCC Administrator
fd96c4b51a Daily bump. 2022-07-27 00:16:58 +00:00
Thomas Rodgers
e75da2ace6 libstdc++: Minor codegen improvement for atomic wait spinloop
This patch merges the spin loops in the atomic wait implementation which is a
minor codegen improvement.

libstdc++-v3/ChangeLog:
	* include/bits/atomic_wait.h (__atomic_spin): Merge spin loops.
2022-07-26 14:55:36 -07:00
David Malcolm
db613e8fa8 analyzer: fix false +ves from -Wanalyzer-va-arg-type-mismatch on int promotion [PR106319]
gcc/analyzer/ChangeLog:
	PR analyzer/106319
	* store.cc (store::set_value): Don't strip away casts if the
	region has NULL type.

gcc/testsuite/ChangeLog:
	PR analyzer/106319
	* gcc.dg/analyzer/stdarg-types-3.c: New test.
	* gcc.dg/analyzer/stdarg-types-4.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-26 17:17:18 -04:00
David Malcolm
0460ba622e analyzer: fix stray get_element decls
These were copy&paste errors.

gcc/analyzer/ChangeLog:
	* region.h (code_region::get_element): Remove stray decl.
	(function_region::get_element): Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-07-26 14:43:59 -04:00
Harald Anlauf
600956c81c Fortran: error recovery from calculation of storage size of a symbol [PR103504]
gcc/fortran/ChangeLog:

	PR fortran/103504
	* interface.cc (get_sym_storage_size): Array bounds and character
	length can only be of integer type.

gcc/testsuite/ChangeLog:

	PR fortran/103504
	* gfortran.dg/pr103504.f90: New test.
2022-07-26 19:05:05 +02:00
Peter Bergner
975658b782 c: Handle initializations of opaque types [PR106016]
The initial commit that added opaque types thought that there couldn't
be any valid initializations for variables of these types, but the test
case in the bug report shows that isn't true.  The solution is to handle
OPAQUE_TYPE initializations like the other scalar types.

2022-06-17  Peter Bergner  <bergner@linux.ibm.com>

gcc/
	PR c/106016
	* expr.cc (count_type_elements): Handle OPAQUE_TYPE.

gcc/testsuite/
	PR c/106016
	* gcc.target/powerpc/pr106016.c: New test.
2022-07-26 10:04:44 -05:00
Lulu Cheng
5b96c823e5 LoongArch: Modify the output message string of the warning.
Fix bug for "error: spurious trailing punctuation sequence '.' in format [-Werror=format-diag]".

gcc/ChangeLog:

	* config/loongarch/loongarch-opts.cc: Modify the output message string
	of the warning.
2022-07-26 21:21:46 +08:00
Martin Liska
87ce0f1fd6 docs: fix previsou commit
gcc/ChangeLog:

	* doc/tm.texi.in: Fix placement of defmac.
	* doc/tm.texi: Copy.
2022-07-26 14:26:58 +02:00
Martin Liska
78017eaa36 docs: fix crossing declaration of @defmac and @hook.
gcc/ChangeLog:

	* doc/tm.texi.in: Fix cross @defmac and @hook.
	* doc/tm.texi: Copy.
2022-07-26 14:07:19 +02:00
Marek Polacek
2333b58c98 c++: ICE with erroneous template redeclaration [PR106311]
Here we ICE trying to get DECL_SOURCE_LOCATION of the parm that happens
to be error_mark_node in this ill-formed test.  I kept running into this
while reducing code, so it'd be good to have it fixed.

	PR c++/106311

gcc/cp/ChangeLog:

	* pt.cc (redeclare_class_template): Check DECL_P before accessing
	DECL_SOURCE_LOCATION.

gcc/testsuite/ChangeLog:

	* g++.dg/template/redecl5.C: New test.
2022-07-26 08:01:33 -04:00
Aldy Hernandez
2615502971 Handle non constant ranges in irange pretty printer.
Technically iranges only exist in constant form, but we allow symbolic
ones before arriving in the ranger, so legacy VRP can work.  This fixes the
ICE when attempting to print symbolic iranges in the pretty printer.

For consistency's sake, I have made sure irange::get_nonzero_bits does
not similarly ICE on a symbolic range, even though no one should be
querying nonzero bits on such a range.  This should all melt away
when legacy disappears, because all these methods are slated for
removal (min, max, kind, symbolic_p, constant_p, etc).

Finally, Richi suggested using pp_wide_int in the pretty printer
instead of going through trees.  I've adapted a test, since
dump_generic_node seems to work slightly different.

	PR tree-optimization/106444

gcc/ChangeLog:

	* value-range-pretty-print.cc (vrange_printer::visit): Handle
	legacy ranges.
	(vrange_printer::print_irange_bound): Work on wide_int's.
	* value-range-pretty-print.h (print_irange_bound): Same.
	* value-range.cc (irange::get_nonzero_bits): Handle legacy ranges.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/evrp4.c: Adjust.
2022-07-26 13:07:04 +02:00
Richard Biener
67248ad043 Improve ptr_derefs_may_alias_p for the case of &STRING_CST
When the first pointer happens to be a pointer to a STRING_CST we
give up too early since the 2nd pointer handling could still end
up with a DECL for example which can disambiguate against a STRING_CST
just fine.

	* tree-ssa-alias.cc (ptr_derefs_may_alias_p): If ptr1
	points to a constant continue checking ptr2.
2022-07-26 12:08:50 +02:00
Andrew Carlotti
c906efc700 aarch64: Move vreinterpret definitions into the compiler
This removes a significant number of intrinsic definitions from the arm_neon.h
header file, and reduces the amount of code duplication.  The new macros and
data structures are intended to also facilitate moving other intrinsic
definitions out of the header file in future.

There is a a slight change in the behaviour of the bf16 vreinterpret intrinsics
when compiling without bf16 support.  Expressions like:

b = vreinterpretq_s32_bf16(vreinterpretq_bf16_s64(a))

are now compiled successfully, instead of causing a 'target specific option
mismatch' during inlining.

gcc/ChangeLog:

	* config/aarch64/aarch64-builtins.cc
	(MODE_d_bf16, MODE_d_f16, MODE_d_f32, MODE_d_f64, MODE_d_s8)
	(MODE_d_s16, MODE_d_s32, MODE_d_s64, MODE_d_u8, MODE_d_u16)
	(MODE_d_u32, MODE_d_u64, MODE_d_p8, MODE_d_p16, MODE_d_p64)
	(MODE_q_bf16, MODE_q_f16, MODE_q_f32, MODE_q_f64, MODE_q_s8)
	(MODE_q_s16, MODE_q_s32, MODE_q_s64, MODE_q_u8, MODE_q_u16)
	(MODE_q_u32, MODE_q_u64, MODE_q_p8, MODE_q_p16, MODE_q_p64)
	(MODE_q_p128): Define macro to map to corresponding mode name.
	(QUAL_bf16, QUAL_f16, QUAL_f32, QUAL_f64, QUAL_s8, QUAL_s16)
	(QUAL_s32, QUAL_s64, QUAL_u8, QUAL_u16, QUAL_u32, QUAL_u64)
	(QUAL_p8, QUAL_p16, QUAL_p64, QUAL_p128): Define macro to map to
	corresponding qualifier name.
	(LENGTH_d, LENGTH_q): Define macro to map to "" or "q" suffix.
	(SIMD_INTR_MODE, SIMD_INTR_QUAL, SIMD_INTR_LENGTH_CHAR): Macro
	functions for the above mappings
	(VREINTERPRET_BUILTIN2, VREINTERPRET_BUILTINS1, VREINTERPRET_BUILTINS)
	(VREINTERPRETQ_BUILTIN2, VREINTERPRETQ_BUILTINS1)
	(VREINTERPRETQ_BUILTINS, VREINTERPRET_BUILTIN)
	(AARCH64_SIMD_VREINTERPRET_BUILTINS): New macros to create definitions
	for all vreinterpret intrinsics
	(enum aarch64_builtins): Add vreinterpret function codes
	(aarch64_init_simd_intrinsics): New
	(handle_arm_neon_h): Improved comment.
	(aarch64_general_fold_builtin): Fold vreinterpret calls
	* config/aarch64/arm_neon.h
	(vreinterpret_p8_f16, vreinterpret_p8_f64, vreinterpret_p8_s8)
	(vreinterpret_p8_s16, vreinterpret_p8_s32, vreinterpret_p8_s64)
	(vreinterpret_p8_f32, vreinterpret_p8_u8, vreinterpret_p8_u16)
	(vreinterpret_p8_u32, vreinterpret_p8_u64, vreinterpret_p8_p16)
	(vreinterpret_p8_p64, vreinterpretq_p8_f64, vreinterpretq_p8_s8)
	(vreinterpretq_p8_s16, vreinterpretq_p8_s32, vreinterpretq_p8_s64)
	(vreinterpretq_p8_f16, vreinterpretq_p8_f32, vreinterpretq_p8_u8)
	(vreinterpretq_p8_u16, vreinterpretq_p8_u32, vreinterpretq_p8_u64)
	(vreinterpretq_p8_p16, vreinterpretq_p8_p64, vreinterpretq_p8_p128)
	(vreinterpret_p16_f16, vreinterpret_p16_f64, vreinterpret_p16_s8)
	(vreinterpret_p16_s16, vreinterpret_p16_s32, vreinterpret_p16_s64)
	(vreinterpret_p16_f32, vreinterpret_p16_u8, vreinterpret_p16_u16)
	(vreinterpret_p16_u32, vreinterpret_p16_u64, vreinterpret_p16_p8)
	(vreinterpret_p16_p64, vreinterpretq_p16_f64, vreinterpretq_p16_s8)
	(vreinterpretq_p16_s16, vreinterpretq_p16_s32, vreinterpretq_p16_s64)
	(vreinterpretq_p16_f16, vreinterpretq_p16_f32, vreinterpretq_p16_u8)
	(vreinterpretq_p16_u16, vreinterpretq_p16_u32, vreinterpretq_p16_u64)
	(vreinterpretq_p16_p8, vreinterpretq_p16_p64, vreinterpretq_p16_p128)
	(vreinterpret_p64_f16, vreinterpret_p64_f64, vreinterpret_p64_s8)
	(vreinterpret_p64_s16, vreinterpret_p64_s32, vreinterpret_p64_s64)
	(vreinterpret_p64_f32, vreinterpret_p64_u8, vreinterpret_p64_u16)
	(vreinterpret_p64_u32, vreinterpret_p64_u64, vreinterpret_p64_p8)
	(vreinterpret_p64_p16, vreinterpretq_p64_f64, vreinterpretq_p64_s8)
	(vreinterpretq_p64_s16, vreinterpretq_p64_s32, vreinterpretq_p64_s64)
	(vreinterpretq_p64_f16, vreinterpretq_p64_f32, vreinterpretq_p64_p128)
	(vreinterpretq_p64_u8, vreinterpretq_p64_u16, vreinterpretq_p64_p16)
	(vreinterpretq_p64_u32, vreinterpretq_p64_u64, vreinterpretq_p64_p8)
	(vreinterpretq_p128_p8, vreinterpretq_p128_p16, vreinterpretq_p128_f16)
	(vreinterpretq_p128_f32, vreinterpretq_p128_p64, vreinterpretq_p128_s64)
	(vreinterpretq_p128_u64, vreinterpretq_p128_s8, vreinterpretq_p128_s16)
	(vreinterpretq_p128_s32, vreinterpretq_p128_u8, vreinterpretq_p128_u16)
	(vreinterpretq_p128_u32, vreinterpret_f16_f64, vreinterpret_f16_s8)
	(vreinterpret_f16_s16, vreinterpret_f16_s32, vreinterpret_f16_s64)
	(vreinterpret_f16_f32, vreinterpret_f16_u8, vreinterpret_f16_u16)
	(vreinterpret_f16_u32, vreinterpret_f16_u64, vreinterpret_f16_p8)
	(vreinterpret_f16_p16, vreinterpret_f16_p64, vreinterpretq_f16_f64)
	(vreinterpretq_f16_s8, vreinterpretq_f16_s16, vreinterpretq_f16_s32)
	(vreinterpretq_f16_s64, vreinterpretq_f16_f32, vreinterpretq_f16_u8)
	(vreinterpretq_f16_u16, vreinterpretq_f16_u32, vreinterpretq_f16_u64)
	(vreinterpretq_f16_p8, vreinterpretq_f16_p128, vreinterpretq_f16_p16)
	(vreinterpretq_f16_p64, vreinterpret_f32_f16, vreinterpret_f32_f64)
	(vreinterpret_f32_s8, vreinterpret_f32_s16, vreinterpret_f32_s32)
	(vreinterpret_f32_s64, vreinterpret_f32_u8, vreinterpret_f32_u16)
	(vreinterpret_f32_u32, vreinterpret_f32_u64, vreinterpret_f32_p8)
	(vreinterpret_f32_p16, vreinterpret_f32_p64, vreinterpretq_f32_f16)
	(vreinterpretq_f32_f64, vreinterpretq_f32_s8, vreinterpretq_f32_s16)
	(vreinterpretq_f32_s32, vreinterpretq_f32_s64, vreinterpretq_f32_u8)
	(vreinterpretq_f32_u16, vreinterpretq_f32_u32, vreinterpretq_f32_u64)
	(vreinterpretq_f32_p8, vreinterpretq_f32_p16, vreinterpretq_f32_p64)
	(vreinterpretq_f32_p128, vreinterpret_f64_f16, vreinterpret_f64_f32)
	(vreinterpret_f64_p8, vreinterpret_f64_p16, vreinterpret_f64_p64)
	(vreinterpret_f64_s8, vreinterpret_f64_s16, vreinterpret_f64_s32)
	(vreinterpret_f64_s64, vreinterpret_f64_u8, vreinterpret_f64_u16)
	(vreinterpret_f64_u32, vreinterpret_f64_u64, vreinterpretq_f64_f16)
	(vreinterpretq_f64_f32, vreinterpretq_f64_p8, vreinterpretq_f64_p16)
	(vreinterpretq_f64_p64, vreinterpretq_f64_s8, vreinterpretq_f64_s16)
	(vreinterpretq_f64_s32, vreinterpretq_f64_s64, vreinterpretq_f64_u8)
	(vreinterpretq_f64_u16, vreinterpretq_f64_u32, vreinterpretq_f64_u64)
	(vreinterpret_s64_f16, vreinterpret_s64_f64, vreinterpret_s64_s8)
	(vreinterpret_s64_s16, vreinterpret_s64_s32, vreinterpret_s64_f32)
	(vreinterpret_s64_u8, vreinterpret_s64_u16, vreinterpret_s64_u32)
	(vreinterpret_s64_u64, vreinterpret_s64_p8, vreinterpret_s64_p16)
	(vreinterpret_s64_p64, vreinterpretq_s64_f64, vreinterpretq_s64_s8)
	(vreinterpretq_s64_s16, vreinterpretq_s64_s32, vreinterpretq_s64_f16)
	(vreinterpretq_s64_f32, vreinterpretq_s64_u8, vreinterpretq_s64_u16)
	(vreinterpretq_s64_u32, vreinterpretq_s64_u64, vreinterpretq_s64_p8)
	(vreinterpretq_s64_p16, vreinterpretq_s64_p64, vreinterpretq_s64_p128)
	(vreinterpret_u64_f16, vreinterpret_u64_f64, vreinterpret_u64_s8)
	(vreinterpret_u64_s16, vreinterpret_u64_s32, vreinterpret_u64_s64)
	(vreinterpret_u64_f32, vreinterpret_u64_u8, vreinterpret_u64_u16)
	(vreinterpret_u64_u32, vreinterpret_u64_p8, vreinterpret_u64_p16)
	(vreinterpret_u64_p64, vreinterpretq_u64_f64, vreinterpretq_u64_s8)
	(vreinterpretq_u64_s16, vreinterpretq_u64_s32, vreinterpretq_u64_s64)
	(vreinterpretq_u64_f16, vreinterpretq_u64_f32, vreinterpretq_u64_u8)
	(vreinterpretq_u64_u16, vreinterpretq_u64_u32, vreinterpretq_u64_p8)
	(vreinterpretq_u64_p16, vreinterpretq_u64_p64, vreinterpretq_u64_p128)
	(vreinterpret_s8_f16, vreinterpret_s8_f64, vreinterpret_s8_s16)
	(vreinterpret_s8_s32, vreinterpret_s8_s64, vreinterpret_s8_f32)
	(vreinterpret_s8_u8, vreinterpret_s8_u16, vreinterpret_s8_u32)
	(vreinterpret_s8_u64, vreinterpret_s8_p8, vreinterpret_s8_p16)
	(vreinterpret_s8_p64, vreinterpretq_s8_f64, vreinterpretq_s8_s16)
	(vreinterpretq_s8_s32, vreinterpretq_s8_s64, vreinterpretq_s8_f16)
	(vreinterpretq_s8_f32, vreinterpretq_s8_u8, vreinterpretq_s8_u16)
	(vreinterpretq_s8_u32, vreinterpretq_s8_u64, vreinterpretq_s8_p8)
	(vreinterpretq_s8_p16, vreinterpretq_s8_p64, vreinterpretq_s8_p128)
	(vreinterpret_s16_f16, vreinterpret_s16_f64, vreinterpret_s16_s8)
	(vreinterpret_s16_s32, vreinterpret_s16_s64, vreinterpret_s16_f32)
	(vreinterpret_s16_u8, vreinterpret_s16_u16, vreinterpret_s16_u32)
	(vreinterpret_s16_u64, vreinterpret_s16_p8, vreinterpret_s16_p16)
	(vreinterpret_s16_p64, vreinterpretq_s16_f64, vreinterpretq_s16_s8)
	(vreinterpretq_s16_s32, vreinterpretq_s16_s64, vreinterpretq_s16_f16)
	(vreinterpretq_s16_f32, vreinterpretq_s16_u8, vreinterpretq_s16_u16)
	(vreinterpretq_s16_u32, vreinterpretq_s16_u64, vreinterpretq_s16_p8)
	(vreinterpretq_s16_p16, vreinterpretq_s16_p64, vreinterpretq_s16_p128)
	(vreinterpret_s32_f16, vreinterpret_s32_f64, vreinterpret_s32_s8)
	(vreinterpret_s32_s16, vreinterpret_s32_s64, vreinterpret_s32_f32)
	(vreinterpret_s32_u8, vreinterpret_s32_u16, vreinterpret_s32_u32)
	(vreinterpret_s32_u64, vreinterpret_s32_p8, vreinterpret_s32_p16)
	(vreinterpret_s32_p64, vreinterpretq_s32_f64, vreinterpretq_s32_s8)
	(vreinterpretq_s32_s16, vreinterpretq_s32_s64, vreinterpretq_s32_f16)
	(vreinterpretq_s32_f32, vreinterpretq_s32_u8, vreinterpretq_s32_u16)
	(vreinterpretq_s32_u32, vreinterpretq_s32_u64, vreinterpretq_s32_p8)
	(vreinterpretq_s32_p16, vreinterpretq_s32_p64, vreinterpretq_s32_p128)
	(vreinterpret_u8_f16, vreinterpret_u8_f64, vreinterpret_u8_s8)
	(vreinterpret_u8_s16, vreinterpret_u8_s32, vreinterpret_u8_s64)
	(vreinterpret_u8_f32, vreinterpret_u8_u16, vreinterpret_u8_u32)
	(vreinterpret_u8_u64, vreinterpret_u8_p8, vreinterpret_u8_p16)
	(vreinterpret_u8_p64, vreinterpretq_u8_f64, vreinterpretq_u8_s8)
	(vreinterpretq_u8_s16, vreinterpretq_u8_s32, vreinterpretq_u8_s64)
	(vreinterpretq_u8_f16, vreinterpretq_u8_f32, vreinterpretq_u8_u16)
	(vreinterpretq_u8_u32, vreinterpretq_u8_u64, vreinterpretq_u8_p8)
	(vreinterpretq_u8_p16, vreinterpretq_u8_p64, vreinterpretq_u8_p128)
	(vreinterpret_u16_f16, vreinterpret_u16_f64, vreinterpret_u16_s8)
	(vreinterpret_u16_s16, vreinterpret_u16_s32, vreinterpret_u16_s64)
	(vreinterpret_u16_f32, vreinterpret_u16_u8, vreinterpret_u16_u32)
	(vreinterpret_u16_u64, vreinterpret_u16_p8, vreinterpret_u16_p16)
	(vreinterpret_u16_p64, vreinterpretq_u16_f64, vreinterpretq_u16_s8)
	(vreinterpretq_u16_s16, vreinterpretq_u16_s32, vreinterpretq_u16_s64)
	(vreinterpretq_u16_f16, vreinterpretq_u16_f32, vreinterpretq_u16_u8)
	(vreinterpretq_u16_u32, vreinterpretq_u16_u64, vreinterpretq_u16_p8)
	(vreinterpretq_u16_p16, vreinterpretq_u16_p64, vreinterpretq_u16_p128)
	(vreinterpret_u32_f16, vreinterpret_u32_f64, vreinterpret_u32_s8)
	(vreinterpret_u32_s16, vreinterpret_u32_s32, vreinterpret_u32_s64)
	(vreinterpret_u32_f32, vreinterpret_u32_u8, vreinterpret_u32_u16)
	(vreinterpret_u32_u64, vreinterpret_u32_p8, vreinterpret_u32_p16)
	(vreinterpret_u32_p64, vreinterpretq_u32_f64, vreinterpretq_u32_s8)
	(vreinterpretq_u32_s16, vreinterpretq_u32_s32, vreinterpretq_u32_s64)
	(vreinterpretq_u32_f16, vreinterpretq_u32_f32, vreinterpretq_u32_u8)
	(vreinterpretq_u32_u16, vreinterpretq_u32_u64, vreinterpretq_u32_p8)
	(vreinterpretq_u32_p16, vreinterpretq_u32_p64, vreinterpretq_u32_p128)
	(vreinterpretq_f64_p128, vreinterpretq_p128_f64, vreinterpret_bf16_u8)
	(vreinterpret_bf16_u16, vreinterpret_bf16_u32, vreinterpret_bf16_u64)
	(vreinterpret_bf16_s8, vreinterpret_bf16_s16, vreinterpret_bf16_s32)
	(vreinterpret_bf16_s64, vreinterpret_bf16_p8, vreinterpret_bf16_p16)
	(vreinterpret_bf16_p64, vreinterpret_bf16_f16, vreinterpret_bf16_f32)
	(vreinterpret_bf16_f64, vreinterpretq_bf16_u8, vreinterpretq_bf16_u16)
	(vreinterpretq_bf16_u32, vreinterpretq_bf16_u64, vreinterpretq_bf16_s8)
	(vreinterpretq_bf16_s16, vreinterpretq_bf16_s32, vreinterpretq_bf16_s64)
	(vreinterpretq_bf16_p8, vreinterpretq_bf16_p16, vreinterpretq_bf16_p64)
	(vreinterpretq_bf16_p128, vreinterpretq_bf16_f16)
	(vreinterpretq_bf16_f32, vreinterpretq_bf16_f64, vreinterpret_s8_bf16)
	(vreinterpret_s16_bf16, vreinterpret_s32_bf16, vreinterpret_s64_bf16)
	(vreinterpret_u8_bf16, vreinterpret_u16_bf16, vreinterpret_u32_bf16)
	(vreinterpret_u64_bf16, vreinterpret_f16_bf16, vreinterpret_f32_bf16)
	(vreinterpret_f64_bf16, vreinterpret_p8_bf16, vreinterpret_p16_bf16)
	(vreinterpret_p64_bf16, vreinterpretq_s8_bf16, vreinterpretq_s16_bf16)
	(vreinterpretq_s32_bf16, vreinterpretq_s64_bf16, vreinterpretq_u8_bf16)
	(vreinterpretq_u16_bf16, vreinterpretq_u32_bf16, vreinterpretq_u64_bf16)
	(vreinterpretq_f16_bf16, vreinterpretq_f32_bf16, vreinterpretq_f64_bf16)
	(vreinterpretq_p8_bf16, vreinterpretq_p16_bf16, vreinterpretq_p64_bf16)
	(vreinterpretq_p128_bf16): Delete
2022-07-26 10:31:00 +01:00
Andrew Carlotti
f023cc54e8 aarch64: Consolidate simd type lookup functions
There were several similarly-named functions, which each built or looked up an
operand type using a different subset of valid modes or qualifiers.

This change provides a single function to return operand types, which can
additionally handle const and pointer qualifiers.  For clarity, the existing
functionality is kept in separate helper functions.

gcc/ChangeLog:

	* config/aarch64/aarch64-builtins.cc
	(aarch64_simd_builtin_std_type): Rename to...
	(aarch64_int_or_fp_type): ...this, and allow irrelevant qualifiers.
	(aarch64_lookup_simd_builtin_type): Rename to...
	(aarch64_simd_builtin_type): ...this. Add const/pointer
	support, and extract table lookup to...
	(aarch64_lookup_simd_type_in_table): ...this function.
	(aarch64_init_crc32_builtins): Update to use aarch64_simd_builtin_type.
	(aarch64_init_fcmla_laneq_builtins): Ditto.
	(aarch64_init_simd_builtin_functions): Ditto.
2022-07-26 10:31:00 +01:00
Andrew Carlotti
8a1e05b761 aarch64: Lower vcombine to GIMPLE
This lowers vcombine intrinsics to a GIMPLE vector constructor, which enables
better optimisation during GIMPLE passes.

gcc/

	* config/aarch64/aarch64-builtins.cc
	(aarch64_general_gimple_fold_builtin): Add combine.

gcc/testsuite/

	* gcc.target/aarch64/advsimd-intrinsics/combine.c:
	New test.
2022-07-26 10:30:47 +01:00
Richard Biener
bb04f9f23a tree-optimization/106189 - avoid division by zero exception
The diagnostic code can end up with zero sized array elements
with T[][0] and the wide-int code nicely avoids exceptions when
dividing by zero in one codepath but not in another.  The following
fixes the exception by using wide-int in both paths.

	PR tree-optimization/106189
	* gimple-array-bounds.cc (array_bounds_checker::check_mem_ref):
	Divide using offset_ints.

	* gcc.dg/pr106189.c: New testcase.
2022-07-26 08:36:53 +02:00
Lulu Cheng
16fc26d4e7 LoongArch: Support split symbol.
Add compilation option '-mexplicit-relocs', and if enable '-mexplicit-relocs'
the symbolic address load instruction 'la.*' will be split into two instructions.
This compilation option enabled by default.

gcc/ChangeLog:

	* common/config/loongarch/loongarch-common.cc:
	Enable '-fsection-anchors' when O1 and more advanced optimization.
	* config/loongarch/genopts/loongarch.opt.in: Add new option
	'-mexplicit-relocs', and enable by default.
	* config/loongarch/loongarch-protos.h (loongarch_split_move_insn_p):
	Delete function declaration.
	(loongarch_split_move_insn): Delete function declaration.
	(loongarch_split_symbol_type): Add function declaration.
	* config/loongarch/loongarch.cc (enum loongarch_address_type):
	Add new address type 'ADDRESS_LO_SUM'.
	(loongarch_classify_symbolic_expression): New function definitions.
	Classify the base of symbolic expression X, given that X appears in
	context CONTEXT.
	(loongarch_symbol_insns): Add a judgment condition TARGET_EXPLICIT_RELOCS.
	(loongarch_split_symbol_type): New function definitions.
	Determines whether the symbol load should be split into two instructions.
	(loongarch_valid_lo_sum_p): New function definitions.
	Return true if a LO_SUM can address a value of mode MODE when the LO_SUM
	symbol has type SYMBOL_TYPE.
	(loongarch_classify_address): Add handling of 'LO_SUM'.
	(loongarch_address_insns): Add handling of 'ADDRESS_LO_SUM'.
	(loongarch_signed_immediate_p): Sort code.
	(loongarch_12bit_offset_address_p): Return true if address type is ADDRESS_LO_SUM.
	(loongarch_const_insns): Add handling of 'HIGH'.
	(loongarch_split_move_insn_p): Add the static attribute to the function.
	(loongarch_emit_set): New function definitions.
	(loongarch_call_tls_get_addr): Add symbol handling when defining TARGET_EXPLICIT_RELOCS.
	(loongarch_legitimize_tls_address): Add symbol handling when defining the
	TARGET_EXPLICIT_RELOCS macro.
	(loongarch_split_symbol): New function definitions. Split symbol.
	(loongarch_legitimize_address): Add codes see if the address can split into a high part
	and a LO_SUM.
	(loongarch_legitimize_const_move): Add codes split moves of symbolic constants into
	high and low.
	(loongarch_split_move_insn): Delete function definitions.
	(loongarch_output_move): Add support for HIGH and LO_SUM.
	(loongarch_print_operand_reloc): New function definitions.
	Print symbolic operand OP, which is part of a HIGH or LO_SUM in context CONTEXT.
	(loongarch_memmodel_needs_release_fence): Sort code.
	(loongarch_print_operand): Rearrange alphabetical order and add H and L to support HIGH
	and LOW output.
	(loongarch_print_operand_address): Add handling of 'ADDRESS_LO_SUM'.
	(TARGET_MIN_ANCHOR_OFFSET): Define macro to -IMM_REACH/2.
	(TARGET_MAX_ANCHOR_OFFSET): Define macro to IMM_REACH/2-1.
	* config/loongarch/loongarch.md (movti): Delete the template.
	(*movti): Delete the template.
	(movtf): Delete the template.
	(*movtf): Delete the template.
	(*low<mode>): New template of normal symbol low address.
	(@tls_low<mode>): New template of tls symbol low address.
	(@ld_from_got<mode>): New template load address from got table.
	(@ori_l_lo12<mode>): New template.
	* config/loongarch/loongarch.opt: Update from loongarch.opt.in.
	* config/loongarch/predicates.md: Add support for symbol_type HIGH.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/func-call-1.c: Add build option '-mno-explicit-relocs'.
	* gcc.target/loongarch/func-call-2.c: Add build option '-mno-explicit-relocs'.
	* gcc.target/loongarch/func-call-3.c: Add build option '-mno-explicit-relocs'.
	* gcc.target/loongarch/func-call-4.c: Add build option '-mno-explicit-relocs'.
	* gcc.target/loongarch/func-call-5.c: New test.
	* gcc.target/loongarch/func-call-6.c: New test.
	* gcc.target/loongarch/func-call-7.c: New test.
	* gcc.target/loongarch/func-call-8.c: New test.
	* gcc.target/loongarch/relocs-symbol-noaddend.c: New test.
2022-07-26 14:30:18 +08:00
Lulu Cheng
d5e401fb14 LoongArch: Subdivision symbol type, add SYMBOL_PCREL support.
1. Remove cModel type support other than normal.
2. The method for calling global functions changed from 'la.global + jirl' to 'bl'
   when complied add '-fplt'.

gcc/ChangeLog:

	* config/loongarch/constraints.md (a): Delete the constraint.
	(b): A constant call not local address.
	(h): Delete the constraint.
	(t): Delete the constraint.
	* config/loongarch/loongarch-opts.cc (loongarch_config_target):
	Remove cModel type support other than normal.
	* config/loongarch/loongarch-protos.h (enum loongarch_symbol_type):
	Add new symbol type 'SYMBOL_PCREL', 'SYMBOL_TLS_IE' and 'SYMBOL_TLS_LE'.
	(loongarch_split_symbol): Delete useless function declarations.
	(loongarch_split_symbol_type): Delete useless function declarations.
	* config/loongarch/loongarch.cc (enum loongarch_address_type):
	Delete unnecessary comment information.
	(loongarch_symbol_binds_local_p): Modified the judgment order of label
	and symbol.
	(loongarch_classify_symbol): Return symbol type. If symbol is a label,
	or symbol is a local symbol return SYMBOL_PCREL. If is a tls symbol,
	return SYMBOL_TLS. If is a not local symbol return SYMBOL_GOT_DISP.
	(loongarch_symbolic_constant_p): Add handling of 'SYMBOL_TLS_IE'
	'SYMBOL_TLS_LE' and 'SYMBOL_PCREL'.
	(loongarch_symbol_insns): Add handling of 'SYMBOL_TLS_IE' 'SYMBOL_TLS_LE'
	and 'SYMBOL_PCREL'.
	(loongarch_address_insns): Sort code.
	(loongarch_12bit_offset_address_p): Sort code.
	(loongarch_14bit_shifted_offset_address_p): Sort code.
	(loongarch_call_tls_get_addr): Sort code.
	(loongarch_legitimize_tls_address): Sort code.
	(loongarch_output_move): Remove schema support for cmodel other than normal.
	(loongarch_memmodel_needs_release_fence): Sort code.
	(loongarch_print_operand): Sort code.
	* config/loongarch/loongarch.h (LARCH_U12BIT_OFFSET_P):
	Rename to LARCH_12BIT_OFFSET_P.
	(LARCH_12BIT_OFFSET_P): New macro.
	* config/loongarch/loongarch.md: Reimplement the function call. Remove schema
	support for cmodel other than normal.
	* config/loongarch/predicates.md (is_const_call_weak_symbol): Delete this predicate.
	(is_const_call_plt_symbol): Delete this predicate.
	(is_const_call_global_noplt_symbol): Delete this predicate.
	(is_const_call_no_local_symbol): New predicate, determines whether it is a local
	symbol or label.

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/func-call-1.c: New test.
	* gcc.target/loongarch/func-call-2.c: New test.
	* gcc.target/loongarch/func-call-3.c: New test.
	* gcc.target/loongarch/func-call-4.c: New test.
2022-07-26 14:30:14 +08:00
Kewen Lin
f428660193 rs6000: Preserve REG_EH_REGION when replacing load/store [PR106091]
As test case in PR106091 shows, rs6000 specific pass swaps
doesn't preserve the reg_note REG_EH_REGION when replacing
some load insn at the end of basic block, it causes the
flow info verification to fail unexpectedly.  Since memory
reference rtx may trap, this patch is to ensure we copy
REG_EH_REGION reg_note while replacing swapped aligned load
or store.

	PR target/106091

gcc/ChangeLog:

	* config/rs6000/rs6000-p8swap.cc (replace_swapped_aligned_store): Copy
	REG_EH_REGION when replacing one store insn having it.
	(replace_swapped_aligned_load): Likewise.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pr106091.c: New test.
2022-07-25 21:29:14 -05:00
GCC Administrator
a5271b1449 Daily bump. 2022-07-26 00:16:29 +00:00
Jason Merrill
789c4b9bb0 c++: aggregate prvalue as for range [PR106230]
Since my PR94041 work on temporary lifetime in aggregate initialization, we
end up calling build_vec_init to initialize the reference-extended temporary
for the artificial __for_range variable.  And build_vec_init uses
finish_for_stmt to implement its loop.  That function assumes that if
__for_range is in current_binding_level, we're finishing a range-for, and we
should fix up the variable as it goes out of scope.  But when called from
build_vec_init we aren't finishing a range-for, and do_poplevel doesn't
remove the variable from scope because stmts_are_full_exprs_p is false.  So
let's check that here as well, and leave the DECL_NAME alone.

	PR c++/106230

gcc/cp/ChangeLog:

	* semantics.cc (finish_for_stmt): Check stmts_are_full_exprs_p.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/range-for38.C: New test.
2022-07-25 20:06:37 -04:00
Aldy Hernandez
a6efab5fbc Dispatch code for floating point range ops.
This modifies the range-op dispatch code to handle floats.  Also
provided are the stub routines for the floating point range-ops, as we
need something to dispatch to ;-).

I am not ecstatic about the dispatch code, but there's no getting
around having to switch on the tree code and type in some manner.  All
the other alternatives I played with ended up being slower, or harder
to maintain.  At least, this one is self-contained in the
range_op_handler API, and less than 0.16% slower for VRP in our
benchmarks.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* Makefile.in (OBJS): Add range-op-float.o.
	* range-op.cc (get_float_handler): New.
	(range_op_handler::range_op_handler): Save code and type for
	delayed querying.
	(range_op_handler::oeprator bool): Move from header file, and
	add support for floats.
	(range_op_handler::fold_range): Add support for floats.
	(range_op_handler::op1_range): Same.
	(range_op_handler::op2_range): Same.
	(range_op_handler::lhs_op1_relation): Same.
	(range_op_handler::lhs_op2_relation): Same.
	(range_op_handler::op1_op2_relation): Same.
	* range-op.h (class range_operator_float): New.
	(class floating_op_table): New.
	* value-query.cc (range_query::get_tree_range): Add case for
	REAL_CST.
	* range-op-float.cc: New file.
2022-07-25 20:54:23 +02:00
Martin Liska
838da6cf8d analyzer: convert tests with dos2unix
gcc/testsuite/ChangeLog:

	* gcc.dg/analyzer/fd-2.c: Convert Windows endlines to Unix
	style.
	* gcc.dg/analyzer/fd-3.c: Likewise.
	* gcc.dg/analyzer/fd-4.c: Likewise.
	* gcc.dg/analyzer/fd-5.c: Likewise.
	* c-c++-common/attr-fd.c: Likewise.
2022-07-25 19:33:16 +02:00
Martin Liska
9365b2bf2f analyzer: fix coding style in sm-fd.cc
gcc/analyzer/ChangeLog:

	* sm-fd.cc: Run dos2unix and fix coding style issues.
2022-07-25 19:33:16 +02:00
Roger Sayle
16aafa3194 PR target/91681: zero_extendditi2 pattern for more optimizations on x86.
Technically, PR target/91681 has already been resolved; we now recognize the
highpart multiplication at the tree-level, we no longer use the stack, and
we currently generate the same number of instructions as LLVM.  However, it
is still possible to do better, the current x86_64 code to generate a double
word addition of a zero extended operand, looks like:

        xorl    %r11d, %r11d
        addq    %r10, %rax
        adcq    %r11, %rdx

when it's possible (as LLVM does) to use an immediate constant:

        addq    %r10, %rax
        adcq    $0, %rdx

This is implemented by introducing a zero_extendditi2 pattern,
for zero extension from DImode to TImode on TARGET_64BIT that is
split after reload.  With zero extension now visible to combine,
we add two new define_insn_and_split that add/subtract a zero
extended operand in double word mode.  These apply to both 32-bit
and 64-bit code generation, to produce adc $0 and sbb $0.

One consequence of this is that these new patterns interfere with
the optimization that recognizes DW:DI = (HI:SI<<32)+LO:SI as a pair
of register moves, or more accurately the combine splitter no longer
triggers as we're now converting two instructions into two instructions
(not three instructions into two instructions).  This is easily
repaired (and extended to handle TImode) by changing from a pair
of define_split (that handle operand commutativity) to a set of
four define_insn_and_split (again to handle operand commutativity).

2022-07-25  Roger Sayle  <roger@nextmovesoftware.com>
	    Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog
	PR target/91681
	* config/i386/i386-expand.cc (split_double_concat): A new helper
	function for setting a double word value from two word values.
	* config/i386/i386-protos.h (split_double_concat): Prototype here.
	* config/i386/i386.md (zero_extendditi2): New define_insn_and_split.
	(*add<dwi>3_doubleword_zext): New define_insn_and_split.
	(*sub<dwi>3_doubleword_zext): New define_insn_and_split.
	(*concat<mode><dwi>3_1): New define_insn_and_split replacing
	previous define_split for implementing DST = (HI<<32)|LO as
	pair of move instructions, setting lopart and hipart.
	(*concat<mode><dwi>3_2): Likewise.
	(*concat<mode><dwi>3_3): Likewise, where HI is zero_extended.
	(*concat<mode><dwi>3_4): Likewise, where HI is zero_extended.

gcc/testsuite/ChangeLog
	PR target/91681
	* g++.target/i386/pr91681.C: New test case (from the PR).
	* gcc.target/i386/pr91681-1.c: New int128 test case.
	* gcc.target/i386/pr91681-2.c: Likewise.
	* gcc.target/i386/pr91681-3.c: Likewise, but for ia32.
2022-07-25 17:33:48 +01:00
Aldy Hernandez
ca1e4b26c1 [PR middle-end/106432] Gracefully handle unsupported type in range_on_edge
A cleaner approach to fix this PR has been suggested by Andrew, which
is to just return false on range_on_edge for unsupported range types.

Tested on x86-64 Linux.

	PR middle-end/106432

gcc/ChangeLog:

	* gimple-range.cc (gimple_ranger::range_on_edge): Return false
	when the result range type is unsupported.
2022-07-25 17:31:27 +02:00
Jason Merrill
4c6567b409 c++: -Woverloaded-virtual false positive [PR87729]
My attempt to shortcut unnecessary checking after finding a match was
also wrong for multiple inheritance, so let's give up on it.

	PR c++/87729

gcc/cp/ChangeLog:

	* class.cc (warn_hidden): Remove shortcut.

gcc/testsuite/ChangeLog:

	* g++.dg/warn/Woverloaded-virt4.C: New test.
2022-07-25 09:23:46 -04:00
Sebastian Huber
556b816b82 RTEMS: Do not define _GNU_SOURCE by default
gcc/ChangeLog:

	* config/rs6000/rtems.h (CPLUSPLUS_CPP_SPEC): Undef.
2022-07-25 14:57:06 +02:00
Richard Biener
613e3b8695 middle-end/106414 - fix mistake in ~(x ^ y) -> x == y pattern
When compares are integer typed the inversion with ~ isn't properly
preserved by the equality comparison even when converting the
result properly.  The following fixes this by restricting the
input precisions accordingly.

	PR middle-end/106414
	* match.pd (~(x ^ y) -> x == y): Restrict to single bit
	precision types.

	* gcc.dg/torture/pr106414-1.c: New testcase.
	* gcc.dg/torture/pr106414-2.c: Likewise.
2022-07-25 13:24:47 +02:00
Andre Simoes Dias Vieira
eb966d393d aarch64: Implement ACLE Data Intrinsics
This patch adds support for the ACLE Data Intrinsics to the AArch64 port.

gcc/ChangeLog:

2022-07-25  Andre Vieira  <andre.simoesdiasvieira@arm.com>

	* config/aarch64/aarch64.md (rbit<mode>2): Rename this ...
	(@aarch64_rbit<mode>): ... to this and change it in...
	(ffs<mode>2,ctz<mode>2): ... here.
	(@aarch64_rev16<mode>): New.
	* config/aarch64/aarch64-builtins.cc: (aarch64_builtins):
	Define the following enum AARCH64_REV16, AARCH64_REV16L,
	AARCH64_REV16LL, AARCH64_RBIT, AARCH64_RBITL, AARCH64_RBITLL.
	(aarch64_init_data_intrinsics): New.
	(aarch64_general_init_builtins): Add call to
	aarch64_init_data_intrinsics.
	(aarch64_expand_builtin_data_intrinsic): New.
	(aarch64_general_expand_builtin): Add call to
	aarch64_expand_builtin_data_intrinsic.
	* config/aarch64/arm_acle.h (__clz, __clzl, __clzll, __cls, __clsl,
	__clsll, __rbit, __rbitl, __rbitll, __rev, __revl, __revll, __rev16,
	__rev16l, __rev16ll, __ror, __rorl, __rorll, __revsh): New.

gcc/testsuite/ChangeLog:

2022-07-25  Andre Vieira  <andre.simoesdiasvieira@arm.com>

	* gcc.target/aarch64/acle/data-intrinsics.c: New test.
2022-07-25 10:27:13 +01:00
Martin Liska
718cf8d0bd docs: remove recently added trailing whitespaces
gcc/ChangeLog:

	* doc/extend.texi: Remove trailing whitespaces.
	* doc/invoke.texi: Likewise.
2022-07-25 09:00:30 +02:00
Aldy Hernandez
1a10bd84a5 frange class to represent floating point ranges
This implements a basic frange class to represent floating point
ranges.  Although it is meant to be a base for further development, it
is enough to handle relations and propagate NAN and other properties.

For ranger clients to become floating point aware, we still need the
range-op entries, which I will submit later this week.  Since those
entries require specialized FP knowledge, I will ask for a review from
the FP experts before committing.

Once range-op entries come live, all ranger clients that have been
converted to the type agnostic vrange API will become FP aware: evrp,
DOM, the threaders, loop-ch, etc.  (Still missing is loop unswitching,
as a lot of the int_range* temporaries should be Value_Range.  I don't
have enough cycles to convert loop unswitching, but could gladly give
guidance.  It should be straightforward for those familiar with the
code ;-)).

Samples things we handle:

* We can set the FP properties (!NAN, !INF, etc) at assignment from
  constants (and propagate them throughout the CFG):

  float z = 0.0;
  if (__builtin_isnan (z))
    link_error ();

* The relation oracle works in tandem with the FP ranges:

      if (x > y)
       ;
      else if (!__builtin_isnan (x) && !__builtin_isnan (y))
       {
         // If x and y are not NAN, the x <= y relationship holds, and the
         // following conditional can be folded away.
         if (x <= y)
           bar ();
       }

* We know the true side of all ordered conditionals (except !=)
  implies !NAN:

  if (x > y)
    {
      if (__builtin_isnan (x) || __builtin_isnan (y))
        link_error ();
    }

Range-ops also works correctly with -ffinite-math-only, and avoids
checking for NANs, etc.

I believe this is enough to get a fully fleshed out floating point
support for evrp and friends, but doing so is beyond my limited FP
knowledge.  For example, frange could be enhanced to track constant
endpoints, and we could track other FP properties aside from NAN.
Further discussion is gladly welcome.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* value-range-pretty-print.cc (vrange_printer::visit): New.
	(vrange_printer::print_frange_prop): New.
	* value-range-pretty-print.h (class vrange_printer): Add visit and
	print_frange_prop.
	* value-range-storage.h (vrange_allocator::alloc_vrange): Handle frange.
	(vrange_allocator::alloc_frange): New.
	* value-range.cc (vrange::operator=): Handle frange.
	(vrange::operator==): Same.
	(frange::accept): New.
	(frange::set): New.
	(frange::normalize_kind): New.
	(frange::union_): New.
	(frange::intersect): New.
	(frange::operator=): New.
	(frange::operator==): New.
	(frange::supports_type_p): New.
	(frange::verify_range): New.
	* value-range.h (enum value_range_discriminator): Handle frange.
	(class fp_prop): New.
	(FP_PROP_ACCESSOR): New.
	(class frange_props): New.
	(FRANGE_PROP_ACCESSOR): New.
	(class frange): New.
	(Value_Range::init): Handle frange.
	(Value_Range::operator=): Same.
	(Value_Range::supports_type_p): Same.
	(frange_props::operator==): New.
	(frange_props::union_): New.
	(frange_props::intersect): New
	(frange::frange): New.
	(frange::type): New.
	(frange::set_varying): New.
	(frange::set_undefined): New.
2022-07-25 08:45:21 +02:00
Peter Bergner
75d20d6c84 rs6000: Adjust -mdejagnu-cpu to filter out -mtune [PR106345]
As PR106345 shows, when configuring compiler with an explicit
option --with-tune=<value>, it would cause some test cases to
fail if their test points are sensitive to tune setting, such
as: group_ending_nop, loop align etc.  It doesn't help that
even to specify one explicit -mcpu=.

This patch is to adjust the behavior of -mdejagnu-cpu by
filtering out all -mcpu= and -mtune= options, then test cases
would use <cpu> as tune as the one specified by -mdejagnu-cpu.

2022-07-25  Peter Bergner  <bergner@linux.ibm.com>
	    Kewen Lin  <linkw@linux.ibm.com>

	PR testsuite/106345

gcc/ChangeLog:

	* config/rs6000/rs6000.h (DRIVER_SELF_SPECS): Adjust -mdejagnu-cpu
	to filter out all -mtune options.
2022-07-25 00:51:44 -05:00
Jason Merrill
45f6ced9b8 c++: correct testcase PR number
gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/nsdmi-union7.C: Fix PR number.
2022-07-24 23:02:37 -04:00
GCC Administrator
6078e013e3 Daily bump. 2022-07-25 00:16:29 +00:00
Aldy Hernandez
8b8103dcd2 Minor fixes to vr_values to not die on non integral types.
The legacy code in vr_values mostly works on integral types (with few
exceptions such as some conversions from float).  This patch makes
vr_values::range_of_expr not die when asked for a range of an
unsupported type.  It also keeps the min/max simplification code from
being called on non integrals, similarly to what many of the other
assignment code is doing.

This is all a nop on the current code, but will keep us from
misbehaving when VRP starts working on non-integrals.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* value-query.cc (range_query::get_value_range): Add assert.
	* vr-values.cc (vr_values::range_of_expr): Make sure we don't ICE
	on unsupported types in vr_values.
	(simplify_using_ranges::simplify): Same.
2022-07-24 17:00:51 +02:00
Aldy Hernandez
164758b02c Tweaks to global ranges.
The global get_nonzero_bits was previously returning -1 for
unsupported types.  I dropped this in the conversion to global ranges
and it's causing a problem in the frange work, where CCP is asking for
the nonzero bits of non-integral types.  CCP may require further
tweaks, but for now, restore the original behavior.

Also, I'm removing old checks for precision that no longer hold, now
that we handle various types for global ranges.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* tree-ssanames.cc (get_nonzero_bits): Return -1 for unsupported
	types.
	* value-query.cc (get_ssa_name_range_info): Remove precision check.
2022-07-24 17:00:50 +02:00
Aldy Hernandez
4a36b4e1fe Allow registering same SSA name relations in oracle.
Similarly to what we did for the relation oracle, but for the path
oracle.  This was found while working on frange, where we can test for
x == x while checking for NANness.

Tested on x86-64 Linux.

gcc/ChangeLog:

	* value-relation.cc (value_relation::set_relation): Remove assert.
	(path_oracle::register_relation): Exit when trying to register
	same SSA name relations.
2022-07-24 17:00:50 +02:00