@@ -894,7 +894,24 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& tree_nop_conversion_p (type, TREE_TYPE (@1)))
(convert (bit_and (bit_not @1) @0))))
+/* Fold A * 10 == B * 10 into A == B. */
+(for cmp (eq ne)
+ (simplify
+ (cmp (mult:c @0 @1) (mult:c @2 @1))
+ (if (TYPE_OVERFLOW_UNDEFINED (type)
+ && !integer_zerop (@1))
+ (cmp @0 @2))))
+/* Fold A * 10 < B * 10 into A < B. */
+(for cmp (lt gt le ge)
+ (simplify
+ (cmp (mult:c @0 @1) (mult:c @2 @1))
+ (if (TYPE_OVERFLOW_UNDEFINED (type)
+ && !integer_zerop (@1))
+ (if (tree_expr_nonnegative_p (@1))
+ (cmp @0 @2))
+ (if (!tree_expr_nonnegative_p (@1))
+ (cmp @2 @0)))))
/* ((X inner_op C0) outer_op C1)
With X being a tree where value_range has reasoned certain bits to always be
new file mode 100644
@@ -0,0 +1,29 @@
+/* PR middle-end/31096 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+int
+f (int a, int b)
+{
+ return a > b;
+}
+
+int
+f1 (int a, int b)
+{
+ return a * 10 >= b * 10;
+}
+
+int
+f2 (int a, int b)
+{
+ return a * -42 < b * -42;
+}
+
+int
+f3 (int a, int b)
+{
+ return a * 0 <= b * 0;
+}
+
+/* { dg-final { scan-tree-dump-not "\(D\) * " "optimized" } } */
new file mode 100644
@@ -0,0 +1,29 @@
+/* PR middle-end/31096 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+int
+f (int a, int b)
+{
+ return a == b;
+}
+
+int
+f1 (int a, int b)
+{
+ return a * 10 == b * 10;
+}
+
+int
+f2 (int a, int b)
+{
+ return a * -42 != b * -42;
+}
+
+int
+f3 (int a, int b)
+{
+ return a * 0 != b * 0;
+}
+
+/* { dg-final { scan-tree-dump-not "\(D\) * " "optimized" } } */