* fold-const.c (fold_comparison): Disable X - Y CMP 0 to X CMP Y for
operators other than the equality operators.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213118
138bc75d-0d04-0410-961f-
82ee72b054a4
+2014-07-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR middle-end/61734
+ * fold-const.c (fold_comparison): Disable X - Y CMP 0 to X CMP Y for
+ operators other than the equality operators.
+
2014-07-28 Richard Biener <rguenther@suse.de>
PR middle-end/52478
/* Transform comparisons of the form X - Y CMP 0 to X CMP Y. */
if (TREE_CODE (arg0) == MINUS_EXPR
- && (equality_code || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)))
+ && equality_code
&& integer_zerop (arg1))
{
+ /* ??? The transformation is valid for the other operators if overflow
+ is undefined for the type, but performing it here badly interacts
+ with the transformation in fold_cond_expr_with_comparison which
+ attempts to synthetize ABS_EXPR. */
if (!equality_code)
fold_overflow_warning ("assuming signed overflow does not occur "
"when changing X - Y cmp 0 to X cmp Y",
+2014-07-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/fold-abs-5.c: New test.
+ * gcc.dg/Wstrict-overflow-25.c: XFAIL everywhere.
+ * gcc.dg/fold-compare-8.c: Likewise.
+
2014-07-28 Richard Biener <rguenther@suse.de>
PR middle-end/52478
int
foo (int x, int y)
{
- return x - y < 0; /* { dg-warning "assuming signed overflow does not occur" "correct warning" } */
+ return x - y < 0; /* { dg-warning "assuming signed overflow does not occur" "correct warning" { xfail *-*-* } } */
}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-original" } */
+
+int test (int a, int b, int sum)
+{
+ sum += ((a - b) > 0 ? (a - b) : -(a - b));
+ return sum;
+}
+
+/* { dg-final { scan-tree-dump "ABS" "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
return x - y < 0;
}
-/* { dg-final { scan-tree-dump "x < y" "original" } } */
+/* { dg-final { scan-tree-dump "x < y" "original" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "original" } } */