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



--- Comment #53 from Oleg Endo <olegendo at gcc dot gnu.org> 2012-09-23 
21:41:55 UTC ---

Another case that seems to go awry:



int test_1 (int a, int b, int c, int* d)

{

  bool x = a == 0;

  d[2] = !x;



  return x ? b : c;

}



-O2 -m4:

        tst     r4,r4

        mov     #1,r1

        movt    r0

        xor     r0,r1

        tst     r0,r0

        bt/s    .L5

        mov.l   r1,@(8,r7)

        mov     r5,r6

.L5:

        rts

        mov     r6,r0



This should be something like:

        tst     r4,r4

        movt    r0

        xor     #1,r0

        bf/s    .L5

        mov.l   r1,@(8,r7)

        mov     r5,r6

.L5:

        rts

        mov     r6,r0





-O2 -m2a:

        tst     r4,r4

        movt    r0

        mov     #1,r1

        xor     r0,r1

        mov.l   r1,@(8,r7)

        tst     r0,r0

        bf      .L6

        mov     r6,r0

        rts/n

    .align 1

.L6:

        rts

        mov     r5,r0



This should be:

        tst     r4,r4

        movrt   r1

        mov.l   r1,@(8,r7)

        bt      .L6

        mov     r6,r0

        rts/n

    .align 1

.L6:

        rts

        mov     r5,r0

Reply via email to