https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105477
Bug ID: 105477
Summary: RISC-V: Regression: Useless moves in conditional
select return
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: christophm30 at gmail dot com
Target Milestone: ---
Commit 3a7ba8fd triggers a regression so that on RISC-V two useless move
instructions are generated.
Test code:
"""
long test(long a, long b, long c)
{
return (!c ? a : b);
}
"""
GCC 10.2.0, GCC 11 or upstream/master before 3a7ba8fd generates (rv64gc + -O3):
test:
beq a2,zero,.L2
mv a0,a1
.L2:
ret
Current upstream/master generates:
<test>:
0: 87aa mv a5,a0
2: 852e mv a0,a1
4: e211 bnez a2,8 <.L2>
6: 853e mv a0,a5
<.L2>:
8: 8082 ret
This might be an issue in the ifcvt code (in combination of the RISC-V backend)
or something where the RISC-V backend needs to improve.
Some context to this issue:
* The mentioned change (3a7ba8fd) is not problematic at all and fixes an issue
PR104960
* PR105314 reports a similar issue, that is also triggered by the same change