]> git.ipfire.org Git - thirdparty/gcc.git/commit
Fix riscv_expand_conditional_move.
authorDie Li <lidie@eswincomputing.com>
Sat, 20 May 2023 05:00:13 +0000 (23:00 -0600)
committerJeff Law <jlaw@ventanamicro.com>
Sat, 20 May 2023 05:00:13 +0000 (23:00 -0600)
commit55914b016de8c8514c58eb59822677a69e44135c
treed3d6c3fa818848d2a070d729e0fa3b77d0d3b221
parent31cc55f4ff32475f8552205cbf341d4af8bb4fb7
Fix riscv_expand_conditional_move.

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 <gaofei@eswincomputing.com>
Signed-off-by: Die Li <lidie@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
gcc/testsuite/gcc.target/riscv/xtheadcondmov-indirect-rv32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/xtheadcondmov-indirect-rv64.c [new file with mode: 0644]