[GHC] #8199: Get rid of HEAP_ALLOCED
GHC
ghc-devs at haskell.org
Thu Nov 7 21:00:59 UTC 2013
#8199: Get rid of HEAP_ALLOCED
----------------------------+----------------------------------------------
Reporter: ezyang | Owner: ezyang
Type: feature | Status: new
request | Milestone: 7.10.1
Priority: normal | Version: 7.7
Component: | Keywords:
Compiler | Architecture: Unknown/Multiple
Resolution: | Difficulty: Project (more than a week)
Operating System: | Blocked By: 5435
Unknown/Multiple | Related Tickets:
Type of failure: |
None/Unknown |
Test Case: |
Blocking: |
----------------------------+----------------------------------------------
Comment (by ezyang):
Simon and I chatted about how to move this patchset forward last night on
IRC, I'm recording the main points here for posterity:
* Static closures originally did not work on Windows with shared libs.
Since these are now all copied to dynamic heap, it should be possible to
reinstate the Int/Char static closure optimization, among other things.
* This is a good step towards supporting multiple RTSes. However, we would
need to store the indirection table at an offset from BaseReg. It's not
obvious to me how to go about doing that, since we still need some
cooperation from the linker to manage all the offsets.
I ran some quick tests on the impact of this patch on the startup time of
GHC. It seems to add something like 0.02s to initialization time, which is
quite reasonable. Simon's primary other concern is binary size. The
primary things that are inflating binary size in this patch are as
follows:
* We are using movq (memory-to-register) instead of movl (constant-to-
register).
* If we were moving a static constructor into memory, we now need to do it
in two instructions, since there are no memory-to-memory movs:
{{{
- movq $s_closure+1,-24(%rbp)
+ movq s_static_closure_ind,%rax
+ movq %rax,-24(%rbp)
}}}
* The closures stored in the indirection tables are tagged, which means
that if the code expects an untagged closure, we need an extra instruction
to deal with it:
{{{
- movl $Main_and2_closure,%ebx
+ movq Main_and2_static_closure_ind,%rbx
+ andq $-8,%rbx
}}}
* The indirections table takes up one word per static closure
* The initialization code imposes a per-module cost
I don't know which of these are the biggest offenders yet.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8199#comment:18>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list