On 6/5/25 19:11, Jiawei wrote:
>> Changes since v1:
>>   - NFC with attribution to PR/119164 it helps fix and the testcase.
>>
>> FRM mode switching state machine has DYN as default state which it also
>> fallsback to after transitioning to other states such as DYN_CALL.
>> Currently TARGET_MODE_EMIT generates a FRM restore on any transition to
>> DYN leading to spurious/extraneous FRM restores.
>>
>> Only do this if an interim static Rounding Mode was observed in the state
>> machine.
>>
>> Fixes the extraneous FRM read/write in PR119164 (and also PR119832 w/o need
>> for TARGET_MODE_CONFLUENCE). Also reduces the number of FRM writes in
>> SPEC2017 -Ofast -mrv64gcv build significantly.
>>
>>                    Before            After
>>               -------------      -------------
>>               frrm fsrmi fsrm   frrm fsrmi frrm
>
>                                                                         ~~^~~
>
> Should the second frrm repeat here be fsrm?
>

Yeah sorry this was a typo and indeed reports fsrm.

> Anyway, the results seem to be significantly improved. 
>
> LGTM, and thank you for this work.
>

Awesome.

Thx,
-Vineet

>>   perlbench_r   42    0    4      17    0    1
>>      cpugcc_r  167    0   17      11    0    0
>>      bwaves_r   16    0    1      16    0    1
>>         mcf_r   11    0    0      11    0    0
>>  cactusBSSN_r   76    0   27      19    0    1
>>        namd_r  119    0   63      14    0    1
>>      parest_r  168    0  114      24    0    1
>>      povray_r  123    1   17      26    1    6
>>         lbm_r    6    0    0       6    0    0
>>     omnetpp_r   17    0    1      17    0    1
>>         wrf_r 2287   13 1956    1268   13 1603
>>    cpuxalan_r   17    0    1      17    0    1
>>      ldecod_r   11    0    0      11    0    0
>>        x264_r   14    0    1      11    0    0
>>     blender_r  724   12  182      61   12   42
>>        cam4_r  324   13  169      45   13   20
>>   deepsjeng_r   11    0    0      11    0    0
>>     imagick_r  265   16   34     132   16   25
>>       leela_r   12    0    0      12    0    0
>>         nab_r   13    0    1      13    0    1
>>   exchange2_r   16    0    1      16    0    1
>>   fotonik3d_r   20    0   11      19    0    1
>>        roms_r   33    0   23      21    0    1
>>          xz_r    6    0    0       6    0    0
>>              ---------------    --------------
>>               4498   55 2623    1804   55 1707
>>              ---------------    --------------
>>                         7176              3566
>>              ---------------    --------------
>>
>>      PR target/119164
>>
>> gcc/ChangeLog:
>>
>>      * config/riscv/riscv.cc (riscv_emit_frm_mode_set): check
>>      STATIC_FRM_P for transition to DYN.
>>
>> gcc/testsuite/ChangeLog:
>>
>>      * gcc.target/riscv/rvv/base/pr119164.c: New test.
>>
>> Signed-off-by: Vineet Gupta <vine...@rivosinc.com>
>> ---
>>  gcc/config/riscv/riscv.cc                     |  2 +-
>>  .../gcc.target/riscv/rvv/base/pr119164.c      | 22 +++++++++++++++++++
>>  2 files changed, 23 insertions(+), 1 deletion(-)
>>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/pr119164.c
>>
>> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
>> index a5f68c999b0e..f982111a9952 100644
>> --- a/gcc/config/riscv/riscv.cc
>> +++ b/gcc/config/riscv/riscv.cc
>> @@ -12182,7 +12182,7 @@ riscv_emit_frm_mode_set (int mode, int prev_mode)
>>        && prev_mode != riscv_vector::FRM_DYN
>>        && prev_mode != riscv_vector::FRM_DYN_CALL)
>>        /* Restore frm value when switch to DYN mode.  */
>> -      || (mode == riscv_vector::FRM_DYN
>> +      || (STATIC_FRM_P (cfun) && mode == riscv_vector::FRM_DYN
>>        && prev_mode != riscv_vector::FRM_DYN_CALL);
>>  
>>    if (restore_p)
>> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr119164.c 
>> b/gcc/testsuite/gcc.target/riscv/rvv/base/pr119164.c
>> new file mode 100644
>> index 000000000000..a39a7f177f05
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr119164.c
>> @@ -0,0 +1,22 @@
>> +/* Reduced from SPEC2017 blender: node_texture_util.c.
>> +   The conditional function call was tripping mode switching state machine 
>> */
>> +
>> +/* { dg-do compile } */
>> +/* { dg-options " -Ofast -march=rv64gcv_zvl256b -ftree-vectorize 
>> -mrvv-vector-bits=zvl" } */
>> +
>> +void *a;
>> +float *b;
>> +short c;
>> +void d();
>> +void e() {
>> +  if (a)
>> +    d();
>> +  if (c) {
>> +    b[0] = b[0] * 0.5f + 0.5f;
>> +    b[1] = b[1] * 0.5f + 0.5f;
>> +  }
>> +}
>> +
>> +/* { dg-final { scan-assembler-not {frrm\s+[axs][0-9]+} } } */
>> +/* { dg-final { scan-assembler-not {fsrmi\s+[01234]} } } */
>> +/* { dg-final { scan-assembler-not {fsrm\s+[axs][0-9]+} } } */
>> -- 
>> 2.43.0
>>
>
>

Reply via email to