Hi Jeff,

That check is performed in a lambda function:

  {"zce", "zcf",
   [] (const riscv_subset_list *subset_list) -> bool
   {
     return subset_list->xlen () == 32 && subset_list->lookup ("f");
   }},

The typo was in a rule itself:

{"zcf", "f", ...

So, with this fix zcf in implied by zce if this condition is passed:

subset_list->xlen () == 32 && subset_list->lookup ("f")

Before 9e12010b5e724277ea this rule was implemented in this code:

  if (subset_list->lookup ("zce") != NULL
        && subset_list->m_xlen == 32
        && subset_list->lookup ("f") != NULL
        && subset_list->lookup ("zcf") == NULL)
    subset_list->add ("zcf", false);

But it was accidentally refactored in a wrong way.

Regards,
Yuriy Kolerov

-----Original Message-----
From: Jeff Law <jeffreya...@gmail.com> 
Sent: Tuesday, February 25, 2025 4:46 PM
To: Yuriy Kolerov <ykole...@synopsys.com>; gcc-patches@gcc.gnu.org
Cc: Artemiy Volkov <arte...@synopsys.com>
Subject: Re: [PATCH v2] RISC-V: Fix a typo in zce to zcf implication



On 2/24/25 3:22 AM, Yuriy Kolerov wrote:
> zce must imply zcf but this rule was corrupted after refactoring in 
> 9e12010b5e724277ea. This may be observed ater generating an .s file 
> from any source code file with -mriscv-attribute -march=rv32if_zce 
> -mabi=ilp32 -S options. A full march will be presented in arch 
> attribute:
> 
>      rv32i2p1_f2p2_zicsr2p0_zca1p0_zcb1p0_zce1p0_zcmp1p0_zcmt1p0
> 
> As you see, zcf is not presented here though f_zce pair is passed in 
> -march. According to The RISC-V Instruction Set Manual:
> 
>      Specifying Zce on RV32 with F includes Zca, Zcb, Zcmp,
>      Zcmt and Zcf.
> 
>       PR target/118906
> 
> gcc/ChangeLog:
> 
>       * common/config/riscv/riscv-common.cc: fix zce to zcf
>       implication.
> 
> gcc/testsuite/ChangeLog:
> 
>       * gcc.target/riscv/attribute-zce-1.c: New test.
>       * gcc.target/riscv/attribute-zce-2.c: New test.
>       * gcc.target/riscv/attribute-zce-3.c: New test.
>       * gcc.target/riscv/attribute-zce-4.c: New test.
I'm not 100% sure this is implementation is correct.  My understanding is that 
zce implies zcf iff rv32 and f are also enabled.  So don't you need to verify 
that rv32 and f are enabled?  Or is that done elsewhere?

Though it looks like the other cases zce -> {zca, zcb, zcmp, zcmp} don't have 
that check.

It feels like I'm missing something in how all this works.

Kito, you know this stuff better than I, thoughts?


Jeff

Reply via email to