https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79373
--- Comment #7 from Steven Pigeon <steven.p.pigeon at gmail dot com> --- (In reply to Andrew Pinski from comment #6) > Once undefined behavior happens all bets are off of any behavior of the > program. > > In this case the function is in lined and the optimizers see i cannot > overflow the multiply so it removes the loop check. I do understand that this is what happens (the code is fixed by promoting int32_t t=x to int64_t t=x) but the undefined behavior affects a variable (and its associated comparison) that should not be affected by it. It's as if this program int32_t f(int16_t x) { return x*65793; } for (int i=-32768; i<32768; i++) std::cout << f(i) << std::endl; would just never stop. Would that be expected?