diff options
author | Jeff Law <jlaw@ventanamicro.com> | 2024-08-08 07:42:26 -0600 |
---|---|---|
committer | Jeff Law <jlaw@ventanamicro.com> | 2024-08-08 07:42:26 -0600 |
commit | 190ad81282057b0e5884faaaad30a7270356b9b1 (patch) | |
tree | 0c7720d7e24da269ff2c99122dba0a35ce952eab /gcc/tree-vect-patterns.cc | |
parent | ab18785840d7b8afd9f716bab9d1eab415bc4fe9 (diff) | |
download | gcc-190ad81282057b0e5884faaaad30a7270356b9b1.zip gcc-190ad81282057b0e5884faaaad30a7270356b9b1.tar.gz gcc-190ad81282057b0e5884faaaad30a7270356b9b1.tar.bz2 |
[RISC-V][PR target/116240] Ensure object is a comparison before extracting arguments
This was supposed to go out the door yesterday, but I kept getting interrupted.
The target bits for rtx costing can't assume the rtl they're given actually
matches a target pattern. It's just kind of inherent in how the costing
routines get called in various places.
In this particular case we're trying to cost a conditional move:
(set (dest) (if_then_else (cond) (true) (false))
On the RISC-V port the backend only allows actual conditionals for COND. So
something like (eq (reg) (const_int 0)). In the costing code for if-then-else
we did something like
(XEXP (XEXP (cond, 0), 0)))
Which fails miserably if COND is a terminal node like (reg) rather than (ne
(reg) (const_int 0)
So this patch tightens up the RTL scanning to ensure that we have a comparison
before we start looking at the comparison's arguments.
Run through my tester without incident, but I'll wait for the pre-commit tester
to run through a cycle before pushing to the trunk.
Jeff
ps. We probably could support a naked REG for the condition and internally convert it to (ne (reg) (const_int 0)), but I don't think it likely happens with any regularity.
PR target/116240
gcc/
* config/riscv/riscv.cc (riscv_rtx_costs): Ensure object is a
comparison before looking at its arguments.
gcc/testsuite
* gcc.target/riscv/pr116240.c: New test.
Diffstat (limited to 'gcc/tree-vect-patterns.cc')
0 files changed, 0 insertions, 0 deletions