https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96272
--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> --- (In reply to Jakub Jelinek from comment #2) > Well, it needs the addition too, so I think this can't be done in match.pd, > but would need to be done in some other pass (not sure which, perhaps > phiopt?). Maybe I was not too clear. Please consider this testcase: --cut here-- #include <limits.h> #include <stdio.h> int foo (unsigned a, unsigned b) { return a > UINT_MAX - b; } int bar (unsigned a, unsigned b) { int dummy; return __builtin_uadd_overflow (a, b, &dummy); } --cut here-- This results in (-O2): foo: notl %esi xorl %eax, %eax cmpl %edi, %esi setb %al ret bar: xorl %eax, %eax addl %esi, %edi setc %al ret So, if it is possible to transform the comparison via the following equivalence: a > UINT_MAX - b == (a + b) > UINT_MAX to a __builtin_uadd_overflow, then at least on x86 it is possible to produce much better code.