------- Comment #5 from rguenth at gcc dot gnu dot org 2007-01-17 15:35 ------- There are a few issues, first we use emit_libcall_block to emit the trapping PLUS which sets a REG_EQUAL note with a non-trapping PLUS.
Second we analyze iaddv as not possibly throwing so we remove the call from main() during tree optimization as the result is unused. Third, we widen the integer addition to DImode and dispatch to libgcc2 __addvdi3 which looks like Dump of assembler code for function __addvdi3: 0x0000000000400580 <__addvdi3+0>: sub $0x8,%rsp 0x0000000000400584 <__addvdi3+4>: test %rsi,%rsi 0x0000000000400587 <__addvdi3+7>: lea (%rdi,%rsi,1),%rax 0x000000000040058b <__addvdi3+11>: js 0x4005a0 <__addvdi3+32> 0x000000000040058d <__addvdi3+13>: cmp %rax,%rdi so it tests for 64bit overflow instead of 32bit one. Obviously allowind LIBCALL_WIDEN is wrong for the trapping optabs, too. -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rguenth at gcc dot gnu dot | |org Keywords| |wrong-code http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19020