Changes between Version 18 and Version 19 of Commentary/ResourceLimits


Ignore:
Timestamp:
Sep 2, 2013 9:58:47 AM (8 months ago)
Author:
ezyang
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Commentary/ResourceLimits

    v18 v19  
    3535=== CAF Allocation === 
    3636 
    37 [[GhcFile(compiler/codeGen/StgCmmBind.hs)]]:link_caf 
    38  
    39 {{{ 
    40 // this is not part of link_caf, see thunkCode 
    41          Hp = Hp + 32; 
    42          if (Hp > HpLim) goto cms; 
    43 //   ; hp_rel <- allocDynClosureCmm Nothing cafBlackHoleInfoTable mkLFBlackHole use_cc blame_cc [(tso,fixedHdrSize dflags)] 
    44          I64[I64[R1 + 8] + 72] = I64[I64[R1 + 8] + 72] + %MO_UU_Conv_W64_W64(4 - 2); 
    45          I64[Hp - 24] = stg_CAF_BLACKHOLE_info; 
    46          I64[Hp - 16] = I64[R1 + 8]; // DIFFERENCE: costCentreFrom dflags (CmmReg nodeReg) 
    47          I64[Hp - 8] = (%MO_UU_Conv_W32_W64(I32[era]) << 30) | 0; 
    48          I64[Hp + 0] = CurrentTSO; 
    49 //  emitRtsCallGen [(ret,NoHint)] (mkForeignLabel (fsLit "newCAF") Nothing ForeignLabelInExternalPackage IsFunction) ... 
    50          (_cmt::I64,) = foreign "ccall" 
    51            newCAF((BaseReg, PtrHint), (R1, PtrHint), (Hp - 24, PtrHint)); 
    52 // Atomic CAF entry 
    53          if (_cmt::I64 == 0) goto cmu; 
    54          goto cmv; 
    55  
    56 }}} 
    57  
    58 Changes to (XXX): 
    59  
    60 {{{ 
    61 // XXX change nursery to Bdescr(R1)->rc 
    62          Hp = Hp + 16; 
    63          if (Hp > HpLim) goto cms; 
    64          I64[Hp - 8] = stg_CAF_BLACKHOLE_info; 
    65          I64[Hp + 0] = CurrentTSO; 
    66 // XXX change nursery back, new heap check? 
    67          (_cmt::I64,) = foreign "ccall" 
    68            newCAF((BaseReg, PtrHint), (R1, PtrHint), (Hp - 24, PtrHint)); 
    69          if (_cmt::I64 == 0) goto cmu; 
    70          goto cmv; 
    71 }}} 
     37[[GhcFile(compiler/codeGen/StgCmmBind.hs)]]:thunkCode 
    7238 
    7339Here is an interesting bugger: 
    7440 
    7541{{{ 
    76  sat_s15K_info() 
    77          { label: sat_s15K_info 
    78            rep:HeapRep static { Thunk } 
    79            type: [73,79] 
    80            desc: [60,109,97,105,110,58,77,97,105,110,46,115,97,116,95,115,49,53,75,62] 
    81          } 
     42// ldvEnterClosure 
    8243     c17Q: 
    8344         if (%MO_UU_Conv_W32_W64(I32[era]) > 0) goto c17R; 
     
    8647         I64[R1 + 16] = I64[R1 + 16] & 1152921503533105152 | %MO_UU_Conv_W32_W64(I32[era]) | 1152921504606846976; 
    8748         goto c17S; 
     49// entryHeapCheck 
    8850     c17S: 
    8951         if (Sp - 80 < SpLim) goto c17U; 
    9052         Hp = Hp + 64; 
    9153         if (Hp > HpLim) goto c17W; 
     54// setupUpdate 
     55//// linkCaf 
    9256         I64[I64[R1 + 8] + 72] = I64[I64[R1 + 8] + 72] + %MO_UU_Conv_W64_W64(4 - 2); 
    9357         I64[Hp - 56] = stg_CAF_BLACKHOLE_info; 
     
    9963         if (_c17X::I64 == 0) goto c17Y; 
    10064         goto c17Z; 
    101      c17U: jump stg_gc_enter_1; // [R1] 
    102      c17W: 
    103          HpAlloc = 64; 
    104          goto c17U; 
    105      c17Y: jump I64[R1]; // [R1] 
    10665     c17Z: 
     66//// pushUpdateFrame 
    10767         I64[Sp - 32] = stg_bh_upd_frame_info; 
    10868         I64[Sp - 8] = Hp - 56; 
    10969         I64[Sp - 24] = CCCS; 
     70// enterCostCentreThunk 
    11071         CCCS = I64[R1 + 8]; 
    11172         I64[CCCS + 72] = I64[CCCS + 72] + %MO_UU_Conv_W64_W64(4 - 2); 
     73// cgExpr body 
    11274         I64[Hp - 24] = GHC.Integer.Type.S#_con_info; 
    11375         I64[Hp - 16] = CCCS; 
     
    12385         Sp = Sp - 80; 
    12486         jump GHC.Num.fromInteger_info; // [R2] 
    125  }] 
     87     c17U: jump stg_gc_enter_1; // [R1] 
     88     c17W: 
     89         HpAlloc = 64; 
     90         goto c17U; 
     91     c17Y: jump I64[R1]; // [R1] 
    12692}}} 
    12793 
    12894Notice the heap check serves for the later branch too. On the other hand, the CCCS coincides with the later change. This seems to be the general pattern. So we might be able to handle this CAF by special-casing CAFs. 
     95 
     96{{{ 
     97         _crc = Bdescr(Hp)->rc; 
     98         CHANGE_NURSERY(I64[R1 + 8]); 
     99// entryHeapCheck 
     100     c17S: 
     101         if (Sp - 80 < SpLim) goto c17U; 
     102         Hp = Hp + 32; 
     103         if (Hp > HpLim) goto c17W; 
     104// setupUpdate 
     105//// linkCaf 
     106         I64[Hp - 24] = stg_CAF_BLACKHOLE_info; 
     107         I64[Hp - 16] = CurrentTSO; 
     108         (_c17X::I64,) = foreign "ccall" 
     109           newCAF((BaseReg, PtrHint), (R1, PtrHint), (Hp - 56, PtrHint)); 
     110         if (_c17X::I64 == 0) goto c17Y; 
     111         goto c17Z; 
     112     c17Z: 
     113//// pushUpdateFrame 
     114         I64[Sp - 32] = stg_bh_upd_frame_info; 
     115         I64[Sp - 8] = Hp - 56; 
     116         I64[Sp - 24] = _crc; // *** 
     117// cgExpr body 
     118         I64[Hp - 8] = GHC.Integer.Type.S#_con_info; 
     119         I64[Hp + 0] = 2; 
     120         I64[Sp - 56] = Hp - 23; 
     121         I64[Sp - 64] = stg_ap_p_info; 
     122         I64[Sp - 72] = Bdescr(Hp)->rc; // *** 
     123         I64[Sp - 80] = stg_restore_crc_info; // *** 
     124         R2 = Foreign.C.Types.$fNumCInt_closure; 
     125         I64[Sp - 48] = s15P_info; 
     126         Sp = Sp - 80; 
     127         jump GHC.Num.fromInteger_info; // [R2] 
     128     c17U: jump stg_gc_enter_1; // [R1] 
     129     c17W: 
     130         HpAlloc = 32; 
     131         goto c17U; 
     132     c17Y: jump I64[R1]; // [R1] 
     133}}} 
     134 
     135We also hit the slow function application path. 
    129136 
    130137=== Thunk code ===