https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62018
--- Comment #12 from rguenther at suse dot de <rguenther at suse dot de> --- On Sun, 9 Nov 2014, fxcoudert at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62018 > > --- Comment #8 from Francois-Xavier Coudert <fxcoudert at gcc dot gnu.org> --- > (In reply to Francois-Xavier Coudert from comment #7) > > Richard, I am willing to debug this, but don't know where to go after the > > above analysis. > > > I think it's a libgcc miscompilation somehow. Directly calling __addvsi3 as > follows: > > int __addvsi3 (int, int); > int main (void) > { volatile int x = __addvsi3 (__INT_MAX__, 1); } > > does not abort, even though (in my understanding) it should. It definitely does on x86_64-linux. Are you using libgcc_s from the system (thus darwin)? ISTR old libgcc did the arithmetic in a bogus way (using undefined behavior). Quoting from GCC 4.3 sources: Wtype __addvSI3 (Wtype a, Wtype b) { const Wtype w = a + b; ^^^ if (b >= 0 ? w < a : w > a) abort (); the addition is done in signed thus invoking undefined behavior. A fixed variant (trunk) looks like Wtype __addvSI3 (Wtype a, Wtype b) { const Wtype w = (UWtype) a + (UWtype) b; if (b >= 0 ? w < a : w > a) abort (); doing the addition in unsigned arithmetic. So I bet apple GCC 4.2 is affected as well - not sure if LLVM provides libgcc_s on newer systems.