diff mbox

[PR68021] Set ratio to 1 when computing the value of biv cand by itself

Message ID HE1PR08MB0507FEFCF4FF37E4E98CCDBFE7D70@HE1PR08MB0507.eurprd08.prod.outlook.com
State New
Headers show

Commit Message

Bin Cheng Feb. 10, 2016, 11:34 a.m. UTC
Hi,
This is another way to fix PR68021, and I think it's the least intrusive way.  The issue is triggered in a special case in which cand is a original biv, and use denotes the value of the biv itself.  In this case, the use is added specifically for the original biv, as a result, get_computation_aff isn't called for the <cand, use> pair before rewriting the use.  It is possible that constant_multiple_of/operand_equal_q could fail because of inconsistent fold behavior.  The fold behavior is fully described in PR68021.
This patch fixes IVOPT part of issue by setting ratio to 1, because it is known that the use has the value of the biv cand.

Bootstrap and test on x86_64 and aarch64.  Is it OK if no failures?

Thanks,
bin

2016-02-09  Bin Cheng  <bin.cheng@arm.com>

	PR tree-optimization/68021
	* tree-ssa-loop-ivopts.c (get_computation_aff): Set ratio to 1 if
	when computing the value of biv cand by itself.

gcc/testsuite/ChangeLog
2016-02-09  Bin Cheng  <bin.cheng@arm.com>

	PR tree-optimization/68021
	* gcc.dg/tree-ssa/pr68021.c: New test.

Comments

Richard Biener Feb. 10, 2016, 1:27 p.m. UTC | #1
On Wed, Feb 10, 2016 at 12:34 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
> Hi,
> This is another way to fix PR68021, and I think it's the least intrusive way.  The issue is triggered in a special case in which cand is a original biv, and use denotes the value of the biv itself.  In this case, the use is added specifically for the original biv, as a result, get_computation_aff isn't called for the <cand, use> pair before rewriting the use.  It is possible that constant_multiple_of/operand_equal_q could fail because of inconsistent fold behavior.  The fold behavior is fully described in PR68021.
> This patch fixes IVOPT part of issue by setting ratio to 1, because it is known that the use has the value of the biv cand.
>
> Bootstrap and test on x86_64 and aarch64.  Is it OK if no failures?

Ok, but please add a comment why we have this special-casing instead
of relying on constant_multiple_of.

Thanks,
Richard.

> Thanks,
> bin
>
> 2016-02-09  Bin Cheng  <bin.cheng@arm.com>
>
>         PR tree-optimization/68021
>         * tree-ssa-loop-ivopts.c (get_computation_aff): Set ratio to 1 if
>         when computing the value of biv cand by itself.
>
> gcc/testsuite/ChangeLog
> 2016-02-09  Bin Cheng  <bin.cheng@arm.com>
>
>         PR tree-optimization/68021
>         * gcc.dg/tree-ssa/pr68021.c: New test.
Bin.Cheng Feb. 10, 2016, 2:13 p.m. UTC | #2
On Wed, Feb 10, 2016 at 1:27 PM, Richard Biener
<richard.guenther@gmail.com> wrote:
>
> On Wed, Feb 10, 2016 at 12:34 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
> > Hi,
> > This is another way to fix PR68021, and I think it's the least intrusive way.  The issue is triggered in a special case in which cand is a original biv, and use denotes the value of the biv itself.  In this case, the use is added specifically for the original biv, as a result, get_computation_aff isn't called for the <cand, use> pair before rewriting the use.  It is possible that constant_multiple_of/operand_equal_q could fail because of inconsistent fold behavior.  The fold behavior is fully described in PR68021.
> > This patch fixes IVOPT part of issue by setting ratio to 1, because it is known that the use has the value of the biv cand.
> >
> > Bootstrap and test on x86_64 and aarch64.  Is it OK if no failures?
>
> Ok, but please add a comment why we have this special-casing instead
> of relying on constant_multiple_of.
Done, patch applied at revision 233269.

Thanks,
bin
>
>
> Thanks,
> Richard.
>
> > Thanks,
> > bin
> >
> > 2016-02-09  Bin Cheng  <bin.cheng@arm.com>
> >
> >         PR tree-optimization/68021
> >         * tree-ssa-loop-ivopts.c (get_computation_aff): Set ratio to 1 if
> >         when computing the value of biv cand by itself.
> >
> > gcc/testsuite/ChangeLog
> > 2016-02-09  Bin Cheng  <bin.cheng@arm.com>
> >
> >         PR tree-optimization/68021
> >         * gcc.dg/tree-ssa/pr68021.c: New test.
diff mbox

Patch

diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 4026d28..48facec 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -3741,7 +3741,15 @@  get_computation_aff (struct loop *loop,
       var = fold_convert (uutype, var);
     }
 
-  if (!constant_multiple_of (ustep, cstep, &rat))
+  /* Ratio is 1 when computing the value of biv cand by itself.  */
+  if (cand->pos == IP_ORIGINAL && cand->incremented_at == use->stmt)
+    {
+      gcc_assert (is_gimple_assign (use->stmt));
+      gcc_assert (use->iv->ssa_name == cand->var_after);
+      gcc_assert (gimple_assign_lhs (use->stmt) == cand->var_after);
+      rat = 1;
+    }
+  else if (!constant_multiple_of (ustep, cstep, &rat))
     return false;
 
   /* In case both UBASE and CBASE are shortened to UUTYPE from some common
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr68021.c b/gcc/testsuite/gcc.dg/tree-ssa/pr68021.c
new file mode 100644
index 0000000..f60b1ff
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr68021.c
@@ -0,0 +1,17 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+char a;
+void fn1 (char *p1, int p2, int p3)
+{
+  int i, x;
+  for (i = 0; i < 10; i++)
+    {
+      for (x = 0; x < p3; x++)
+	{
+	  *p1 = a;
+	  p1--;
+	}
+      p1 += p2;
+    }
+}