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

--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Maxim Egorushkin from comment #0)
> g function assembly contains a superflous test instruction. It should not
> generate that instruction, since sub instruction already sets all the
> required flags. I first discovered this issue in gcc-4.9.2 and it is still
> there in gcc-7.2.0.

SUBL also sets overflow flat (OF). JLE in fact jumps when (ZF=1 or SF≠OF), so
assuming OF is always cleared is waaay to dangerous.

As a matter of fact, flag-setting cmp/sub/add patterns can be changed to
operate in CCNOmode instead of CCGOCmode when strict signed overflow rules are
in effect (in C/C++ signed overflow is undefined, so we CAN assume signed
overflow never happens and consequently flag OF is never set), but it would be
major PITA on x86 architecture, where plus and minus operations on signed
integers always overflow "as expected".

(BTW: I did implement the above idea, but compiler failed bootstrap comparison
check. I'm surprised clang was brave enough to implement this dangerous
optimization.)

Reply via email to