aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2007-01-02 00:38:21 +0000
committerJoseph Myers <jsm28@gcc.gnu.org>2007-01-02 00:38:21 +0000
commita446b4e815275c0ba3ea5e2119b0084284777ac7 (patch)
tree3a591d5196a5a6c1c2ecdc330d7d323242f600da /gcc
parent27c293ef97537edd7745e096ebf92c8e8b20d85b (diff)
downloadgcc-a446b4e815275c0ba3ea5e2119b0084284777ac7.zip
gcc-a446b4e815275c0ba3ea5e2119b0084284777ac7.tar.gz
gcc-a446b4e815275c0ba3ea5e2119b0084284777ac7.tar.bz2
re PR middle-end/30311 (revision 120211 failed to compile perlbench)
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. From-SVN: r120329
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/caller-save.c11
-rw-r--r--gcc/rtlanal.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr30311.c16
5 files changed, 44 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4748fd6..fad6cfb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2007-01-02 Joseph Myers <joseph@codesourcery.com>
+
+ 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.
+
2007-01-01 Andrew Pinski <pinskia@gmail.com>
PR middle-end/30253
diff --git a/gcc/caller-save.c b/gcc/caller-save.c
index 86d74ee..54f88a1 100644
--- a/gcc/caller-save.c
+++ b/gcc/caller-save.c
@@ -1,6 +1,6 @@
/* Save and restore call-clobbered registers which are live across a call.
- Copyright (C) 1989, 1992, 1994, 1995, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1989, 1992, 1994, 1995, 1997, 1998, 1999, 2000,
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of GCC.
@@ -537,14 +537,15 @@ add_stored_regs (rtx reg, rtx setter, void *data)
if (GET_CODE (setter) == CLOBBER)
return;
- if (GET_CODE (reg) == SUBREG && REG_P (SUBREG_REG (reg)))
+ if (GET_CODE (reg) == SUBREG
+ && REG_P (SUBREG_REG (reg))
+ && REGNO (SUBREG_REG (reg)) < FIRST_PSEUDO_REGISTER)
{
offset = subreg_regno_offset (REGNO (SUBREG_REG (reg)),
GET_MODE (SUBREG_REG (reg)),
SUBREG_BYTE (reg),
GET_MODE (reg));
- reg = SUBREG_REG (reg);
- regno = REGNO (reg) + offset;
+ regno = REGNO (SUBREG_REG (reg)) + offset;
endregno = regno + subreg_nregs (reg);
}
else
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index bc2da3c..2d15663 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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ea08e48..b636d48 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-02 Joseph Myers <joseph@codesourcery.com>
+
+ PR middle-end/30311
+ * gcc.c-torture/compile/pr30311.c: New test.
+
2007-01-01 Andrew Pinski <pinskia@gmail.com>
PR middle-end/30253
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr30311.c b/gcc/testsuite/gcc.c-torture/compile/pr30311.c
new file mode 100644
index 0000000..85ce750
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr30311.c
@@ -0,0 +1,16 @@
+/* ICE in subreg_get_info: bug 30311. */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+inline double bar(double x)
+{
+ long double d;
+ __asm__ ("" : "=t" (d) : "0" (x));
+ return d;
+}
+
+double foo(double x)
+{
+ if (x)
+ return bar(x);
+ else
+ return bar(x);
+}