On Thu, Jan 15, 2026 at 12:17 PM Jeffrey Law
<[email protected]> wrote:
>
>
>
> On 10/23/2025 10:43 AM, Nikita Biryukov wrote:
> > While investigating Zicond extension code generation on RISC-V, I identified
> > several cases where GCC (trunk) generates suboptimal code due to premature 
> > if-conversion.
> >
> > Consider the following test case:
> > CFLAGS: -march=rv64gc_zicond -mabi=lp64d -O2
> >
> > int test_IOR_ceqz_x (int x, int z, int c)
> > {
> >    if (c)
> >      x = x | z;
> >    return x;
> > }
> >
> > Before the patch:
> >    or      a1,a0,a1
> >    czero.eqz a1,a1,a2
> >    czero.nez a0,a0,a2
> >    add     a0,a0,a1
> >    ret
> >
> > The issue occurs when ifcvt encounters the following RTL pattern:
> >    (set reg1 (ior:DI (reg2:DI) (reg3:DI)))
> >    (set reg4 (sign_extend:DI (subreg:SI (reg1:DI))))
> >
> > When reg1 is no longer used, this expression could be simplified. However,
> > noce_convert_multiple_sets converts the block early, preventing combine from
> > optimizing the pattern.
> >
> > This patch adds checks to bb_ok_for_noce_convert_multiple_sets to detect
> > such sign/zero extension patterns and reject noce_convert_multiple_sets when
> > combine has not yet run. This allows combine to simplify the expressions,
> > resulting in better code generation during the second ifcvt pass.
> >
> > To minimize false positives, the additional checks only apply before the
> > combine pass.
> >
> > Generated code for test_IOR_ceqz_x after the patch:
> >    czero.eqz a2,a1,a2
> >    or       a0,a0,a2
> >    ret
> >
> > The patch has been bootstrapped and tested on riscv64-unknown-linux-gnu.
> >
> > gcc/
> >       * ifcvt.cc (noce_extended_and_dead_set_p): New function.
> >       (bb_ok_for_noce_convert_multiple_sets): Use 
> > noce_extended_and_dead_set_p.
> >
> > gcc/testsuite/
> >       * gcc.target/riscv/zicond_ifcvt_opt_int.c: New test.
> Just wanted to let you know this fell through the cracks and we're going
> to have to revisit in the spring when the tree re-opens for development
> (we're in regression bugfixes only for the next few months).  Its in my
> queue to revisit at the appropriate time.

Though I think it is the fix for https://gcc.gnu.org/PR123322 :).

Thanks,
Andrew

>
> Jeff

Reply via email to