{-# 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 f2, Copointed (arch reg freg f2)) => [arch reg freg f2 ()] -> [arch reg freg f2 Live] mkIntervals :: forall (arch :: * -> * -> * -> * -> *) reg freg f2. (Arch arch reg freg f2, Copointed (arch reg freg f2)) => [arch reg freg f2 ()] -> [arch reg freg f2 Live] mkIntervals = [arch reg freg f2 NLiveness] -> [arch reg freg f2 Live] forall (p :: * -> *). Copointed p => [p NLiveness] -> [p Live] intervals ([arch reg freg f2 NLiveness] -> [arch reg freg f2 Live]) -> ([arch reg freg f2 ()] -> [arch reg freg f2 NLiveness]) -> [arch reg freg f2 ()] -> [arch reg freg f2 Live] forall b c a. (b -> c) -> (a -> b) -> a -> c . [arch reg freg f2 Liveness] -> [arch reg freg f2 NLiveness] enliven ([arch reg freg f2 Liveness] -> [arch reg freg f2 NLiveness]) -> ([arch reg freg f2 ()] -> [arch reg freg f2 Liveness]) -> [arch reg freg f2 ()] -> [arch reg freg f2 NLiveness] forall b c a. (b -> c) -> (a -> b) -> a -> c . [arch reg freg f2 ()] -> [arch reg freg f2 Liveness] forall (arch :: * -> * -> * -> * -> *) reg freg f2. Arch arch reg freg f2 => [arch reg freg f2 ()] -> [arch reg freg f2 Liveness] mkLive where enliven :: [arch reg freg f2 Liveness] -> [arch reg freg f2 NLiveness] enliven = (Int -> arch reg freg f2 Liveness -> arch reg freg f2 NLiveness) -> [Int] -> [arch reg freg f2 Liveness] -> [arch reg freg f2 NLiveness] forall a b c. (a -> b -> c) -> [a] -> [b] -> [c] zipWith (\Int n arch reg freg f2 Liveness a -> (Liveness -> NLiveness) -> arch reg freg f2 Liveness -> arch reg freg f2 NLiveness forall a b. (a -> b) -> arch reg freg f2 a -> arch reg freg f2 b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (Int -> Liveness -> NLiveness NLiveness Int n) arch reg freg f2 Liveness a) [Int 0..]