/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom2" } */
+/* { dg-options "-O2 -fdump-tree-dom2 -fno-tree-vrp" } */
int min1(int a, int b)
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+
+int min1(int a, int b)
+{
+ if (a <= b)
+ return a < b ? a : b;
+ return 0;
+}
+
+int min2(int a, int b)
+{
+ if (a <= b)
+ return a > b ? b : a;
+ return 0;
+}
+
+int min3(int a, int b)
+{
+ if (a < b)
+ return a < b ? a : b;
+ return 0;
+}
+
+int min4(int a, int b)
+{
+ if (a < b)
+ return a > b ? b : a;
+ return 0;
+}
+
+int min5(int a, int b)
+{
+ if (a <= b)
+ return a <= b ? a : b;
+ return 0;
+}
+
+int min6(int a, int b)
+{
+ if (a <= b)
+ return a >= b ? b : a;
+ return 0;
+}
+
+int min7(int a, int b)
+{
+ if (a < b)
+ return a <= b ? a : b;
+ return 0;
+}
+
+int min8(int a, int b)
+{
+ if (b > a)
+ return a >= b ? b : a;
+ return 0;
+}
+
+int min9(int a, int b)
+{
+ if (b >= a)
+ return a < b ? a : b;
+ return 0;
+}
+
+int min10(int a, int b)
+{
+ if (b >= a)
+ return a > b ? b : a;
+ return 0;
+}
+
+int min11(int a, int b)
+{
+ if (b > a)
+ return a < b ? a : b;
+ return 0;
+}
+
+int min12(int a, int b)
+{
+ if (b > a)
+ return a > b ? b : a;
+ return 0;
+}
+
+int min13(int a, int b)
+{
+ if (b >= a)
+ return a <= b ? a : b;
+ return 0;
+}
+
+int min14(int a, int b)
+{
+ if (b >= a)
+ return a >= b ? b : a;
+ return 0;
+}
+
+int min15(int a, int b)
+{
+ if (b > a)
+ return a <= b ? a : b;
+ return 0;
+}
+
+int min16(int a, int b)
+{
+ if (b > a)
+ return a >= b ? b : a;
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "MIN_EXPR" "evrp" } } */
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math -fdump-tree-evrp" } */
+
+
+float min1(float a, float b)
+{
+ if (a <= b)
+ return a < b ? a : b;
+ return 0.0;
+}
+
+float min2(float a, float b)
+{
+ if (a <= b)
+ return a > b ? b : a;
+ return 0.0;
+}
+
+float min3(float a, float b)
+{
+ if (a < b)
+ return a < b ? a : b;
+ return 0.0;
+}
+
+float min4(float a, float b)
+{
+ if (a < b)
+ return a > b ? b : a;
+ return 0.0;
+}
+
+float min5(float a, float b)
+{
+ if (a <= b)
+ return a <= b ? a : b;
+ return 0.0;
+}
+
+float min6(float a, float b)
+{
+ if (a <= b)
+ return a >= b ? b : a;
+ return 0.0;
+}
+
+float min7(float a, float b)
+{
+ if (a < b)
+ return a <= b ? a : b;
+ return 0.0;
+}
+
+float min8(float a, float b)
+{
+ if (b > a)
+ return a >= b ? b : a;
+ return 0.0;
+}
+
+float min9(float a, float b)
+{
+ if (b >= a)
+ return a < b ? a : b;
+ return 0.0;
+}
+
+float min10(float a, float b)
+{
+ if (b >= a)
+ return a > b ? b : a;
+ return 0.0;
+}
+
+float min11(float a, float b)
+{
+ if (b > a)
+ return a < b ? a : b;
+ return 0.0;
+}
+
+float min12(float a, float b)
+{
+ if (b > a)
+ return a > b ? b : a;
+ return 0.0;
+}
+
+float min13(float a, float b)
+{
+ if (b >= a)
+ return a <= b ? a : b;
+ return 0.0;
+}
+
+float min14(float a, float b)
+{
+ if (b >= a)
+ return a >= b ? b : a;
+ return 0.0;
+}
+
+float min15(float a, float b)
+{
+ if (b > a)
+ return a <= b ? a : b;
+ return 0.0;
+}
+
+float min16(float a, float b)
+{
+ if (b > a)
+ return a >= b ? b : a;
+ return 0.0;
+}
+
+/* { dg-final { scan-tree-dump-not "MIN_EXPR" "evrp" } } */
+
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-dom2" } */
+/* { dg-options "-O2 -fdump-tree-dom2 -fno-tree-vrp" } */
int max1(int a, int b)
{
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+int max1(int a, int b)
+{
+ if (a <= b)
+ return a < b ? b : a;
+ return 0;
+}
+
+int max2(int a, int b)
+{
+ if (a <= b)
+ return a > b ? a : b;
+ return 0;
+}
+
+int max3(int a, int b)
+{
+ if (a < b)
+ return a < b ? b : a;
+ return 0;
+}
+
+int max4(int a, int b)
+{
+ if (a < b)
+ return a > b ? a : b;
+ return 0;
+}
+
+int max5(int a, int b)
+{
+ if (a <= b)
+ return a <= b ? b : a;
+ return 0;
+}
+
+int max6(int a, int b)
+{
+ if (a <= b)
+ return a >= b ? a : b;
+ return 0;
+}
+
+int max7(int a, int b)
+{
+ if (a < b)
+ return a <= b ? b : a;
+ return 0;
+}
+
+int max8(int a, int b)
+{
+ if (b > a)
+ return a >= b ? a : b;
+ return 0;
+}
+
+int max9(int a, int b)
+{
+ if (b >= a)
+ return a < b ? b : a;
+ return 0;
+}
+
+int max10(int a, int b)
+{
+ if (b >= a)
+ return a > b ? a : b;
+ return 0;
+}
+
+int max11(int a, int b)
+{
+ if (b > a)
+ return a < b ? b : a;
+ return 0;
+}
+
+int max12(int a, int b)
+{
+ if (b > a)
+ return a > b ? a : b;
+ return 0;
+}
+
+int max13(int a, int b)
+{
+ if (b >= a)
+ return a <= b ? b : a;
+ return 0;
+}
+
+int max14(int a, int b)
+{
+ if (b >= a)
+ return a >= b ? a : b;
+ return 0;
+}
+
+int max15(int a, int b)
+{
+ if (b > a)
+ return a <= b ? b : a;
+ return 0;
+}
+
+int max16(int a, int b)
+{
+ if (b > a)
+ return a >= b ? a : b;
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "MAX_EXPR" "evrp" } } */
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math -fdump-tree-evrp" } */
+
+float max1(float a, float b)
+{
+ if (a <= b)
+ return a < b ? b : a;
+ return 0.0;
+}
+
+float max2(float a, float b)
+{
+ if (a <= b)
+ return a > b ? a : b;
+ return 0.0;
+}
+
+float max3(float a, float b)
+{
+ if (a < b)
+ return a < b ? b : a;
+ return 0.0;
+}
+
+float max4(float a, float b)
+{
+ if (a < b)
+ return a > b ? a : b;
+ return 0.0;
+}
+
+float max5(float a, float b)
+{
+ if (a <= b)
+ return a <= b ? b : a;
+ return 0.0;
+}
+
+float max6(float a, float b)
+{
+ if (a <= b)
+ return a >= b ? a : b;
+ return 0.0;
+}
+
+float max7(float a, float b)
+{
+ if (a < b)
+ return a <= b ? b : a;
+ return 0.0;
+}
+
+float max8(float a, float b)
+{
+ if (b > a)
+ return a >= b ? a : b;
+ return 0.0;
+}
+
+float max9(float a, float b)
+{
+ if (b >= a)
+ return a < b ? b : a;
+ return 0.0;
+}
+
+float max10(float a, float b)
+{
+ if (b >= a)
+ return a > b ? a : b;
+ return 0.0;
+}
+
+float max11(float a, float b)
+{
+ if (b > a)
+ return a < b ? b : a;
+ return 0.0;
+}
+
+float max12(float a, float b)
+{
+ if (b > a)
+ return a > b ? a : b;
+ return 0.0;
+}
+
+float max13(float a, float b)
+{
+ if (b >= a)
+ return a <= b ? b : a;
+ return 0.0;
+}
+
+float max14(float a, float b)
+{
+ if (b >= a)
+ return a >= b ? a : b;
+ return 0.0;
+}
+
+float max15(float a, float b)
+{
+ if (b > a)
+ return a <= b ? b : a;
+ return 0.0;
+}
+
+float max16(float a, float b)
+{
+ if (b > a)
+ return a >= b ? a : b;
+ return 0.0;
+}
+
+/* { dg-final { scan-tree-dump-not "MAX_EXPR" "evrp" } } */
+
int_range<1> res;
range_op_handler handler (code);
- if (handler && handler.fold_range (res, boolean_type_node, r0, r1))
+
+ // Find any relation between op0 and op1 and pass it to fold_range.
+ relation_kind rel = VREL_VARYING;
+ if (gimple_range_ssa_p (op0) && gimple_range_ssa_p (op1))
+ rel = query->relation ().query (s, op0, op1);
+
+ if (handler && handler.fold_range (res, boolean_type_node, r0, r1,
+ relation_trio::op1_op2 (rel)))
{
if (res == range_true ())
return boolean_true_node;
case MIN_EXPR:
case MAX_EXPR:
- if (INTEGRAL_TYPE_P (TREE_TYPE (rhs1)))
- return simplify_min_or_max_using_ranges (gsi, stmt);
- break;
+ return simplify_min_or_max_using_ranges (gsi, stmt);
case RSHIFT_EXPR:
{