This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/31848] [4.3 regression] Invalid loop optimization causes bootstrap failure in genautomata
- From: "rakdver at kam dot mff dot cuni dot cz" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 10 May 2007 08:42:15 -0000
- Subject: [Bug rtl-optimization/31848] [4.3 regression] Invalid loop optimization causes bootstrap failure in genautomata
- References: <bug-31848-374@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #6 from rakdver at kam dot mff dot cuni dot cz 2007-05-10 09:42 -------
Subject: Re: [4.3 regression] Invalid loop optimization causes bootstrap
failure in genautomata
> Now, imagine the representative of a class of invariant insns is this one:
>
> (gdb) next
> 1161 reorder_insns (inv->insn, inv->insn, BB_END (preheader));
> (gdb) p debug_rtx(inv->insn)
> (insn 552 551 644 57 foo.c:11152 (set (reg:SI 323)
> (reg/v/f:SI 170 [ compressed_min_issue_delay_vect ])) 161
> {*arm_movsi_insn} (nil)
> (expr_list:REG_EQUAL (const_int 0 [0x0])
> (nil)))
> $7 = void
The heuristics may need some tweaking... moving reg-reg moves out of
loop seems unnecessary. Anyway,
> ...and we've moved the insn with note and all out of the loop, even though the
> note is not valid anymore.
> Index: loop-invariant.c
> ===================================================================
> --- loop-invariant.c (revision 124576)
> +++ loop-invariant.c (working copy)
> @@ -1156,9 +1156,21 @@ move_invariant_reg (struct loop *loop, u
> to let emit_move_insn produce a valid instruction stream. */
> if (REG_P (dest) && !HARD_REGISTER_P (dest))
> {
> + rtx note;
> +
> emit_insn_after (gen_move_insn (dest, reg), inv->insn);
> SET_DEST (set) = reg;
> reorder_insns (inv->insn, inv->insn, BB_END (preheader));
> +
> + /* If there is a REG_EQUAL note on the insn we just moved, and
> + insn is in a basic block that is not always executed, the note
> + may no longer be valid after we move the insn.
> + Note that uses in REG_EQUAL notes are taken into account in
> + the computation of invariants. Hence it is safe to retain the
> + note even if the note contains register references. */
> + if (! inv->always_executed
> + && (note = find_reg_note (inv->insn, REG_EQUAL, NULL_RTX)))
> + remove_note (inv->insn, note);
> }
> else
> {
>
>
> Zdenek, what do you think about this?
the patch looks OK.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31848