Fixup some issues in extract_affine (graphite)

Message ID alpine.LSU.2.20.1806071144470.5043@zhemvz.fhfr.qr
State New
Headers show
Series
  • Fixup some issues in extract_affine (graphite)
Related show

Commit Message

Richard Biener June 7, 2018, 9:45 a.m.
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 <rguenther@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.

Patch

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;