diff options
author | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2020-04-01 13:31:35 +0300 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-10-22 07:41:30 -0400 |
commit | 86e6549ea3090d0d79c2aaed8373ba5696f2b6a9 (patch) | |
tree | e19574cf00d86db9193e6bb40aedc610100482e5 /rts/include | |
parent | 881720697d7d3297120a56a74e2a94e938d6aaa1 (diff) | |
download | haskell-86e6549ea3090d0d79c2aaed8373ba5696f2b6a9.tar.gz |
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>
Diffstat (limited to 'rts/include')
-rw-r--r-- | rts/include/stg/MiscClosures.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/rts/include/stg/MiscClosures.h b/rts/include/stg/MiscClosures.h index e6b4957e17..257d59a607 100644 --- a/rts/include/stg/MiscClosures.h +++ b/rts/include/stg/MiscClosures.h @@ -318,6 +318,10 @@ RTS_THUNK(stg_ap_5_upd); RTS_THUNK(stg_ap_6_upd); RTS_THUNK(stg_ap_7_upd); +// Standard entry for `unpackCString# str` thunks +RTS_ENTRY(stg_unpack_cstring); +RTS_ENTRY(stg_unpack_cstring_utf8); + /* standard application routines (see also utils/genapply, * and GHC.StgToCmm.ArgRep). */ |