oTU!      $None !"#$%&'()* !"#$%&'()* !"#$%&'()*None+,-./+,-./+,-./None010101None234523452345None *+-./02345689:;=?BCDGHJKM6789:;<=>?@ABCDEFGHIJKLMNO6789:;<=>?@ABCDEFGHIJKLMNO6789:;<=>?A@BCDEFGHIJKLMNONonePQRSTUVWXYZ[\]^PQRSTUVWXYZ[\]^PQRSTUVWXYZ[\]^None_`_`_` Noneaaa Nonebcdefghbcdefghbcdefgh None *+-./02345689:;=?BCDGHJKM+ijklmnopqrstuvwxyz{|}~+ijklmnopqrstuvwxyz{|}~)ijklmnopqrstuvwxyz{|}~ None  None *+-./02345689:;=?BCDGHJKMNone *+-./02345689:;=?BCDGHJKM  None *+-./02345689:;=?BCDGHJKMNone *+-./02345689:;=?BCDGHJKM None *+-./02345689:;=?BCDGHJKMNoneNoneNone *+-./02345689:;=?BCDGHJKM8      !"#$%&'()*+,-./0123456789:;<8      !"#$%&'()*+,-./0123456789:;<5      !"#$%&'()*+,-./0123456789:;<None *+-./02345689:;=?BCDGHJKM)=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde)=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde'=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeNone *+-./02345689:;=?BCDGHJKMfghijklmnopqrstuvwxyz{fghijklmnopqrstuvwxyz{fgihjklmnopqrstuvwxyz{NoneNone|||NoneNone *+-./02345689:;=?BCDGHJKM}}}None *+-./02345689:;=?BCDGHJKM ~ ~~ NoneNone *+-./02345689:;=?BCDGHJKM   None *+-./02345689:;=?BCDGHJKMNone *+-./02345689:;=?BCDGHJKM+ +     None   !None *+-./02345689:;=?BCDGHJKM"None *+-./02345689:;=?BCDGHJKM#None *+-./02345689:;=?BCDGHJKM               $NoneNone *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.  "Maximum number of registers to use!  !      %&'()*+,-./011234566789:;<=>>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~K         d e  e d dedddee      !"#$de%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUdeVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0dd0dee0de0de16>d?@A789;<=2345          !!d!e!!""""0"d"""""""""""""""#####d#e################$     linearscan-0.3.0.1 LinearScanLinearScan.UtilsLinearScan.IStateLinearScan.SpecifLinearScan.UsePosLinearScan.SsrboolLinearScan.StateLinearScan.DatatypesLinearScan.NonEmpty0LinearScan.SsrfunLinearScan.EqtypeLinearScan.LibLinearScan.IntMapLinearScan.SsrnatLinearScan.SeqLinearScan.GraphLinearScan.RangeLinearScan.LogicLinearScan.IntervalLinearScan.ChoiceLinearScan.FintypeLinearScan.ScanStateLinearScan.List0LinearScan.OrderLinearScan.SsreflectLinearScan.Vector0LinearScan.MorphLinearScan.CursorLinearScan.SplitLinearScan.AllocateLinearScan.BlocksLinearScan.LiveSetsLinearScan.ResolveLinearScan.AssignLinearScan.BuildLinearScan.MainOpKind IsLoopEnd IsLoopBeginIsBranchIsCallIsNormalVarIdVarKindOutputTempInputPhysReg BlockInfoblockIdblockSuccessorsblockOps setBlockOpsOpInfoopKindopRefsmoveOpswapOpsaveOp restoreOp applyAllocsVarInfovarIdvarKind regRequiredallocatetraceboundedTransport'snocset_nthvmapvfoldl'vfoldl'_with_indexnth list_rectunconsIStateiputimapipureijoinCoq_sig2Coq_sigUsePos Build_UsePosulocregReq Coq_pred_sort Coq_predTypePredType Coq_mem_predMem Coq_simpl_relCoq_simpl_predCoq_relCoq_pred Coq_reflectReflectFReflectT unsafeCoerce__isSomeiffPidPandP coq_SimplPred pred_of_simplrel_of_simpl_rel mkPredType pred_of_memmemin_mempred_of_mem_predStategetputmodifyjoinfmapbindpureapliftA2mapMfoldMforFoldMconcat concatMapMlist_reccoq_NE_from_list_Option__apply_Option__coq_default _Option__bind _Option__mappcomps2val sig_of_sig2 Coq_sub_sort Coq_subTypeSubTypeEquality__Coq_sortEquality__Coq_typeEquality__Coq_mixin_ofEquality__MixinEquality__Coq_axiom_Equality__mixin_of_rect_Equality__mixin_of_rec _Equality__op_Equality__type_rect_Equality__type_rec_Equality__coq_class_Equality__pack_Equality__cloneeq_opeqPvalcoq_Subinsub sig_subType inj_eqAxiomcoq_InjEqMixincoq_PcanEqMixinval_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_chooselebfodd1forFoldspaninsertsortBy dep_foldl_invdep_foldl_invE emptyIntMapcoq_IntSet_forFoldcoq_IntMap_groupOnCoq_ex_minn_speceqnP nat_eqMixin nat_eqType find_ex_minnex_minnP nat_of_boolodd double_recdoubleCoq_eqseq_class Coq_last_spec LastRconsLastNilnilprconslastbelastlastPfindcountcatrevrevmem_seqpred_of_eq_seq seq_predTyperempmapiotaGraph Build_Graphverticesedges emptyGraph addVertexaddEdge removeEdge connectionsoutboundinboundtsort'topsort SortedRanges BoundedRange RangeDescBuild_RangeDescrbegrendups getRangeDesc packRangenewRangecoq_Range_consemptyBoundedRangeemptySortedRanges prependRangecoq_SortedRanges_cattransportSortedRangesrangesIntersectrangeIntersectionPointfindRangeUsePos rangeSpancoq_False_rect coq_False_rec IntervalDescBuild_IntervalDesc IntervalKind RightMostMiddleLeftMostWhole splitKindivaribegiendikndrdsgetIntervalDesc packInterval intervalStart intervalEndintervalCoversPosintervalsIntersectintervalIntersectionPoint searchInRangefindIntervalUsePos lookupUsePos nextUseAfter firstUsePosfirstUseReqReg intervalSpanCountable__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__mixin_of_rect_Choice__mixin_of_rec _Choice__find_Choice__class_of_rect_Choice__class_of_rec _Choice__base_Choice__mixin_Choice__type_rect_Choice__type_rec_Choice__coq_class_Choice__clone _Choice__pack_Choice__eqType_Choice__InternalTheory__find)_Choice__InternalTheory__xchoose_subproofcoq_PcanChoiceMixinsub_choiceMixinnat_choiceMixinnat_choiceType_Countable__mixin_of_rect_Countable__mixin_of_rec_Countable__pickle_Countable__unpickle_Countable__coq_EqMixin_Countable__coq_ChoiceMixin_Countable__class_of_rect_Countable__class_of_rec_Countable__base_Countable__mixin_Countable__type_rect_Countable__type_rec_Countable__coq_class_Countable__clone_Countable__pack_Countable__eqType_Countable__choiceTypeunpicklepickle pickle_invcoq_PcanCountMixinsub_countMixinnat_countMixin nat_countTypeFinite__Coq_sortFinite__Coq_typeFinite__Coq_class_of Finite__ClassFinite__Coq_mixin_of Finite__Mixin_Finite__mixin_of_rect_Finite__mixin_of_rec_Finite__mixin_base_Finite__mixin_enum_Finite__coq_EnumMixin_Finite__coq_UniqMixin_Finite__count_enum_Finite__coq_CountMixin_Finite__class_of_rect_Finite__class_of_rec _Finite__base_Finite__mixin_Finite__base2_Finite__type_rect_Finite__type_rec_Finite__coq_class_Finite__clone _Finite__pack_Finite__eqType_Finite__choiceType_Finite__countType_Finite__EnumDef__enumenum_mem image_memordinal_subTypeordinal_eqMixinordinal_eqTypeordinal_choiceMixinordinal_choiceTypeordinal_countMixinord_enumordinal_finMixinordinal_finType ScanStateSigScanStateStatusInUsePending IntervalId ScanStateDescBuild_ScanStateDescFixedIntervalsType nextInterval intervalsfixedIntervals unhandledactiveinactivehandledregisterWithHighestPosisWithinlookupIntervallookupRegister packScanStatecomputeBlockOrderSStateSSInfo Build_SSInfoSSErrorEUnexpectedNoMoreUnhandledEFuelExhaustedERegisterAssignmentsOverlapERegisterAlreadyAssignedENoIntervalsToSplitECannotSplitSingleton7ECannotSplitSingleton6ECannotSplitSingleton5ECannotSplitSingleton4ECannotSplitSingleton3ECannotSplitSingleton2ECannotSplitSingleton1stbinderror_return_thisDescwithScanStatePOliftLen weakenHasLen_strengthenHasLenmoveUnhandledToActivemoveActiveToHandledmoveActiveToInactivemoveInactiveToActivemoveInactiveToHandledcurId curIntDetails curPosition withCursor SplitPositionEndOfLifetimeHoleBeforeFirstUsePosReqReg BeforePos splitPosition splitIntervalsplitCurrentIntervalsplitAssignedIntervalForRegsplitActiveIntervalForRegsplitAnyInactiveIntervalForRegCoq_intermediate_resultCoq_int_reg_seqintersectsWithFixedIntervalupdateRegisterPostryAllocateFreeRegallocateBlockedRegmorphlen_transportmt_fstgoActivecheckActiveIntervalsmoveInactiveToActive' goInactivecheckInactiveIntervalshandleInterval walkIntervalsOpIdBuild_BlockInfoBlockId Build_OpInfo Build_VarInfo eqVarKind eqVarKindPcoq_VarKind_eqMixincoq_VarKind_eqType nat_of_varId allBlockOps blockSizefoldOpscountOps BlockLiveSetsBuild_BlockLiveSets blockLiveGen blockLiveKill blockLiveIn blockLiveOutblockFirstOpId blockLastOpIdcomputeLocalLiveSetscomputeGlobalLiveSets BlockMovescheckIntervalBoundaryresolveDataFlow AssnState AssnStateInfoBuild_AssnStateInfoassnOpId assnBlockBeg assnBlockEndassnAccmoveOpMsaveOpM restoreOpMpairMsavesAndRestores collectAllocs doAllocations generateMovesresolveMappings considerOps assignRegNum PendingRanges RangeCursorBuild_RangeCursor BuildState newBuildStateemptyRangeCursortransportRangeCursoremptyPendingRangesmergeIntoSortedRanges varKindLtnhandleVars_combinehandleVars_onlyRangeshandleVars_onlyVarsextractVarInfo handleVarsreduceOp reduceBlock reduceBlockscompileIntervalsbuildIntervals linearScanbase Data.EitherLeft fromVarInfo fromOpInfo fromBlockInfo