diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-01-16 22:34:35 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-01-16 22:34:35 +0100 |
commit | e1bcfb924ae9b6dffd7757a6f1a193793af58c2f (patch) | |
tree | 97c5bf3c97e4747ef5fc4e016464ce03bd36014b /gcc/loop-doloop.c | |
parent | 1c70261c9a4d7faedfb03a79753b9acf81195561 (diff) | |
download | gcc-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/loop-doloop.c')
-rw-r--r-- | gcc/loop-doloop.c | 13 |
1 files changed, 7 insertions, 6 deletions
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 |