https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98981
Kito Cheng <kito at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kito at gcc dot gnu.org --- Comment #2 from Kito Cheng <kito at gcc dot gnu.org> --- Here is a quick patch for fix part of this issue, it seems like because our cost model is inprecise, but I guess I need run benchmark to make sure the performance and code size didn't get any regression. find_max_i32: lui a4,%hi(.LANCHOR0) addi a4,a4,%lo(.LANCHOR0) addi a3,a4,1024 addi a6,a4,400 li a0,0 .L3: lw a5,0(a4) lw a2,0(a3) addi a4,a4,4 addi a3,a3,4 addw a1,a5,a2 addw a5,a5,a2 bge a1,a0,.L2 mv a5,a0 .L2: sext.w a0,a5 bne a4,a6,.L3 ret Patch: diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c index d489717b2a5..b8c9f7200ce 100644 --- a/gcc/config/riscv/riscv.c +++ b/gcc/config/riscv/riscv.c @@ -1879,6 +1879,15 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN } /* Fall through. */ case SIGN_EXTEND: + if (TARGET_64BIT && !REG_P (XEXP (x, 0))) + { + int code = GET_CODE (XEXP (x, 0)); + if (code == PLUS || code == MINUS || code == NEG || code == MULT) + { + *total = COSTS_N_INSNS (1); + return true; + } + } *total = riscv_extend_cost (XEXP (x, 0), GET_CODE (x) == ZERO_EXTEND); return false;