tree-predcom.c (ref_at_iteration): Add parameter NITERS.
authorBin Cheng <bin.cheng@arm.com>
Fri, 28 Jul 2017 14:57:05 +0000 (14:57 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Fri, 28 Jul 2017 14:57:05 +0000 (14:57 +0000)
* tree-predcom.c (ref_at_iteration): Add parameter NITERS.  Compute
memory reference to DR at (NITERS + ITERS)-th iteration of loop.

From-SVN: r250667

gcc/ChangeLog
gcc/tree-predcom.c

index 536340272795232429f04b664f26d4f274a61f58..6d33678487c0bedd3960a5bef4f197683dbbb806 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-28  Bin Cheng  <bin.cheng@arm.com>
+
+       * tree-predcom.c (ref_at_iteration): Add parameter NITERS.  Compute
+       memory reference to DR at (NITERS + ITERS)-th iteration of loop.
+
 2017-07-28  Bin Cheng  <bin.cheng@arm.com>
 
        * tree-predcom.c (struct chain): New field init_seq.
index 089d3c674a4197a4540879f04e489277c27560f0..8861f31cc55b9125a0632b726c34880891aa80a3 100644 (file)
@@ -1370,11 +1370,12 @@ replace_ref_with (gimple *stmt, tree new_tree, bool set, bool in_lhs)
   gsi_insert_after (&bsi, new_stmt, GSI_NEW_STMT);
 }
 
-/* Returns a memory reference to DR in the ITER-th iteration of
-   the loop it was analyzed in.  Append init stmts to STMTS.  */
+/* Returns a memory reference to DR in the (NITERS + ITER)-th iteration
+   of the loop it was analyzed in.  Append init stmts to STMTS.  */
 
 static tree
-ref_at_iteration (data_reference_p dr, int iter, gimple_seq *stmts)
+ref_at_iteration (data_reference_p dr, int iter,
+                 gimple_seq *stmts, tree niters = NULL_TREE)
 {
   tree off = DR_OFFSET (dr);
   tree coff = DR_INIT (dr);
@@ -1383,14 +1384,27 @@ ref_at_iteration (data_reference_p dr, int iter, gimple_seq *stmts)
   tree ref_type = NULL_TREE;
   tree ref_op1 = NULL_TREE;
   tree ref_op2 = NULL_TREE;
-  if (iter == 0)
-    ;
-  else if (TREE_CODE (DR_STEP (dr)) == INTEGER_CST)
-    coff = size_binop (PLUS_EXPR, coff,
-                      size_binop (MULT_EXPR, DR_STEP (dr), ssize_int (iter)));
-  else
-    off = size_binop (PLUS_EXPR, off,
-                     size_binop (MULT_EXPR, DR_STEP (dr), ssize_int (iter)));
+  tree new_offset;
+
+  if (iter != 0)
+    {
+      new_offset = size_binop (MULT_EXPR, DR_STEP (dr), ssize_int (iter));
+      if (TREE_CODE (new_offset) == INTEGER_CST)
+       coff = size_binop (PLUS_EXPR, coff, new_offset);
+      else
+       off = size_binop (PLUS_EXPR, off, new_offset);
+    }
+
+  if (niters != NULL_TREE)
+    {
+      niters = fold_convert (ssizetype, niters);
+      new_offset = size_binop (MULT_EXPR, DR_STEP (dr), niters);
+      if (TREE_CODE (niters) == INTEGER_CST)
+       coff = size_binop (PLUS_EXPR, coff, new_offset);
+      else
+       off = size_binop (PLUS_EXPR, off, new_offset);
+    }
+
   /* While data-ref analysis punts on bit offsets it still handles
      bitfield accesses at byte boundaries.  Cope with that.  Note that
      if the bitfield object also starts at a byte-boundary we can simply