module LinearScan.Trace where


import Debug.Trace (trace, traceShow, traceShowId)
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 Hask.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 IntervalIdT PhysRegT SplitPositionT
 | ESplitActiveOrInactiveInterval IntervalIdT TrueIfActiveT SplitPositionT
 | EIntervalHasUsePosReqReg Prelude.Int
 | EIntervalBeginsAtSplitPosition
 | EMoveUnhandledToActive IntervalIdT PhysRegT
 | ESplitActiveIntervalForReg PhysRegT SplitPositionT
 | ESplitAnyInactiveIntervalForReg PhysRegT SplitPositionT
 | ESpillInterval SpillConditionT
 | ESpillCurrentInterval
 | ESplitUnhandledInterval IntervalIdT SplitPositionT
 | ESplitCurrentInterval IntervalIdT SplitPositionT
 | ETryAllocateFreeReg PhysRegT (Prelude.Maybe Prelude.Int) IntervalIdT
 | EAllocateBlockedReg PhysRegT (Prelude.Maybe Prelude.Int) IntervalIdT
 | ERemoveUnhandledInterval IntervalIdT
 | ECannotInsertUnhandled Prelude.Int Prelude.Int Prelude.Int Prelude.Int
 | EIntervalBeginsBeforeUnhandled IntervalIdT
 | ENoValidSplitPosition IntervalIdT
 | ECannotSplitSingleton IntervalIdT
 | ERegisterAlreadyAssigned PhysRegT
 | ERegisterAssignmentsOverlap PhysRegT IntervalIdT Prelude.Int
 | ECannotModifyHandledInterval IntervalIdT
 | EUnexpectedNoMoreUnhandled
 | ECannotSpillIfRegisterRequired IntervalIdT
 | ECannotSpillIfRegisterRequiredBefore IntervalIdT Prelude.Int
 | EFuelExhausted
 | EUnhandledIntervalsRemain
 | EActiveIntervalsRemain
 | EInactiveIntervalsRemain
 | ENotYetImplemented Prelude.Int