https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94802
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Not fixed completely yet, (a - b) < 0 is not optimized into a < b yet. The following patch does that, but it regresses --- gcc/match.pd.jj 2020-12-30 17:04:27.340815135 +0100 +++ gcc/match.pd 2020-12-30 17:41:44.393443188 +0100 @@ -3966,6 +3966,16 @@ (define_operator_list COND_TERNARY (cmp (sub@2 @0 @1) integer_zerop) (if (single_use (@2)) (cmp @0 @1))))) +#if GIMPLE +(for cmp (lt le gt ge) + (for sub (minus pointer_diff) + (simplify + (cmp (sub@2 @0 @1) integer_zerop) + (if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)) + && !TYPE_OVERFLOW_SANITIZED (TREE_TYPE (@0)) + && single_use (@2)) + (cmp @0 @1))))) +#endif /* Transform comparisons of the form X * C1 CMP 0 to X CMP 0 in the signed arithmetic case. That form is created by the compiler the following test: +FAIL: gcc.dg/tree-ssa/pr45397.c scan-tree-dump-not evrp " & 255;" +FAIL: gcc.dg/tree-ssa/pr45397.c scan-tree-dump-not phiopt2 "if " +FAIL: gcc.dg/tree-ssa/pr45397.c scan-tree-dump-times phiopt2 "MAX_EXPR" 3 +FAIL: gcc.dg/tree-ssa/pr45397.c scan-tree-dump-times phiopt2 "MIN_EXPR" 3 so some more work will be needed.