Introduce a standard thunk for allocating strings
Currently for a top-level closure in the form hey = unpackCString# x we generate code like this: Main.hey_entry() // [R1] { info_tbls: [(c2T4, label: Main.hey_info rep: HeapRep static { Thunk } srt: Nothing)] stack_info: arg_space: 8 updfr_space: Just 8 } {offset c2T4: // global _rqm::P64 = R1; if ((Sp + 8) - 24 < SpLim) (likely: False) goto c2T5; else goto c2T6; c2T5: // global R1 = _rqm::P64; call (stg_gc_enter_1)(R1) args: 8, res: 0, upd: 8; c2T6: // global (_c2T1::I64) = call "ccall" arg hints: [PtrHint, PtrHint] result hints: [PtrHint] newCAF(BaseReg, _rqm::P64); if (_c2T1::I64 == 0) goto c2T3; else goto c2T2; c2T3: // global call (I64[_rqm::P64])() args: 8, res: 0, upd: 8; c2T2: // global I64[Sp - 16] = stg_bh_upd_frame_info; I64[Sp - 8] = _c2T1::I64; R2 = hey1_r2Gg_bytes; Sp = Sp - 16; call GHC.CString.unpackCString#_info(R2) args: 24, res: 0, upd: 24; } } This code is generated for every string literal. Only difference between top-level closures like this is the argument for the bytes of the string (hey1_r2Gg_bytes in the code above). With this patch we introduce a standard thunk in the RTS, called stg_MK_STRING_info, that does what `unpackCString# x` does, except it gets the bytes address from the payload. Using this, for the closure above, we generate this: Main.hey_closure" { Main.hey_closure: const stg_MK_STRING_info; const 0; // padding for indirectee const 0; // static link const 0; // saved info const hey1_r1Gg_bytes; // the payload } This is much smaller in code. Metric Decrease: T10421 T11195 T12150 T12425 T16577 T18282 T18698a T18698b Co-Authored By: Ben Gamari <ben@well-typed.com>
parent
88172069
No related branches found
No related tags found
Pipeline #58197 canceled
Stage: tool-lint
Stage: quick-build
Stage: full-build
Stage: packaging
Stage: testing
Stage: deploy
Showing
- compiler/GHC/Cmm.hs 5 additions, 2 deletionscompiler/GHC/Cmm.hs
- compiler/GHC/Cmm/CLabel.hs 20 additions, 1 deletioncompiler/GHC/Cmm/CLabel.hs
- compiler/GHC/Cmm/Info/Build.hs 44 additions, 21 deletionscompiler/GHC/Cmm/Info/Build.hs
- compiler/GHC/Cmm/Parser.y 2 additions, 2 deletionscompiler/GHC/Cmm/Parser.y
- compiler/GHC/StgToCmm/Bind.hs 39 additions, 1 deletioncompiler/GHC/StgToCmm/Bind.hs
- compiler/GHC/StgToCmm/Heap.hs 10 additions, 8 deletionscompiler/GHC/StgToCmm/Heap.hs
- compiler/GHC/StgToCmm/Utils.hs 1 addition, 1 deletioncompiler/GHC/StgToCmm/Utils.hs
- rts/Prelude.h 2 additions, 0 deletionsrts/Prelude.h
- rts/RtsSymbols.c 4 additions, 1 deletionrts/RtsSymbols.c
- rts/StgStdThunks.cmm 100 additions, 0 deletionsrts/StgStdThunks.cmm
- rts/include/stg/MiscClosures.h 4 additions, 0 deletionsrts/include/stg/MiscClosures.h
Loading