diff options
| author | Paul Eggert | 2020-01-07 11:23:11 -0800 |
|---|---|---|
| committer | Paul Eggert | 2020-01-07 11:29:41 -0800 |
| commit | f950b078a6f2fd011312e9471998edf6b5fb957e (patch) | |
| tree | b26243166a063e13787f19cdad5daf8864b7a151 | |
| parent | 72f54f035dc74a01c1ab5ff444752a994d852490 (diff) | |
| download | emacs-f950b078a6f2fd011312e9471998edf6b5fb957e.tar.gz emacs-f950b078a6f2fd011312e9471998edf6b5fb957e.zip | |
Help the compiler inline sxhash
* src/fns.c (sxhash_obj): Rename from sxhash and make
it static, so that the compiler can inline it better.
(sxhash): New function that does not take a depth arg.
All callers changed.
| -rw-r--r-- | src/fns.c | 19 | ||||
| -rw-r--r-- | src/image.c | 4 | ||||
| -rw-r--r-- | src/lisp.h | 2 |
3 files changed, 16 insertions, 9 deletions
| @@ -47,6 +47,7 @@ static void sort_vector_copy (Lisp_Object, ptrdiff_t, | |||
| 47 | enum equal_kind { EQUAL_NO_QUIT, EQUAL_PLAIN, EQUAL_INCLUDING_PROPERTIES }; | 47 | enum equal_kind { EQUAL_NO_QUIT, EQUAL_PLAIN, EQUAL_INCLUDING_PROPERTIES }; |
| 48 | static bool internal_equal (Lisp_Object, Lisp_Object, | 48 | static bool internal_equal (Lisp_Object, Lisp_Object, |
| 49 | enum equal_kind, int, Lisp_Object); | 49 | enum equal_kind, int, Lisp_Object); |
| 50 | static EMACS_UINT sxhash_obj (Lisp_Object, int); | ||
| 50 | 51 | ||
| 51 | DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0, | 52 | DEFUN ("identity", Fidentity, Sidentity, 1, 1, 0, |
| 52 | doc: /* Return the ARGUMENT unchanged. */ | 53 | doc: /* Return the ARGUMENT unchanged. */ |
| @@ -4022,7 +4023,7 @@ hashfn_eq (Lisp_Object key, struct Lisp_Hash_Table *h) | |||
| 4022 | Lisp_Object | 4023 | Lisp_Object |
| 4023 | hashfn_equal (Lisp_Object key, struct Lisp_Hash_Table *h) | 4024 | hashfn_equal (Lisp_Object key, struct Lisp_Hash_Table *h) |
| 4024 | { | 4025 | { |
| 4025 | return make_ufixnum (sxhash (key, 0)); | 4026 | return make_ufixnum (sxhash (key)); |
| 4026 | } | 4027 | } |
| 4027 | 4028 | ||
| 4028 | /* Ignore HT and return a hash code for KEY which uses 'eql' to compare keys. | 4029 | /* Ignore HT and return a hash code for KEY which uses 'eql' to compare keys. |
| @@ -4042,7 +4043,7 @@ hashfn_user_defined (Lisp_Object key, struct Lisp_Hash_Table *h) | |||
| 4042 | { | 4043 | { |
| 4043 | Lisp_Object args[] = { h->test.user_hash_function, key }; | 4044 | Lisp_Object args[] = { h->test.user_hash_function, key }; |
| 4044 | Lisp_Object hash = hash_table_user_defined_call (ARRAYELTS (args), args, h); | 4045 | Lisp_Object hash = hash_table_user_defined_call (ARRAYELTS (args), args, h); |
| 4045 | return FIXNUMP (hash) ? hash : make_ufixnum (sxhash (hash, 0)); | 4046 | return FIXNUMP (hash) ? hash : make_ufixnum (sxhash (hash)); |
| 4046 | } | 4047 | } |
| 4047 | 4048 | ||
| 4048 | struct hash_table_test const | 4049 | struct hash_table_test const |
| @@ -4606,13 +4607,13 @@ sxhash_list (Lisp_Object list, int depth) | |||
| 4606 | CONSP (list) && i < SXHASH_MAX_LEN; | 4607 | CONSP (list) && i < SXHASH_MAX_LEN; |
| 4607 | list = XCDR (list), ++i) | 4608 | list = XCDR (list), ++i) |
| 4608 | { | 4609 | { |
| 4609 | EMACS_UINT hash2 = sxhash (XCAR (list), depth + 1); | 4610 | EMACS_UINT hash2 = sxhash_obj (XCAR (list), depth + 1); |
| 4610 | hash = sxhash_combine (hash, hash2); | 4611 | hash = sxhash_combine (hash, hash2); |
| 4611 | } | 4612 | } |
| 4612 | 4613 | ||
| 4613 | if (!NILP (list)) | 4614 | if (!NILP (list)) |
| 4614 | { | 4615 | { |
| 4615 | EMACS_UINT hash2 = sxhash (list, depth + 1); | 4616 | EMACS_UINT hash2 = sxhash_obj (list, depth + 1); |
| 4616 | hash = sxhash_combine (hash, hash2); | 4617 | hash = sxhash_combine (hash, hash2); |
| 4617 | } | 4618 | } |
| 4618 | 4619 | ||
| @@ -4632,7 +4633,7 @@ sxhash_vector (Lisp_Object vec, int depth) | |||
| 4632 | n = min (SXHASH_MAX_LEN, hash & PSEUDOVECTOR_FLAG ? PVSIZE (vec) : hash); | 4633 | n = min (SXHASH_MAX_LEN, hash & PSEUDOVECTOR_FLAG ? PVSIZE (vec) : hash); |
| 4633 | for (i = 0; i < n; ++i) | 4634 | for (i = 0; i < n; ++i) |
| 4634 | { | 4635 | { |
| 4635 | EMACS_UINT hash2 = sxhash (AREF (vec, i), depth + 1); | 4636 | EMACS_UINT hash2 = sxhash_obj (AREF (vec, i), depth + 1); |
| 4636 | hash = sxhash_combine (hash, hash2); | 4637 | hash = sxhash_combine (hash, hash2); |
| 4637 | } | 4638 | } |
| 4638 | 4639 | ||
| @@ -4675,7 +4676,13 @@ sxhash_bignum (Lisp_Object bignum) | |||
| 4675 | structure. Value is an unsigned integer clipped to INTMASK. */ | 4676 | structure. Value is an unsigned integer clipped to INTMASK. */ |
| 4676 | 4677 | ||
| 4677 | EMACS_UINT | 4678 | EMACS_UINT |
| 4678 | sxhash (Lisp_Object obj, int depth) | 4679 | sxhash (Lisp_Object obj) |
| 4680 | { | ||
| 4681 | return sxhash_obj (obj, 0); | ||
| 4682 | } | ||
| 4683 | |||
| 4684 | static EMACS_UINT | ||
| 4685 | sxhash_obj (Lisp_Object obj, int depth) | ||
| 4679 | { | 4686 | { |
| 4680 | EMACS_UINT hash; | 4687 | EMACS_UINT hash; |
| 4681 | 4688 | ||
diff --git a/src/image.c b/src/image.c index 5fe0d713e1b..b4ce08eeb3c 100644 --- a/src/image.c +++ b/src/image.c | |||
| @@ -1616,7 +1616,7 @@ search_image_cache (struct frame *f, Lisp_Object spec, EMACS_UINT hash) | |||
| 1616 | static void | 1616 | static void |
| 1617 | uncache_image (struct frame *f, Lisp_Object spec) | 1617 | uncache_image (struct frame *f, Lisp_Object spec) |
| 1618 | { | 1618 | { |
| 1619 | struct image *img = search_image_cache (f, spec, sxhash (spec, 0)); | 1619 | struct image *img = search_image_cache (f, spec, sxhash (spec)); |
| 1620 | if (img) | 1620 | if (img) |
| 1621 | { | 1621 | { |
| 1622 | free_image (f, img); | 1622 | free_image (f, img); |
| @@ -2281,7 +2281,7 @@ lookup_image (struct frame *f, Lisp_Object spec) | |||
| 2281 | eassert (valid_image_p (spec)); | 2281 | eassert (valid_image_p (spec)); |
| 2282 | 2282 | ||
| 2283 | /* Look up SPEC in the hash table of the image cache. */ | 2283 | /* Look up SPEC in the hash table of the image cache. */ |
| 2284 | hash = sxhash (spec, 0); | 2284 | hash = sxhash (spec); |
| 2285 | img = search_image_cache (f, spec, hash); | 2285 | img = search_image_cache (f, spec, hash); |
| 2286 | if (img && img->load_failed_p) | 2286 | if (img && img->load_failed_p) |
| 2287 | { | 2287 | { |
diff --git a/src/lisp.h b/src/lisp.h index e1bbb53ad49..1a1ae0399be 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -3652,7 +3652,7 @@ extern bool sweep_weak_table (struct Lisp_Hash_Table *, bool); | |||
| 3652 | extern void hexbuf_digest (char *, void const *, int); | 3652 | extern void hexbuf_digest (char *, void const *, int); |
| 3653 | extern char *extract_data_from_object (Lisp_Object, ptrdiff_t *, ptrdiff_t *); | 3653 | extern char *extract_data_from_object (Lisp_Object, ptrdiff_t *, ptrdiff_t *); |
| 3654 | EMACS_UINT hash_string (char const *, ptrdiff_t); | 3654 | EMACS_UINT hash_string (char const *, ptrdiff_t); |
| 3655 | EMACS_UINT sxhash (Lisp_Object, int); | 3655 | EMACS_UINT sxhash (Lisp_Object); |
| 3656 | Lisp_Object hashfn_eql (Lisp_Object, struct Lisp_Hash_Table *); | 3656 | Lisp_Object hashfn_eql (Lisp_Object, struct Lisp_Hash_Table *); |
| 3657 | Lisp_Object hashfn_equal (Lisp_Object, struct Lisp_Hash_Table *); | 3657 | Lisp_Object hashfn_equal (Lisp_Object, struct Lisp_Hash_Table *); |
| 3658 | Lisp_Object hashfn_user_defined (Lisp_Object, struct Lisp_Hash_Table *); | 3658 | Lisp_Object hashfn_user_defined (Lisp_Object, struct Lisp_Hash_Table *); |