aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel1@de.ibm.com>2005-11-09 11:42:38 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2005-11-09 11:42:38 +0000
commit297a777d4748114bc58d17eb41d7b8026f20a711 (patch)
treedaab885ca761c1889ea819eca5b0410606e642a1 /gcc
parent7221b4a18ceb8d291f2d6f5f0d9f2b1bfccc058e (diff)
downloadgcc-297a777d4748114bc58d17eb41d7b8026f20a711.zip
gcc-297a777d4748114bc58d17eb41d7b8026f20a711.tar.gz
gcc-297a777d4748114bc58d17eb41d7b8026f20a711.tar.bz2
s390.c (s390_regs_ever_clobbered): Only save live eh regs for a function containing a landing pad.
2005-11-09 Andreas Krebbel <krebbel1@de.ibm.com> * config/s390/s390.c (s390_regs_ever_clobbered): Only save live eh regs for a function containing a landing pad. * testsuite/g++.dg/other/pr24623.C: Testcase added. From-SVN: r106687
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/s390/s390.c5
-rw-r--r--gcc/testsuite/g++.dg/other/pr24623.C69
3 files changed, 79 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index eddcaa9..d5043a7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2005-11-09 Andreas Krebbel <krebbel1@de.ibm.com>
+ * config/s390/s390.c (s390_regs_ever_clobbered): Only save live eh regs
+ for a function containing a landing pad.
+ * testsuite/g++.dg/other/pr24623.C: Testcase added.
+
+2005-11-09 Andreas Krebbel <krebbel1@de.ibm.com>
+
* flow.c (mark_set_1): Handle CLOBBERs like SETs if the register
is live afterwards.
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index cbb382d..75192e4 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -6009,7 +6009,10 @@ s390_regs_ever_clobbered (int *regs_ever_clobbered)
deal with this automatically. */
if (current_function_calls_eh_return || cfun->machine->has_landing_pad_p)
for (i = 0; EH_RETURN_DATA_REGNO (i) != INVALID_REGNUM ; i++)
- regs_ever_clobbered[EH_RETURN_DATA_REGNO (i)] = 1;
+ if (current_function_calls_eh_return
+ || (cfun->machine->has_landing_pad_p
+ && regs_ever_live [EH_RETURN_DATA_REGNO (i)]))
+ regs_ever_clobbered[EH_RETURN_DATA_REGNO (i)] = 1;
/* For nonlocal gotos all call-saved registers have to be saved.
This flag is also set for the unwinding code in libgcc.
diff --git a/gcc/testsuite/g++.dg/other/pr24623.C b/gcc/testsuite/g++.dg/other/pr24623.C
new file mode 100644
index 0000000..480bb39
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/pr24623.C
@@ -0,0 +1,69 @@
+/* This used to ICE due to a backend problem on s390. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+class ReferenceCounted
+{
+public:
+
+ virtual ~ ReferenceCounted ()
+ {
+ }
+ void decrementRefCount () const
+ {
+ if (--const_cast < unsigned int &>(_ref_count) == 0)
+ {
+ delete this;
+ }
+ }
+ unsigned int _ref_count;
+};
+
+template < class T > class RefCountPointer
+{
+public:
+
+RefCountPointer (T * p = 0):_p (p)
+ {
+ }
+ RefCountPointer & operator= (const RefCountPointer < T > &o)
+ {
+ if (_p != o._p)
+ {
+ if (_p != 0)
+ _p->decrementRefCount ();
+ }
+ }
+ ~RefCountPointer ()
+ {
+ }
+ T *_p;
+};
+class Item:public ReferenceCounted
+{
+public:
+
+ typedef RefCountPointer < const Item > Ptr;
+};
+class AnyAtomicType:public Item
+{
+};
+class StaticContext
+{
+};
+class DynamicContext:public StaticContext
+{
+};
+class SortableItem
+{
+ SortableItem ();
+ int m_bAscending:1;
+ DynamicContext *m_context;
+ AnyAtomicType::Ptr m_item;
+};
+SortableItem::SortableItem ()
+{
+ m_context = __null;
+ m_item = __null;
+}