------- 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