This page gathers examples of Hoopl usage so that beginners can learn from them.
Dead assignment removal
This was originally part of CmmLive module but was removed due to being too slow. According to Simon Marlow "a single removeDeadAssigments pass costs about 5% of compilation time, and in the vast majority of code does nothing over what CmmSink already does".
removeDeadAssignments :: DynFlags -> CmmGraph -> UniqSM (CmmGraph, BlockEnv CmmLocalLive)removeDeadAssignments dflags g = dataflowPassBwd g  $ analRewBwd liveLattice (xferLive dflags) rewrites where rewrites = mkBRewrite3 nothing middle nothing -- SDM: no need for deepBwdRw here, we only rewrite to empty -- Beware: deepBwdRw with one polymorphic function seems more -- reasonable here, but GHC panics while compiling, see bug -- #4045. middle :: CmmNode O O -> Fact O CmmLocalLive -> CmmReplGraph O O middle (CmmAssign (CmmLocal reg') _) live | not (reg' `elemRegSet` live) = return $ Just emptyGraph -- XXX maybe this should be somewhere else... middle (CmmAssign lhs (CmmReg rhs)) _ | lhs == rhs = return $ Just emptyGraph middle (CmmStore lhs (CmmLoad rhs _)) _ | lhs == rhs = return $ Just emptyGraph middle _ _ = return Nothing nothing :: CmmNode e x -> Fact x CmmLocalLive -> CmmReplGraph e x nothing _ _ = return Nothing
CmmRewriteAssignments optimization pass
The CmmRewriteAssignments pass was originally written by Edward Z. Yang to perform Cmm optimizations like inlining and sinking. However, it turned out to be too slow and was replaced with CmmSink pass written by Simon Marlow. CmmSink does almost the same things as CmmRewriteAssignments, the most notable difference being that the former does not handle loops. Code of CmmRewriteAssignments is available in this attachment.