aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-01-16 22:34:35 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-01-16 22:34:35 +0100
commite1bcfb924ae9b6dffd7757a6f1a193793af58c2f (patch)
tree97c5bf3c97e4747ef5fc4e016464ce03bd36014b /gcc
parent1c70261c9a4d7faedfb03a79753b9acf81195561 (diff)
downloadgcc-e1bcfb924ae9b6dffd7757a6f1a193793af58c2f.zip
gcc-e1bcfb924ae9b6dffd7757a6f1a193793af58c2f.tar.gz
gcc-e1bcfb924ae9b6dffd7757a6f1a193793af58c2f.tar.bz2
re PR target/79080 (ICE: internal consistency failure (error: invalid rtl sharing found in the insn) (error: shared rtx))
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/loop-doloop.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr79080.c19
4 files changed, 36 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a69094c..cc2e1d0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c
index 5616709..3b9a9603 100644
--- a/gcc/loop-doloop.c
+++ b/gcc/loop-doloop.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e8f00c1..2ac1597 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..de0969d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr79080.c
@@ -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;
+ }
+}