Re: [PATCH PR83695]Fix ICE by resetting cached scev info after interchange.

2018-01-11 Thread Richard Biener
On Thu, Jan 11, 2018 at 1:49 PM, Bin Cheng  wrote:
> Hi,
> As explained in comment of PR83695, outdated cached scev info could be 
> referred
> by later interchange of outer loops in nest.  This simple patch fixes ICE by
> resetting cached scev info after interchange.  It's expensive resetting all 
> scev
> information but might not be a problem here given we only interchange in 
> limited
> cases.
>
> Bootstrap and test on x86_64 and AArch64.  Is it OK?

Ok.

Richard.

> Thanks,
> bin
>
> 2018-01-11  Bin Cheng  
>
> PR tree-optimization/83695
> * gimple-loop-linterchange.cc
> (tree_loop_interchange::interchange_loops): Call scev_reset_htab to
> reset cached scev information after interchange.
> (pass_linterchange::execute): Remove call to scev_reset_htab.
>
> gcc/testsuite
> 2018-01-11  Bin Cheng  
>
> PR tree-optimization/83695
> * gcc.dg/tree-ssa/pr83695.c: New test.


[PATCH PR83695]Fix ICE by resetting cached scev info after interchange.

2018-01-11 Thread Bin Cheng
Hi,
As explained in comment of PR83695, outdated cached scev info could be referred
by later interchange of outer loops in nest.  This simple patch fixes ICE by
resetting cached scev info after interchange.  It's expensive resetting all scev
information but might not be a problem here given we only interchange in limited
cases.

Bootstrap and test on x86_64 and AArch64.  Is it OK?

Thanks,
bin

2018-01-11  Bin Cheng  

PR tree-optimization/83695
* gimple-loop-linterchange.cc
(tree_loop_interchange::interchange_loops): Call scev_reset_htab to
reset cached scev information after interchange.
(pass_linterchange::execute): Remove call to scev_reset_htab.

gcc/testsuite
2018-01-11  Bin Cheng  

PR tree-optimization/83695
* gcc.dg/tree-ssa/pr83695.c: New test.diff --git a/gcc/gimple-loop-interchange.cc b/gcc/gimple-loop-interchange.cc
index 01a26c0..eb35263 100644
--- a/gcc/gimple-loop-interchange.cc
+++ b/gcc/gimple-loop-interchange.cc
@@ -1119,6 +1119,10 @@ tree_loop_interchange::interchange_loops (loop_cand 
, loop_cand )
   oloop.m_loop->any_likely_upper_bound = false;
   free_numbers_of_iterations_estimates (oloop.m_loop);
 
+  /* Clear all cached scev information.  This is expensive but shouldn't be
+ a problem given we interchange in very limited times.  */
+  scev_reset_htab ();
+
   /* ???  The association between the loop data structure and the
  CFG changed, so what was loop N at the source level is now
  loop M.  We should think of retaining the association or breaking
@@ -2070,9 +2074,6 @@ pass_linterchange::execute (function *fun)
   loop_nest.release ();
 }
 
-  if (changed_p)
-scev_reset_htab ();
-
   return changed_p ? (TODO_update_ssa_only_virtuals) : 0;
 }
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr83695.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr83695.c
new file mode 100644
index 000..af56a31
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr83695.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+int a[3][3][3], b, d;
+short c;
+unsigned char e;
+
+static void f ()
+{
+  for (c = 0; c < 2; c++)
+  for (e = 0; e < 3; e++)
+for (b = 0; b < 3; b++)
+  a[b][e][b] = 0;
+  while (1)
+;
+}
+
+int main ()
+{
+  if (d)
+f ();
+  return 0;
+}