summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2008-01-17 16:18:59 +0000
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2008-01-17 16:18:59 +0000
commit74748e47c7c3af646d70012caeff51f5531d60cd (patch)
tree5121992dd80b8b1bb8673bf19c1c5051d0828766
parenta13ff5904a508ab8c3bc31344a2f29921f3de1d1 (diff)
downloadgcc-74748e47c7c3af646d70012caeff51f5531d60cd.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131601 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/global.c10
-rw-r--r--gcc/ra-conflict.c5
-rw-r--r--gcc/ra.h7
4 files changed, 28 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 572b6edab60..c337e95a9c5 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 8be113df60a..c805f572c7f 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 bc93b891817..ce1dfdfcfb7 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 4081df347ca..c7e12a7b0c5 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;