This fixes a GRAPHITE code-generation issue by eliding ISL AST plus
for large power-of-two values that don't affect the result.
I intentionally didn't extend this to other values with the same
property as I'd like to see testcases.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Richard.

2018-01-23  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/82819
        * graphite-isl-ast-to-gimple.c (binary_op_to_tree): Avoid
        code generating pluses that are no-ops in the target precision.

        * gcc.dg/graphite/pr82819.c: New testcase.

Index: gcc/graphite-isl-ast-to-gimple.c
===================================================================
--- gcc/graphite-isl-ast-to-gimple.c    (revision 256977)
+++ gcc/graphite-isl-ast-to-gimple.c    (working copy)
@@ -326,7 +326,8 @@ binary_op_to_tree (tree type, __isl_take
   /* From our constraint generation we may get modulo operations that
      we cannot represent explicitely but that are no-ops for TYPE.
      Elide those.  */
-  if (expr_type == isl_ast_op_pdiv_r
+  if ((expr_type == isl_ast_op_pdiv_r
+       || expr_type == isl_ast_op_add)
       && isl_ast_expr_get_type (arg_expr) == isl_ast_expr_int
       && (wi::exact_log2 (widest_int_from_isl_expr_int (arg_expr))
          >= TYPE_PRECISION (type)))
Index: gcc/testsuite/gcc.dg/graphite/pr82819.c
===================================================================
--- gcc/testsuite/gcc.dg/graphite/pr82819.c     (nonexistent)
+++ gcc/testsuite/gcc.dg/graphite/pr82819.c     (working copy)
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -floop-nest-optimize" } */
+
+short int *ts;
+
+void
+c2 (unsigned long long int s4, int ns)
+{
+  short int *b2 = (short int *)&ns;
+
+  while (ns != 0)
+    {
+      int xn;
+
+      for (xn = 0; xn < 3; ++xn)
+       for (*b2 = 0; *b2 < 2; ++*b2)
+         s4 += xn;
+      if (s4 != 0)
+       b2 = ts;
+      ++ns;
+    }
+}

Reply via email to