https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83133

--- Comment #10 from Maxim Egorushkin <maxim.yegorushkin at gmail dot com> ---
(In reply to Uroš Bizjak from comment #8)
> (In reply to jos...@codesourcery.com from comment #5)
> > Both 32-bit and 64-bit ABIs make the values of flags in EFLAGS (other than 
> > DF) undefined on function entry and return.  Thus, a function can never 
> > assume anything about the value of OF unless it has executed an 
> > instruction known to set/clear it and has not called any other functions 
> > since then.
> 
> In the testcase, there is nothing that violates ABI.

Not sure why ABI got involved here.

> It all happens in "g"
> that passes calculated result to a function. Selected function depends on
> flags, calculated from the subtraction, and wrong function gets selected
> when overflow happens.

The underflow happens as a result of that subtraction. That underflow leads to
UB. In the case of UB, both gcc and clang behaviours are valid. The clang
behaviour is one instruction cheaper though.

Reply via email to