]> git.ipfire.org Git - thirdparty/git.git/commitdiff
xdiff: remove "line_hash" field from xrecord_t
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Mon, 26 Jan 2026 10:48:51 +0000 (10:48 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Jan 2026 16:38:29 +0000 (08:38 -0800)
Prior to commit 6a26019c81 (xdiff: split xrecord_t.ha into line_hash
and minimal_perfect_hash, 2025-11-18) the "ha" field of xrecord_t
initially held the "line_hash" value and once the line had been
interned that field was updated to hold the "minimal_perfect_hash". The
"line_hash" is only used to intern the line so there is no point in
storing it after all the input lines have been interned.

Removing the "line_hash" field from xrecord_t and storing it in
xdlclass_t where it is actually used makes it clearer that it is a
temporary value and it should not be used once we're calculated the
"minimal_perfect_hash". This also reduces the size of xrecord_t by 25%
on 64-bit platforms and 40% on 32-bit platforms. While the struct is
small we create one instance per input line so any saving is welcome.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
xdiff/xprepare.c
xdiff/xtypes.h

index 34c82e4f8e162650c1ca79af0d19bbaa06ae9833..08e5d3f4dfafdc8ac923279dbe903c7bc1d5b476 100644 (file)
@@ -34,6 +34,7 @@
 #define INVESTIGATE 2
 
 typedef struct s_xdlclass {
+       uint64_t line_hash;
        struct s_xdlclass *next;
        xrecord_t rec;
        long idx;
@@ -92,13 +93,14 @@ static void xdl_free_classifier(xdlclassifier_t *cf) {
 }
 
 
-static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t *rec) {
+static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t *rec,
+                              uint64_t line_hash) {
        size_t hi;
        xdlclass_t *rcrec;
 
-       hi = XDL_HASHLONG(rec->line_hash, cf->hbits);
+       hi = XDL_HASHLONG(line_hash, cf->hbits);
        for (rcrec = cf->rchash[hi]; rcrec; rcrec = rcrec->next)
-               if (rcrec->rec.line_hash == rec->line_hash &&
+               if (rcrec->line_hash == line_hash &&
                                xdl_recmatch((const char *)rcrec->rec.ptr, (long)rcrec->rec.size,
                                        (const char *)rec->ptr, (long)rec->size, cf->flags))
                        break;
@@ -112,6 +114,7 @@ static int xdl_classify_record(unsigned int pass, xdlclassifier_t *cf, xrecord_t
                if (XDL_ALLOC_GROW(cf->rcrecs, cf->count, cf->alloc))
                                return -1;
                cf->rcrecs[rcrec->idx] = rcrec;
+               rcrec->line_hash = line_hash;
                rcrec->rec = *rec;
                rcrec->len1 = rcrec->len2 = 0;
                rcrec->next = cf->rchash[hi];
@@ -158,8 +161,7 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
                        crec = &xdf->recs[xdf->nrec++];
                        crec->ptr = prev;
                        crec->size = cur - prev;
-                       crec->line_hash = hav;
-                       if (xdl_classify_record(pass, cf, crec) < 0)
+                       if (xdl_classify_record(pass, cf, crec, hav) < 0)
                                goto abort;
                }
        }
index 979586f20a6028f8adc1cb82af1627493c99ddc7..50aee779be3583d845a11e23414277c0d1185a48 100644 (file)
@@ -41,7 +41,6 @@ typedef struct s_chastore {
 typedef struct s_xrecord {
        uint8_t const *ptr;
        size_t size;
-       uint64_t line_hash;
        size_t minimal_perfect_hash;
 } xrecord_t;