Do we have free bits in the info pointer itself?

Reid Barton rwbarton at
Thu Sep 8 03:55:38 UTC 2016

Good point. Also

* the high bits are free now, but they may not be free forever (though
that's not a great reason to avoid using them in the meantime)

* masking off the high bits when entering is rather expensive, at
least in code size, compared to a simple "jmp *%rax" or especially
"jmp *symb", which appears at the end of almost every Haskell function

* modifying the low bits of a pointer will leave it pointing at the
same cache line, so the hardware prefetcher may decide to prefetch the
contents (hopefully at an appropriate time) while modifying the high
bits will make it not look like a pointer at all. But it's hard to
know how much we currently gain from hardware prefetching, if

Certainly these downsides are not necessarily deal-breakers, as
demonstrated by NaN-boxing as used in major JavaScript engines.

What did you intend to use the high bits for?

Reid Barton

On Wed, Sep 7, 2016 at 11:16 PM, Edward Kmett <ekmett at> wrote:
> Mostly just that GHC still works on 32 bit platforms.
> -Edward
> On Wed, Sep 7, 2016 at 5:32 PM, Ryan Newton <rrnewton at> wrote:
>> Our heap object header is one word -- an info table pointer.
>> Well, a 64 bit info table pointer leaves *at least* 16 high bits inside
>> the object header for other purposes, right?
>> Is there any problem with using these other than having to mask the info
>> table pointer each time it is dereferenced?
>> Thanks,
>>   -Ryan
>> _______________________________________________
>> ghc-devs mailing list
>> ghc-devs at
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at

More information about the ghc-devs mailing list