https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77779
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2016-09-29 Ever confirmed|0 |1 Known to fail| |5.4.0, 6.2.0 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Same with GCC 6. On trunk we get diff: .LFB0: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 call __subvdi3 sarq $3, %rax movl $2, %esi movq %rax, %rdi call __mulvdi3 addq $8, %rsp .cfi_def_cfa_offset 8 ret because we "optimize" (canonicalize) the add to a multiplication by two. I believe the DImode overflow minus is spurious because of the way we represent pointer subtraction: a.0_1 = (long int) a_5(D); b.1_2 = (long int) b_6(D); _3 = a.0_1 - b.1_2; _4 = _3 /[ex] 8; thus a - b isn't distinguishable from ((long)a - (long)b) / 8. Anyway, confirmed. The "fix" is to make trapping ops explicit by using the existing builtins / internal-fns from the frontends that (want to) implement -ftrapv. There's a separate bug about this as well.