match: x+umax(x,1) -> umax(x*2, 1) [PR127103]

This adds a simplification for `x+umax(x,1)` to `umax(x*2, 1)` when `x*2`
is known not to overflow. This shows up with std::vector::push_back
after the patch which adds `x+minmax(a,b)` simplification; it is also
a special case of that patch for `umax and 1`.  This gives a small
code generation improvement with std::vector::push_back because we
trade an add after the umax with a shift beforehand.

Bootstrapped and tested on x86_64-linux-gnu.

	PR tree-optimization/127103

gcc/ChangeLog:

	* match.pd (`x+umax(x,1)`): New pattern.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/max1-plus-1.c: New test.

Signed-off-by: Andrea Pinski <andrew.pinski@oss.qualcomm.com>
diff --git a/gcc/match.pd b/gcc/match.pd
index 4059ed7..82cf6ae 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -522,6 +522,18 @@
  (if (ANY_INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_UNDEFINED (type))
   (abs @0)))
 
+#if GIMPLE
+/* x + uMax(x, 1) -> uMax(x+x, 1)
+   if x+x is known not to wrap/overflow.  */
+(simplify
+ (plus:c @0 (max:s@2 @0 integer_onep@1))
+ (if (TYPE_UNSIGNED (type))
+  (with { int_range_max vr0; }
+   (if (gimple_match_range_of_expr (vr0, @0, @2)
+	&& range_op_handler (PLUS_EXPR).overflow_free_p (vr0, vr0))
+    (max (plus @0 @0) @1)))))
+#endif
+
 /* X * 1, X / 1 -> X.  */
 (for op (mult trunc_div ceil_div floor_div round_div exact_div)
   (simplify
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/max1-plus-1.c b/gcc/testsuite/gcc.dg/tree-ssa/max1-plus-1.c
new file mode 100644
index 0000000..9fdf0a4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/max1-plus-1.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized-raw" } */
+/* x + uMax(x, 1) -> uMax(x+x, 1) */
+/* PR tree-optimization/127103 */
+
+__attribute__((always_inline))
+static inline unsigned
+max(unsigned a, unsigned b)
+{
+  if (a < b)
+    return b;
+  return a;
+}
+
+unsigned f1(unsigned a, unsigned t1)
+{
+  if (a > __INT_MAX__)
+    return 0;
+  return a + max(1, a);
+}
+
+/* { dg-final { scan-tree-dump "gimple_assign <mult_expr, _\[0-9\], a_\[0-9\].D., 2" "optimized" } } */