summaryrefslogtreecommitdiff
path: root/gcc/rtlanal.c
diff options
context:
space:
mode:
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-02 00:38:21 +0000
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>2007-01-02 00:38:21 +0000
commit8ef3d190e91c016d268433ab18b8d661fe623189 (patch)
tree3a591d5196a5a6c1c2ecdc330d7d323242f600da /gcc/rtlanal.c
parent09b1890ec92d55ccb2e9c91d72164a1f0356330c (diff)
downloadgcc-8ef3d190e91c016d268433ab18b8d661fe623189.tar.gz
gcc:
PR middle-end/30311 * caller-save.c (add_stored_regs): Only handle SUBREGs if inner REG is a hard register. Do not modify REG before calling subreg_nregs. * rtlanal.c (subreg_get_info): Don't assert size of XMODE is a multiple of the size of YMODE for certain lowpart cases. gcc/testsuite: * gcc.c-torture/compile/pr30311.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120329 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r--gcc/rtlanal.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index bc2da3c7e2a..2d156638b6d 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -1,6 +1,6 @@
/* Analyze RTL for GNU compiler.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
Foundation, Inc.
This file is part of GCC.
@@ -3057,6 +3057,13 @@ subreg_get_info (unsigned int xregno, enum machine_mode xmode,
{
info->representable_p = true;
rknown = true;
+
+ if (offset == 0 || nregs_xmode == nregs_ymode)
+ {
+ info->offset = 0;
+ info->nregs = nregs_ymode;
+ return;
+ }
}
/* This should always pass, otherwise we don't know how to verify