From 387a411e5d6478249de6872c283f2df78ef83bf4 Mon Sep 17 00:00:00 2001 From: simonmar Date: Mon, 28 Jul 2003 16:05:39 +0000 Subject: [PATCH] [project @ 2003-07-28 16:05:30 by simonmar] Disable update-in-place. In its current form, it has a serious bug: if the thunk being updated happens to have turned into a BLACKHOLE_BQ, then the mutable list will be corrupted by the update. Disabling update-in-place has some performance implications: many programs are not affected, but one program in nofib (nucleic2) goes about 20% slower. However, I can get it to go 300% faster by adding a few strictness annotations and compiling with -funbox-strict-fields. --- ghc/compiler/absCSyn/AbsCSyn.lhs | 5 +--- ghc/compiler/absCSyn/Costs.lhs | 3 +-- ghc/compiler/absCSyn/PprAbsC.lhs | 2 -- ghc/compiler/codeGen/CgCon.lhs | 43 +--------------------------------- ghc/compiler/codeGen/CgHeapery.lhs | 39 ++---------------------------- ghc/compiler/nativeGen/StixMacro.lhs | 17 -------------- ghc/compiler/nativeGen/StixPrim.lhs | 4 ---- ghc/includes/StgMacros.h | 4 +--- ghc/includes/Updates.h | 9 +------ ghc/mk/version.mk | 2 +- 10 files changed, 8 insertions(+), 120 deletions(-) diff --git a/ghc/compiler/absCSyn/AbsCSyn.lhs b/ghc/compiler/absCSyn/AbsCSyn.lhs index bf9b4ab..32c0866 100644 --- a/ghc/compiler/absCSyn/AbsCSyn.lhs +++ b/ghc/compiler/absCSyn/AbsCSyn.lhs @@ -1,7 +1,7 @@ % % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -% $Id: AbsCSyn.lhs,v 1.54 2003/07/18 14:39:06 simonmar Exp $ +% $Id: AbsCSyn.lhs,v 1.55 2003/07/28 16:05:30 simonmar Exp $ % \section[AbstractC]{Abstract C: the last stop before machine code} @@ -251,8 +251,6 @@ data CStmtMacro -- dataToTag# primop -- *only* used in unregisterised builds. -- (see AbsCUtils.dsCOpStmt) | DATA_TO_TAGZH - | AWAKEN_BQ_CLOSURE -- possibly awaken a blocking quuee - -- (used for in-place updates) | REGISTER_FOREIGN_EXPORT -- register a foreign exported fun | REGISTER_IMPORT -- register an imported module @@ -365,7 +363,6 @@ data CExprMacro = ENTRY_CODE | ARG_TAG -- stack argument tagging | GET_TAG -- get current constructor tag - | UPD_FRAME_UPDATEE | CCS_HDR | BYTE_ARR_CTS -- used when passing a ByteArray# to a ccall | PTRS_ARR_CTS -- similarly for an Array# diff --git a/ghc/compiler/absCSyn/Costs.lhs b/ghc/compiler/absCSyn/Costs.lhs index 3163226..17ea6d5 100644 --- a/ghc/compiler/absCSyn/Costs.lhs +++ b/ghc/compiler/absCSyn/Costs.lhs @@ -1,7 +1,7 @@ % % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -% $Id: Costs.lhs,v 1.32 2002/12/11 15:36:22 simonmar Exp $ +% $Id: Costs.lhs,v 1.33 2003/07/28 16:05:30 simonmar Exp $ % % Only needed in a GranSim setup -- HWL % --------------------------------------------------------------------------- @@ -301,7 +301,6 @@ exprMacroCosts side macro mode_list = ENTRY_CODE -> nullCosts -- nothing ARG_TAG -> nullCosts -- nothing GET_TAG -> Cost (0, 0, 1, 0, 0) -- indirect load - UPD_FRAME_UPDATEE -> Cost (0, 0, 1, 0, 0) -- indirect load -- --------------------------------------------------------------------------- diff --git a/ghc/compiler/absCSyn/PprAbsC.lhs b/ghc/compiler/absCSyn/PprAbsC.lhs index 00c8a73..f7b3118 100644 --- a/ghc/compiler/absCSyn/PprAbsC.lhs +++ b/ghc/compiler/absCSyn/PprAbsC.lhs @@ -1294,7 +1294,6 @@ ppr_amode (CMacroExpr pk macro as) cExprMacroText ENTRY_CODE = SLIT("ENTRY_CODE") cExprMacroText ARG_TAG = SLIT("ARG_TAG") cExprMacroText GET_TAG = SLIT("GET_TAG") -cExprMacroText UPD_FRAME_UPDATEE = SLIT("UPD_FRAME_UPDATEE") cExprMacroText CCS_HDR = SLIT("CCS_HDR") cExprMacroText BYTE_ARR_CTS = SLIT("BYTE_ARR_CTS") cExprMacroText PTRS_ARR_CTS = SLIT("PTRS_ARR_CTS") @@ -1306,7 +1305,6 @@ cStmtMacroText UPD_BH_SINGLE_ENTRY = SLIT("UPD_BH_SINGLE_ENTRY") cStmtMacroText PUSH_UPD_FRAME = SLIT("PUSH_UPD_FRAME") cStmtMacroText SET_TAG = SLIT("SET_TAG") cStmtMacroText DATA_TO_TAGZH = SLIT("dataToTagzh") -cStmtMacroText AWAKEN_BQ_CLOSURE = SLIT("AWAKEN_BQ_CLOSURE") cStmtMacroText REGISTER_FOREIGN_EXPORT = SLIT("REGISTER_FOREIGN_EXPORT") cStmtMacroText REGISTER_IMPORT = SLIT("REGISTER_IMPORT") cStmtMacroText REGISTER_DIMPORT = SLIT("REGISTER_DIMPORT") diff --git a/ghc/compiler/codeGen/CgCon.lhs b/ghc/compiler/codeGen/CgCon.lhs index 57bfffe..c83a035 100644 --- a/ghc/compiler/codeGen/CgCon.lhs +++ b/ghc/compiler/codeGen/CgCon.lhs @@ -32,7 +32,7 @@ import CgUsages ( getRealSp, getVirtSp, setRealAndVirtualSp, import CgRetConv ( assignRegs ) import Constants ( mAX_INTLIKE, mIN_INTLIKE, mAX_CHARLIKE, mIN_CHARLIKE, mIN_UPD_SIZE ) -import CgHeapery ( allocDynClosure, inPlaceAllocDynClosure ) +import CgHeapery ( allocDynClosure ) import CgTailCall ( performReturn, mkStaticAlgReturnCode, returnUnboxedTuple ) import CLabel ( mkClosureLabel ) @@ -316,47 +316,6 @@ cgReturnDataCon con amodes jump_to_join_point sequel = absC (CJump (CLbl deflt_lbl CodePtrRep)) -- Ignore the sequel: we've already looked at it above - -- If the sequel is an update frame, we might be able to - -- do update in place... - UpdateCode - | not (isNullaryDataCon con) -- no nullary constructors, please - && not (any isFollowableRep (map getAmodeRep amodes)) - -- no ptrs please (generational gc...) - && closureSize closure_info <= mIN_UPD_SIZE - -- don't know the real size of the - -- thunk, so assume mIN_UPD_SIZE - - -> -- get a new temporary and make it point to the updatee - let - uniq = getUnique con - temp = CTemp uniq PtrRep - in - - profCtrC FSLIT("TICK_UPD_CON_IN_PLACE") - [mkIntCLit (length amodes)] `thenC` - - getSpRelOffset args_sp `thenFC` \ sp_rel -> - absC (CAssign temp - (CMacroExpr PtrRep UPD_FRAME_UPDATEE [CAddr sp_rel])) - `thenC` - - -- stomp all over it with the new constructor - inPlaceAllocDynClosure closure_info temp (CReg CurCostCentre) stuff - `thenC` - - -- set Node to point to the closure being returned - -- (can't be done earlier: node might conflict with amodes) - absC (CAssign (CReg node) temp) `thenC` - - -- pop the update frame off the stack, and do the proper - -- return. - let new_sp = args_sp - updateFrameSize in - setEndOfBlockInfo (EndOfBlockInfo new_sp (OnStack new_sp)) $ - performReturn (AbsCNop) (mkStaticAlgReturnCode con) - - where - (closure_info, stuff) = layOutDynConstr con getAmodeRep amodes - other_sequel -- The usual case | isUnboxedTupleCon con -> returnUnboxedTuple amodes | otherwise -> build_it_then (mkStaticAlgReturnCode con) diff --git a/ghc/compiler/codeGen/CgHeapery.lhs b/ghc/compiler/codeGen/CgHeapery.lhs index 7cf05ca..2329dcb 100644 --- a/ghc/compiler/codeGen/CgHeapery.lhs +++ b/ghc/compiler/codeGen/CgHeapery.lhs @@ -1,14 +1,14 @@ % % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -% $Id: CgHeapery.lhs,v 1.38 2003/07/18 14:39:06 simonmar Exp $ +% $Id: CgHeapery.lhs,v 1.39 2003/07/28 16:05:35 simonmar Exp $ % \section[CgHeapery]{Heap management functions} \begin{code} module CgHeapery ( funEntryChecks, altHeapCheck, unbxTupleHeapCheck, thunkChecks, - allocDynClosure, inPlaceAllocDynClosure + allocDynClosure, -- new functions, basically inserting macro calls into Code -- HWL ,fetchAndReschedule, yield @@ -368,38 +368,3 @@ allocDynClosure closure_info use_cc blame_cc amodes_with_offsets closure_size = closureSize closure_info slop_size = slopSize closure_info \end{code} - -Occasionally we can update a closure in place instead of allocating -new space for it. This is the function that does the business, assuming: - - - the new closure doesn't contain any pointers if we're - using a generational collector. - -\begin{code} -inPlaceAllocDynClosure - :: ClosureInfo - -> CAddrMode -- Pointer to beginning of closure - -> CAddrMode -- Cost Centre to stick in the object - - -> [(CAddrMode, VirtualHeapOffset)] -- Offsets from start of the object - -- ie Info ptr has offset zero. - -> Code - -inPlaceAllocDynClosure closure_info head use_cc amodes_with_offsets - = let -- do_move IS THE ASSIGNMENT FUNCTION - do_move (amode, offset_from_start) - = CAssign (CVal (CIndex head (mkIntCLit offset_from_start) WordRep) - (getAmodeRep amode)) - amode - in - -- GENERATE THE CODE - absC ( mkAbstractCs ( - [ - -- don't forget to AWAKEN_BQ_CLOSURE: even though we're - -- doing update-in-place, the thunk might still have been - -- blackholed and another thread might be waiting on it. - CMacroStmt AWAKEN_BQ_CLOSURE [head], - CInitHdr closure_info head use_cc 0{-no alloc-} - ] - ++ (map do_move amodes_with_offsets))) -\end{code} diff --git a/ghc/compiler/nativeGen/StixMacro.lhs b/ghc/compiler/nativeGen/StixMacro.lhs index 27b544c..8c3dafb 100644 --- a/ghc/compiler/nativeGen/StixMacro.lhs +++ b/ghc/compiler/nativeGen/StixMacro.lhs @@ -116,23 +116,6 @@ macroCode SET_TAG [tag] ----------------------------------------------------------------------------- \begin{code} -macroCode AWAKEN_BQ_CLOSURE [arg] - = getUniqLabelNCG `thenUs` \ label -> - let - info = StInd AddrRep arg - cond = StMachOp MO_Nat_Ne [info, bq_info ] - jump = StCondJump label cond - blocking_queue = StInd PtrRep - (StIndex PtrRep arg (StInt (toInteger fixedHdrSize))) - call = StVoidable (StCall (Left FSLIT("awakenBlockedQueue")) - CCallConv VoidRep [blocking_queue]) - in - returnUs ( \xs -> jump : call : StLabel label : xs ) -\end{code} - ------------------------------------------------------------------------------ - -\begin{code} macroCode REGISTER_IMPORT [arg] = returnUs ( \xs -> StAssignMem WordRep (StReg stgSp) arg diff --git a/ghc/compiler/nativeGen/StixPrim.lhs b/ghc/compiler/nativeGen/StixPrim.lhs index 64932e3..1e9f029 100644 --- a/ghc/compiler/nativeGen/StixPrim.lhs +++ b/ghc/compiler/nativeGen/StixPrim.lhs @@ -214,10 +214,6 @@ amodeToStix (CMacroExpr _ macro [arg]) (StInt (toInteger (-1)))), StInt 16] #endif - UPD_FRAME_UPDATEE - -> StInd PtrRep (StIndex PtrRep arg_amode - (StInt (toInteger uF_UPDATEE))) - BYTE_ARR_CTS -> StIndex IntRep arg_amode arrWordsHS PTRS_ARR_CTS -> StIndex PtrRep arg_amode arrPtrsHS ForeignObj_CLOSURE_DATA -> StInd PtrRep (StIndex PtrRep arg_amode fixedHS) diff --git a/ghc/includes/StgMacros.h b/ghc/includes/StgMacros.h index 2aecd45..473a590 100644 --- a/ghc/includes/StgMacros.h +++ b/ghc/includes/StgMacros.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgMacros.h,v 1.53 2003/04/28 10:02:15 simonmar Exp $ + * $Id: StgMacros.h,v 1.54 2003/07/28 16:05:36 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -464,8 +464,6 @@ EXTFUN_RTS(stg_gen_block); # define UPD_BH_SINGLE_ENTRY(thunk) /* nothing */ #endif /* EAGER_BLACKHOLING */ -#define UPD_FRAME_UPDATEE(p) ((P_)(((StgUpdateFrame *)(p))->updatee)) - /* ----------------------------------------------------------------------------- Moving Floats and Doubles diff --git a/ghc/includes/Updates.h b/ghc/includes/Updates.h index 0467c07..3b9b5c0 100644 --- a/ghc/includes/Updates.h +++ b/ghc/includes/Updates.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Updates.h,v 1.32 2003/07/18 14:39:05 simonmar Exp $ + * $Id: Updates.h,v 1.33 2003/07/28 16:05:38 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -133,13 +133,6 @@ Awaken any threads waiting on this computation -------------------------------------------------------------------------- */ -#define AWAKEN_BQ_CLOSURE(closure) \ - { \ - const StgInfoTable *info; \ - info = ((StgClosure *)closure)->header.info; \ - AWAKEN_BQ(info,closure); \ - } - #if defined(PAR) /* diff --git a/ghc/mk/version.mk b/ghc/mk/version.mk index 97bcd98..ad758da 100644 --- a/ghc/mk/version.mk +++ b/ghc/mk/version.mk @@ -36,7 +36,7 @@ ProjectName = The Glorious Glasgow Haskell Compilation System ProjectNameShort = ghc -ProjectVersion = 6.1 +ProjectVersion = 6.1.20030727 ProjectVersionInt = 601 ProjectPatchLevel = 0 -- 1.7.10.4