summaryrefslogtreecommitdiff
path: root/ghc
diff options
context:
space:
mode:
authorsimonmar <unknown>2003-07-28 16:05:39 +0000
committersimonmar <unknown>2003-07-28 16:05:39 +0000
commit387a411e5d6478249de6872c283f2df78ef83bf4 (patch)
treeea8ec8acc776e6049984fd2178429cd77d57a230 /ghc
parentcc19a5c807af2b8128943dfb18eed0a566218b13 (diff)
downloadhaskell-387a411e5d6478249de6872c283f2df78ef83bf4.tar.gz
[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.
Diffstat (limited to 'ghc')
-rw-r--r--ghc/compiler/absCSyn/AbsCSyn.lhs5
-rw-r--r--ghc/compiler/absCSyn/Costs.lhs3
-rw-r--r--ghc/compiler/absCSyn/PprAbsC.lhs2
-rw-r--r--ghc/compiler/codeGen/CgCon.lhs43
-rw-r--r--ghc/compiler/codeGen/CgHeapery.lhs39
-rw-r--r--ghc/compiler/nativeGen/StixMacro.lhs17
-rw-r--r--ghc/compiler/nativeGen/StixPrim.lhs4
-rw-r--r--ghc/includes/StgMacros.h4
-rw-r--r--ghc/includes/Updates.h9
-rw-r--r--ghc/mk/version.mk2
10 files changed, 8 insertions, 120 deletions
diff --git a/ghc/compiler/absCSyn/AbsCSyn.lhs b/ghc/compiler/absCSyn/AbsCSyn.lhs
index bf9b4abbd2..32c086691d 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 3163226e86..17ea6d57f4 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 00c8a7349b..f7b3118264 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 57bfffe748..c83a03527a 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 7cf05ca65e..2329dcb6d2 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 27b544c450..8c3dafbbe8 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 64932e3138..1e9f0292b7 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 2aecd4593a..473a590dc3 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 0467c07f80..3b9b5c02f3 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 97bcd987fd..ad758da42e 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