{-# LANGUAGE BangPatterns #-}{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE GADTs #-}{-# LANGUAGE ScopedTypeVariables #-}moduleCmmLive(CmmLocalLive ,cmmLocalLiveness ,cmmGlobalLiveness ,liveLattice ,gen_kill )whereimportGhcPrelude importDynFlags importBlockId importCmm importPprCmmExpr ()importHoopl.Block importHoopl.Collections importHoopl.Dataflow importHoopl.Label importMaybes importOutputable ------------------------------------------------------------------------------- Calculating what variables are live on entry to a basic block------------------------------------------------------------------------------- | The variables live on entry to a blocktypeCmmLive r =RegSet r typeCmmLocalLive =CmmLive LocalReg -- | The dataflow latticeliveLattice::Ordr =>DataflowLattice (CmmLive r ){-# SPECIALIZEliveLattice::DataflowLattice(CmmLiveLocalReg)#-}{-# SPECIALIZEliveLattice::DataflowLattice(CmmLiveGlobalReg)#-}liveLattice =DataflowLattice emptyRegSet add whereadd (OldFact old )(NewFact new )=let!join =plusRegSet old new inchangedIf (sizeRegSet join >sizeRegSet old )join -- | A mapping from block labels to the variables live on entrytypeBlockEntryLiveness r =LabelMap (CmmLive r )------------------------------------------------------------------------------- | Calculated liveness info for a CmmGraph-----------------------------------------------------------------------------cmmLocalLiveness::DynFlags ->CmmGraph ->BlockEntryLiveness LocalReg cmmLocalLiveness dflags graph =check $analyzeCmmBwd liveLattice (xferLive dflags )graph mapEmpty whereentry =g_entrygraph check facts =noLiveOnEntry entry (expectJust "check"$mapLookup entry facts )facts cmmGlobalLiveness::DynFlags ->CmmGraph ->BlockEntryLiveness GlobalReg cmmGlobalLiveness dflags graph =analyzeCmmBwd liveLattice (xferLive dflags )graph mapEmpty -- | On entry to the procedure, there had better not be any LocalReg's live-in.noLiveOnEntry::BlockId ->CmmLive LocalReg ->a ->a noLiveOnEntry bid in_fact x =ifnullRegSet in_fact thenx elsepprPanic "LocalReg's live-in to graph"(ppr bid <+> ppr in_fact )gen_kill::(DefinerOfRegs r n ,UserOfRegs r n )=>DynFlags ->n ->CmmLive r ->CmmLive r gen_kill dflags node set =let!afterKill =foldRegsDefd dflags deleteFromRegSet set node infoldRegsUsed dflags extendRegSet afterKill node {-# INLINEgen_kill#-}xferLive::forallr .(UserOfRegs r (CmmNode O O ),DefinerOfRegs r (CmmNode O O ),UserOfRegs r (CmmNode O C ),DefinerOfRegs r (CmmNode O C ))=>DynFlags ->TransferFun (CmmLive r )xferLive dflags (BlockCC eNode middle xNode )fBase =letjoined =gen_kill dflags xNode $!joinOutFacts liveLattice xNode fBase !result =foldNodesBwdOO (gen_kill dflags )middle joined inmapSingleton (entryLabel eNode )result {-# SPECIALIZExferLive::DynFlags->TransferFun(CmmLiveLocalReg)#-}{-# SPECIALIZExferLive::DynFlags->TransferFun(CmmLiveGlobalReg)#-}

AltStyle によって変換されたページ (->オリジナル) /