I've noticed some wrong-code issues as well as missed optimizations (less 'wrap' stuff).
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. >From 02d00158e8ec62f1c52a8191f6b15c446445a4da Mon Sep 17 00:00:00 2001 From: Richard Guenther <rguent...@suse.de> Date: Thu, 7 Jun 2018 09:26:22 +0200 Subject: [PATCH] fix-graphite-affine-overflow * 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. 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;