summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>2002-08-24 03:20:33 +0000
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>2002-08-24 03:20:33 +0000
commitff34fd942ee0488bb75c9515f8e69ca26684d7c5 (patch)
treea77c2142c30ef92cd834b61d17ae51d942b6fc8d /gcc
parent077ce9785f3a56d7447f04aba890c912be2faf21 (diff)
downloadgcc-ff34fd942ee0488bb75c9515f8e69ca26684d7c5.tar.gz
* ggc-page.c (compute_inverse): Short circuit calculation for
object sizes larger than half a page. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@56548 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ggc-page.c12
2 files changed, 17 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 05a7437360a..3cf590b0ebb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-08-23 Zack Weinberg <zack@codesourcery.com>
+
+ * ggc-page.c (compute_inverse): Short circuit calculation for
+ object sizes larger than half a page.
+
2002-08-23 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/rs6000.c (rs6000_elf_select_section): Treat
diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c
index af3af1ab0bb..294bdfc49e4 100644
--- a/gcc/ggc-page.c
+++ b/gcc/ggc-page.c
@@ -1080,6 +1080,18 @@ compute_inverse (order)
{
unsigned size, inv, e;
+ /* There can be only one object per "page" in a bucket for sizes
+ larger than half a machine page; it will always have offset zero. */
+ if (OBJECT_SIZE (order) > G.pagesize/2)
+ {
+ if (OBJECTS_PER_PAGE (order) != 1)
+ abort ();
+
+ DIV_MULT (order) = 1;
+ DIV_SHIFT (order) = 0;
+ return;
+ }
+
size = OBJECT_SIZE (order);
e = 0;
while (size % 2 == 0)