This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][GCC][ARM] Adjust costs so udiv is preferred over sdiv when both are valid. [Patch (2/2)]


Ping
________________________________________
From: gcc-patches-owner@gcc.gnu.org <gcc-patches-owner@gcc.gnu.org> on behalf of Tamar Christina <Tamar.Christina@arm.com>
Sent: Monday, May 15, 2017 9:32:55 AM
To: GCC Patches
Cc: nd; Kyrylo Tkachov; Ramana Radhakrishnan; Richard Earnshaw; nickc@redhat.com
Subject: Re: [PATCH][GCC][ARM] Adjust costs so udiv is preferred over sdiv when both are valid. [Patch (2/2)]

Ping
________________________________________
From: gcc-patches-owner@gcc.gnu.org <gcc-patches-owner@gcc.gnu.org> on behalf of Tamar Christina <Tamar.Christina@arm.com>
Sent: Tuesday, May 2, 2017 4:37:12 PM
To: GCC Patches
Cc: nd; Kyrylo Tkachov; Ramana Radhakrishnan; Richard Earnshaw; nickc@redhat.com
Subject: [PATCH][GCC][ARM] Adjust costs so udiv is preferred over sdiv when both are valid. [Patch (2/2)]

Hi All,

This patch adjusts the cost model so that when both sdiv and udiv are possible
it prefers udiv over sdiv. This was done by making sdiv slightly more expensive
instead of making udiv cheaper to keep the baseline costs of a division the same
as before.

Similar to aarch64 this patch along with my other two related mid-end changes
makes a big difference in division by constants.

Given:

int f2(int x)
{
  return ((x * x) % 300) + ((x * x) / 300);
}

we now generate

f2:
        mul     r3, r0, r0
        mov     r0, r3
        ldr     r1, .L3
        umull   r2, r3, r0, r1
        lsr     r2, r3, #5
        add     r3, r2, r2, lsl #2
        rsb     r3, r3, r3, lsl #4
        sub     r0, r0, r3, lsl #2
        add     r0, r0, r2
        bx      lr

as opposed to

f2:
        mul     r3, r0, r0
        mov     r0, r3
        ldr     r3, .L4
        push    {r4, r5}
        smull   r4, r5, r0, r3
        asr     r3, r0, #31
        rsb     r3, r3, r5, asr #5
        add     r2, r3, r3, lsl #2
        rsb     r2, r2, r2, lsl #4
        sub     r0, r0, r2, lsl #2
        add     r0, r0, r3
        pop     {r4, r5}
        bx      lr

Bootstrapped and reg tested on arm-none-eabi
with no regressions.

OK for trunk?

Thanks,
Tamar


gcc/
2017-05-02  Tamar Christina  <tamar.christina@arm.com>

        * config/arm/arm.c (arm_rtx_costs_internal): Make sdiv more expensive than udiv.


gcc/testsuite/
2017-05-02  Tamar Christina  <tamar.christina@arm.com>

        * gcc.target/arm/sdiv_costs_1.c: New.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]