[PR81744] Fix ICE by deep copying expression of loop's number of iterations

Message ID DB5PR0801MB274220464F80E72A5B8E39C8E78A0@DB5PR0801MB2742.eurprd08.prod.outlook.com
State New
Headers show

Commit Message

Bin Cheng Aug. 8, 2017, 10:35 a.m.
Hi,
This is an obvious patch.  It fixes ICE in PR81744 by deep copying expression
of loop's number of iterations.
Test result checked.  Is it OK?

Thanks,
bin
2017-08-07  Bin Cheng  <bin.cheng@arm.com>

	PR tree-optimization/81744
	* tree-predcom.c (prepare_finalizers_chain): Deep copy expr of
	loop's number of iterations.

gcc/testsuite/ChangeLog
2017-08-07  Bin Cheng  <bin.cheng@arm.com>

	PR tree-optimization/81744
	* gcc.dg/tree-ssa/pr81744.c: New.

Comments

Richard Biener Aug. 8, 2017, 11:14 a.m. | #1
On Tue, Aug 8, 2017 at 12:35 PM, Bin Cheng <Bin.Cheng@arm.com> wrote:
> Hi,
> This is an obvious patch.  It fixes ICE in PR81744 by deep copying expression
> of loop's number of iterations.
> Test result checked.  Is it OK?

Ok.

Thanks,
Richard.

> Thanks,
> bin
> 2017-08-07  Bin Cheng  <bin.cheng@arm.com>
>
>         PR tree-optimization/81744
>         * tree-predcom.c (prepare_finalizers_chain): Deep copy expr of
>         loop's number of iterations.
>
> gcc/testsuite/ChangeLog
> 2017-08-07  Bin Cheng  <bin.cheng@arm.com>
>
>         PR tree-optimization/81744
>         * gcc.dg/tree-ssa/pr81744.c: New.

Patch

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr81744.c b/gcc/testsuite/gcc.dg/tree-ssa/pr81744.c
new file mode 100644
index 0000000..b0f5d38f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr81744.c
@@ -0,0 +1,13 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-tree-loop-vectorize -fno-tree-slp-vectorize -fno-inline -fdump-tree-pcom-details" } */
+
+typedef struct {
+  int a, b;
+} CompandSegment;
+int a;
+CompandSegment *b;
+void fn1() {
+  for (; a; a++)
+    b[a].a = b[a].b = b[a - 1].a = b[a - 1].b = 0;
+}
+/* { dg-final { scan-tree-dump-times "Store-stores chain" 2 "pcom"} } */
diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c
index 4538773..e7b10cb 100644
--- a/gcc/tree-predcom.c
+++ b/gcc/tree-predcom.c
@@ -2940,7 +2940,7 @@  prepare_finalizers_chain (struct loop *loop, chain_p chain)
 
       if (TREE_CODE (niters) != INTEGER_CST && TREE_CODE (niters) != SSA_NAME)
 	{
-	  niters = copy_node (niters);
+	  niters = unshare_expr (niters);
 	  niters = force_gimple_operand (niters, &stmts, true, NULL);
 	  if (stmts)
 	    {