module LinearScan.Trace 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


type IntervalIdT = Prelude.Int

type PhysRegT = Prelude.Int

data SpillConditionT =
   NewToHandledT IntervalIdT
 | UnhandledToHandledT IntervalIdT
 | ActiveToHandledT IntervalIdT PhysRegT
 | InactiveToHandledT IntervalIdT PhysRegT

data SplitPositionT =
   BeforePosT Prelude.Int
 | EndOfLifetimeHoleT Prelude.Int

type TrueIfActiveT = Prelude.Bool

data SSTrace =
   EIntersectsWithFixedInterval Prelude.Int PhysRegT
 | ESplitAssignedIntervalForReg PhysRegT
 | ESplitActiveOrInactiveInterval TrueIfActiveT
 | EIntervalHasUsePosReqReg IntervalIdT
 | EIntervalBeginsAtSplitPosition
 | EMoveUnhandledToActive PhysRegT
 | ESplitActiveIntervalForReg PhysRegT
 | ESplitAnyInactiveIntervalForReg PhysRegT
 | ESpillInterval SpillConditionT
 | ESpillCurrentInterval
 | ESplitUnhandledInterval
 | ESplitCurrentInterval SplitPositionT
 | ETryAllocateFreeReg PhysRegT (Prelude.Maybe Prelude.Int) IntervalIdT
 | EAllocateBlockedReg PhysRegT (Prelude.Maybe Prelude.Int) IntervalIdT
 | ERemoveUnhandledInterval IntervalIdT
 | ECannotInsertUnhandled
 | EIntervalBeginsBeforeUnhandled IntervalIdT
 | ENoValidSplitPosition IntervalIdT
 | ECannotSplitSingleton IntervalIdT
 | ERegisterAlreadyAssigned PhysRegT
 | ERegisterAssignmentsOverlap PhysRegT
 | EUnexpectedNoMoreUnhandled
 | ECannotSpillIfRegisterRequired PhysRegT
 | EFuelExhausted
 | ENotYetImplemented Prelude.Int