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;

Reply via email to