Commit f6b5c26b by Richard Biener Committed by Richard Biener

graphite-sese-to-poly.c (extract_affine): Properly handle POINTER_PLUS_EXPR,…

graphite-sese-to-poly.c (extract_affine): Properly handle POINTER_PLUS_EXPR, BIT_NOT_EXPR and conversion to signed.

2017-09-20  Richard Biener  <rguenther@suse.de>

	* graphite-sese-to-poly.c (extract_affine): Properly handle
	POINTER_PLUS_EXPR, BIT_NOT_EXPR and conversion to signed.

From-SVN: r253001
parent 73fe2f32
2017-09-20 Richard Biener <rguenther@suse.de>
* graphite-sese-to-poly.c (extract_affine): Properly handle
POINTER_PLUS_EXPR, BIT_NOT_EXPR and conversion to signed.
2017-09-20 Richard Biener <rguenther@suse.de>
PR tree-optimization/81373
* graphite-scop-detection.c (build_cross_bb_scalars_def):
Force SESE live-out defs to be handled even if they are
......
......@@ -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));
......
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