https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105314
Bug ID: 105314 Summary: ifcvt regression in noce_try_store_flag_mask 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: --- The function noce_try_store_flag_mask() in ifcvt.cc converts "if (test) x = 0;" to "x &= -(test == 0);" (if costs permit that). Commit 3a7ba8fd (which was introduced a month ago to fix PR104960) triggers a regression so that the if-conversion can't be performed anymore. On RISC-V this manifests as follows: """ long func(long a, long b, long c) { if (c) a = 0; return a; } """ Old code: 0000000000000000 <func>: 0: 00163613 seqz a2,a2 4: 40c00633 neg a2,a2 8: 8d71 and a0,a0,a2 a: 8082 ret New (branching) code: 0000000000000000 <func>: 0: c211 beqz a2,4 <.L1> 2: 4501 li a0,0 0000000000000004 <.L1>: 4: 8082 ret Looking through the test suite, I could only find the file "gcc.target/arm/ifcvt-size-check.c" which should be affected by this regression as well. However, I haven't tested that.