Commit 564e405c by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/81346 (Missed constant propagation into comparison)

	PR tree-optimization/81346
	* match.pd: Optimize (X - 1U) <= INT_MAX-1U into (int) X > 0.

	* gcc.dg/tree-ssa/pr81346-5.c: New test.

From-SVN: r250342
parent 3717fbe3
2017-07-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/81346
* match.pd: Optimize (X - 1U) <= INT_MAX-1U into (int) X > 0.
2017-07-19 Tom de Vries <tom@codesourcery.com>
* config/nvptx/nvptx.md (VECIM): Add V2DI.
......
......@@ -1125,6 +1125,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& wi::neg_p (@1, TYPE_SIGN (TREE_TYPE (@1))))
(cmp @2 @0))))))
/* (X - 1U) <= INT_MAX-1U into (int) X > 0. */
(for cmp (le gt)
icmp (gt le)
(simplify
(cmp (plus @0 integer_minus_onep@1) INTEGER_CST@2)
(if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
&& TYPE_UNSIGNED (TREE_TYPE (@0))
&& TYPE_PRECISION (TREE_TYPE (@0)) > 1
&& wi::eq_p (@2, wi::max_value (TYPE_PRECISION (TREE_TYPE (@0)),
SIGNED) - 1))
(with { tree stype = signed_type_for (TREE_TYPE (@0)); }
(icmp (convert:stype @0) { build_int_cst (stype, 0); })))))
/* X / 4 < Y / 4 iff X < Y when the division is known to be exact. */
(for cmp (simple_comparison)
(simplify
......
2017-07-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/81346
* gcc.dg/tree-ssa/pr81346-5.c: New test.
2017-07-19 Tom de Vries <tom@codesourcery.com>
* gcc.target/nvptx/decl-init.c: Update alignment.
......
/* PR tree-optimization/81346 */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* { dg-final { scan-tree-dump-times "\\(signed int\\) x" 10 "optimized" } } */
/* { dg-final { scan-tree-dump-times " <= 0;" 5 "optimized" } } */
/* { dg-final { scan-tree-dump-times " > 0;" 5 "optimized" } } */
int f1 (unsigned x) { return x - 1 <= __INT_MAX__ - 1; }
int f2 (unsigned x) { unsigned a = 1, b = __INT_MAX__ - 1; return x - a <= b; }
int f3 (unsigned x) { return x - 1 < __INT_MAX__; }
int f4 (unsigned x) { unsigned a = 1, b = __INT_MAX__; return x - a < b; }
int f5 (unsigned x) { return x >= 1 && x <= __INT_MAX__; }
int f6 (unsigned x) { return x - 1 > __INT_MAX__ - 1; }
int f7 (unsigned x) { unsigned a = 1, b = __INT_MAX__ - 1; return x - a > b; }
int f8 (unsigned x) { return x - 1 >= __INT_MAX__; }
int f9 (unsigned x) { unsigned a = 1, b = __INT_MAX__; return x - a >= b; }
int f10 (unsigned x) { return x < 1 || x > __INT_MAX__; }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment