This is the mail archive of the gcc-bugs@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]

-O3 libgcc EH miscompilation: a first hint


Hi,

it seems that -O3 currently optimizes the code produced by
__builtin_eh_return() away. The code in libgcc2.c/__throw() looks like:

  handler = throw_helper (eh, pc, my_udata, &offset);

  /* Now go!  */

  __builtin_eh_return ((void *)eh, offset, handler);



The working assembly with -O2 looks like:

     f1c:       4b ff fb ed     bl      b08 <throw_helper>
     f20:       81 3f 00 00     lwz     r9,0(r31)
     f24:       80 1e 80 44     lwz     r0,-32700(r30)
     f28:       80 9f 02 08     lwz     r4,520(r31)
     f2c:       7c 65 1b 78     mr      r5,r3
     f30:       90 09 00 04     stw     r0,4(r9)
     f34:       80 7f 02 0c     lwz     r3,524(r31)
     f38:       48 00 00 10     b       f48 <.L188+0xc>

00000f3c <.L188>:
     f3c:       7c a9 03 a6     mtctr   r5
     f40:       7c 21 22 14     add     r1,r1,r4
     f44:       4e 80 04 20     bctr
     f48:       81 61 00 00     lwz     r11,0(r1)
     f4c:       80 0b 00 04     lwz     r0,4(r11)
     f50:       81 8b ff 24     lwz     r12,-220(r11)
     f54:       7c 08 03 a6     mtlr    r0
     f58:       81 cb ff 28     lwz     r14,-216(r11)
     f5c:       81 eb ff 2c     lwz     r15,-212(r11)
     f60:       82 0b ff 30     lwz     r16,-208(r11)

and with -O3:

     c44:       4b ff f7 d5     bl      418 <throw_helper>
     c48:       81 21 00 00     lwz     r9,0(r1)
     c4c:       80 1e 80 20     lwz     r0,-32736(r30)
     c50:       80 81 02 08     lwz     r4,520(r1)
     c54:       7c 65 1b 78     mr      r5,r3
     c58:       90 09 00 04     stw     r0,4(r9)
     c5c:       80 61 02 0c     lwz     r3,524(r1)

00000c60 <.L348>:
     c60:       80 01 03 04     lwz     r0,772(r1)
     c64:       81 81 02 24     lwz     r12,548(r1)
     c68:       7c 08 03 a6     mtlr    r0
     c6c:       81 c1 02 28     lwz     r14,552(r1)
     c70:       81 e1 02 2c     lwz     r15,556(r1)
     c74:       82 01 02 30     lwz     r16,560(r1)

the result of throw_helper is still moved to r5, but where did the mtctr/bctr
pair vanish to?

Franz.


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