On 4/27/23 20:21, Die Li wrote:
Two issues have been observed in current riscv_expand_conditional_move
implementation.
1. Before introduction of TARGET_XTHEADCONDMOV, op0 of comparision expression
is used for mode comparision with word_mode, but after TARGET_XTHEADCONDMOV
megered with TARGET_SFB_ALU, dest of if-then-else is used for mode comparision 
with
word_mode, and from md file mode of dest is DI or SI which can be different with
word_mode in RV64.

2. TARGET_XTHEADCONDMOV cannot be generated when the mode of the comparison is 
E_VOID.

This patch solves the issues above.

Provide an example from the newly added test case.

Testcase:
int ConNmv_reg_reg_reg(int x, int y, int z, int n){
   if (x != y) return z;
   return n;
}

Cflags:
-O2 -march=rv64gc_xtheadcondmov -mabi=lp64d

before patch:
ConNmv_reg_reg_reg:
        bne     a0,a1,.L23
        mv      a2,a3
.L23:
        mv      a0,a2
        ret

after patch:
ConNmv_reg_reg_reg:
        sub     a1,a0,a1
        th.mveqz        a2,zero,a1
        th.mvnez        a3,zero,a1
        or      a0,a2,a3
        ret

Co-Authored by: Fei Gao <gao...@eswincomputing.com>
Signed-off-by: Die Li <li...@eswincomputing.com>

gcc/ChangeLog:

         * config/riscv/riscv.cc (riscv_expand_conditional_move): Fix mode 
checking.

gcc/testsuite/ChangeLog:

         * gcc.target/riscv/xtheadcondmov-indirect-rv32.c: New test.
         * gcc.target/riscv/xtheadcondmov-indirect-rv64.c: New test.
---
  gcc/config/riscv/riscv.cc                     |   4 +-
  .../riscv/xtheadcondmov-indirect-rv32.c       | 116 ++++++++++++++++++
  .../riscv/xtheadcondmov-indirect-rv64.c       | 116 ++++++++++++++++++
  3 files changed, 234 insertions(+), 2 deletions(-)
  create mode 100644 
gcc/testsuite/gcc.target/riscv/xtheadcondmov-indirect-rv32.c
  create mode 100644 
gcc/testsuite/gcc.target/riscv/xtheadcondmov-indirect-rv64.c

diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 1529855a2b4..30ace45dc5f 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -3411,7 +3411,7 @@ riscv_expand_conditional_move (rtx dest, rtx op, rtx 
cons, rtx alt)
        && GET_MODE_CLASS (mode) == MODE_INT
        && reg_or_0_operand (cons, mode)
        && reg_or_0_operand (alt, mode)
-      && GET_MODE (op) == mode
+      && (GET_MODE (op) == mode || GET_MODE (op) == E_VOIDmode)
So I nearly suggested we just drop this check. In general comparisons don't have modes. But I don't think it's going to hurt and it lines up with the predicates that test for conditions.

Note that some of the new tests are still failing (though they certainly do much better after your patch)
.
FAIL: gcc.target/riscv/xtheadcondmov-indirect-rv32.c -O1 check-function-bodies ConNmv_imm_imm_r > FAIL: gcc.target/riscv/xtheadcondmov-indirect-rv32.c -O2
check-function-bodies ConNmv_imm_imm_reg
  FAIL: gcc.target/riscv/xtheadcondmov-indirect-rv32.c   -O2 -flto 
-fno-use-linker-plugin -flto-partition=none   check-function-bodies 
ConNmv_imm_imm_reg
  FAIL: gcc.target/riscv/xtheadcondmov-indirect-rv32.c   -O2 -flto 
-fuse-linker-plugin -fno-fat-lto-objects   check-function-bodies 
ConNmv_imm_imm_reg
  FAIL: gcc.target/riscv/xtheadcondmov-indirect-rv32.c   -O3 -g   
check-function-bodies ConNmv_imm_imm_reg


[ ... and a few more instances omitted ... ]

I went ahead and pushed the patch, but you might want to double-check the state of those failing tests.

Jeff

Reply via email to