linearscan-0.3.1.0: LinearScan/Main.hs
module LinearScan.Main where
import Debug.Trace (trace, traceShow)
import qualified Prelude
import qualified Data.IntMap
import qualified Data.IntSet
import qualified Data.List
import qualified Data.Ord
import qualified Data.Functor.Identity
import qualified LinearScan.Utils
import qualified LinearScan.Allocate as Allocate
import qualified LinearScan.Assign as Assign
import qualified LinearScan.Blocks as Blocks
import qualified LinearScan.Build as Build
import qualified LinearScan.LiveSets as LiveSets
import qualified LinearScan.Morph as Morph
import qualified LinearScan.Order as Order
import qualified LinearScan.Resolve as Resolve
linearScan :: Prelude.Int -> (Blocks.BlockInfo a1 a2 a3 a4) -> (Blocks.OpInfo
a5 a3 a4) -> ([] a1) -> a5 -> Prelude.Either Morph.SSError
((,) ([] a2) a5)
linearScan maxReg binfo oinfo blocks accum =
let {blocks' = Order.computeBlockOrder blocks} in
let {liveSets = LiveSets.computeLocalLiveSets maxReg binfo oinfo blocks'}
in
let {
liveSets' = LiveSets.computeGlobalLiveSetsRecursively binfo blocks'
liveSets}
in
case Build.buildIntervals maxReg binfo oinfo blocks liveSets' of {
Prelude.Left err -> Prelude.Left err;
Prelude.Right ssig ->
case Allocate.walkIntervals maxReg ( ssig) ((Prelude.succ)
(Blocks.countOps binfo blocks)) of {
Prelude.Left err -> Prelude.Left err;
Prelude.Right ssig' ->
let {
mappings = Resolve.resolveDataFlow maxReg binfo ( ssig') blocks
liveSets'}
in
Prelude.Right
(Assign.assignRegNum maxReg binfo oinfo ( ssig') liveSets' mappings
blocks accum)}}