diff options
Diffstat (limited to 'compiler/cmm/CmmUtils.hs')
-rw-r--r-- | compiler/cmm/CmmUtils.hs | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/compiler/cmm/CmmUtils.hs b/compiler/cmm/CmmUtils.hs index 1f6d1ac0e3..043ccf0ff5 100644 --- a/compiler/cmm/CmmUtils.hs +++ b/compiler/cmm/CmmUtils.hs @@ -55,7 +55,10 @@ module CmmUtils( analFwd, analBwd, analRewFwd, analRewBwd, dataflowPassFwd, dataflowPassBwd, dataflowAnalFwd, dataflowAnalBwd, - dataflowAnalFwdBlocks + dataflowAnalFwdBlocks, + + -- * Ticks + blockTicks, annotateBlock ) where #include "HsVersions.h" @@ -567,3 +570,18 @@ dataflowPassBwd :: NonLocal n => dataflowPassBwd (CmmGraph {g_entry=entry, g_graph=graph}) facts bwd = do (graph, facts, NothingO) <- analyzeAndRewriteBwd bwd (JustC [entry]) graph (mkFactBase (bp_lattice bwd) facts) return (CmmGraph {g_entry=entry, g_graph=graph}, facts) + +------------------------------------------------- +-- Tick utilities + +-- | Extract all tick annotations from the given block +blockTicks :: Block CmmNode C C -> [CmmTickish] +blockTicks b = reverse $ foldBlockNodesF goStmt b [] + where goStmt :: CmmNode e x -> [CmmTickish] -> [CmmTickish] + goStmt (CmmTick t) ts = t:ts + goStmt _other ts = ts + +annotateBlock :: [CmmTickish] -> Block CmmNode C C -> Block CmmNode C C +annotateBlock ts b = blockJoin hd (tstmts `blockAppend` mid) tl + where (hd, mid, tl) = blockSplit b + tstmts = foldr blockCons emptyBlock $ map CmmTick ts |