aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-06-07 09:48:31 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-06-07 09:48:31 +0000
commitfa8ce18938339c8d5b54d6d7428800efe3229510 (patch)
treed51ab974c94e34717c69d09ce3994961a55472d2 /gcc
parentc962b2c36f126d17df41cf01aaa67ae1bed341d9 (diff)
downloadgcc-fa8ce18938339c8d5b54d6d7428800efe3229510.zip
gcc-fa8ce18938339c8d5b54d6d7428800efe3229510.tar.gz
gcc-fa8ce18938339c8d5b54d6d7428800efe3229510.tar.bz2
graphite-sese-to-poly.c (extract_affine): Avoid unneded wrapping.
2018-06-07 Richard Biener <rguenther@suse.de> * 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/graphite-sese-to-poly.c18
2 files changed, 18 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ccc02ba..6526ca2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-06-07 Richard Biener <rguenther@suse.de>
+
+ * 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 <jakub@redhat.com>
PR tree-optimization/69615
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index 453f996..4dcc013 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;