From: Richard Biener Date: Thu, 7 Jun 2018 09:48:31 +0000 (+0000) Subject: graphite-sese-to-poly.c (extract_affine): Avoid unneded wrapping. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fa8ce18938339c8d5b54d6d7428800efe3229510;p=gcc.git graphite-sese-to-poly.c (extract_affine): Avoid unneded wrapping. 2018-06-07 Richard Biener * graphite-sese-to-poly.c (extract_affine): Avoid unneded wrapping. Properly wrap the result of a BIT_NOT_EXPR. Properly wrap signed arithmetic if overflow wraps. From-SVN: r261267 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ccc02bafa41..6526ca2800d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-06-07 Richard Biener + + * graphite-sese-to-poly.c (extract_affine): Avoid unneded + wrapping. Properly wrap the result of a BIT_NOT_EXPR. + Properly wrap signed arithmetic if overflow wraps. + 2018-06-07 Jakub Jelinek PR tree-optimization/69615 diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 453f9962e48..4dcc013f6bb 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -272,7 +272,8 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) lhs = extract_affine (s, integer_minus_one_node, isl_space_copy (space)); rhs = extract_affine (s, TREE_OPERAND (e, 0), space); res = isl_pw_aff_sub (lhs, rhs); - break; + /* We need to always wrap the result of a bitwise operation. */ + return wrap (res, TYPE_PRECISION (type) - (TYPE_UNSIGNED (type) ? 0 : 1)); case NEGATE_EXPR: lhs = extract_affine (s, TREE_OPERAND (e, 0), isl_space_copy (space)); @@ -285,8 +286,8 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) gcc_assert (! defined_in_sese_p (e, s->scop_info->region)); int dim = parameter_index_in_region (e, s->scop_info); gcc_assert (dim != -1); - res = extract_affine_name (dim, space); - break; + /* No need to wrap a parameter. */ + return extract_affine_name (dim, space); } case INTEGER_CST: @@ -301,11 +302,15 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) /* Signed values, even if overflow is undefined, get modulo-reduced. But only if not all values of the old type fit in the new. */ if (! TYPE_UNSIGNED (type) - && ((TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (e, 0))) + && ((TYPE_UNSIGNED (itype) && TYPE_PRECISION (type) <= TYPE_PRECISION (itype)) || TYPE_PRECISION (type) < TYPE_PRECISION (itype))) res = wrap (res, TYPE_PRECISION (type) - 1); - break; + else if (TYPE_UNSIGNED (type) + && (!TYPE_UNSIGNED (itype) + || TYPE_PRECISION (type) < TYPE_PRECISION (itype))) + res = wrap (res, TYPE_PRECISION (type)); + return res; } case NON_LVALUE_EXPR: @@ -317,7 +322,8 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) break; } - if (TYPE_UNSIGNED (type)) + /* For all wrapping arithmetic wrap the result. */ + if (TYPE_OVERFLOW_WRAPS (type)) res = wrap (res, TYPE_PRECISION (type)); return res;