graphite-sese-to-poly.c (extract_affine): Properly handle POINTER_PLUS_EXPR, BIT_NOT_...
authorRichard Biener <rguenther@suse.de>
Wed, 20 Sep 2017 07:34:55 +0000 (07:34 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 20 Sep 2017 07:34:55 +0000 (07:34 +0000)
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

gcc/ChangeLog
gcc/graphite-sese-to-poly.c

index a5522e945c701500df46d8911da46a2bf98f4c72..ae6d143d6aea65fed86fdb01850e5ee161527f8d 100644 (file)
@@ -1,3 +1,8 @@
+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
index 6e64f13a77a5701bca4d72560240c9cad7c54a0a..5d6ba67bbce41be8bb992d4f02a0a51f8844f05d 100644 (file)
@@ -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));