https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81594
--- Comment #7 from Segher Boessenkool <segher at gcc dot gnu.org> --- Peepholes catch fewer cases, and it is very hard to write correct peepholes. The only reason to use peepholes is when the other passes leave some important optimisation on the table, and you cannot feasibly fix that problem. They are not a substitute for proper optimisation (for example, almost all "interesting" optimisation happen before it, so you cannot rely on combine or cse or *prop etc. to do anything -- so, if you want some simple optimisations with it you need to write that manually (an exponential amount of work). This even applies to "trivial" things like constant arguments. Peepholes are nice for mopping up those cases that for one reason or the other the other compiler passes cannot / do not get right. They can "tune" the compiler output to be just a teeny bit better. They cannot do anything more than that.