xw2      !"#$%&'()*+,-./019None 23456789:;<= 23456789:;<= 23456789:;<=None>?>?>?None@ABCDEFG@ABCDEFG@ABCDEFGNoneBHIHIHINoneJKLJKLJKLNoneBMNOPQMNOPQMNOPQNoneB RSTUVWXYZ RSTUVWXYZRSTUVWXYZ NoneB[\]^[\]^[\]^ None None None_`_`_` NoneabcdeabcdeabcdeNoneNonefghfghfghNoneijklijklijklNonemnmnmnNoneopopopNoneBqrstuvwxyz{|}~qrstuvwxyz{|}~qrstuvwxyz{|}~NoneNoneNoneB''%NoneBNoneB NoneBNoneB               NoneB  !"#$%&  !"#$%&  !"#$%&NoneB'()*+,-./012345678'()*+,-./012345678'()*+,-./012345678None 9:;<=>?@AB 9:;<=>?@AB 9:;<=>?@ABNoneBCDEFGHIJKLMNOPQRSTUVWXCDEFGHIJKLMNOPQRSTUVWXCDEFGHIJKLMNOPQRSTUVWXNoneYZ[\]^_`abcdefghiYZ[\]^_`abcdefghiYZ[\]^_`abcdefghi NoneBjklmnjklmnjklmn!NoneBopqrstopqrstopqrst"NoneB uvwxyz{|}~ uvwxyz{|}~ uvwxyz{|}~#None$None**%None&NoneB   'NoneB(NoneB )None! !  *NoneB   +NoneB     !"#     !"#     !"#,NoneB$%&'()*+,-./012345678$%&'()*+,-./012345678$%&'()*+,-./012345678-None9:;<=>?@ABCDEFGHIJKLMNOPQ9:;<=>?@ABCDEFGHIJKLMNOPQ9:;<=>?@ABCDEFGHIJKLMNOPQ.NoneBRSTUVWXYZ[\]^_`abcdRSTUVWXYZ[\]^_`abcdRSTUVWXYZ[\]^_`abcd/NoneBefghijklmnopqrstuvwxyz{efghijklmnopqrstuvwxyz{efghijklmnopqrstuvwxyz{0NoneB|}~|}~|}~1NoneB2None3NoneB  4NoneB 5NoneB6NoneB))  7NoneBH       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJH       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ6        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ8NoneBKLMNOPQRSTUVWXYZ[\]KLMNOPQRSTUVWXYZ[\]KLMNOPQRSTUVWXYZ[\]9None ^_`abcdef ^_`abcdef^_`abcdefNone!"/:OTpFrom the point of view of this library, a basic block is nothing more than an ordered sequence of operations.xIdentify the block with a unique number. The nature and ordering of the number is not significant, only its uniqueness.$The immediate successors of a block.yGiven two blocks, insert a new block between them to break up a "critical edge" (where the first block has multiple destinations due to a conditional branch, for example, while the second block has multiple originations due to branches from other blocks). The result is the new pair of blocks at that boundary. Typically, only one of the two will be a newly created block.Return the entry, body, and exit operation of a block. Typically, the entry operation is a "label", and the exit operation is a branch, jump or return.NReplace the set of operations for a block with a set of allocated 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 its range of use.Certain operations have special significance as to how basic blocks are organized and lifetime of allocations. Thus, if an operation begins or ends a loop, or represents a method call, this should be indicated using the  field. Indication of calls is necessary for saving and restoring all registers around a call, while indication of loops is optional, as it merely avoids reloading spilled variables inside loop bodies.0Return the kind of operator prior to allocation.1Return all variable references for the operation.YCreate move instruction(s) from one register to another, relating to the given variable._Create a spill instruction from the given restriction, to a stack slot for the given variable.]Create a load instruction from the stack slot for the given variable, to the given register.Given an operation, and a set of register allocations for each variable used by the operation (differentiated by type of use), apply the allocations to create one or more post-allocation operations.6Render the given pre-allocation operation as a string.]Each "virtual variable" has details associated with it that affect the allocation procedure.!BIdentify the variable, or if it is an explicit register reference."The kind of a variable determines the scope of its lifetime, and when it is spilled or loaded to or from stack. 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.#SIf true, the variable's value must be loaded into a register at this use position.$Transform a list of basic blocks, containing variable references, into an equivalent list where each reference has been associated with a register allocation. Artificial save and restore instructions may be inserted into those blocks to indicate spilling and reloading of variables.In order to call this function, the caller must provide records that functionally characterize these blocks and their operations according to an abstract API. This is done so that any program graph conforming to the API may be used, and no particular representation is required.A tuple is return where the first value is a textual dump that describes the complete allocation state. If this value is never forced, that data is not collected.The second value is the resulting list of allocated blocks. If allocation is found to be impossible -- for example if there are not enough registers -- a g value is returned, with a list of strings describing the error and its possible context. This is usually when the textual dump should be provided, if one's user has selected verbose error output, for example.Qhijklmnopqrstuvwxyz{|}~ !"#$"Maximum number of registers to useCharacterization of blocksCharacterization of operations#Whether to use the runtime verifier%A topologically sorted list of blocks5Status dump and allocated blocks, or error w/ context%&'()*%  !"#$%$  !"# !h ijklmnopqrstu vwxyz{|}~  !"#$%&'()*(:(;(<(=(>)?)@)A)B)C)D7E7F7G7HIIJKLMNOOPQRSTUVWWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~         !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   !!!!!!""""""""""$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%&&&&&&&&&&&&''''''''''''''''''(((((((((((()I)))O)))W))X)Y)Z))P)Q)R)S)T)U)J)K)L)M)N))))**************************+++++ + + + + +++++++++++++++++,, ,!,",#,,,$,%,&,',(,),*,+,,,-,.,/,0,1-2-3-4--5-6-7-8-9-:-;-<-=->-?-@-A-B-C-D-E-F-G-H-I.J....K.L.M.N.O.t.P.Q.R.S.T.n.s.U.m/V/W/X/Y/Z/[/\/]/D//^/_/`/a/b/c/d/e/f/g/h/i/j0k0l000m0n0o0p0q0r0s0t0u0v0w0x0y0z0{0|0}0~0001111D11111111111112222333333333334444D444444444455555D5555555555555555555555666666666666666666666666D6666666666666666677777777777777777777777D7777777777777777 7 7 7 7 7777777777777777777 7!7"7#7$7%7&88'8(8D88)8*8+8,8-8.8/8081828838485969798999:9;9<9=9>?@A66BCDEFGHIJK[[L_`abcdMNOPQRSTUVWXYZ[\]^_`a'linearscan-1.0.0-JiglWMulspQFV1lyA4Fev6 LinearScan Hask.UtilsLinearScan.AsciiLinearScan.ContextLinearScan.ContravariantLinearScan.DatatypesLinearScan.FunctorLinearScan.ApplicativeLinearScan.ConstLinearScan.LibLinearScan.List0LinearScan.LogicLinearScan.MaybeLinearScan.NatLinearScan.NonEmptyLinearScan.Prelude0LinearScan.SpecifLinearScan.SsrLinearScan.SsrboolLinearScan.SsreflectLinearScan.SsrfunLinearScan.EqtypeLinearScan.SsrnatLinearScan.ChoiceLinearScan.SeqLinearScan.FintypeLinearScan.GraphLinearScan.IntSetLinearScan.List1LinearScan.IntMapLinearScan.MonadLinearScan.ClassLinearScan.IdentityLinearScan.StateLinearScan.String0LinearScan.TraceLinearScan.TupleLinearScan.State0LinearScan.LensLinearScan.UsePosLinearScan.BlocksLinearScan.LoopsLinearScan.LiveSetsLinearScan.RangeLinearScan.IntervalLinearScan.Vector0LinearScan.ScanStateLinearScan.BuildLinearScan.MorphLinearScan.CursorLinearScan.SpillLinearScan.SplitLinearScan.AllocateLinearScan.ResolveLinearScan.VerifyLinearScan.AssignLinearScan.MainVarKindInput InputOutputTempOutputOpKindIsNormalIsCallIsBranchVarIdPhysReg UseVerifierVerifyDisabled VerifyEnabledVerifyEnabledStrict BlockInfoblockIdblockSuccessorssplitCriticalEdgeblockOps setBlockOpsOpInfoopKindopRefsmoveOpsaveOp restoreOp applyAllocsshowOp1VarInfovarIdvarKind regRequiredallocate$fShowSplitPositionT$fShowSpillConditionT$fShowResolvingMoveSet$fShowRegStateDescSet$fShowLoopState$fShowScanStateDesc $fShowSSTrace$fShowBlockLiveSets$fShowFinalStage$fShowAllocError $fShowOpKind $fEqOpKind $fEqVarKindtraceintMap_mergeWithKey'unconsvec_idvshiftinvreplacevmapvfoldl'vfoldl'_with_indexvmap_with_indexvnthvec_rect Coq_asciiAsciiContextiaskcontextiputimapipureijoinibind ContravariantAnynat_rect list_rectlist_recFunctor unsafeCoerce__fmap ApplicativeBuild_Applicative is_functorpureapliftA2Constcoq_Const_Functorcoq_Const_Contravariantcoq_False_rect coq_False_rec fromMaybemaybeisJust option_map option_choosecoq_NonEmpty_rectcoq_NonEmpty_reccoq_NE_from_listflipconstapplylebfCoq_sig2Coq_sigprop Coq_pred_sort Coq_predTypePredType Coq_mem_predMem Coq_simpl_relCoq_simpl_predCoq_relCoq_pred Coq_reflectReflectTReflectFisSomeiffPidPandP coq_SimplPred pred_of_simplrel_of_simpl_rel mkPredType pred_of_memmemin_mempred_of_mem_pred_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_opeqPeqbP bool_eqMixin bool_eqTypevalcoq_Subinsubinsubd 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_eqTypeeqnP nat_eqMixin nat_eqType nat_of_boolodd double_recdoubleCountable__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_countTypeCoq_eqseq_class Coq_last_specLastNil LastRconsnilpheadrconslastbelastlastPlast_indfindcountalldropeqseqeqseqP seq_eqMixin seq_eqTypemem_seqpred_of_eq_seq seq_predTypeunduprempmapiotaflattenFinite__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_finTypeord0inordGraph Build_Graphverticesedges emptyGraph addVertexaddEdge removeEdgeoutboundinbound removeVertextopsortIntSet 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_eqTypeconcat maybeLookupforFoldforFoldr catMaybesspan partitioninsertsortByIntMap emptyIntMapcoq_IntMap_fromListcoq_IntMap_sizecoq_IntMap_lookupcoq_IntMap_altercoq_IntMap_insertcoq_IntMap_mapcoq_IntMap_mergeWithKeycoq_IntMap_foldlcoq_IntMap_foldrcoq_IntMap_foldlWithKeycoq_IntMap_foldrWithKeycoq_IntMap_toListcoq_IntMap_combineeqIntMap eqIntMapPcoq_IntMap_eqMixincoq_IntMap_eqTypecoq_IntMap_groupOnMonad Build_Monadis_applicativejoinbindreturn_whenunlessmapMmapM_forM_foldMforFoldMfoldrM forFoldrM concatMapM MonadTransliftIdentitycoq_Identity_Functorcoq_Identity_Applicativecoq_Identity_MonadStategetgetsmodifycoq_State_Functorcoq_State_Applicativecoq_State_MonadSSTraceEIntersectsWithFixedIntervalESplitAssignedIntervalForRegESplitActiveOrInactiveIntervalEIntervalHasUsePosReqRegEIntervalBeginsAtSplitPositionEMoveUnhandledToActiveESplitActiveIntervalForRegESplitAnyInactiveIntervalForRegESpillIntervalESpillCurrentIntervalESplitUnhandledIntervalESplitCurrentIntervalETryAllocateFreeRegEAllocateBlockedRegERemoveUnhandledIntervalECannotInsertUnhandledEIntervalBeginsBeforeUnhandledENoValidSplitPositionECannotSplitSingletonERegisterAlreadyAssignedERegisterAssignmentsOverlapECannotModifyHandledIntervalEUnexpectedNoMoreUnhandledECannotSpillIfRegisterRequired$ECannotSpillIfRegisterRequiredBeforeEFuelExhaustedEUnhandledIntervalsRemainEActiveIntervalsRemainEInactiveIntervalsRemainENotYetImplemented TrueIfActiveTSplitPositionT BeforePosTEndOfLifetimeHoleTSpillConditionT NewToHandledTUnhandledToHandledTActiveToHandledTInactiveToHandledTPhysRegT IntervalIdTfirstcurryStateTgetTputTmodifyTcoq_StateT_Functor coq_StateT_apcoq_StateT_Applicativecoq_StateT_joincoq_StateT_Monadcoq_StateT_MonadTrans liftStateTGettingGetterLens'Lenssetoverview stepdownl' stepdowng_1_2use plusStateT modifyStateT applyStateTUsePos Build_UsePos eqVarKind eqVarKindPcoq_VarKind_eqMixincoq_VarKind_eqTypeulocregRequvarupos_lehead_orBuild_BlockInfoBlockId Build_OpInfoOpId Build_VarInfo nat_of_varId allBlockOps blockSizefoldOpscountOps LoopStateBuild_LoopState activeBlocks visitedBlocksloopHeaderBlocks loopEndBlocksforwardBranchesbackwardBranches loopIndices loopDepthsemptyLoopStatemodifyActiveBlocksmodifyVisitedBlocksmodifyLoopHeaderBlocksmodifyLoopEndBlocksmodifyForwardBranchesmodifyBackwardBranchessetLoopIndices setLoopDepths addReferencepathToLoopHeadercomputeLoopDepthscomputeVarReferences findLoopEndscomputeBlockOrder BlockLiveSetsBuild_BlockLiveSets blockLiveGen blockLiveKill blockLiveIn blockLiveOutblockFirstOpId blockLastOpIdemptyBlockLiveSetseqBlockLiveSetseqBlockLiveSetsPcoq_BlockLiveSets_eqMixincoq_BlockLiveSets_eqType _blockLiveGen_blockLiveKill _blockLiveIn _blockLiveOut_blockFirstOpId_blockLastOpIdcomputeLiveSetscomputeLocalLiveSetsupdateLiveSetscomputeGlobalLiveSets computeGlobalLiveSetsRecursively BoundedRange SubRangesOf SortedRanges RangeDescBuild_RangeDescrbegrendups head_or_end getRangeDesc packRangecoq_Range_shiftcoq_Range_cons range_ltncoq_SortedRanges_cattransportSortedRangesfindRangeUsePos rangeSpanemptyBoundedRangeSubIntervalsOf IntervalDescBuild_IntervalDescivaribegiendrdsgetIntervalDesc packInterval intervalStart intervalEndposWithinIntervalfindIntervalUsePos lookupUsePos nextUseAfterrangeFirstUsePos firstUsePosafterLifetimeHolefirstUseReqRegintervalsIntersectintervalIntersectsWithSubrangedivideIntervalRangessplitIntervalRanges splitIntervalVecvnilvsingvcons fin_contrafin_rect vecn_rect vec_to_seqvfoldr_with_indexvfoldl_with_indexvconstvmodify ScanStateSigScanStateStatusPendingInUse IntervalId ScanStateDescBuild_ScanStateDescFixedIntervalsType nextInterval intervalsfixedIntervals unhandledactiveinactivehandled handledIdssortRegisterVectorregisterWithHighestPoshandledIntervalDescsForRegverifyNewHandled packScanState PendingRanges BuildState newBuildStateemptyPendingRangescoq_BoundedRange_leqcompilePendingRangesrangesToBoundedRangescompressPendingRangesmergeIntoSortedRangesupos_before_rend makeNewRange makeUsePoshandleOutputVar handleVarhandleVars_combinehandleVars_onlyRangeshandleVars_onlyVars handleVarsreduceOp reduceBlock reduceBlockscompileIntervalsbuildIntervalsSStateSSInfo Build_SSInfothisDescerror_withScanStatePOliftLenstrengthenHasLenmoveUnhandledToHandledmoveUnhandledToActivemoveActiveToHandledmoveActiveToInactivemoveInactiveToActivemoveInactiveToHandledcurId curIntDetails withCursorSpillCondition NewToHandledUnhandledToHandledActiveToHandledInactiveToHandledcoq_SpillConditionToToptimalSplitPosition spillIntervalspillCurrentInterval SplitPosition BeforePosEndOfLifetimeHolecoq_SplitPositionToT splitPositionsplitUnhandledIntervalsplitCurrentIntervalsplitActiveOrInactiveIntervalsplitAssignedIntervalForRegsplitActiveIntervalForRegsplitAnyInactiveIntervalForReg AllocationBuild_AllocationCoq_intermediate_resultCoq_int_reg_seqintersectsWithFixedIntervalupdateRegisterPosfindEligibleRegistertryAllocateFreeRegallocateBlockedRegmorphlen_transportmt_fstgoActivedep_foldl_invEcheckActiveIntervalsmoveInactiveToActive' goInactivecheckInactiveIntervalshandleIntervalfinalizeScanState_obligation_1finalizeScanState walkIntervalsintValintRegdetermineAllocations BlockMovesResolvingMoveSetRSMoveRSSpill RSRestore RSAllocReg RSFreeReg RSAssignReg RSClearReg RSAllocStack RSFreeStackRSLooped ResolvingMoveMoveSpillRestoreAllocRegFreeReg AssignRegClearReg AllocStack FreeStackLoopedcoq_ResolvingMove_rectweakenResolvingMoveeqResolvingMoveeqResolvingMovePcoq_ResolvingMove_eqMixincoq_ResolvingMove_eqTypeshouldAddResolvingEdge addResolutionaddResolutionsisMoveSplittable splitMoveresolvingMovesdetermineMovescheckBlockBoundaryresolveDataFlowVerified VerifiedSigBuild_VerifiedSig RegStateSig AllocErrorVarNotAllocatedVarNotResidentVarNotResidentForRegVarNotReservedForRegStackNotAllocatedForVarStackAlreadyAllocatedForVarPhysRegAlreadyReservedForVarRegAlreadyReservedToVarBlockWithoutPredecessorsAllocationDoesNotMatchUnknownPredecessorBlockLoopInResolvingMovesRegStateDescSetBuild_RegStateDescSet RegStateDescBuild_RegStateDescRegAllocationsrsAllocsrsStackfromRegStateDesc residency reservationnewRegStateDesc packRegStateverDescverInitverFinalverMoves verErrorsverExtnewVerifiedSig_verDesc _verState_verInit _verFinal _verMoves _verErrors_verExterrorsTerrorTaddMove allocationsAt allocationForcheckAllocation reserveReg isReservedcheckReservation releaseRegclearReg assignReg isResidentcheckResidencyisStackAllocated checkStack allocStack freeStackverifyBlockBeginverifyBlockEnd verifyAllocsverifyResolutionsverifyTransitions AssnStateDescBuild_AssnStateDescassnOpId assnBlockBeg assnBlockEndnewAssnStateDesc _assnOpId _assnBlockBeg _assnBlockEnd generateMoves varAllocs varInfoAllocssetAllocations considerOps assignRegNumDetails Build_DetailsScanStateDescSetBuild_ScanStateDescSet FinalStageBuildingIntervalsFailedAllocatingRegistersFailedtoScanStateDescSet linearScanbase Data.EitherLeftreasonliveSets _inputBlocks orderedBlocksallocatedBlocks scanStatePre scanStatePost blockInfoopInfo loopState _nextInterval allocations coqFunctorcoqApplicativecoqMonad fromVarInfo fromOpInfo showIntervalshowIntervalDesc showRangesshowUsePositionstoScanStateDesc toLoopState showBlock1 opContextshowOps1 showBlocks1 fromBlockInfo showSplit showDetails toDetails