{-# LANGUAGE FlexibleContexts #-} module Asm.LI ( mkIntervals ) where import Asm.Ar import Asm.L import CF import Data.Copointed import LI mkIntervals :: (Arch arch reg freg, Copointed (arch reg freg)) => [arch reg freg ()] -> [arch reg freg Live] mkIntervals :: forall (arch :: * -> * -> * -> *) reg freg. (Arch arch reg freg, Copointed (arch reg freg)) => [arch reg freg ()] -> [arch reg freg Live] mkIntervals = [arch reg freg NLiveness] -> [arch reg freg Live] forall (p :: * -> *). Copointed p => [p NLiveness] -> [p Live] intervals ([arch reg freg NLiveness] -> [arch reg freg Live]) -> ([arch reg freg ()] -> [arch reg freg NLiveness]) -> [arch reg freg ()] -> [arch reg freg Live] forall b c a. (b -> c) -> (a -> b) -> a -> c . [arch reg freg Liveness] -> [arch reg freg NLiveness] enliven ([arch reg freg Liveness] -> [arch reg freg NLiveness]) -> ([arch reg freg ()] -> [arch reg freg Liveness]) -> [arch reg freg ()] -> [arch reg freg NLiveness] forall b c a. (b -> c) -> (a -> b) -> a -> c . [arch reg freg ()] -> [arch reg freg Liveness] forall (arch :: * -> * -> * -> *) reg freg. Arch arch reg freg => [arch reg freg ()] -> [arch reg freg Liveness] mkLive where enliven :: [arch reg freg Liveness] -> [arch reg freg NLiveness] enliven = (Int -> arch reg freg Liveness -> arch reg freg NLiveness) -> [Int] -> [arch reg freg Liveness] -> [arch reg freg NLiveness] forall a b c. (a -> b -> c) -> [a] -> [b] -> [c] zipWith (\Int n arch reg freg Liveness a -> (Liveness -> NLiveness) -> arch reg freg Liveness -> arch reg freg NLiveness forall a b. (a -> b) -> arch reg freg a -> arch reg freg b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (Int -> Liveness -> NLiveness NLiveness Int n) arch reg freg Liveness a) [Int 0..]