diff --git a/mercurial/revlog.py b/mercurial/revlog.py
index 478f3379768aecf737fed585f4b4de373784cabf_bWVyY3VyaWFsL3JldmxvZy5weQ==..e92650e39f1cd8ff7565c583e8bf0fa0bdac364d_bWVyY3VyaWFsL3JldmxvZy5weQ== 100644
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -200,7 +200,7 @@
         self.datafile = indexfile[:-2] + ".d"
         self.opener = opener
         self._cache = None
-        self._basecache = (0, 0)
+        self._basecache = None
         self._chunkcache = (0, '')
         self.index = []
         self._pcache = {}
@@ -1095,6 +1095,8 @@
         offset = self.end(prev)
         flags = 0
         d = None
+        if self._basecache is None:
+            self._basecache = (prev, self.chainbase(prev))
         basecache = self._basecache
         p1r, p2r = self.rev(p1), self.rev(p2)
 
diff --git a/tests/test-generaldelta.t b/tests/test-generaldelta.t
new file mode 100755
index 0000000000000000000000000000000000000000..e92650e39f1cd8ff7565c583e8bf0fa0bdac364d_dGVzdHMvdGVzdC1nZW5lcmFsZGVsdGEudA==
--- /dev/null
+++ b/tests/test-generaldelta.t
@@ -0,0 +1,23 @@
+Check whether size of generaldelta revlog is not bigger than its
+regular equivalent. Test would fail if generaldelta was naive
+implementation of parentdelta: third manifest revision would be fully
+inserted due to big distance from its paren revision (zero).
+
+  $ hg init repo
+  $ cd repo
+  $ echo foo > foo
+  $ echo bar > bar
+  $ hg commit -q -Am boo
+  $ hg clone --pull . ../gdrepo -q --config format.generaldelta=yes
+  $ for r in 1 2 3; do
+  >   echo $r > foo
+  >   hg commit -q -m $r
+  >   hg up -q -r 0
+  >   hg pull . -q -r $r -R ../gdrepo
+  > done
+  $ cd ..
+  $ regsize=`du -s -b repo/.hg/store/00manifest.i | cut -f 1`
+  $ gdsize=`du -s -b gdrepo/.hg/store/00manifest.i | cut -f 1`
+  $ if ((regsize < gdsize)); then
+  >   echo 'generaldelta increased size of a revlog!'
+  > fi