From f6b5c26b8a6c827ec20445daad76a6cee0435e0e Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 20 Sep 2017 07:34:55 +0000 Subject: [PATCH] graphite-sese-to-poly.c (extract_affine): Properly handle POINTER_PLUS_EXPR, BIT_NOT_EXPR and conversion to signed. 2017-09-20 Richard Biener * graphite-sese-to-poly.c (extract_affine): Properly handle POINTER_PLUS_EXPR, BIT_NOT_EXPR and conversion to signed. From-SVN: r253001 --- gcc/ChangeLog | 5 +++++ gcc/graphite-sese-to-poly.c | 31 ++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a5522e945c7..ae6d143d6ae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2017-09-20 Richard Biener + + * graphite-sese-to-poly.c (extract_affine): Properly handle + POINTER_PLUS_EXPR, BIT_NOT_EXPR and conversion to signed. + 2017-09-20 Richard Biener PR tree-optimization/81373 diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 6e64f13a77a..5d6ba67bbce 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -237,6 +237,7 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) return NULL; } + tree type = TREE_TYPE (e); switch (TREE_CODE (e)) { case POLYNOMIAL_CHREC: @@ -247,8 +248,22 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) res = extract_affine_mul (s, e, space); break; - case PLUS_EXPR: case POINTER_PLUS_EXPR: + { + lhs = extract_affine (s, TREE_OPERAND (e, 0), isl_space_copy (space)); + /* The RHS of a pointer-plus expression is to be interpreted + as signed value. Try to look through a sign-changing conversion + first. */ + tree tem = TREE_OPERAND (e, 1); + STRIP_NOPS (tem); + rhs = extract_affine (s, tem, space); + if (TYPE_UNSIGNED (TREE_TYPE (tem))) + rhs = wrap (rhs, TYPE_PRECISION (type) - 1); + res = isl_pw_aff_add (lhs, rhs); + break; + } + + case PLUS_EXPR: lhs = extract_affine (s, TREE_OPERAND (e, 0), isl_space_copy (space)); rhs = extract_affine (s, TREE_OPERAND (e, 1), space); res = isl_pw_aff_add (lhs, rhs); @@ -260,8 +275,13 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) res = isl_pw_aff_sub (lhs, rhs); break; - case NEGATE_EXPR: case BIT_NOT_EXPR: + 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; + + case NEGATE_EXPR: lhs = extract_affine (s, TREE_OPERAND (e, 0), isl_space_copy (space)); rhs = extract_affine (s, integer_minus_one_node, space); res = isl_pw_aff_mul (lhs, rhs); @@ -279,6 +299,12 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) return res; CASE_CONVERT: + res = extract_affine (s, TREE_OPERAND (e, 0), space); + /* signed values, even if overflow is undefined, get modulo-reduced. */ + if (! TYPE_UNSIGNED (type)) + res = wrap (res, TYPE_PRECISION (type) - 1); + break; + case NON_LVALUE_EXPR: res = extract_affine (s, TREE_OPERAND (e, 0), space); break; @@ -288,7 +314,6 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) break; } - tree type = TREE_TYPE (e); if (TYPE_UNSIGNED (type)) res = wrap (res, TYPE_PRECISION (type)); -- 2.30.2