
#8590: Reduce code size of CAFs -------------------------------------+------------------------------------ Reporter: parcs | Owner: parcs Type: feature request | Status: patch Priority: normal | Milestone: Component: Compiler (NCG) | Version: 7.7 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: None/Unknown | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: -------------------------------------+------------------------------------ Changes (by parcs): * status: new => patch Comment: Proposed patch attached. To illustrate the change in code generation, consider the module {{{ #!haskell module CAF where a = "test" }}} Previously, the output Cmm looked like {{{ #!c CAF.a_entry() // [R1] { info_tbl: [(cCO, label: CAF.a_info rep:HeapRep static { Thunk })] stack_info: arg_space: 8 updfr_space: Just 8 } {offset cCO: _rnT::P64 = R1; if ((Sp + -16) < SpLim) goto cCP; else goto cCQ; cCQ: Hp = Hp + 16; if (Hp > HpLim) goto cCS; else goto cCR; cCS: HpAlloc = 16; goto cCP; cCP: R1 = _rnT::P64; call (stg_gc_enter_1)(R1) args: 8, res: 0, upd: 8; cCR: I64[Hp - 8] = stg_CAF_BLACKHOLE_info; I64[Hp] = CurrentTSO; (_cCK::I64) = call "ccall" arg hints: [PtrHint, PtrHint, PtrHint] result hints: [] newCAF(BaseReg, _rnT::P64, Hp - 8); if (_cCK::I64 == 0) goto cCM; else goto cCL; cCM: call (I64[_rnT::P64])() args: 8, res: 0, upd: 8; cCL: I64[Sp - 16] = stg_bh_upd_frame_info; P64[Sp - 8] = Hp - 8; R2 = cCN_str; Sp = Sp - 16; call GHC.CString.unpackCString#_info(R2) args: 24, res: 0, upd: 24; } }}} Now, the output Cmm looks like {{{ #!c CAF.a_entry() // [R1] { info_tbl: [(cCN, label: CAF.a_info rep:HeapRep static { Thunk })] stack_info: arg_space: 8 updfr_space: Just 8 } {offset cCN: if ((Sp + -16) < SpLim) goto cCO; else goto cCP; cCO: R1 = R1; call (stg_gc_enter_1)(R1) args: 8, res: 0, upd: 8; cCP: (_cCJ::I64) = call "ccall" arg hints: [PtrHint, PtrHint] result hints: [PtrHint] newCAF(BaseReg, R1); if (_cCJ::I64 == 0) goto cCL; else goto cCK; cCL: call (I64[R1])() args: 8, res: 0, upd: 8; cCK: I64[Sp - 16] = stg_bh_upd_frame_info; I64[Sp - 8] = _cCJ::I64; R2 = cCM_str; Sp = Sp - 16; call GHC.CString.unpackCString#_info(R2) args: 24, res: 0, upd: 24; } }}} Comparing object sizes: Before: {{{ text data bss dec hex filename 146 32 0 178 b2 caf.o }}} After: {{{ text data bss dec hex filename 92 32 0 124 7c caf.o }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8590#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler