Commit graph

205695 commits

Author SHA1 Message Date
GCC Administrator
26a7e775a2 Daily bump. 2023-11-23 00:18:14 +00:00
John David Anglin
6f59f959e7 hppa: Define MAX_FIXED_MODE_SIZE
Replace default define.  We support TImode when TARGET_64BIT is true.

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

gcc/ChangeLog:

	PR target/112592
	* config/pa/pa.h (MAX_FIXED_MODE_SIZE): Define.
2023-11-22 20:06:22 +00:00
John David Anglin
a89224f819 hppa: Fix integer REG+D address reloads
I made a mistake in the previous change to integer_store_memory_operand.
There is no support pa_emit_move sequence to handle secondary reloads of
integer REG+D instructions.  Further, the Q constraint is used for some
non-simple instructions (movb and addib).  Thus, we need to return true
when reload is in progress.

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

gcc/ChangeLog:

	PR target/112617
	* config/pa/predicates.md (integer_store_memory_operand): Return
	true for REG+D addresses when reload_in_progress is true.
2023-11-22 19:47:34 +00:00
Patrick Palka
3f266c84a1 c++: alias template of non-template class [PR112633]
The entering_scope adjustment in tsubst_aggr_type assumes if an alias is
dependent, then so is the aliased type (and therefore it has template info)
but that's not true for the dependent alias template specialization ty1<T>
below which aliases the non-template class A.  In this case no adjustment
is needed anyway, so we can just punt.

	PR c++/112633

gcc/cp/ChangeLog:

	* pt.cc (tsubst_aggr_type): Handle empty TYPE_TEMPLATE_INFO
	in the entering_scope adjustment.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/alias-decl-75.C: New test.
2023-11-22 13:54:29 -05:00
Thomas Schwinge
a53da3a213 Adjust 'libgomp.c/declare-variant-{3,4}-[...]' for inter-procedural value range propagation
..., that is, commit 53ba8d6695
"inter-procedural value range propagation", after which we see:

    [-PASS:-]{+FAIL:+} libgomp.c/declare-variant-3-sm30.c scan-nvptx-none-offload-tree-dump optimized "= f30 \\(\\);"

Etc.  That's due to:

    @@ -144,13 +144,11 @@
     __attribute__((omp target entrypoint, noclone))
     void main._omp_fn.0 (const struct .omp_data_t.3 & restrict .omp_data_i)
     {
    -  int _3;
       int * _5;

       <bb 2> [local count: 1073741824]:
    -  _3 = f30 ();
       _5 = *.omp_data_i_4(D).v;
    -  *_5 = _3;
    +  *_5 = 30;
       return;

It's nice to see this optimization work here, too, but it does interfere with
how we're currently testing OpenMP 'declare variant'.

	libgomp/
	* testsuite/libgomp.c/declare-variant-3.h (f30, f35, f53, f70)
	(f75, f80, f): Add '__attribute__ ((noipa))'.
	* testsuite/libgomp.c/declare-variant-4.h (gfx803, gfx900, gfx906)
	(gfx908, gfx90a, f): Likewise.
2023-11-22 17:54:59 +01:00
Iain Sandoe
e9b39df933 testsuite: Update path to intl include.
When we are building libintl in-tree, we need to pass the path
to the generated libintl.h include to the plugin tests.  This
path has changed with the use of gettext directly.

gcc/testsuite/ChangeLog:

	* lib/plugin-support.exp: Update the expected path to an
	in-tree build of libintl.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
2023-11-22 14:51:00 +00:00
Iain Sandoe
2a46e0e7e2 testsuite, Darwin: Add support for Mach-O function body scans.
We need to process the source slightly differently from ELF, especially
in that we have __USER_LABEL_PREFIX__ and there are no function start
and end assembler directives.  This means we cannot delineate functions
when frame output is switched off.

TODO: consider adding -mtest-markers or something similar to inject
assembler comments that can be scanned for.

gcc/testsuite/ChangeLog:

	* lib/scanasm.exp: Initial handling for Mach-O function body scans.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
Co-authored-by: Richard Sandiford <richard.sandiford@arm.com>
2023-11-22 14:50:04 +00:00
Richard Biener
6bf66276e3 tree-optimization/112344 - wrong final value replacement
When performing final value replacement chrec_apply that's used to
compute the overall effect of niters to a CHREC doesn't consider that
the overall increment of { -2147483648, +, 2 } doesn't fit in
a signed integer when the loop iterates until the value of the IV
of 20.  The following fixes this mistake, carrying out the multiply
and add in an unsigned type instead, avoiding undefined overflow
and thus later miscompilation by path range analysis.

	PR tree-optimization/112344
	* tree-chrec.cc (chrec_apply): Perform the overall increment
	calculation and increment in an unsigned type.

	* gcc.dg/torture/pr112344.c: New testcase.
2023-11-22 15:37:14 +01:00
Andrew Stubbs
ecb22ddbe2 amdgcn: Fix vector TImode reload loop
I've only observed the problem on the devel/omp/gcc-13 branch, but this
could theoretically affect mainline also.  The mov insns for the other modes
already have '$', so this completes the set.

gcc/ChangeLog:

	* config/gcn/gcn-valu.md (*mov<mode>_4reg): Disparage AVGPR use when a
	reload is required.
2023-11-22 14:24:21 +00:00
Vladimir N. Makarov
95f61de95b [IRA]: Fix using undefined dump file in IRA code during insn scheduling
Part of IRA code is used for register pressure sensitive insn
scheduling and live range shrinkage.  Numerous changes of IRA resulted
in that this IRA code uses dump file passed by the scheduler and
internal ira dump file (in called functions) which can be undefined or
freed by the scheduler during compiling previous functions.  The patch
fixes this problem.  To reproduce the error valgrind should be used
and GCC should be compiled with valgrind annotations.  Therefor the
patch does not contain the test case.

gcc/ChangeLog:

	PR rtl-optimization/112610
	* ira-costs.cc: (find_costs_and_classes): Remove arg.
	Use ira_dump_file for printing.
	(print_allocno_costs, print_pseudo_costs): Ditto.
	(ira_costs): Adjust call of find_costs_and_classes.
	(ira_set_pseudo_classes): Set up and restore ira_dump_file.
2023-11-22 09:04:28 -05:00
Florian Weimer
08ba7e8b98 gcc.misc-tests/linkage-y.c: Compatibility with C99+ system compilers
This program is compiled with an installed "cc" compiler, not the
built GCC compiler, so it should be as compatible as possible across a
wide range of compilers.

gcc/testsuite/

	* gcc.misc-tests/linkage-y.c (puts): Declare.
	(main): Add int return type and return 0.
2023-11-22 14:26:53 +01:00
Juzhe-Zhong
de6f3e12bd RISC-V: Fix incorrect use of vcompress in permutation auto-vectorization
This patch fixes following FAILs on zvl512b of RV32 system:

FAIL: gcc.target/riscv/rvv/autovec/struct/struct_vect_run-12.c execution test
FAIL: gcc.target/riscv/rvv/autovec/struct/struct_vect_run-9.c execution test

The root cause is that for permutation indice = {0,3,7,0} use vcompress optimization
which is incorrect. Fix vcompress optimization bug.

	PR target/112598

gcc/ChangeLog:

	* config/riscv/riscv-v.cc (shuffle_compress_patterns): Fix vcompress bug.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/pr112598-3.c: New test.
2023-11-22 20:30:53 +08:00
Francois-Xavier Coudert
ce966ae660 Build: fix error in fixinclude configure
The stray line defining enable_darwin_at_rpath outside of the scope of
_LT_DARWIN_LINKER_FEATURES is a mistake and should be removed. It leads
to a wrong line in fixincludes/ChangeLog because there is no $1 argument
at that point.

ChangeLog:

	* libtool.m4: Fix stray call

fixincludes/ChangeLog:

	* configure: Regenerated.
2023-11-22 11:54:33 +01:00
Tamar Christina
c2ef470885 AArch64: fix aarch64_usubw pattern
It looks like during my pre-commit testrun I forgot to apply this patch
to the patch stack.  It had a typo in the element size.

It also looks like since the hi/lo operations take different element
counts for the assembler syntax that I can't have a unified pattern.

gcc/ChangeLog:

	* config/aarch64/aarch64-simd.md
	(aarch64_uaddw<mode>_<PERM_EXTEND:perm_hilo>_zip,
	aarch64_usubw<mode>_<PERM_EXTEND:perm_hilo>_zip): Split into...
	(aarch64_uaddw<mode>_lo_zip, aarch64_uaddw<mode>_hi_zip,
	"aarch64_usubw<mode>_lo_zip, "aarch64_usubw<mode>_hi_zip): ... This.
	* config/aarch64/iterators.md (PERM_EXTEND, perm_index): Remove.
	(perm_hilo): Remove UNSPEC_ZIP1, UNSPEC_ZIP2.

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/uxtl-combine-4.c: Fix typo.
	* gcc.target/aarch64/uxtl-combine-5.c: Likewise.
	* gcc.target/aarch64/uxtl-combine-6.c: Likewise.
2023-11-22 10:37:33 +00:00
Jakub Jelinek
8c24011b2b testsuite: Add testcase for already fixed PR112518
This PR has been fixed by the PR112526 fix.

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

	PR target/112518
	* gcc.target/i386/bmi2-pr112518.c: New test.
2023-11-22 11:32:54 +01:00
Christophe Lyon
65bd6de0de arm: [MVE intrinsics] Fix typo
In commt 0c2037d9d9 (Add support for
contiguous loads and stores), I added a spurious line which broke
bootstrap because of an unused variable error.

This patch removes it.

Committed as obvious.

2023-11-22  Christophe Lyon  <christophe.lyon@linaro.org>

gcc/ChangeLog:

	* config/arm/arm-mve-builtins.cc
	(function_resolver::infer_pointer_type): Remove spurious line.
2023-11-22 09:53:50 +00:00
Xi Ruoyao
fce3678101
LoongArch: Optimize LSX vector shuffle on floating-point vector
The vec_perm expander was wrongly defined.  GCC internal says:

Operand 3 is the “selector”.  It is an integral mode vector of the same
width and number of elements as mode M.

But we made operand 3 in the same mode as the shuffled vectors, so it
would be a FP mode vector if the shuffled vectors are FP mode.

With this mistake, the generic code manages to work around and it ends
up creating some very nasty code for a simple __builtin_shuffle (a, b,
c) where a and b are V4SF, c is V4SI:

    la.local    $r12,.LANCHOR0
    la.local    $r13,.LANCHOR1
    vld $vr1,$r12,48
    vslli.w $vr1,$vr1,2
    vld $vr2,$r12,16
    vld $vr0,$r13,0
    vld $vr3,$r13,16
    vshuf.b $vr0,$vr1,$vr1,$vr0
    vld $vr1,$r12,32
    vadd.b  $vr0,$vr0,$vr3
    vandi.b $vr0,$vr0,31
    vshuf.b $vr0,$vr1,$vr2,$vr0
    vst $vr0,$r12,0
    jr  $r1

This is obviously stupid.  Fix the expander definition and adjust
loongarch_expand_vec_perm to handle it correctly.

gcc/ChangeLog:

	* config/loongarch/lsx.md (vec_perm<mode:LSX>): Make the
	selector VIMODE.
	* config/loongarch/loongarch.cc (loongarch_expand_vec_perm):
	Use the mode of the selector (instead of the shuffled vector)
	for truncating it.  Operate on subregs in the selector mode if
	the shuffled vector has a different mode (i. e. it's a
	floating-point vector).

gcc/testsuite/ChangeLog:

	* gcc.target/loongarch/vect-shuf-fp.c: New test.
2023-11-22 17:06:06 +08:00
Hongyu Wang
bd17d00a4b [APX PUSH2POP2] Adjust operand order for PUSH2POP2
The push2/pop2 operand order does not match the binutils implementation
for AT&T syntax that it will first push operands[2] then operands[1].
Correct it by reverse operand order for AT&T syntax.

gcc/ChangeLog:

	* config/i386/i386.md (push2_di): Adjust operand order for AT&T
	syntax.
	(pop2_di): Likewise.
	(push2p_di): Likewise.
	(pop2p_di): Likewise.

gcc/testsuite/ChangeLog:

	* gcc.target/i386/apx-push2pop2-1.c: Adjust output scan.
	* gcc.target/i386/apx-push2pop2_force_drap-1.c: Likewise.
2023-11-22 15:35:57 +08:00
Juzhe-Zhong
d13e59b86c RISC-V: Fix permutation indice mode bug
This patch fixes following FAILs on zvl512b:
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-1.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-1.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-16.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-16.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-17.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-17.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-3.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-3.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-5.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-5.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-6.c execution test
FAIL: gcc.target/riscv/rvv/autovec/partial/slp_run-6.c execution test

The root cause is that we are using vrgather.vv on vector QI mode which
is incorrect for zvl512b since it exceed 256.

Instead, we should use vrgatherei16.vv

	PR target/112598

gcc/ChangeLog:

	* config/riscv/riscv-v.cc (emit_vlmax_gather_insn): Adapt the priority.
	(shuffle_generic_patterns): Fix permutation indice bug.
	* config/riscv/vector-iterators.md: Fix VEI16 bug.

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/autovec/pr112598-2.c: New test.
2023-11-22 14:30:28 +08:00
liuhongt
2e51fff7ce Support cbranchm for Vector HI/QImode.
gcc/ChangeLog:

	* config/i386/sse.md (cbranch<mode>4): Extend to Vector
	HI/QImode.
2023-11-22 14:01:10 +08:00
Jason Merrill
f4c53580f3 c++: start_preparsed_function tweak
In review of the deducing 'this' patch, it came up that the logic in
start_preparsed_function around the ctype variable was convoluted, being
set for non-static member functions and friends, but not for static member
functions.  Let's set it for any member function, and not rely on it to
decide whether to set up 'this'.

gcc/cp/ChangeLog:

	* decl.cc (start_preparsed_function): Clarify ctype logic.
2023-11-21 22:37:44 -05:00
Maciej W. Rozycki
56ff988e6b PR target/111815: VAX: Only accept the index scaler as the RHS operand to ASHIFT
As from commit 9df1ba9a35 ("libbacktrace: support zstd decompression")
GCC for the `vax-netbsdelf' target fails to complete building, with an
ICE:

during RTL pass: final
.../libbacktrace/elf.c: In function 'elf_zstd_decompress':
.../libbacktrace/elf.c:5006:1: internal compiler error: in print_operand_address, at config/vax/vax.cc:514
 5006 | }
      | ^
0x1113df97 print_operand_address(_IO_FILE*, rtx_def*)
	.../gcc/config/vax/vax.cc:514
0x10c2489b default_print_operand_address(_IO_FILE*, machine_mode, rtx_def*)
	.../gcc/targhooks.cc:373
0x106ddd0b output_address(machine_mode, rtx_def*)
	.../gcc/final.cc:3648
0x106ddd0b output_asm_insn(char const*, rtx_def**)
	.../gcc/final.cc:3505
0x106e2143 output_asm_insn(char const*, rtx_def**)
	.../gcc/final.cc:3421
0x106e2143 final_scan_insn_1
	.../gcc/final.cc:2841
0x106e28e3 final_scan_insn(rtx_insn*, _IO_FILE*, int, int, int*)
	.../gcc/final.cc:2887
0x106e2bf7 final_1
	.../gcc/final.cc:1979
0x106e3c67 rest_of_handle_final
	.../gcc/final.cc:4240
0x106e3c67 execute
	.../gcc/final.cc:4318
Please submit a full bug report, with preprocessed source (by using -freport-bug).
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.

This is due to combine producing an invalid address RTX:

(plus:SI (ashift:SI (const_int 1 [0x1])
        (reg:QI 3 %r3 [1232]))
    (reg/v:SI 10 %r10 [orig:736 weight_mask ] [736]))

where the expression is ((1 << R3) + R10), which does not match a valid
machine addressing mode.  Consequently `print_operand_address' chokes.

This can be reduced to the testcase included, where it triggers the same
ICE in `p'.  Preincrements are required so that their results land in
registers and consequently an indexed addressing mode is tried or
otherwise doing operations piecemeal on stack-based function arguments
as direct input operands turns out more profitable in terms of RTX costs
and the ICE is avoided.

The ultimate cause has been commit c605a8bf92 ("VAX: Accept ASHIFT in
address expressions"), where a shift of an immediate value by a register
has been mistakenly allowed as an index expression as if the shift
operation was commutative such as multiplication is.  So with ASHIFT the
scaler in an index expression has to be the right-hand operand, and the
backend has to enforce that, whereas with MULT the scaler can be either
operand.

Fix this by only accepting the index scaler as the RHS operand to
ASHIFT.

	gcc/
	PR target/111815
	* config/vax/vax.cc (index_term_p): Only accept the index scaler
	as the RHS operand to ASHIFT.

	gcc/testsuite/
	PR target/111815
	* gcc.dg/torture/pr111815.c: New test.
2023-11-22 01:27:02 +00:00
Maciej W. Rozycki
ae098dfeee RISC-V: Remove duplicate `order_operator' predicate
Remove our RISC-V-specific `order_operator' predicate, which is exactly
the same as generic `ordered_comparison_operator' one.

	gcc/
	* config/riscv/predicates.md (order_operator): Remove predicate.
	* config/riscv/riscv.cc (riscv_rtx_costs): Update accordingly.
	* config/riscv/riscv.md (*branch<mode>, *mov<GPR:mode><X:mode>cc)
	(cstore<mode>4): Likewise.
2023-11-22 01:18:32 +00:00
Maciej W. Rozycki
6300e672c8 RISC-V/testsuite: Add branchless cases for FP NE cond-add operation
Verify, for the generic floating-point NE conditional-add operation,
that if-conversion triggers via `noce_try_addcc' at `-mbranch-cost=3'
setting, which makes branchless code sequences emitted by if-conversion
cheaper than their original branched equivalents, and that extraneous
instructions such as SNEZ, etc. are not present in output.

The reason to XFAIL the SImode test for RV64 targets is GCC thinks it
has to sign-extend addends, which causes if-conversion to give up.

	gcc/testsuite/
	* gcc.target/riscv/adddifne.c: New test.
	* gcc.target/riscv/addsifne.c: New test.
2023-11-22 01:18:31 +00:00
Maciej W. Rozycki
23207facbb RISC-V/testsuite: Add branched cases for FP NE cond-add operation
Verify, for the generic floating-point NE conditional-add operation,
that if-conversion does *not* trigger at `-mbranch-cost=2' setting,
which makes original branched code sequences cheaper than their
branchless equivalents if-conversion would emit.

	gcc/testsuite/
	* gcc.target/riscv/adddibfne.c: New test.
	* gcc.target/riscv/addsibfne.c: New test.
2023-11-22 01:18:31 +00:00
Maciej W. Rozycki
f96e5fdeb6 RISC-V/testsuite: Add branched cases for FP NE cond-move operations
Verify, for the floating-point NE conditional-move operation, that
if-conversion triggers via `noce_try_cmove' at the respective
sufficiently high `-mbranch-cost=' settings that make branchless code
sequences produced by if-conversion cheaper than their original branched
equivalents, and that extraneous instructions such as SNEZ, etc. are not
present in output.

	gcc/testsuite/
	* gcc.target/riscv/movdifeq-sfb.c: New test.
	* gcc.target/riscv/movdifeq-thead.c: New test.
	* gcc.target/riscv/movdifeq-ventana.c: New test.
	* gcc.target/riscv/movdifeq-zicond.c: New test.
	* gcc.target/riscv/movdifeq.c: New test.
	* gcc.target/riscv/movsifeq-sfb.c: New test.
	* gcc.target/riscv/movsifeq-thead.c: New test.
	* gcc.target/riscv/movsifeq-ventana.c: New test.
	* gcc.target/riscv/movsifeq-zicond.c: New test.
	* gcc.target/riscv/movsifeq.c: New test.
2023-11-22 01:18:31 +00:00
Maciej W. Rozycki
4c69b5fbb9 RISC-V/testsuite: Add branched cases for FP NE cond-move operations
Verify, for generic, Ventana and Zicond targets and the floating-point
NE conditional-move operation, that if-conversion does *not* trigger at
the respective sufficiently low `-mbranch-cost=' settings that make
original branched code sequences cheaper than their branchless
equivalents if-conversion would emit.

	gcc/testsuite/
	* gcc.target/riscv/movdibfeq-ventana.c: New test.
	* gcc.target/riscv/movdibfeq-zicond.c: New test.
	* gcc.target/riscv/movdibfeq.c: New test.
	* gcc.target/riscv/movsibfeq-ventana.c: New test.
	* gcc.target/riscv/movsibfeq-zicond.c: New test.
	* gcc.target/riscv/movsibfeq.c: New test.
2023-11-22 01:18:31 +00:00
Maciej W. Rozycki
9a1a2e9857 RISC-V: Handle FP NE operator via inversion in cond-operation expansion
We have no FNE.fmt machine instructions, but we can emulate them for the
purpose of conditional-move and conditional-add operations by using the
respective FEQ.fmt instruction and then swapping the data input operands
or complementing the mask for the conditional addend respectively, so
update our handlers accordingly.

	gcc/
	* config/riscv/riscv-protos.h (riscv_expand_float_scc): Add
	`invert_ptr' parameter.
	* config/riscv/riscv.cc (riscv_emit_float_compare): Add NE
	inversion handling.
	(riscv_expand_float_scc): Pass `invert_ptr' through to
	`riscv_emit_float_compare'.
	(riscv_expand_conditional_move): Pass `&invert' to
	`riscv_expand_float_scc'.
	* config/riscv/riscv.md (add<mode>cc): Likewise.
2023-11-22 01:18:31 +00:00
Maciej W. Rozycki
0f4ce86eeb RISC-V/testsuite: Add branchless cases for generic FP cond adds
Verify, for generic floating-point conditional-add operations that have
a corresponding conditional-set machine instruction, that if-conversion
triggers via `noce_try_addcc' at `-mbranch-cost=3' setting, which makes
branchless code sequences emitted by if-conversion cheaper than their
original branched equivalents, and that extraneous instructions such as
SNEZ, etc. are not present in output.

The reason to XFAIL SImode tests for RV64 targets is the compiler thinks
it has to sign-extend addends, which causes if-conversion to give up.

	gcc/testsuite/
	* gcc.target/riscv/adddifeq.c: New test.
	* gcc.target/riscv/adddifge.c: New test.
	* gcc.target/riscv/adddifgt.c: New test.
	* gcc.target/riscv/adddifle.c: New test.
	* gcc.target/riscv/adddiflt.c: New test.
	* gcc.target/riscv/addsifeq.c: New test.
	* gcc.target/riscv/addsifge.c: New test.
	* gcc.target/riscv/addsifgt.c: New test.
	* gcc.target/riscv/addsifle.c: New test.
	* gcc.target/riscv/addsiflt.c: New test.
2023-11-22 01:18:30 +00:00
Maciej W. Rozycki
2278c6443a RISC-V/testsuite: Add branched cases for generic FP cond adds
Verify, for generic floating-point conditional-add operations that have
a corresponding conditional-set machine instruction, that if-conversion
does *not* trigger at `-mbranch-cost=2' setting, which makes original
branched code sequences cheaper than their branchless equivalents
if-conversion would emit.  Cover all the relevant floating-point
relational operations to make sure no corner case escapes.

	gcc/testsuite/
	* gcc.target/riscv/adddibfeq.c: New test.
	* gcc.target/riscv/adddibfge.c: New test.
	* gcc.target/riscv/adddibfgt.c: New test.
	* gcc.target/riscv/adddibfle.c: New test.
	* gcc.target/riscv/adddibflt.c: New test.
	* gcc.target/riscv/addsibfeq.c: New test.
	* gcc.target/riscv/addsibfge.c: New test.
	* gcc.target/riscv/addsibfgt.c: New test.
	* gcc.target/riscv/addsibfle.c: New test.
	* gcc.target/riscv/addsibflt.c: New test.
2023-11-22 01:18:30 +00:00
Maciej W. Rozycki
9d02897e88 RISC-V/testsuite: Add branchless cases for generic FP cond moves
Verify, for generic floating-point conditional-move operations that have
a corresponding conditional-set machine instruction, that if-conversion
triggers (via `cond_move_convert_if_block', which doesn't report) at
`-mbranch-cost=5' setting, which makes branchless code sequences emitted
by if-conversion cheaper than their original branched equivalents, and
that extraneous instructions such as SNEZ, etc. are not present in
output.

	gcc/testsuite/
	* gcc.target/riscv/movdifge.c: New test.
	* gcc.target/riscv/movdifgt.c: New test.
	* gcc.target/riscv/movdifle.c: New test.
	* gcc.target/riscv/movdiflt.c: New test.
	* gcc.target/riscv/movdifne.c: New test.
	* gcc.target/riscv/movsifge.c: New test.
	* gcc.target/riscv/movsifgt.c: New test.
	* gcc.target/riscv/movsifle.c: New test.
	* gcc.target/riscv/movsiflt.c: New test.
	* gcc.target/riscv/movsifne.c: New test.
2023-11-22 01:18:30 +00:00
Maciej W. Rozycki
fe276a42a7 RISC-V/testsuite: Add branched cases for generic FP cond moves
Verify, for generic floating-point conditional-move operations that have
a corresponding conditional-set machine instruction, that if-conversion
does *not* trigger at `-mbranch-cost=4' setting, which makes original
branched code sequences cheaper than their branchless equivalents
if-conversion would emit.  Cover all the relevant floating-point
relational operations to make sure no corner case escapes.

	gcc/testsuite/
	* gcc.target/riscv/movdibfge.c: New test.
	* gcc.target/riscv/movdibfgt.c: New test.
	* gcc.target/riscv/movdibfle.c: New test.
	* gcc.target/riscv/movdibflt.c: New test.
	* gcc.target/riscv/movdibfne.c: New test.
	* gcc.target/riscv/movsibfge.c: New test.
	* gcc.target/riscv/movsibfgt.c: New test.
	* gcc.target/riscv/movsibfle.c: New test.
	* gcc.target/riscv/movsibflt.c: New test.
	* gcc.target/riscv/movsibfne.c: New test.
2023-11-22 01:18:30 +00:00
Maciej W. Rozycki
2f0c6252f4 RISC-V: Avoid extraneous integer comparison for FP comparisons
We have floating-point coditional-set machine instructions for a subset
of FP comparisons, so avoid going through a comparison against constant
zero in `riscv_expand_float_scc' where not necessary, preventing an
extraneous RTL instruction from being produced that counts against the
cost of the replacement branchless code sequence in if-conversion, e.g.:

(insn 29 6 30 2 (set (reg:DI 142)
        (ge:DI (reg/v:DF 135 [ w ])
            (reg/v:DF 136 [ x ]))) 297 {*cstoredfdi4}
     (nil))
(insn 30 29 31 2 (set (reg:DI 143)
        (ne:DI (reg:DI 142)
            (const_int 0 [0]))) 319 {*sne_zero_didi}
     (nil))
(insn 31 30 32 2 (set (reg:DI 141)
        (reg:DI 143)) 206 {*movdi_64bit}
     (nil))
(insn 32 31 33 2 (set (reg:DI 144)
        (neg:DI (reg:DI 141))) 15 {negdi2}
     (nil))
(insn 33 32 34 2 (set (reg:DI 145)
        (and:DI (reg:DI 144)
            (reg/v:DI 137 [ y ]))) 102 {*anddi3}
     (nil))
(insn 34 33 35 2 (set (reg:DI 146)
        (not:DI (reg:DI 144))) 111 {one_cmpldi2}
     (nil))
(insn 35 34 36 2 (set (reg:DI 147)
        (and:DI (reg:DI 146)
            (reg/v:DI 138 [ z ]))) 102 {*anddi3}
     (nil))
(insn 36 35 21 2 (set (reg/v:DI 138 [ z ])
        (ior:DI (reg:DI 145)
            (reg:DI 147))) 105 {iordi3}
     (nil))

where the second insn effectively just copies its input.  This now gets
simplified to:

(insn 29 6 30 2 (set (reg:DI 141)
        (ge:DI (reg/v:DF 135 [ w ])
            (reg/v:DF 136 [ x ]))) 297 {*cstoredfdi4}
     (nil))
(insn 30 29 31 2 (set (reg:DI 142)
        (neg:DI (reg:DI 141))) 15 {negdi2}
     (nil))
(insn 31 30 32 2 (set (reg:DI 143)
        (and:DI (reg:DI 142)
            (reg/v:DI 137 [ y ]))) 102 {*anddi3}
     (nil))
(insn 32 31 33 2 (set (reg:DI 144)
        (not:DI (reg:DI 142))) 111 {one_cmpldi2}
     (nil))
(insn 33 32 34 2 (set (reg:DI 145)
        (and:DI (reg:DI 144)
            (reg/v:DI 138 [ z ]))) 102 {*anddi3}
     (nil))
(insn 34 33 21 2 (set (reg/v:DI 138 [ z ])
        (ior:DI (reg:DI 143)
            (reg:DI 145))) 105 {iordi3}
     (nil))

lowering the cost of the code sequence produced (even though combine
would swallow the second insn anyway).

We still need to produce a comparison against constant zero where the
instruction following a floating-point coditional-set operation is a
branch, so add canonicalization to `riscv_expand_conditional_branch'
instead.

	gcc/
	* config/riscv/riscv.cc (riscv_emit_float_compare) <NE>: Handle
	separately.
	<EQ, LE, LT, GE, GT>: Return operands supplied as is.
	(riscv_emit_binary): Call `riscv_emit_binary' directly rather
	than going through a temporary register for word-mode targets.
	(riscv_expand_conditional_branch): Canonicalize the comparison
	if not against constant zero.
2023-11-22 01:18:30 +00:00
Maciej W. Rozycki
2f825475b2 RISC-V: Provide FP conditional-branch instructions for if-conversion
Do not expand floating-point conditional-branch RTL instructions right
away that use a comparison operation that is either directly available
as a machine conditional-set instruction or is NE, which can be emulated
by EQ.  This is so that if-conversion sees them in their original form
and can produce fewer operations tried in a branchless code sequence
compared to when such an instruction has been already converted to a
sequence of a floating-point conditional-set RTL instruction followed by
an integer conditional-branch RTL instruction.  Split any floating-point
conditional-branch RTL instructions still remaining after reload then.

Adjust the testsuite accordingly: since the middle end uses the inverse
condition internally, an inverse conditional-set instruction may make it
to assembly output and also `cond_move_process_if_block' will be used by
if-conversion rather than `noce_process_if_block', because the latter
function not yet been updated to handle inverted conditions.

	gcc/
	* config/riscv/predicates.md (ne_operator): New predicate.
	* config/riscv/riscv.cc (riscv_insn_cost): Handle branches on a
	floating-point condition.
	* config/riscv/riscv.md (@cbranch<mode>4): Rename expander to...
	(@cbranch<ANYF:mode>4): ... this.  Only expand the RTX via
	`riscv_expand_conditional_branch' for `!signed_order_operator'
	operators, otherwise let it through.
	(*cbranch<ANYF:mode>4, *cbranch<ANYF:mode>4): New insns and
	splitters.

	gcc/testsuite/
	* gcc.target/riscv/movdifge-sfb.c: Reject "if-conversion
	succeeded through" rather than accepting it.
	* gcc.target/riscv/movdifge-thead.c: Likewise.
	* gcc.target/riscv/movdifge-ventana.c: Likewise.
	* gcc.target/riscv/movdifge-zicond.c: Likewise.
	* gcc.target/riscv/movdifgt-sfb.c: Likewise.
	* gcc.target/riscv/movdifgt-thead.c: Likewise.
	* gcc.target/riscv/movdifgt-ventana.c: Likewise.
	* gcc.target/riscv/movdifgt-zicond.c: Likewise.
	* gcc.target/riscv/movdifle-sfb.c: Likewise.
	* gcc.target/riscv/movdifle-thead.c: Likewise.
	* gcc.target/riscv/movdifle-ventana.c: Likewise.
	* gcc.target/riscv/movdifle-zicond.c: Likewise.
	* gcc.target/riscv/movdiflt-sfb.c: Likewise.
	* gcc.target/riscv/movdiflt-thead.c: Likewise.
	* gcc.target/riscv/movdiflt-ventana.c: Likewise.
	* gcc.target/riscv/movdiflt-zicond.c: Likewise.
	* gcc.target/riscv/movsifge-sfb.c: Likewise.
	* gcc.target/riscv/movsifge-thead.c: Likewise.
	* gcc.target/riscv/movsifge-ventana.c: Likewise.
	* gcc.target/riscv/movsifge-zicond.c: Likewise.
	* gcc.target/riscv/movsifgt-sfb.c: Likewise.
	* gcc.target/riscv/movsifgt-thead.c: Likewise.
	* gcc.target/riscv/movsifgt-ventana.c: Likewise.
	* gcc.target/riscv/movsifgt-zicond.c: Likewise.
	* gcc.target/riscv/movsifle-sfb.c: Likewise.
	* gcc.target/riscv/movsifle-thead.c: Likewise.
	* gcc.target/riscv/movsifle-ventana.c: Likewise.
	* gcc.target/riscv/movsifle-zicond.c: Likewise.
	* gcc.target/riscv/movsiflt-sfb.c: Likewise.
	* gcc.target/riscv/movsiflt-thead.c: Likewise.
	* gcc.target/riscv/movsiflt-ventana.c: Likewise.
	* gcc.target/riscv/movsiflt-zicond.c: Likewise.
	* gcc.target/riscv/smax-ieee.c: Also accept FLT.D.
	* gcc.target/riscv/smaxf-ieee.c: Also accept FLT.S.
	* gcc.target/riscv/smin-ieee.c: Also accept FGT.D.
	* gcc.target/riscv/sminf-ieee.c: Also accept FGT.S.
2023-11-22 01:18:30 +00:00
Maciej W. Rozycki
37ff43c273 RISC-V: Also allow FP conditions in `riscv_expand_conditional_move'
In `riscv_expand_conditional_move' we only let integer conditions
through at the moment, even though code has already been prepared to
handle floating-point conditions as well.

Lift this restriction and only bail out if a non-word-mode integer
condition has been requested, as we cannot handle this specific case
owing to machine instruction set restriction.  We already take care of
the non-integer, non-floating-point case later on.

	gcc/
	* config/riscv/riscv.cc (riscv_expand_conditional_move): Don't
	bail out in floating-point conditions.
2023-11-22 01:18:29 +00:00
Maciej W. Rozycki
7e126d8d0f RISC-V: Only use SUBREG if applicable in `riscv_expand_float_scc'
A subsequent change to enable the processing of conditional moves on a
floating-point condition by `riscv_expand_conditional_move' will cause
`riscv_expand_float_scc' to be called for word-mode target RTX with RV64
targets.  In that case an invalid insn such as:

(insn 25 24 0 (set (reg:DI 141)
        (subreg:SI (reg:DI 143) 0)) -1
     (nil))

would be produced, which would crash the compiler later on.  Since the
output operand of the SET operation to be produced already has the same
mode as the input operand does, just omit the use of SUBREG and assign
directly.

	gcc/
	* config/riscv/riscv.cc (riscv_expand_float_scc): Suppress the
	use of SUBREG if the conditional-set target is word-mode.
2023-11-22 01:18:29 +00:00
Maciej W. Rozycki
5e6903ddd3 RISC-V/testsuite: Add branchless cases for generic integer cond adds
Verify, for generic integer conditional-add operations, if-conversion
to trigger via `noce_try_addcc' at the respective sufficiently high
`-mbranch-cost=' settings that make branchless code sequences produced
by if-conversion cheaper than their original branched equivalents, and,
where applicable, that extraneous instructions such as SNEZ, etc. are
not present in output.  Cover all integer relational operations to make
sure no corner case escapes.

The reason to XFAIL SImode tests for RV64 targets is the compiler thinks
it has to sign-extend addends, which causes if-conversion to give up.

	gcc/testsuite/
	* gcc.target/riscv/adddieq.c: New test.
	* gcc.target/riscv/adddige.c: New test.
	* gcc.target/riscv/adddigeu.c: New test.
	* gcc.target/riscv/adddigt.c: New test.
	* gcc.target/riscv/adddigtu.c: New test.
	* gcc.target/riscv/adddile.c: New test.
	* gcc.target/riscv/adddileu.c: New test.
	* gcc.target/riscv/adddilt.c: New test.
	* gcc.target/riscv/adddiltu.c: New test.
	* gcc.target/riscv/adddine.c: New test.
	* gcc.target/riscv/addsieq.c: New test.
	* gcc.target/riscv/addsige.c: New test.
	* gcc.target/riscv/addsigeu.c: New test.
	* gcc.target/riscv/addsigt.c: New test.
	* gcc.target/riscv/addsigtu.c: New test.
	* gcc.target/riscv/addsile.c: New test.
	* gcc.target/riscv/addsileu.c: New test.
	* gcc.target/riscv/addsilt.c: New test.
	* gcc.target/riscv/addsiltu.c: New test.
	* gcc.target/riscv/addsine.c: New test.
2023-11-22 01:18:29 +00:00
Maciej W. Rozycki
bbfe2639e1 RISC-V/testsuite: Add branched cases for generic integer cond adds
Verify, for generic integer conditional-add operations, if-conversion
*not* to trigger at the respective sufficiently low `-mbranch-cost='
settings that make original branched code sequences cheaper than their
branchless equivalents if-conversion would emit.  Cover all integer
relational operations to make sure no corner case escapes.

	gcc/testsuite/
	* gcc.target/riscv/adddibeq.c: New test.
	* gcc.target/riscv/adddibge.c: New test.
	* gcc.target/riscv/adddibgeu.c: New test.
	* gcc.target/riscv/adddibgt.c: New test.
	* gcc.target/riscv/adddibgtu.c: New test.
	* gcc.target/riscv/adddible.c: New test.
	* gcc.target/riscv/adddibleu.c: New test.
	* gcc.target/riscv/adddiblt.c: New test.
	* gcc.target/riscv/adddibltu.c: New test.
	* gcc.target/riscv/adddibne.c: New test.
	* gcc.target/riscv/addsibeq.c: New test.
	* gcc.target/riscv/addsibge.c: New test.
	* gcc.target/riscv/addsibgeu.c: New test.
	* gcc.target/riscv/addsibgt.c: New test.
	* gcc.target/riscv/addsibgtu.c: New test.
	* gcc.target/riscv/addsible.c: New test.
	* gcc.target/riscv/addsibleu.c: New test.
	* gcc.target/riscv/addsiblt.c: New test.
	* gcc.target/riscv/addsibltu.c: New test.
	* gcc.target/riscv/addsibne.c: New test.
2023-11-22 01:18:29 +00:00
Maciej W. Rozycki
40b243c470 RISC-V: Add `addMODEcc' implementation for generic targets
Provide RTL expansion of conditional-add operations for generic targets
using a suitable sequence of base integer machine instructions according
to cost evaluation by if-conversion.  Use existing `-mmovcc' command
line option to enable this transformation.

	gcc/
	* config/riscv/riscv.md (add<mode>cc): New expander.
2023-11-22 01:18:28 +00:00
Maciej W. Rozycki
4111bdf99b RISC-V/testsuite: Add branchless cases for generic integer cond moves
Verify, for generic integer conditional-move operations, if-conversion
to trigger via `noce_try_cmove' at the respective sufficiently high
`-mbranch-cost=' settings that make branchless code sequences produced
by if-conversion cheaper than their original branched equivalents, and,
where applicable, that extraneous instructions such as SNEZ, etc. are
not present in output.  Cover all integer relational operations to make
sure no corner case escapes.

	gcc/testsuite/
	* gcc.target/riscv/movdieq.c: New test.
	* gcc.target/riscv/movdige.c: New test.
	* gcc.target/riscv/movdigeu.c: New test.
	* gcc.target/riscv/movdigt.c: New test.
	* gcc.target/riscv/movdigtu.c: New test.
	* gcc.target/riscv/movdile.c: New test.
	* gcc.target/riscv/movdileu.c: New test.
	* gcc.target/riscv/movdilt.c: New test.
	* gcc.target/riscv/movdiltu.c: New test.
	* gcc.target/riscv/movdine.c: New test.
	* gcc.target/riscv/movsieq.c: New test.
	* gcc.target/riscv/movsige.c: New test.
	* gcc.target/riscv/movsigeu.c: New test.
	* gcc.target/riscv/movsigt.c: New test.
	* gcc.target/riscv/movsigtu.c: New test.
	* gcc.target/riscv/movsile.c: New test.
	* gcc.target/riscv/movsileu.c: New test.
	* gcc.target/riscv/movsilt.c: New test.
	* gcc.target/riscv/movsiltu.c: New test.
	* gcc.target/riscv/movsine.c: New test.
2023-11-22 01:18:28 +00:00
Maciej W. Rozycki
430b9636a5 RISC-V/testsuite: Add branched cases for generic integer cond moves
Verify, for generic integer conditional-move operations, if-conversion
*not* to trigger at the respective sufficiently low `-mbranch-cost='
settings that make original branched code sequences cheaper than their
branchless equivalents if-conversion would emit.  Cover all integer
relational operations to make sure no corner case escapes.

	gcc/testsuite/
	* gcc.target/riscv/movdibeq.c: New test.
	* gcc.target/riscv/movdibge.c: New test.
	* gcc.target/riscv/movdibgeu.c: New test.
	* gcc.target/riscv/movdibgt.c: New test.
	* gcc.target/riscv/movdibgtu.c: New test.
	* gcc.target/riscv/movdible.c: New test.
	* gcc.target/riscv/movdibleu.c: New test.
	* gcc.target/riscv/movdiblt.c: New test.
	* gcc.target/riscv/movdibltu.c: New test.
	* gcc.target/riscv/movdibne.c: New test.
	* gcc.target/riscv/movsibeq.c: New test.
	* gcc.target/riscv/movsibge.c: New test.
	* gcc.target/riscv/movsibgeu.c: New test.
	* gcc.target/riscv/movsibgt.c: New test.
	* gcc.target/riscv/movsibgtu.c: New test.
	* gcc.target/riscv/movsible.c: New test.
	* gcc.target/riscv/movsibleu.c: New test.
	* gcc.target/riscv/movsiblt.c: New test.
	* gcc.target/riscv/movsibltu.c: New test.
	* gcc.target/riscv/movsibne.c: New test.
2023-11-22 01:18:28 +00:00
Maciej W. Rozycki
dc95b338c0 RISC-V: Add `movMODEcc' implementation for generic targets
Provide RTL expansion of conditional-move operations for generic targets
using a suitable sequence of base integer machine instructions according
to cost evaluation by if-conversion.  Add `-mmovcc' command line option
to enable this transformation, off by default.

For the generic sequences small immediates as per the `arith_operand'
predicate are cost-equivalent to registers as we can use them as input,
alternative to a register, to the respective AND[I] machine operations,
however we need to reject immediates fulfilling `lui_operand', because
they would require reloading into a register, making the operation more
costly.  Therefore add `movcc_operand' predicate and use it accordingly.

There is a need to adjust zbs-bext-02.c, which can also serve as emitted
code example, because with certain compilation options an AND operation
can now legitimately appear in output despite BEXT having been produced
as expected, such as with `-march=rv64gc -O2':

foo:
	mv	a3,a0
	li	a5,0
	mv	a0,a1
	li	a2,64
	li	a1,1
.L3:
	sll	a4,a1,a5
	and	a4,a4,a3
	addiw	a5,a5,1
	beq	a4,zero,.L2
	addiw	a0,a0,1
.L2:
	bne	a5,a2,.L3
	ret

vs `-march=rv64gc_zbs -O2':

foo:
	mv	a4,a0
	li	a5,0
	mv	a0,a1
	li	a3,64
.L3:
	bext	a2,a4,a5
	beq	a2,zero,.L2
	addiw	a0,a0,1
.L2:
	addiw	a5,a5,1
	bne	a5,a3,.L3
	ret

and then with `-march=rv64gc -mmovcc -mbranch-cost=7':

foo:
	mv	a6,a0
	li	a4,0
	mv	a0,a1
	li	a7,1
	li	a1,64
.L3:
	sll	a5,a7,a4
	and	a5,a5,a6
	snez	a5,a5
	neg	a5,a5
	not	a2,a5
	addiw	a3,a0,1
	and	a5,a5,a3
	and	a0,a2,a0
	addiw	a4,a4,1
	or	a0,a5,a0
	bne	a4,a1,.L3
	ret

vs `-march=rv64gc_zbs -mmovcc -mbranch-cost=7':

foo:
	mv	a6,a0
	li	a4,0
	mv	a0,a1
	li	a1,64
.L3:
	bext	a5,a6,a4
	neg	a5,a5
	not	a2,a5
	addiw	a3,a0,1
	and	a5,a5,a3
	and	a0,a2,a0
	addiw	a4,a4,1
	or	a0,a5,a0
	bne	a4,a1,.L3
	ret

However BEXT is supposed to replace an SLL operation so adjust the test
case to reject SLL rather than AND, letting the test case pass even with
`/-mmovcc/-mbranch-cost=7' specified as DejaGNU test flags (and in the
absence of target-specific conditional-move operations enabled either by
default or with other test flags).

	gcc/
	* config/riscv/predicates.md (movcc_operand): New predicate.
	* config/riscv/riscv.cc (riscv_expand_conditional_move): Handle
	generic targets.
	* config/riscv/riscv.md (mov<mode>cc): Likewise.
	* config/riscv/riscv.opt (mmovcc): New option.
	* doc/invoke.texi (Option Summary): Document it.

	gcc/testsuite/
	* gcc.target/riscv/zbs-bext-02.c: Adjust to reject SLL rather
	than AND.
2023-11-22 01:18:28 +00:00
Maciej W. Rozycki
4daeedcbaf RISC-V: Implement `riscv_emit_unary' helper
Add a `riscv_emit_unary' helper for unary operations, complementing
`riscv_emit_binary'.

	gcc/
	* config/riscv/riscv-protos.h (riscv_emit_unary): New prototype.
	* config/riscv/riscv.cc (riscv_emit_unary): New function.
2023-11-22 01:18:28 +00:00
Maciej W. Rozycki
6e32373214 RISC-V/testsuite: Add branchless cases for T-Head non-equality cond moves
Verify, for T-Head targets and the non-equality integer conditional-move
operations, that if-conversion triggers via `noce_try_cmove' at
`-mbranch-cost=2' setting, which makes branchless code sequences
produced by if-conversion cheaper than their original branched
equivalents, and that extraneous instructions such as SNEZ, etc. are not
present in output.

	gcc/testsuite/
	* gcc.target/riscv/movdige-thead.c: New test.
	* gcc.target/riscv/movdigeu-thead.c: New test.
	* gcc.target/riscv/movdigt-thead.c: New test.
	* gcc.target/riscv/movdigtu-thead.c: New test.
	* gcc.target/riscv/movdile-thead.c: New test.
	* gcc.target/riscv/movdileu-thead.c: New test.
	* gcc.target/riscv/movdilt-thead.c: New test.
	* gcc.target/riscv/movdiltu-thead.c: New test.
	* gcc.target/riscv/movsige-thead.c: New test.
	* gcc.target/riscv/movsigeu-thead.c: New test.
	* gcc.target/riscv/movsigt-thead.c: New test.
	* gcc.target/riscv/movsigtu-thead.c: New test.
	* gcc.target/riscv/movsile-thead.c: New test.
	* gcc.target/riscv/movsileu-thead.c: New test.
	* gcc.target/riscv/movsilt-thead.c: New test.
	* gcc.target/riscv/movsiltu-thead.c: New test.
2023-11-22 01:18:27 +00:00
Maciej W. Rozycki
4f83f79d93 RISC-V/testsuite: Add branched cases for T-Head non-equality cond moves
Verify, for T-Head targets and the non-equality integer conditional-move
operations, that if-conversion does *not* trigger at `-mbranch-cost=1'
setting, which makes original branched code sequences cheaper than their
branchless equivalents if-conversion would emit.

	gcc/testsuite/
	* gcc.target/riscv/movdibge-thead.c: New test.
	* gcc.target/riscv/movdibgeu-thead.c: New test.
	* gcc.target/riscv/movdibgt-thead.c: New test.
	* gcc.target/riscv/movdibgtu-thead.c: New test.
	* gcc.target/riscv/movdible-thead.c: New test.
	* gcc.target/riscv/movdibleu-thead.c: New test.
	* gcc.target/riscv/movdiblt-thead.c: New test.
	* gcc.target/riscv/movdibltu-thead.c: New test.
	* gcc.target/riscv/movsibge-thead.c: New test.
	* gcc.target/riscv/movsibgeu-thead.c: New test.
	* gcc.target/riscv/movsibgt-thead.c: New test.
	* gcc.target/riscv/movsibgtu-thead.c: New test.
	* gcc.target/riscv/movsible-thead.c: New test.
	* gcc.target/riscv/movsibleu-thead.c: New test.
	* gcc.target/riscv/movsiblt-thead.c: New test.
	* gcc.target/riscv/movsibltu-thead.c: New test.
2023-11-22 01:18:27 +00:00
Maciej W. Rozycki
413ebfd660 RISC-V: Fold all the cond-move variants together
Code in `riscv_expand_conditional_move' for Ventana and Zicond targets
seems like bolted on as an afterthought rather than properly merged so
as to handle all the cases together.

Fold the existing code pieces together then (observing that for short
forward branch targets no integer comparisons need to be canonicalized),
letting T-Head targets produce branchless sequences for all the integer
comparisons rather than for equality ones only, and preparing for the
handling of floating-point comparisons here across all conditional-move
targets.

	gcc/
	* config/riscv/riscv.cc (riscv_expand_conditional_move): Unify
	conditional-move handling across all the relevant targets.
2023-11-22 01:18:27 +00:00
Maciej W. Rozycki
566a2b3baa RISC-V: Also accept constants for T-Head cond-move data input operands
There is no need for the requirement for conditional-move data input
operands to be stricter for T-Head targets than for short forward branch
targets and limit them to registers only.  They are keyed according to
the `sfb_alu_operand' predicate, which lets certain constants through.
Such constants are already forced into a register for the `cons' operand
in the analogous short forward branch case and we can force them for the
`alt' operand and T-Head as well.  This enables more opportunities for a
branchless sequence to be produced.

	gcc/
	* config/riscv/riscv.cc (riscv_expand_conditional_move): Also
	accept constants for T-Head data input operands.
2023-11-22 01:18:27 +00:00
Maciej W. Rozycki
eeb112542f RISC-V: Also accept constants for T-Head cond-move comparison operands
There is no need for the requirement for conditional-move comparison
operands to be stricter for T-Head targets than for other targets and
limit them to registers only.  Constants will be reloaded if required
just as with branches or other-target conditional-move operations and
there is no extra overhead specific to the T-Head case.  This enables
more opportunities for a branchless sequence to be produced.

	gcc/
	* config/riscv/riscv.cc (riscv_expand_conditional_move): Also
	accept constants for T-Head comparison operands.
2023-11-22 01:18:27 +00:00
Maciej W. Rozycki
c47fb7d09e RISC-V/testsuite: Add branchless cases for equality cond-move operations
Verify, for Ventana and Zicond targets and the equality conditional-move
operations, that if-conversion triggers via `noce_try_cmove' at the
respective sufficiently high `-mbranch-cost=' settings that make
branchless code sequences produced by if-conversion cheaper than their
original branched equivalents, and that extraneous instructions such as
SNEZ, etc. are not present in output.

	gcc/testsuite/
	* gcc.target/riscv/movdieq-ventana.c: New test.
	* gcc.target/riscv/movdieq-zicond.c: New test.
	* gcc.target/riscv/movdine-ventana.c: New test.
	* gcc.target/riscv/movdine-zicond.c: New test.
	* gcc.target/riscv/movsieq-ventana.c: New test.
	* gcc.target/riscv/movsieq-zicond.c: New test.
	* gcc.target/riscv/movsine-ventana.c: New test.
	* gcc.target/riscv/movsine-zicond.c: New test.
2023-11-22 01:18:26 +00:00
Maciej W. Rozycki
5e884a8942 RISC-V/testsuite: Add branched cases for equality cond-move operations
Verify, for Ventana and Zicond targets and the equality conditional-move
operations, that if-conversion does *not* trigger at the respective
sufficiently low `-mbranch-cost=' settings that make original branched
code sequences cheaper than their branchless equivalents if-conversion
would emit.

	gcc/testsuite/
	* gcc.target/riscv/movdibeq-ventana.c: New test.
	* gcc.target/riscv/movdibeq-zicond.c: New test.
	* gcc.target/riscv/movdibne-ventana.c: New test.
	* gcc.target/riscv/movdibne-zicond.c: New test.
	* gcc.target/riscv/movsibeq-ventana.c: New test.
	* gcc.target/riscv/movsibeq-zicond.c: New test.
	* gcc.target/riscv/movsibne-ventana.c: New test.
	* gcc.target/riscv/movsibne-zicond.c: New test.
2023-11-22 01:18:26 +00:00