From 599824d24ab2e824ba8af60c123debc03023a94d Mon Sep 17 00:00:00 2001
From: Andreas Krebbel <krebbel1@de.ibm.com>
Date: Thu, 17 Jan 2008 16:18:59 +0000
Subject: [PATCH] global.c (find_reg): Mark the eh regs as used if necessary.

2008-01-17  Andreas Krebbel  <krebbel1@de.ibm.com>

	* global.c (find_reg): Mark the eh regs as used if necessary.
	* ra-conflict.c (global_conflicts): Set no_eh_reg flag.
	* ra.h (struct allocno): no_eh_reg field added.  Changed
	no_stack_reg type to bitfield.

From-SVN: r131601
---
 gcc/ChangeLog     |  7 +++++++
 gcc/global.c      | 10 ++++++++++
 gcc/ra-conflict.c |  5 +++++
 gcc/ra.h          |  7 ++++++-
 4 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 572b6edab601..c337e95a9c5a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2008-01-17  Andreas Krebbel  <krebbel1@de.ibm.com>
+
+	* global.c (find_reg): Mark the eh regs as used if necessary.
+	* ra-conflict.c (global_conflicts): Set no_eh_reg flag.
+	* ra.h (struct allocno): no_eh_reg field added.  Changed
+	no_stack_reg type to bitfield.
+
 2008-01-17  Eric Botcazou  <ebotcazou@adacore.com>
 
 	* tree.c (substitute_in_expr): Add missing 'break'.
diff --git a/gcc/global.c b/gcc/global.c
index 8be113df60a3..c805f572c7fe 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -1011,6 +1011,16 @@ find_reg (int num, HARD_REG_SET losers, int alt_regs_p, int accept_call_clobbere
     IOR_HARD_REG_SET (used1, losers);
 
   IOR_COMPL_HARD_REG_SET (used1, reg_class_contents[(int) class]);
+
+#ifdef EH_RETURN_DATA_REGNO
+  if (allocno[num].no_eh_reg)
+    {
+      unsigned int j;
+      for (j = 0; EH_RETURN_DATA_REGNO (j) != INVALID_REGNUM; j++)
+	SET_HARD_REG_BIT (used1, EH_RETURN_DATA_REGNO (j));
+    }
+#endif
+
   COPY_HARD_REG_SET (used2, used1);
 
   IOR_HARD_REG_SET (used1, allocno[num].hard_reg_conflicts);
diff --git a/gcc/ra-conflict.c b/gcc/ra-conflict.c
index bc93b8918173..ce1dfdfcfb77 100644
--- a/gcc/ra-conflict.c
+++ b/gcc/ra-conflict.c
@@ -1184,6 +1184,11 @@ global_conflicts (void)
 		break;
 	      record_one_conflict (allocnos_live, &hard_regs_live, regno);
 	    }
+
+	  EXECUTE_IF_SET_IN_SPARSESET (allocnos_live, i)
+	    {
+	      allocno[i].no_eh_reg = 1;
+	    }
 	}
 #endif
 
diff --git a/gcc/ra.h b/gcc/ra.h
index 4081df347cad..c7e12a7b0c5f 100644
--- a/gcc/ra.h
+++ b/gcc/ra.h
@@ -75,9 +75,14 @@ struct allocno
 
   HARD_REG_SET regs_someone_prefers;
 
+#ifdef EH_RETURN_DATA_REGNO
+  /* Set to true if allocno can't be allocated in an eh register.  */
+  unsigned int no_eh_reg:1;
+#endif
+
 #ifdef STACK_REGS
   /* Set to true if allocno can't be allocated in the stack register.  */
-  bool no_stack_reg;
+  unsigned int no_stack_reg:1;
 #endif
 };
 extern struct allocno *allocno;
-- 
GitLab