re PR target/79080 (ICE: internal consistency failure (error: invalid rtl sharing...
authorJakub Jelinek <jakub@redhat.com>
Mon, 16 Jan 2017 21:34:35 +0000 (22:34 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 16 Jan 2017 21:34:35 +0000 (22:34 +0100)
PR target/79080
* loop-doloop.c (doloop_modify): Call unshare_all_rtl_in_chain on
sequence.  Formatting fixes.
(doloop_optimize): Formatting fixes.

* gcc.dg/pr79080.c: New test.

From-SVN: r244506

gcc/ChangeLog
gcc/loop-doloop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr79080.c [new file with mode: 0644]

index a69094c..cc2e1d0 100644 (file)
@@ -1,5 +1,10 @@
 2017-01-16  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/79080
+       * loop-doloop.c (doloop_modify): Call unshare_all_rtl_in_chain on
+       sequence.  Formatting fixes.
+       (doloop_optimize): Formatting fixes.
+
        PR driver/49726
        * gcc.c (debug_level_greater_than_spec_func): New function.
        (static_spec_functions): Add debug-level-gt spec function.
index 5616709..3b9a960 100644 (file)
@@ -479,9 +479,13 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
 
   /* Insert initialization of the count register into the loop header.  */
   start_sequence ();
+  /* count has been already copied through copy_rtx.  */
+  reset_used_flags (count);
+  set_used_flags (condition);
   tmp = force_operand (count, counter_reg);
   convert_move (counter_reg, tmp, 1);
   sequence = get_insns ();
+  unshare_all_rtl_in_chain (sequence);
   end_sequence ();
   emit_insn_after (sequence, BB_END (loop_preheader_edge (loop)->src));
 
@@ -489,10 +493,8 @@ doloop_modify (struct loop *loop, struct niter_desc *desc,
     {
       rtx ass = copy_rtx (desc->noloop_assumptions);
       basic_block preheader = loop_preheader_edge (loop)->src;
-      basic_block set_zero
-             = split_edge (loop_preheader_edge (loop));
-      basic_block new_preheader
-             = split_edge (loop_preheader_edge (loop));
+      basic_block set_zero = split_edge (loop_preheader_edge (loop));
+      basic_block new_preheader = split_edge (loop_preheader_edge (loop));
       edge te;
 
       /* Expand the condition testing the assumptions and if it does not pass,
@@ -688,8 +690,7 @@ doloop_optimize (struct loop *loop)
   rtx_insn *doloop_seq = targetm.gen_doloop_end (doloop_reg, start_label);
 
   word_mode_size = GET_MODE_PRECISION (word_mode);
-  word_mode_max
-         = (HOST_WIDE_INT_1U << (word_mode_size - 1) << 1) - 1;
+  word_mode_max = (HOST_WIDE_INT_1U << (word_mode_size - 1) << 1) - 1;
   if (! doloop_seq
       && mode != word_mode
       /* Before trying mode different from the one in that # of iterations is
index e8f00c1..2ac1597 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/79080
+       * gcc.dg/pr79080.c: New test.
+
 2017-01-16  David Malcolm  <dmalcolm@redhat.com>
 
        PR c/78304
diff --git a/gcc/testsuite/gcc.dg/pr79080.c b/gcc/testsuite/gcc.dg/pr79080.c
new file mode 100644 (file)
index 0000000..de0969d
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR target/79080 */
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+/* { dg-additional-options "-mcpu=8548" { target { powerpc*-*-* && ilp32 } } } */
+
+int
+foo (char x)
+{
+  int a;
+
+  for (;;)
+    {
+      x += 59;
+      if (x != 0)
+        a = 0;
+      else
+        return 0;
+    }
+}