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.ch...@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.ch...@arm.com>

        PR tree-optimization/81744
        * gcc.dg/tree-ssa/pr81744.c: New.
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)
            {

Reply via email to