https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77308

--- Comment #28 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
With my latest patch I bootstrapped a configuration with
--with-arch=armv7-a --with-tune=cortex-a9 --with-fpu=vfpv3-d16
--with-float=hard

I noticed a single regression in gcc.target/arm/pr53447-*.c

That is caused by disabling the adddi3 expansion.

void t0p(long long * p)
{
  *p += 0x100000001;
}

used to get compiled to this at -O2:

        ldrd    r2, [r0]
        adds    r2, r2, #1
        adc     r3, r3, #1
        strd    r2, [r0]
        bx      lr

but without the adddi3 pattern I have at -O2:

        ldr     r3, [r0]
        ldr     r1, [r0, #4]
        cmn     r3, #1
        add     r3, r3, #1
        movcc   r2, #0
        movcs   r2, #1
        add     r1, r1, #1
        str     r3, [r0]
        add     r3, r2, r1
        str     r3, [r0, #4]
        bx      lr

Note that also the ldrd instructions are not there.

Unfortunaltely also the other di3 pattern make the ldrd go away:

void t0p(long long * p)
{
  *p |= 0x100000001;
}

was with iordi3 like this:

        ldrd    r2, [r0]
        orr     r2, r2, #1
        orr     r3, r3, #1
        strd    r2, [r0]
        bx      lr

and without iordi3:

        ldm     r0, {r2, r3}
        orr     r2, r2, #1
        orr     r3, r3, #1
        stm     r0, {r2, r3}
        bx      lr

but 

void t0p(long long * p)
{
  p[1] |= 0x100000001;
}


gets two loads instead:

        ldr     r2, [r0, #8]
        ldr     r3, [r0, #12]
        orr     r2, r2, #1
        orr     r3, r3, #1
        str     r2, [r0, #8]
        str     r3, [r0, #12]
        bx      lr

however:

void t0p(long long * p)
{
  p[1] <<= 11;
}

gets compiled into this:

        ldr     r3, [r0, #12]
        ldr     r2, [r0, #8]
        lsl     r3, r3, #11
        lsl     r1, r2, #11
        orr     r3, r3, r2, lsr #21
        str     r1, [r0, #8]
        str     r3, [r0, #12]
        bx      lr


already before my patch.

I think this is the effect on the ldrd that you already mentioned,
and it gets worse when the expansion breaks the di registers up
into two si registers.

Reply via email to