This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug bootstrap/46856] [4.6 regression] internal compiler error in final_scan_insn breaks m68k-linux bootstrap
- From: "mikpe at it dot uu.se" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 26 Jan 2011 14:43:36 +0000
- Subject: [Bug bootstrap/46856] [4.6 regression] internal compiler error in final_scan_insn breaks m68k-linux bootstrap
- Auto-submitted: auto-generated
- References: <bug-46856-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46856
--- Comment #6 from Mikael Pettersson <mikpe at it dot uu.se> 2011-01-26 14:43:34 UTC ---
The loop in reload_combine_recognize_const_pattern contains this check:
/* If the add clobbers another hard reg in parallel, don't move
it past a real set of this hard reg. */
if (must_move_add && clobbered_regno >= 0
&& reg_state[clobbered_regno].real_store_ruid >= use_ruid)
break;
Since the moved add is a cc0 setter, it seems reasonable to check here that
it's not moved past another cc0 setter. Replacing the previous patch with the
following also restores bootstrap (testsuite still running):
--- gcc-4.6-20110115/gcc/postreload.c.~1~ 2010-12-21 15:51:42.000000000
+0100
+++ gcc-4.6-20110115/gcc/postreload.c 2011-01-18 20:26:39.000000000 +0100
@@ -1008,6 +1008,11 @@ reload_combine_recognize_const_pattern (
if (must_move_add && clobbered_regno >= 0
&& reg_state[clobbered_regno].real_store_ruid >= use_ruid)
break;
+#if defined(HAVE_cc0)
+ /* Unbreak m68k, see PR bootstrap/46856. */
+ if (must_move_add && sets_cc0_p (PATTERN (use_insn)))
+ break;
+#endif
gcc_assert (reg_state[regno].store_ruid <= use_ruid);
/* Avoid moving a use of ADDREG past a point where it is stored. */