[Bug target/113715] RISC-V: If the Zcmp is enabled, the a0 register operates abnormally when the program returns
cvs-commit at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Jul 10 03:08:40 GMT 2024
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113715
--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Fei Gao <feigao@gcc.gnu.org>:
https://gcc.gnu.org/g:efa30f619361b043616e624e57366a50982e11df
commit r14-10403-gefa30f619361b043616e624e57366a50982e11df
Author: Fei Gao <gaofei@eswincomputing.com>
Date: Tue Jul 9 10:00:29 2024 +0000
RISC-V: backport fix zcmp popretz [PR113715]
Root cause:
https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=b27d323a368033f0b37e93c57a57a35fd9997864
Commit above tries in targetm.gen_epilogue () to detect if
there's li a0,0 insn at the end of insn chain, if so, cm.popret
is replaced by cm.popretz and li a0,0 insn is deleted.
Insertion of the generated epilogue sequence
into the insn chain doesn't happen at this moment.
If later shrink-wrap decides NOT to insert the epilogue sequence at the end
of insn chain, then the li a0,0 insn has already been mistakeny removed.
Fix this issue by removing generation of cm.popretz in epilogue,
leaving the assignment to a0 and use insn with cm.popret.
That's likely going to result in some kind of code size regression,
but not a correctness regression.
Optimization can be done in future.
Signed-off-by: Fei Gao <gaofei@eswincomputing.com>
gcc/ChangeLog:
PR target/113715
* config/riscv/riscv.cc (riscv_zcmp_can_use_popretz): Removed.
(riscv_gen_multi_pop_insn): Remove generation of cm.popretz.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rv32e_zcmp.c: Adapt TC.
* gcc.target/riscv/rv32i_zcmp.c: Likewise.
More information about the Gcc-bugs
mailing list