------- Comment #6 from steven at gcc dot gnu dot org  2010-01-02 14:08 -------
Created an attachment (id=19446)
 --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=19446&action=view)
Classic GCSE, resurrected (with some improvements)

With this patch (not bootstrapped/tested/etc.), I get the following code:

test:
        push    {r4, r5, r6, lr}
        ldr     r3, .L4
        ldr     r2, .L4+4
.LPIC0:
        add     r3, pc
        ldr     r5, [r3, r2]
        mov     r4, #200
        lsl     r4, r4, #1
        mov     r6, r0
        ldr     r0, [r5, r4]
        bl      func1
        ldr     r0, [r5, r4]
        mov     r1, r6
        bl      func2
        cmp     r0, #0
        beq     .L2
        bl      func
.L2:
        mov     r3, #200
        lsl     r3, r3, #1
        ldr     r0, [r5, r3]
        bl      func3
        @ sp needed for prologue
        pop     {r4, r5, r6, pc}


The constant load of #400 is not eliminated, because classic GCSE is not value
numbering, so to it, the following expressions in insns 11 and 31 are not
equivalent:

   11 r141:SI=0x190
   12 r142:SI=[r139:SI+r141:SI]
      REG_EQUAL: [const(`glob'+0x190)]

   30 r149:SI=0x190
   31 r150:SI=[r139:SI+r149:SI]

The REG_EQUAL note is probably not exploited because it is a CONST and
want_to_gcse_p rejects it (someone should check if that is indeed the reason).

I have no intention at this point to finish this patch.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42574

Reply via email to