Ptr should have a phantom role
In GHC.Ptr we see
type role Ptr representational
data Ptr a = Ptr Addr# deriving (Eq, Ord)
with no comments. Why is Ptr representational?
In the same module we have castPtr:
castPtr :: Ptr a -> Ptr b
castPtr (Ptr addr) = Ptr addr
which unpacks and repacks a Ptr. If Ptr was phantom, we could use coerce. And that in turn would actually make a lot of code more efficient – there are lots of calls to castPtr. Specifically, in nofib, I tried implementing castPtr with unsafeCoerce. Then I found:
- 12% less allocation in
reverse-complem - 7.3% less allocation in
fasta. - Binary sizes fell 0.1%.
Both these benchmarks are ones that do a lot of I/O, and it turns out that GHC.IO.Handle.Text.$wa1 has a castPtr that (all by itself) accounts for 12% of reverse-complem's total allocation! So making castPtr free is good.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.8.2 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |