public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* A problem simplifying subregs of the hard frame pointer
@ 2010-07-09  9:55 Bernd Schmidt
  2010-07-16 11:04 ` Ping: " Bernd Schmidt
  0 siblings, 1 reply; 8+ messages in thread
From: Bernd Schmidt @ 2010-07-09  9:55 UTC (permalink / raw)
  To: GCC Patches; +Cc: Richard Earnshaw

[-- Attachment #1: Type: text/plain, Size: 1831 bytes --]

While testing some other Thumb-1 changes, I got an abort while
generating thumb_movhi_clobber for a secondary reload.  The pattern
calls gcc_unreachable when it finds a case it can't handle.

There's a FIXME there that other cases might need to be handled, but
looking closer, the entire pattern seems bogus; it requests two scratch
regs (one DImode reg) and doesn't use them.  The circumstances in which
we arrive there also seemed suspect.  We were reloading an insn of the form

 (set (mem:HI (some address)) (subreg:HI (reg:SI 7)))

Reload did _not_ choose the reg->mem alternative of the movhi pattern,
which is crazy.  The reason it didn't is that reg 7 is the hard frame
pointer, and simplify_subreg_regno didn't want to simplify the subreg
here (-fomit-frame-pointer was on of course).  So, find_reloads set
force_reload for the register operand, which seems to have been enough
to confuse its cost calculations.

Fixed by the first part of this patch; I see no reason to treat the hard
frame pointer register specially - it's typically just a general reg.
If FRAME_POINTER_REGNUM == HARD_FRAME_POINTER_REGNUM, the test will have
the same effect as before, which is probably still wrong, but for now
it's a safe change to make.

The other part removes the strange-looking part frmo the
thumb_movhi_clobber register and restores it to just a call to
gcc_unreachable.  This is still ugly, but it's essentially the state it
was in before
  http://gcc.gnu.org/ml/gcc-patches/2005-08/msg01210.html
which presumably changed this because of the bug I'm fixing here.

Regression tested, together with some other patches, on
    qemu-system-armv7-3/arch=armv7-a/thumb
    qemu-system-armv7-3/thumb
    qemu-system-armv7-3

which only showed up one unrelated problem for which I'm testing a fix.

Ok (rtlanal and ARM parts)?


Bernd

[-- Attachment #2: subreg-problem.diff --]
[-- Type: text/plain, Size: 1536 bytes --]

	* rtlanal.c (simplify_subreg_regno): Don't treat
	HARD_FRAME_POINTER_REGNUM specially.
	* config/arm/arm.md (thumb_movhi_clobber): Restore previous
	version of the pattern that always calls gcc_unreachable.

Index: rtlanal.c
===================================================================
--- rtlanal.c	(revision 161987)
+++ rtlanal.c	(working copy)
@@ -3297,8 +3297,7 @@ simplify_subreg_regno (unsigned int xreg
 
   /* We shouldn't simplify stack-related registers.  */
   if ((!reload_completed || frame_pointer_needed)
-      && (xregno == FRAME_POINTER_REGNUM
-	  || xregno == HARD_FRAME_POINTER_REGNUM))
+      && xregno == FRAME_POINTER_REGNUM)
     return -1;
 
   if (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
Index: config/arm/arm.md
===================================================================
--- config/arm/arm.md	(revision 161987)
+++ config/arm/arm.md	(working copy)
@@ -5666,17 +5666,9 @@ (define_expand "thumb_movhi_clobber"
 	(match_operand:HI     1 "register_operand" ""))
    (clobber (match_operand:DI 2 "register_operand" ""))]
   "TARGET_THUMB1"
-  "
-  if (strict_memory_address_p (HImode, XEXP (operands[0], 0))
-      && REGNO (operands[1]) <= LAST_LO_REGNUM)
-    {
-      emit_insn (gen_movhi (operands[0], operands[1]));
-      DONE;
-    }
-  /* XXX Fixme, need to handle other cases here as well.  */
+{
   gcc_unreachable ();
-  "
-)
+})
 	
 ;; We use a DImode scratch because we may occasionally need an additional
 ;; temporary if the address isn't offsettable -- push_reload doesn't seem

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-08-04  1:10 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-07-09  9:55 A problem simplifying subregs of the hard frame pointer Bernd Schmidt
2010-07-16 11:04 ` Ping: " Bernd Schmidt
2010-07-23 10:22   ` Ping^2: " Bernd Schmidt
2010-07-28 17:03     ` Richard Henderson
2010-07-28 17:03       ` Bernd Schmidt
2010-07-31 13:16         ` Richard Earnshaw
2010-08-04  0:00           ` Bernd Schmidt
2010-08-04  1:10             ` Bernd Schmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).