sN!      &None !"#$%&'()*+ !"#$%&'()*+ !"#$%&'()*+None,-./0,-./0,-./0None121212None;3456789:;<=>?@ABCDEFGHIJKLM3456789:;<=>?@ABCDEFGHIJKLM3456789:;<>=?@ABCDEFGHIJKLMNoneNONONONonePQPQPQNoneRSTRSTRST NoneUVWXYZUVWXYZUVWXYZ None;#[\]^_`abcdefghijklmnopqrstuvwxyz{|}#[\]^_`abcdefghijklmnopqrstuvwxyz{|}![\]^_`abcdefghijklmnopqrstuvwxyz{|} None~~~ None; None;None; None; None;NoneNoneNone;None; None;               None;- !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKL- !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKL+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLNone; MNOPQRSTUVWX MNOPQRSTUVWX MNOPQRSTUVWXNone; YZ[\]^_`abc YZ[\]^_`abc YZ[\]^_`abcNonedefghijklmnopqrstuvwxyz{|}defghijklmnopqrstuvwxyz{|}defghijklmnopqrstuvwxyz{|}None~~~None;,, NoneNone;None;None;#     #     #     None;$  !"#$%&'()*+$  !"#$%&'()*+  !"#$%&'()*+!None;,-./0123456789:;<,-./0123456789:;<,-./0123456789:;<"None;=>?@ABCDEFGHIJKLMNOPQRSTUVW=>?@ABCDEFGHIJKLMNOPQRSTUVW=>?@ABCDEFGHIJKLMNOPQRSTUVW#None;XYZ[\]^_`abcdefgXYZ[\]^_`abcdefg XY^]\[Z_`abcdefg$None;hijklmnopqrstuvwxyz{|}~hijklmnopqrstuvwxyz{|}~hijklmnopqrstuvwxyz{|}~%None;&None  None*3HM pFrom the point of view of this library, a basic block is nothing more than an ordered sequence of operations.Every operation may reference multiple variables and/or specific physical registers. If a physical register is referenced, then that register is considered unavailable for allocation over the range of such references.Certain operations have special significance as to how basic blocks are organized, and the lifetime of allocations. Thus, if an operation begins or ends a loop, or represents a method call, it should be indicated using the  field. Indication of calls is necessary in order to save and restore all registers around a call, but indication of loops is optional, as it's merely avoids reloading of spilled variables inside loop bodies.Each variable has associated allocation details, and a flag to indicate whether it must be loaded into a register at its point of use. Variables are also distinguished by their kind, which allows for restricting the scope of their lifetime. For example, output variables are not needed in a basic block until the first point of use, while the lifetime of input variables extends until their final use. Transform a list of basic blocks containing variable references, into an equivalent list where each reference is associated with a register allocation. Artificial save and restore instructions may also be inserted into blocks to indicate spilling and reloading of variables.In order to call this function, the caller must provide records that allow viewing and mutating of the original program graph.hIf allocation is found to be impossible -- for example if there are simply not enough registers -- a : value is returned, with a string describing the error.H  "Maximum number of registers to use!  !         '()* + , - . / 011234567789:;<=>?@@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqMrstuvw x y z { | } ~        c d e  e d     d e dcdcde     cdd de!"#$%&'()*+,-./01234567cde89:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]cde^_`abcdefgcdehijklmneopqrstuvwxyz{|}~00dee0de0dede 1   7   @  d e A B C  8 9 : ; < = > 2 3 4 5 6    !!!d!e!!!!!!!!!!!!! "!"""d"#"$"%"&"'"(")"*"+","-"."/"0"1"2"3"4"5"6"7"8"9":#;#<#=#>#?#@#A#B#0#d#C#D#E#F#G#H$I$J$K$L$M$N$O$0$d$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a%b%c%d%e%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y&z&{&|&}&~&&&&zz!!#$%&'()*linearscan-0.5.0.0 LinearScanLinearScan.UtilsLinearScan.IStateLinearScan.SpecifLinearScan.SsrboolLinearScan.DatatypesLinearScan.LogicLinearScan.NonEmpty0LinearScan.SsrfunLinearScan.EqtypeLinearScan.LibLinearScan.SsrnatLinearScan.SeqLinearScan.GraphLinearScan.ChoiceLinearScan.FintypeLinearScan.List0LinearScan.SsreflectLinearScan.Vector0LinearScan.UsePosLinearScan.RangeLinearScan.MonadLinearScan.YonedaLinearScan.LensLinearScan.IntervalLinearScan.ScanStateLinearScan.MorphLinearScan.CursorLinearScan.SplitLinearScan.AllocateLinearScan.IntMapLinearScan.BlocksLinearScan.LiveSetsLinearScan.LoopsLinearScan.ResolveLinearScan.AssignLinearScan.BuildLinearScan.MainVarKindOutputTempInputOpKindIsBranchIsCallIsNormalVarIdPhysReg BlockInfoblockIdblockSuccessorssplitCriticalEdgeblockOps setBlockOpsOpInfoopKindopRefsmoveOpswapOpsaveOp restoreOp applyAllocsshowOp1VarInfovarIdvarKind regRequiredallocatetraceboundedTransport'snocset_nthvmapvfoldl'vfoldl'_with_indexnth list_rectunconsintMap_mergeWithKey'IStateiputimapipureijoinCoq_sig2Coq_sig Coq_pred_sort Coq_predTypePredType Coq_mem_predMem Coq_simpl_relCoq_simpl_predCoq_relCoq_pred Coq_reflectReflectFReflectTAny unsafeCoerce__isSomeiffPidPandP coq_SimplPred pred_of_simplrel_of_simpl_rel mkPredType pred_of_memmemin_mempred_of_mem_predlist_reccoq_False_rect coq_False_reccoq_NonEmpty_rectcoq_NonEmpty_reccoq_NE_from_list_Option__apply_Option__coq_default _Option__bindpcomps2val sig_of_sig2 Coq_sub_sort Coq_subTypeSubTypeEquality__Coq_sortEquality__Coq_typeEquality__Coq_mixin_ofEquality__MixinEquality__Coq_axiom _Equality__op_Equality__coq_classeq_opeqPvalcoq_Subinsub sig_subType inj_eqAxiomval_eqP sig_eqMixin sig_eqTypepair_eqpair_eqP prod_eqMixin prod_eqTypeopt_eqopt_eqPoption_eqMixin option_eqTypesum_eqsum_eqP sum_eqMixin sum_eqType Coq_oddnum option_map option_chooseolast maybeLookuplebfodd1forFoldforFoldr catMaybesspan partitioninsertsortBy dep_foldl_invdep_foldl_invEeqnP nat_eqMixin nat_eqType nat_of_boolodd double_recdoubleCoq_eqseq_class Coq_last_spec LastRconsLastNilnilpheadrconslastbelastlastPlast_indfindcountcatrevreveqseqeqseqP seq_eqMixin seq_eqTypemem_seqpred_of_eq_seq seq_predTypeunduprempmapiotaGraph Build_Graphverticesedges emptyGraph addVertexaddEdge removeEdge connectionsoutboundinboundtsort'topsortCountable__Coq_sortCountable__Coq_typeCountable__Coq_class_ofCountable__ClassCountable__Coq_mixin_ofCountable__MixinChoice__Coq_sortChoice__Coq_typeChoice__Coq_class_of Choice__ClassChoice__Coq_mixin_of _Choice__find _Choice__base_Choice__mixin_Choice__coq_class_Choice__InternalTheory__findcoq_PcanChoiceMixinsub_choiceMixinnat_choiceMixinnat_choiceType_Countable__pickle_Countable__unpickle_Countable__mixin_Countable__coq_classunpicklepicklecoq_PcanCountMixinsub_countMixinnat_countMixin nat_countTypeFinite__Coq_sortFinite__Coq_typeFinite__Coq_class_of Finite__ClassFinite__Coq_mixin_of Finite__Mixin_Finite__mixin_enum _Finite__base_Finite__mixin_Finite__coq_class_Finite__EnumDef__enum_Finite__EnumDef__enumDefenum_mem image_memordinal_subTypeordinal_eqMixinordinal_eqTypeordinal_choiceMixinordinal_choiceTypeordinal_countMixinord_enumordinal_finMixinordinal_finTypeUsePos Build_UsePos eqVarKind eqVarKindPcoq_VarKind_eqMixincoq_VarKind_eqTypeulocregRequvarupos_lehead_or BoundedRange SubRangesOf SortedRanges RangeDescBuild_RangeDescrbegrendups head_or_end getRangeDesc packRangecoq_Range_shiftcoq_Range_cons range_ltncoq_SortedRanges_cattransportSortedRangesrangesIntersectrangeIntersectionPointfindRangeUsePos rangeSpanemptyBoundedRangeStateTStateMonad Build_Monad ApplicativeBuild_ApplicativeFunctorfmapapplyfirstcurry is_functorpureapis_applicativejoinliftA2bindmapMmapM_forM_foldMforFoldMfoldrM forFoldrMconcat concatMapMinsertMmodifycoq_State_Functorcoq_State_Applicativecoq_State_MonadgetTgetsTputTmodifyTcoq_StateT_Functor coq_StateT_apcoq_StateT_Applicativecoq_StateT_joincoq_StateT_Monadlift IsomorphismBuild_IsomorphismYonedaiso_tocoq_Yoneda_lemmacoq_Yoneda_Functorcoq_Yoneda_Applicativecoq_Yoneda_joincoq_Yoneda_MonadLens'LensConstIdentitycoq_Identity_Functorcoq_Const_FunctorsetviewSubIntervalsOf IntervalDescBuild_IntervalDescivaribegiendrdsgetIntervalDesc packInterval intervalStart intervalEndposWithinIntervalintervalsIntersectintervalIntersectionPointfindIntervalUsePos lookupUsePos nextUseAfterrangeFirstUsePos firstUsePos lastUsePosafterLifetimeHolefirstUseReqRegdivideIntervalRangessplitIntervalRanges splitInterval ScanStateSigScanStateStatusInUsePending IntervalId ScanStateDescBuild_ScanStateDescFixedIntervalsType nextInterval intervalsfixedIntervals unhandledactiveinactivehandledregisterWithHighestPos packScanStateSStateSSInfo Build_SSInfoSSErrorENotYetImplementedEFuelExhaustedECannotSpillIfRegisterRequiredEUnexpectedNoMoreUnhandledERegisterAssignmentsOverlapERegisterAlreadyAssignedECannotSplitSingletonENoValidSplitPositionENoValidSplitPositionUnhEIntervalBeginsBeforeUnhandledECannotInsertUnhAtPos SpillDetailsSD_InactiveToHandledSD_ActiveToHandledSD_UnhandledToHandledSD_NewToHandled SplitPositionEndOfLifetimeHole BeforePos SplitReasonSplittingInactiveSplittingActiveIntersectsWithFixedAvailableForPartstbinderror_return_thisDescwithScanStatePOliftLenstrengthenHasLenmoveUnhandledToHandledmoveUnhandledToActivemoveActiveToHandledmoveActiveToInactivemoveInactiveToActivemoveInactiveToHandledcurId curIntDetails curPosition withCursorSpillConditionInactiveToHandledActiveToHandledUnhandledToHandled NewToHandled splitPositionspillConditionToDetails spillIntervalspillCurrentIntervalsplitUnhandledIntervalsplitCurrentIntervalsplitActiveOrInactiveIntervalsplitAssignedIntervalForRegsplitActiveIntervalForRegsplitAnyInactiveIntervalForReg AllocationBuild_AllocationCoq_intermediate_resultCoq_int_reg_seqintersectsWithFixedIntervalupdateRegisterPostryAllocateFreeRegallocateBlockedRegmorphlen_transportmt_fstgoActivecheckActiveIntervalsmoveInactiveToActive' goInactivecheckInactiveIntervalshandleIntervalfinalizeScanState walkIntervalsintValintRegdetermineAllocationsIntSetIntMap emptyIntMapcoq_IntMap_fromListcoq_IntMap_sizecoq_IntMap_lookupcoq_IntMap_altercoq_IntMap_insertcoq_IntMap_mapcoq_IntMap_mergeWithKeycoq_IntMap_foldlcoq_IntMap_foldlWithKeycoq_IntMap_toListeqIntMap eqIntMapPcoq_IntMap_eqMixincoq_IntMap_eqType emptyIntSetcoq_IntSet_singletoncoq_IntSet_membercoq_IntSet_sizecoq_IntSet_insertcoq_IntSet_deletecoq_IntSet_unioncoq_IntSet_differencecoq_IntSet_foldlcoq_IntSet_forFoldcoq_IntSet_toListeqIntSet eqIntSetPcoq_IntSet_eqMixincoq_IntSet_eqTypecoq_IntMap_groupOnBuild_BlockInfoBlockId Build_OpInfoOpId Build_VarInfo nat_of_varId allBlockOps blockSizefoldOpscountOps BlockLiveSetsBuild_BlockLiveSets blockLiveGen blockLiveKill blockLiveIn blockLiveOutblockFirstOpId blockLastOpIdeqBlockLiveSetseqBlockLiveSetsPcoq_BlockLiveSets_eqMixincoq_BlockLiveSets_eqTypecomputeLocalLiveSetscomputeGlobalLiveSets computeGlobalLiveSetsRecursively LoopStateBuild_LoopState activeBlocks visitedBlocksloopHeaderBlocks loopEndBlocksforwardBranchesbackwardBranches loopIndices loopDepthsemptyLoopStatemodifyActiveBlocksmodifyVisitedBlocksmodifyLoopHeaderBlocksmodifyLoopEndBlocksmodifyForwardBranchesmodifyBackwardBranchessetLoopIndices setLoopDepths addReferencepathToLoopHeader liftStateTcomputeLoopDepthscomputeVarReferences findLoopEndscomputeBlockOrder BlockMoves ResolvingMoveNopRestoreSpillSwapMoveRawResolvingMoveprepareForGraph moveFromGraphdetermineMovesresolvingMovescheckBlockBoundaryresolveDataFlow AssnState AssnStateInfoBuild_AssnStateInfo AllocErrorBuild_AllocError AllocStateBuild_AllocState newAllocStateassnOpId assnBlockBeg assnBlockEndassnAllocStateassnBlockEntryAllocsassnBlockExitAllocs assnErrorsnewAssnStateInfo _assnOpId _assnBlockBeg _assnBlockEnd generateMoves varAllocssetAllocationsresolveMappings considerOps assignRegNum PendingRanges BuildState newBuildStateemptyPendingRangescoq_BoundedRange_leqcompilePendingRangesrangesToBoundedRangescompressPendingRangesmergeIntoSortedRangesupos_before_rend makeNewRange makeUsePoshandleOutputVar handleVarhandleVars_combinehandleVars_onlyRangeshandleVars_onlyVarsextractVarInfo handleVarsreduceOp reduceBlock reduceBlockscompileIntervalsbuildIntervalsDetails Build_DetailsScanStateDescSetBuild_ScanStateDescSet FinalStageAllocatingRegistersFailedBuildingIntervalsFailedtoScanStateDescSet linearScanbase Data.EitherLeftreasonliveSets inputBlocksallocatedBlocks scanStatePre scanStatePost blockInfoopInfo loopState _nextInterval allocations fromVarInfoshowOp1' fromOpInfoshowIntervalDesc showRangesshowUsePositionstoScanStateDesc toLoopStatetracer showBlock1showOps1 showBlocks1 fromBlockInfo showDetails toDetails$fShowLoopState$fShowScanStateDesc