* 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); \
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. */
* in the compiler that means stg_ap_1 is generated occasionally (ToDo)
*/
-INFO_TABLE(stg_ap_1_upd,1,1,THUNK_1_0,"stg_ap_1_upd_info","stg_ap_1_upd_info")
+INFO_TABLE(stg_ap_1_upd,1,0,THUNK_1_0,"stg_ap_1_upd_info","stg_ap_1_upd_info")
{
TICK_ENT_DYN_THK();
STK_CHK_NP(SIZEOF_StgUpdateFrame+WDS(1));