X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FStgStdThunks.cmm;h=be859995981d18236975aa8301f790a3d6b2a525;hb=cd47700887365ca2a6af17d03e731efce65cf2ac;hp=fecbb4c3c0f2a72b6ecf8fea2a363e48bc08442e;hpb=229fa59a85aa087900a07cdcc7200164db84f79b;p=ghc-hetmet.git diff --git a/rts/StgStdThunks.cmm b/rts/StgStdThunks.cmm index fecbb4c..be85999 100644 --- a/rts/StgStdThunks.cmm +++ b/rts/StgStdThunks.cmm @@ -52,7 +52,22 @@ * so we untag it before accessing the field. * */ -#define SELECTOR_CODE_UPD(offset) \ +#ifdef PROFILING +// When profiling, we cannot shortcut by checking the tag, +// because LDV profiling relies on entering closures to mark them as +// "used". +#define SEL_ENTER(offset) \ + R1 = UNTAG(R1); \ + jump %GET_ENTRY(R1); +#else +#define SEL_ENTER(offset) \ + if (GETTAG(R1) != 0) { \ + jump RET_LBL(stg_sel_ret_##offset##_upd); \ + } \ + jump %GET_ENTRY(R1); +#endif + +#define SELECTOR_CODE_UPD(offset) \ INFO_TABLE_RET(stg_sel_ret_##offset##_upd, RET_SMALL, RET_PARAMS) \ { \ R1 = StgClosure_payload(UNTAG(R1),offset); \ @@ -73,10 +88,7 @@ W_[Sp-WITHUPD_FRAME_SIZE] = stg_sel_ret_##offset##_upd_info; \ Sp = Sp - WITHUPD_FRAME_SIZE; \ R1 = StgThunk_payload(R1,0); \ - if (GETTAG(R1) != 0) { \ - jump RET_LBL(stg_sel_ret_##offset##_upd); \ - } \ - jump %GET_ENTRY(R1); \ + SEL_ENTER(offset); \ } /* NOTE: no need to ENTER() here, we know the closure cannot evaluate to a function, because we're going to do a field selection on the result. */