X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fcmm%2Fcmm-notes;h=4a87911ec544ea5d076f73ea86a61751f50e74c0;hp=c0ccadfbecaa9673906f4e639d1adc4713733a15;hb=de2d10e18ce23e5df7fa4f3433b85c95d6092b58;hpb=ce8ae48278e629b8143edebe05347d92723fdf67 diff --git a/compiler/cmm/cmm-notes b/compiler/cmm/cmm-notes index c0ccadf..4a87911 100644 --- a/compiler/cmm/cmm-notes +++ b/compiler/cmm/cmm-notes @@ -1,3 +1,34 @@ +More notes (June 11) +~~~~~~~~~~~~~~~~~~~~ +* Possible refactoring: Nuke AGraph in favour of + mkIfThenElse :: Expr -> Graph -> Graph -> FCode Graph + or even + mkIfThenElse :: HasUniques m => Expr -> Graph -> Graph -> m Graph + (Remmber that the .cmm file parser must use this function) + + or parameterise FCode over its envt; the CgState part seem useful for both + +* "Remove redundant reloads" in CmmSpillReload should be redundant; since + insertLateReloads is now gone, every reload is reloading a live variable. + Test and nuke. + +* Sink and inline S(RegSlot(x)) = e in precisely the same way that we + sink and inline x = e + +* Stack layout is very like register assignment: find non-conflicting assigments. + In particular we can use colouring or linear scan (etc). + + We'd fine-grain interference (on a word by word basis) to get maximum overlap. + But that may make very big interference graphs. So linear scan might be + more attactive. + + NB: linear scan does on-the-fly live range splitting. + +* When stubbing dead slots be careful not to write into an area that + overlaps with an area that's in use. So stubbing needs to *follow* + stack layout. + + More notes (May 11) ~~~~~~~~~~~~~~~~~~~ In CmmNode, consider spliting CmmCall into two: call and jump @@ -217,7 +248,7 @@ CmmCvt.hs Conversion between old and new Cmm reps CmmOpt.hs Hopefully-redundant optimiser -------- Stuff to keep ------------ -CmmCPS.hs Driver for new pipeline +CmmPipeline.hs Driver for new pipeline CmmLive.hs Liveness analysis, dead code elim CmmProcPoint.hs Identifying and splitting out proc-points @@ -264,24 +295,24 @@ BlockId.hs BlockId, BlockEnv, BlockSet type RawCmm = GenCmm CmmStatic [CmmStatic] (ListGraph CmmStmt) * HscMain.tryNewCodeGen - - STG->Cmm: StgCmm.codeGen (new codegen) - - Optimise: CmmContFlowOpt (simple optimisations, very self contained) - - Cps convert: CmmCPS.protoCmmCPS - - Optimise: CmmContFlowOpt again - - Convert: CmmCvt.cmmOfZgraph (convert to old rep) very self contained + - STG->Cmm: StgCmm.codeGen (new codegen) + - Optimize and CPS: CmmPipeline.cmmPipeline + - Convert: CmmCvt.cmmOfZgraph (convert to old rep) very self contained * StgCmm.hs The new STG -> Cmm conversion code generator Lots of modules StgCmmXXX ---------------------------------------------------- - CmmCPS.protoCmmCPS The new pipeline + CmmPipeline.cmmPipeline The new pipeline ---------------------------------------------------- -CmmCPS.protoCmmCPS: - 1. Do cpsTop for each procedures separately - 2. Build SRT representation; this spans multiple procedures - (unless split-objs) +CmmPipeline.cmmPipeline: + 1. Do control flow optimization + 2. Do cpsTop for each procedures separately + 3. Build SRT representation; this spans multiple procedures + (unless split-objs) + 4. Do control flow optimization on all resulting procedures cpsTop: * CmmCommonBlockElim.elimCommonBlocks: @@ -419,7 +450,7 @@ a dominator analysis, using the Dataflow Engine. f's keep-alive refs to include h1. * The SRT info is the C_SRT field of Cmm.ClosureTypeInfo in a - CmmInfoTable attached to each CmmProc. CmmCPS.toTops actually does + CmmInfoTable attached to each CmmProc. CmmPipeline.toTops actually does the attaching, right at the end of the pipeline. The C_SRT part gives offsets within a single, shared table of closure pointers.