U
    £½|eÍ…  ã                   @   s¸  d dl mZmZmZmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlZd dlmZ d dlmZ e
dd	ƒZG d
d„ deƒZG dd„ deƒZd dd„Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ dejƒZG dd„ deƒZG dd„ deƒZ ej!ej"j#_$ej%gej"j&_'ej!ej"j&_$ej!gej"j(_'ej!ej%gej"j)_'eej"j)_$ej!ej%eeegej"j*_'eej"j*_$ej!gej"j+_'eej"j+_$ej!gej"j,_'eej"j,_$ej!ej-gej"j._'eej"j._$ej!ej-eeegej"j/_'eej"j/_$ej!gej"j0_'ej!gej"j1_'ej!gej"j2_'ej!gej"j3_'ej!gej"j4_'ej!gej"j5_'ej!gej"j6_'ej!egej"j7_'ej!egej"j8_'ej!gej"j9_'ej!gej"j:_'ej!gej"j;_'ej!gej"j<_'ej!gej"j=_'ej!gej"j>_'ej!gej"j?_'ej!gej"j@_'ej!gej"jA_'ej!egej"jB_'ej!egej"jC_'ej!gej"jD_'ej!gej"jE_'ej!gej"jF_'ej!gej"jG_'ej!gej"jH_'ej!gej"jI_'ej!gej"jJ_'ej!gej"jK_'ej!gej"jL_'ej!gej"jM_'ej!gej"jN_'ej!gej"jO_'ej!gej"jP_'ej!eegej"jQ_'ej!gej"jR_'ej!gej"jS_'ej!gej"jT_'ej!gej"jU_'ej!gej"jV_'ej!gej"jW_'ej!gej"jX_'ej!gej"jY_'ej!gej"jZ_'ej!gej"j[_'ej!gej"j\_'ej!egej"j]_'ej!gej"j^_'ej!gej"j__'ej!gej"j`_'ej!gej"ja_'ej!gej"jb_'ej!egej"jc_'ej!gej"jd_'ej!egej"je_'ej!gej"jf_'ej!gej"jg_'ej!gej"jh_'ej!gej"ji_'ej!gej"jj_'ej!gej"jk_'ej!gej"jl_'ej!gej"jm_'ej!gej"jn_'ej!gej"jo_'ej!gej"jp_'ej!gej"jq_'ej!eegej"jr_'eeƒegej"js_'dS )!é    )Úc_boolÚc_char_pÚc_intÚc_size_tÚc_uintÚ	StructureÚbyrefÚPOINTER)Ú
namedtuple)ÚIntFlag)ÚffiN)Úmkstemp)Ú_encode_stringÚ
PruneStatsz&basicblock diamond fanout fanout_raisec                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r   z4 Holds statistics from reference count pruning.
    c                 C   sN   t |tƒs d}t| t|ƒ¡ƒ‚t| j|j | j|j | j|j | j|j ƒS )Nz;PruneStats can only be added to another PruneStats, got {}.©	Ú
isinstancer   Ú	TypeErrorÚformatÚtypeÚ
basicblockÚdiamondÚfanoutÚfanout_raise©ÚselfÚotherÚmsg© r   úZ/var/www/website-v5/atlas_env/lib/python3.8/site-packages/llvmlite/binding/passmanagers.pyÚ__add__   s    



ýzPruneStats.__add__c                 C   sN   t |tƒs d}t| t|ƒ¡ƒ‚t| j|j | j|j | j|j | j|j ƒS )NzBPruneStats can only be subtracted from another PruneStats, got {}.r   r   r   r   r   Ú__sub__   s    



ýzPruneStats.__sub__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r   r   r   r   r      s   	c                   @   s(   e Zd ZdefdefdefdefgZdS )Ú_c_PruneStatsr   r   r   r   N)r!   r"   r#   r   Ú_fields_r   r   r   r   r%   &   s
   ür%   Fc                 C   s>   t ddddƒ}t| ƒ}tj t|ƒ|¡ t|j|j|j	|j
ƒS )z± Returns a namedtuple containing the current values for the refop pruning
    statistics. If kwarg `printout` is True the stats are printed to stderr,
    default is False.
    r   )r%   r   r   ÚlibÚLLVMPY_DumpRefPruneStatsr   r   r   r   r   r   )ÚprintoutÚstatsZdo_printr   r   r   Údump_refprune_stats.   s    ÿr+   c                 C   s   t j t| ƒ¡ dS )z¸Enable or disable the pass timers.

    Parameters
    ----------
    enable : bool
        Set to True to enable the pass timers.
        Set to False to disable the pass timers.
    N)r   r'   ZLLVMPY_SetTimePassesr   )Úenabler   r   r   Úset_time_passes<   s    	r-   c               
   C   s4   t  ¡ �"} t j | ¡ t| ƒW  5 Q R £ S Q R X dS )a  Returns the pass timings report and resets the LLVM internal timers.

    Pass timers are enabled by ``set_time_passes()``. If the timers are not
    enabled, this function will return an empty string.

    Returns
    -------
    res : str
        LLVM generated timing report.
    N)r   ÚOutputStringr'   ZLLVMPY_ReportAndResetTimingsÚstr)Úbufr   r   r   Úreport_and_reset_timingsH   s    
r1   c                   C   s   t ƒ S ©N)ÚModulePassManagerr   r   r   r   Úcreate_module_pass_managerX   s    r4   c                 C   s   t | ƒS r2   )ÚFunctionPassManager)Úmoduler   r   r   Úcreate_function_pass_manager\   s    r7   c                   @   s,   e Zd ZdZdZdZdZeeB eB eB ZdS )ÚRefPruneSubpassesé   é   é   é   N)r!   r"   r#   ZPER_BBZDIAMONDZFANOUTZFANOUT_RAISEÚALLr   r   r   r   r8   `   s
   r8   c                   @   sF  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zd�dd„Zd‘dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd’d(d)„Zd“d+d,„Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!dAdB„ Z"dCdD„ Z#d”dFdG„Z$dHdI„ Z%dJdK„ Z&dLdM„ Z'dNdO„ Z(dPdQ„ Z)dRdS„ Z*dTdU„ Z+dVdW„ Z,dXdY„ Z-dZd[„ Z.d\d]„ Z/d^d_„ Z0d•d`da„Z1dbdc„ Z2ddde„ Z3dfdg„ Z4dhdi„ Z5djdk„ Z6dldm„ Z7dndo„ Z8dpdq„ Z9drds„ Z:dtdu„ Z;dvdw„ Z<dxdy„ Z=d–dzd{„Z>d|d}„ Z?d~d„ Z@d€d�„ ZAd‚dƒ„ ZBd„d…„ ZCd†d‡„ ZDdˆd‰„ ZEdŠd‹„ ZFeGjHdŒfd�dŽ„ZId�S )—ÚPassManagerzPassManager
    c                 C   s   | j  | ¡ d S r2   )Ú_capiÚLLVMPY_DisposePassManager©r   r   r   r   Ú_disposel   s    zPassManager._disposec                 C   s   t j | ¡ dS )z™
        See https://llvm.org/docs/Passes.html#aa-eval-exhaustive-alias-analysis-precision-evaluator

        LLVM 11+: `llvm::createAAEvalPass`
        N)r   r'   ÚLLVMPY_AddAAEvalPassrA   r   r   r   Úadd_aa_eval_passo   s    zPassManager.add_aa_eval_passc                 C   s   t j | ¡ dS )z›
        See https://llvm.org/docs/Passes.html#basic-aa-basic-alias-analysis-stateless-aa-impl

        LLVM 11+: `llvm::createBasicAAWrapperPass`
        N)r   r'   ÚLLVMPY_AddBasicAAWrapperPassrA   r   r   r   Úadd_basic_aa_passw   s    zPassManager.add_basic_aa_passc                 C   s   t j | ¡ dS )z�
        See http://llvm.org/docs/Passes.html#constmerge-merge-duplicate-global-constants

        LLVM 11+: `LLVMAddConstantMergePass`
        N)r   r'   ÚLLVMPY_AddConstantMergePassrA   r   r   r   Úadd_constant_merge_pass   s    z#PassManager.add_constant_merge_passc                 C   s   t j | ¡ dS )z�
        See http://llvm.org/docs/Passes.html#deadargelim-dead-argument-elimination

        LLVM 11+: `LLVMAddDeadArgEliminationPass`
        N)r   r'   Ú LLVMPY_AddDeadArgEliminationPassrA   r   r   r   Úadd_dead_arg_elimination_pass‡   s    z)PassManager.add_dead_arg_elimination_passc                 C   s   t j | ¡ dS )z�
        See https://llvm.org/docs/Passes.html#da-dependence-analysis

        LLVM 11+: `llvm::createDependenceAnalysisWrapperPass`
        N)r   r'   Ú LLVMPY_AddDependenceAnalysisPassrA   r   r   r   Úadd_dependence_analysis_pass�   s    z(PassManager.add_dependence_analysis_passc                 C   s   t j | ¡ dS )z›
        See https://llvm.org/docs/Passes.html#dot-callgraph-print-call-graph-to-dot-file

        LLVM 11+: `llvm::createCallGraphDOTPrinterPass`
        N)r   r'   Ú!LLVMPY_AddCallGraphDOTPrinterPassrA   r   r   r   Úadd_dot_call_graph_pass—   s    z#PassManager.add_dot_call_graph_passc                 C   s   t j | ¡ dS )z›
        See https://llvm.org/docs/Passes.html#dot-cfg-print-cfg-of-function-to-dot-file

        LLVM 11+: `llvm::createCFGPrinterLegacyPassPass`
        N)r   r'   ÚLLVMPY_AddCFGPrinterPassrA   r   r   r   Úadd_dot_cfg_printer_passŸ   s    z$PassManager.add_dot_cfg_printer_passFc                 C   s   t j | |¡ dS )zÁ
        See https://llvm.org/docs/Passes.html#dot-dom-print-dominance-tree-of-function-to-dot-file

        LLVM 11+: `llvm::createDomPrinterPass` and `llvm::createDomOnlyPrinterPass`
        N)r   r'   ÚLLVMPY_AddDotDomPrinterPass©r   Z	show_bodyr   r   r   Úadd_dot_dom_printer_pass§   s    z$PassManager.add_dot_dom_printer_passc                 C   s   t j | |¡ dS )zÑ
        See https://llvm.org/docs/Passes.html#dot-postdom-print-postdominance-tree-of-function-to-dot-file

        LLVM 11+: `llvm::createPostDomPrinterPass` and `llvm::createPostDomOnlyPrinterPass`
        N)r   r'   ÚLLVMPY_AddDotPostDomPrinterPassrR   r   r   r   Úadd_dot_postdom_printer_pass¯   s    z(PassManager.add_dot_postdom_printer_passc                 C   s   t j | ¡ dS )z¢
        See https://llvm.org/docs/Passes.html#globalsmodref-aa-simple-mod-ref-analysis-for-globals

        LLVM 11+: `llvm::createGlobalsAAWrapperPass`
        N)r   r'   ÚLLVMPY_AddGlobalsModRefAAPassrA   r   r   r   Úadd_globals_mod_ref_aa_pass·   s    z'PassManager.add_globals_mod_ref_aa_passc                 C   s   t j | ¡ dS )z†
        See https://llvm.org/docs/Passes.html#iv-users-induction-variable-users

        LLVM 11+: `llvm::createIVUsersPass`
        N)r   r'   ÚLLVMPY_AddIVUsersPassrA   r   r   r   Úadd_iv_users_pass¿   s    zPassManager.add_iv_users_passc                 C   s   t j | ¡ dS )z·
        See https://llvm.org/docs/Passes.html#lint-statically-lint-checks-llvm-ir

        LLVM 11: `llvm::createLintPass`
        LLVM 12+: `llvm::createLintLegacyPassPass`
        N)r   r'   ÚLLVMPY_AddLintPassrA   r   r   r   Úadd_lint_passÇ   s    zPassManager.add_lint_passc                 C   s   t j | ¡ dS )zš
        See https://llvm.org/docs/Passes.html#lazy-value-info-lazy-value-information-analysis

        LLVM 11+: `llvm::createLazyValueInfoPass`
        N)r   r'   ÚLLVMPY_AddLazyValueInfoPassrA   r   r   r   Úadd_lazy_value_info_passÐ   s    z$PassManager.add_lazy_value_info_passc                 C   s   t j | ¡ dS )z¤
        See https://llvm.org/docs/Passes.html#module-debuginfo-decodes-module-level-debug-info

        LLVM 11+: `llvm::createModuleDebugInfoPrinterPass`
        N)r   r'   Ú$LLVMPY_AddModuleDebugInfoPrinterPassrA   r   r   r   Úadd_module_debug_info_passØ   s    z&PassManager.add_module_debug_info_passc                 C   s   t j | ¡ dS )z—
        See https://llvm.org/docs/Passes.html#regions-detect-single-entry-single-exit-regions

        LLVM 11+: `llvm::createRegionInfoPass`
        N)r   r'   ÚLLVMPY_AddRegionInfoPassrA   r   r   r   Úadd_region_info_passà   s    z PassManager.add_region_info_passc                 C   s   t j | ¡ dS )z—
        See https://llvm.org/docs/Passes.html#scev-aa-scalarevolution-based-alias-analysis

        LLVM 11+: `llvm::createSCEVAAWrapperPass`
        N)r   r'   ÚLLVMPY_AddScalarEvolutionAAPassrA   r   r   r   Úadd_scalar_evolution_aa_passè   s    z(PassManager.add_scalar_evolution_aa_passc                 C   s   t j | ¡ dS )z�
        See https://llvm.org/docs/Passes.html#adce-aggressive-dead-code-elimination

        LLVM 11+: `llvm::createAggressiveDCEPass`
        N)r   r'   ÚLLVMPY_AddAggressiveDCEPassrA   r   r   r   Ú)add_aggressive_dead_code_elimination_passð   s    z5PassManager.add_aggressive_dead_code_elimination_passTc                 C   s   t j | |¡ dS )z¢
        See https://llvm.org/docs/Passes.html#always-inline-inliner-for-always-inline-functions

        LLVM 11+: `llvm::createAlwaysInlinerLegacyPass`
        N)r   r'   ÚLLVMPY_AddAlwaysInlinerPass)r   Zinsert_lifetimer   r   r   Úadd_always_inliner_passø   s    z#PassManager.add_always_inliner_passé   c                 C   s   t j | |¡ dS )z¥
        See https://llvm.org/docs/Passes.html#argpromotion-promote-by-reference-arguments-to-scalars

        LLVM 11+: `llvm::createArgumentPromotionPass`
        N)r   r'   ÚLLVMPY_AddArgPromotionPass)r   Zmax_elementsr   r   r   Úadd_arg_promotion_pass   s    z"PassManager.add_arg_promotion_passc                 C   s   t j | ¡ dS )zœ
        See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg

        LLVM 11+: `llvm::createBreakCriticalEdgesPass`
        N)r   r'   Ú LLVMPY_AddBreakCriticalEdgesPassrA   r   r   r   Úadd_break_critical_edges_pass  s    z)PassManager.add_break_critical_edges_passc                 C   s   t j | ¡ dS )zŒ
        See https://llvm.org/docs/Passes.html#dse-dead-store-elimination

        LLVM 11+: `llvm::createDeadStoreEliminationPass`
        N)r   r'   Ú"LLVMPY_AddDeadStoreEliminationPassrA   r   r   r   Úadd_dead_store_elimination_pass  s    z+PassManager.add_dead_store_elimination_passc                 C   s   t j | ¡ dS )z¤
        See https://llvm.org/docs/Passes.html#function-attrs-deduce-function-attributes

        LLVM 11+: `llvm::createReversePostOrderFunctionAttrsPass`
        N)r   r'   Ú+LLVMPY_AddReversePostOrderFunctionAttrsPassrA   r   r   r   Ú*add_reverse_post_order_function_attrs_pass  s    z6PassManager.add_reverse_post_order_function_attrs_passc                 C   s   t j | ¡ dS )z�
        See http://llvm.org/docs/Passes.html#functionattrs-deduce-function-attributes

        LLVM 11+: `LLVMAddFunctionAttrsPass`
        N)r   r'   ÚLLVMPY_AddFunctionAttrsPassrA   r   r   r   Úadd_function_attrs_pass   s    z#PassManager.add_function_attrs_passc                 C   s   t j | |¡ dS )z‹
        See http://llvm.org/docs/Passes.html#inline-function-integration-inlining

        LLVM 11+: `createFunctionInliningPass`
        N)r   r'   ÚLLVMPY_AddFunctionInliningPass©r   Ú	thresholdr   r   r   Úadd_function_inlining_pass(  s    z&PassManager.add_function_inlining_passc                 C   s   t j | ¡ dS )z‚
        See http://llvm.org/docs/Passes.html#globaldce-dead-global-elimination

        LLVM 11+: `LLVMAddGlobalDCEPass`
        N)r   r'   ÚLLVMPY_AddGlobalDCEPassrA   r   r   r   Úadd_global_dce_pass0  s    zPassManager.add_global_dce_passc                 C   s   t j | ¡ dS )zŠ
        See http://llvm.org/docs/Passes.html#globalopt-global-variable-optimizer

        LLVM 11+: `LLVMAddGlobalOptimizerPass`
        N)r   r'   ÚLLVMPY_AddGlobalOptimizerPassrA   r   r   r   Úadd_global_optimizer_pass8  s    z%PassManager.add_global_optimizer_passc                 C   s   t j | ¡ dS )zœ
        See http://llvm.org/docs/Passes.html#ipsccp-interprocedural-sparse-conditional-constant-propagation

        LLVM 11+: `LLVMAddIPSCCPPass`
        N)r   r'   ÚLLVMPY_AddIPSCCPPassrA   r   r   r   Úadd_ipsccp_pass@  s    zPassManager.add_ipsccp_passc                 C   s   t j | ¡ dS )zˆ
        See http://llvm.org/docs/Passes.html#dce-dead-code-elimination
        LLVM 11+: `llvm::createDeadCodeEliminationPass`
        N)r   r'   Ú!LLVMPY_AddDeadCodeEliminationPassrA   r   r   r   Úadd_dead_code_elimination_passH  s    z*PassManager.add_dead_code_elimination_passc                 C   s   t j | ¡ dS )z¦
        See https://llvm.org/docs/Passes.html#aggressive-instcombine-combine-expression-patterns

        LLVM 11+: `llvm::createAggressiveInstCombinerPass`
        N)r   r'   Ú,LLVMPY_AddAggressiveInstructionCombiningPassrA   r   r   r   Ú)add_aggressive_instruction_combining_passO  s    z5PassManager.add_aggressive_instruction_combining_passc                 C   s   t j | ¡ dS )z�
        See https://llvm.org/docs/Passes.html#internalize-internalize-global-symbols

        LLVM 11+: `llvm::createInternalizePass`
        N)r   r'   ÚLLVMPY_AddInternalizePassrA   r   r   r   Úadd_internalize_passW  s    z PassManager.add_internalize_passc                 C   s   t j | ¡ dS )z…
        See http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg

        LLVM 11+: `LLVMAddCFGSimplificationPass`
        N)r   r'   ÚLLVMPY_AddCFGSimplificationPassrA   r   r   r   Úadd_cfg_simplification_pass_  s    z'PassManager.add_cfg_simplification_passéÿÿÿÿc                 C   s   t j | |¡ dS )zˆ
        See https://llvm.org/docs/Passes.html#jump-threading-jump-threading

        LLVM 11+: `llvm::createJumpThreadingPass`
        N)r   r'   ÚLLVMPY_AddJumpThreadingPassrt   r   r   r   Úadd_jump_threading_passg  s    z#PassManager.add_jump_threading_passc                 C   s   t j | ¡ dS )z‚
        See https://llvm.org/docs/Passes.html#lcssa-loop-closed-ssa-form-pass

        LLVM 11+: `llvm::createLCSSAPass`
        N)r   r'   ÚLLVMPY_AddLCSSAPassrA   r   r   r   Úadd_lcssa_passo  s    zPassManager.add_lcssa_passc                 C   s   t j | ¡ dS )zu
        See http://llvm.org/docs/Passes.html#gvn-global-value-numbering

        LLVM 11+: `LLVMAddGVNPass`
        N)r   r'   ÚLLVMPY_AddGVNPassrA   r   r   r   Úadd_gvn_passw  s    zPassManager.add_gvn_passc                 C   s   t j | ¡ dS )z~
        See http://llvm.org/docs/Passes.html#passes-instcombine

        LLVM 11+: `LLVMAddInstructionCombiningPass`
        N)r   r'   Ú"LLVMPY_AddInstructionCombiningPassrA   r   r   r   Úadd_instruction_combining_pass  s    z*PassManager.add_instruction_combining_passc                 C   s   t j | ¡ dS )z{
        See http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion

        LLVM 11+: `LLVMAddLICMPass`
        N)r   r'   ÚLLVMPY_AddLICMPassrA   r   r   r   Úadd_licm_pass‡  s    zPassManager.add_licm_passc                 C   s   t j | ¡ dS )z‰
        See https://llvm.org/docs/Passes.html#loop-deletion-delete-dead-loops

        LLVM 11+: `llvm::createLoopDeletionPass`
        N)r   r'   ÚLLVMPY_AddLoopDeletionPassrA   r   r   r   Úadd_loop_deletion_pass�  s    z"PassManager.add_loop_deletion_passc                 C   s   t j | ¡ dS )z˜
        See https://llvm.org/docs/Passes.html#loop-extract-extract-loops-into-new-functions

        LLVM 11+: `llvm::createLoopExtractorPass`
        N)r   r'   ÚLLVMPY_AddLoopExtractorPassrA   r   r   r   Úadd_loop_extractor_pass—  s    z#PassManager.add_loop_extractor_passc                 C   s   t j | ¡ dS )z±
        See https://llvm.org/docs/Passes.html#loop-extract-single-extract-at-most-one-loop-into-a-new-function

        LLVM 11+: `llvm::createSingleLoopExtractorPass`
        N)r   r'   Ú!LLVMPY_AddSingleLoopExtractorPassrA   r   r   r   Úadd_single_loop_extractor_passŸ  s    z*PassManager.add_single_loop_extractor_passc                 C   s   t j | ¡ dS )zˆ
        See http://llvm.org/docs/Passes.html#sccp-sparse-conditional-constant-propagation

        LLVM 11+: `LLVMAddSCCPPass`
        N)r   r'   ÚLLVMPY_AddSCCPPassrA   r   r   r   Úadd_sccp_pass§  s    zPassManager.add_sccp_passc                 C   s   t j | ¡ dS )z“
        See https://llvm.org/docs/Passes.html#loop-reduce-loop-strength-reduction

        LLVM 11+: `llvm::createLoopStrengthReducePass`
        N)r   r'   Ú LLVMPY_AddLoopStrengthReducePassrA   r   r   r   Úadd_loop_strength_reduce_pass¯  s    z)PassManager.add_loop_strength_reduce_passc                 C   s   t j | ¡ dS )z’
        See https://llvm.org/docs/Passes.html#loop-simplify-canonicalize-natural-loops

        LLVM 11+: `llvm::createLoopSimplifyPass`
        N)r   r'   Ú LLVMPY_AddLoopSimplificationPassrA   r   r   r   Úadd_loop_simplification_pass·  s    z(PassManager.add_loop_simplification_passc                 C   s   t j | ¡ dS )z{
        See https://llvm.org/docs/Passes.html#loop-unroll-unroll-loops

        LLVM 11+: `LLVMAddLoopUnrollPass`
        N)r   r'   ÚLLVMPY_AddLoopUnrollPassrA   r   r   r   Úadd_loop_unroll_pass¿  s    z PassManager.add_loop_unroll_passc                 C   s   t j | ¡ dS )z‘
        See https://llvm.org/docs/Passes.html#loop-unroll-and-jam-unroll-and-jam-loops

        LLVM 11+: `LLVMAddLoopUnrollAndJamPass`
        N)r   r'   ÚLLVMPY_AddLoopUnrollAndJamPassrA   r   r   r   Úadd_loop_unroll_and_jam_passÇ  s    z(PassManager.add_loop_unroll_and_jam_passc                 C   s   t j | ||¡ dS )z†
        See https://llvm.org/docs/Passes.html#loop-unswitch-unswitch-loops

        LLVM 11+: `llvm::createLoopUnswitchPass`
        N)r   r'   ÚLLVMPY_AddLoopUnswitchPass)r   Zoptimize_for_sizeZhas_branch_divergencer   r   r   Úadd_loop_unswitch_passÏ  s    þz"PassManager.add_loop_unswitch_passc                 C   s   t j | ¡ dS )zŸ
        See https://llvm.org/docs/Passes.html#loweratomic-lower-atomic-intrinsics-to-non-atomic-form

        LLVM 11+: `llvm::createLowerAtomicPass`
        N)r   r'   ÚLLVMPY_AddLowerAtomicPassrA   r   r   r   Úadd_lower_atomic_passÛ  s    z!PassManager.add_lower_atomic_passc                 C   s   t j | ¡ dS )zª
        See https://llvm.org/docs/Passes.html#lowerinvoke-lower-invokes-to-calls-for-unwindless-code-generators

        LLVM 11+: `llvm::createLowerInvokePass`
        N)r   r'   ÚLLVMPY_AddLowerInvokePassrA   r   r   r   Úadd_lower_invoke_passã  s    z!PassManager.add_lower_invoke_passc                 C   s   t j | ¡ dS )z’
        See https://llvm.org/docs/Passes.html#lowerswitch-lower-switchinsts-to-branches

        LLVM 11+: `llvm::createLowerSwitchPass`
        N)r   r'   ÚLLVMPY_AddLowerSwitchPassrA   r   r   r   Úadd_lower_switch_passë  s    z!PassManager.add_lower_switch_passc                 C   s   t j | ¡ dS )z„
        See https://llvm.org/docs/Passes.html#memcpyopt-memcpy-optimization

        LLVM 11+: `llvm::createMemCpyOptPass`
        N)r   r'   Ú LLVMPY_AddMemCpyOptimizationPassrA   r   r   r   Úadd_memcpy_optimization_passó  s    z(PassManager.add_memcpy_optimization_passc                 C   s   t j | ¡ dS )z…
        See https://llvm.org/docs/Passes.html#mergefunc-merge-functions

        LLVM 11+: `llvm::createMergeFunctionsPass`
        N)r   r'   ÚLLVMPY_AddMergeFunctionsPassrA   r   r   r   Úadd_merge_functions_passû  s    z$PassManager.add_merge_functions_passc                 C   s   t j | ¡ dS )z™
        See https://llvm.org/docs/Passes.html#mergereturn-unify-function-exit-nodes

        LLVM 11+: `llvm::createUnifyFunctionExitNodesPass`
        N)r   r'   ÚLLVMPY_AddMergeReturnsPassrA   r   r   r   Úadd_merge_returns_pass  s    z"PassManager.add_merge_returns_passc                 C   s   t j | ¡ dS )zŒ
        See https://llvm.org/docs/Passes.html#partial-inliner-partial-inliner

        LLVM 11+: `llvm::createPartialInliningPass`
        N)r   r'   ÚLLVMPY_AddPartialInliningPassrA   r   r   r   Úadd_partial_inlining_pass  s    z%PassManager.add_partial_inlining_passc                 C   s   t j | ¡ dS )z“
        See https://llvm.org/docs/Passes.html#prune-eh-remove-unused-exception-handling-info

        LLVM 11+: `llvm::createPruneEHPass`
        N)r   r'   Ú$LLVMPY_AddPruneExceptionHandlingPassrA   r   r   r   Ú!add_prune_exception_handling_pass  s    z-PassManager.add_prune_exception_handling_passc                 C   s   t j | ¡ dS )zŒ
        See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions

        LLVM 11+: `llvm::createReassociatePass`
        N)r   r'   ÚLLVMPY_AddReassociatePassrA   r   r   r   Ú add_reassociate_expressions_pass  s    z,PassManager.add_reassociate_expressions_passc                 C   s   t j | ¡ dS )z®
        See https://llvm.org/docs/Passes.html#rel-lookup-table-converter-relative-lookup-table-converter

        LLVM 11+: `llvm::createDemoteRegisterToMemoryPass`
        N)r   r'   Ú$LLVMPY_AddDemoteRegisterToMemoryPassrA   r   r   r   Ú"add_demote_register_to_memory_pass#  s    z.PassManager.add_demote_register_to_memory_passc                 C   s   t j | ¡ dS )a  
        See http://llvm.org/docs/Passes.html#scalarrepl-scalar-replacement-of-aggregates-dt
        Note that this pass corresponds to the ``opt -sroa`` command-line option,
        despite the link above.

        LLVM 11+: `llvm::createSROAPass`
        N)r   r'   ÚLLVMPY_AddSROAPassrA   r   r   r   Úadd_sroa_pass+  s    zPassManager.add_sroa_passc                 C   s   t j | ¡ dS )zv
        See https://llvm.org/docs/Passes.html#sink-code-sinking

        LLVM 11+: `llvm::createSinkingPass`
        N)r   r'   ÚLLVMPY_AddSinkPassrA   r   r   r   Úadd_sink_pass5  s    zPassManager.add_sink_passc                 C   s   t j | |¡ dS )z�
        See https://llvm.org/docs/Passes.html#strip-strip-all-symbols-from-a-module

        LLVM 11+: `llvm::createStripSymbolsPass`
        N)r   r'   ÚLLVMPY_AddStripSymbolsPass)r   Z
only_debugr   r   r   Úadd_strip_symbols_pass=  s    z"PassManager.add_strip_symbols_passc                 C   s   t j | ¡ dS )z©
        See https://llvm.org/docs/Passes.html#strip-dead-debug-info-strip-debug-info-for-unused-symbols

        LLVM 11+: `llvm::createStripDeadDebugInfoPass`
        N)r   r'   Ú LLVMPY_AddStripDeadDebugInfoPassrA   r   r   r   Úadd_strip_dead_debug_info_passE  s    z*PassManager.add_strip_dead_debug_info_passc                 C   s   t j | ¡ dS )z§
        See https://llvm.org/docs/Passes.html#strip-dead-prototypes-strip-unused-function-prototypes

        LLVM 11+: `llvm::createStripDeadPrototypesPass`
        N)r   r'   Ú!LLVMPY_AddStripDeadPrototypesPassrA   r   r   r   Úadd_strip_dead_prototypes_passM  s    z*PassManager.add_strip_dead_prototypes_passc                 C   s   t j | ¡ dS )z¨
        See https://llvm.org/docs/Passes.html#strip-debug-declare-strip-all-llvm-dbg-declare-intrinsics

        LLVM 11+: `llvm::createStripDebugDeclarePass`
        N)r   r'   Ú)LLVMPY_AddStripDebugDeclarePrototypesPassrA   r   r   r   Úadd_strip_debug_declare_passU  s    z(PassManager.add_strip_debug_declare_passc                 C   s   t j | ¡ dS )z³
        See https://llvm.org/docs/Passes.html#strip-nondebug-strip-all-symbols-except-dbg-symbols-from-a-module

        LLVM 11+: `llvm::createStripNonDebugSymbolsPass`
        N)r   r'   Ú"LLVMPY_AddStripNondebugSymbolsPassrA   r   r   r   Úadd_strip_nondebug_symbols_pass]  s    z+PassManager.add_strip_nondebug_symbols_passc                 C   s   t j | ¡ dS )z“
        See https://llvm.org/docs/Passes.html#tailcallelim-tail-call-elimination

        LLVM 11+: `llvm::createTailCallEliminationPass`
        N)r   r'   Ú!LLVMPY_AddTailCallEliminationPassrA   r   r   r   Úadd_tail_call_elimination_passe  s    z*PassManager.add_tail_call_elimination_passc                 C   s   t j | ¡ dS )z?
        LLVM 11+: `LLVMAddTypeBasedAliasAnalysisPass`
        N)r   r'   Ú$LLVMPY_AddTypeBasedAliasAnalysisPassrA   r   r   r   Ú"add_type_based_alias_analysis_passm  s    z.PassManager.add_type_based_alias_analysis_passc                 C   s   t j | ¡ dS )z�
        See http://llvm.org/docs/AliasAnalysis.html#the-basicaa-pass

        LLVM 11+: `LLVMAddBasicAliasAnalysisPass`
        N)r   r'   Ú LLVMPY_AddBasicAliasAnalysisPassrA   r   r   r   Úadd_basic_alias_analysis_passs  s    z)PassManager.add_basic_alias_analysis_passc                 C   s   t j | ¡ dS )z:http://llvm.org/docs/Passes.html#loop-rotate-rotate-loops.N)r   r'   ZLLVMPY_LLVMAddLoopRotatePassrA   r   r   r   Úadd_loop_rotate_pass{  s    z PassManager.add_loop_rotate_passiè  c                 C   s   t |ƒ}tj | ||¡ dS )aá  Add Numba specific Reference count pruning pass.

        Parameters
        ----------
        subpasses_flags : RefPruneSubpasses
            A bitmask to control the subpasses to be enabled.
        subgraph_limit : int
            Limit the fanout pruners to working on a subgraph no bigger than
            this number of basic-blocks to avoid spending too much time in very
            large graphs. Default is 1000. Subject to change in future
            versions.
        N)r8   r   r'   ÚLLVMPY_AddRefPrunePass)r   Zsubpasses_flagsZsubgraph_limitZiflagsr   r   r   Úadd_refprune_pass�  s    zPassManager.add_refprune_passN)F)F)T)rh   )r…   )FF)F)Jr!   r"   r#   r$   rB   rD   rF   rH   rJ   rL   rN   rP   rS   rU   rW   rY   r[   r]   r_   ra   rc   re   rg   rj   rl   rn   rp   rr   rv   rx   rz   r|   r~   r€   r‚   r„   r‡   r‰   r‹   r�   r�   r‘   r“   r•   r—   r™   r›   r�   rŸ   r¡   r£   r¥   r§   r©   r«   r­   r¯   r±   r³   rµ   r·   r¹   r»   r½   r¿   rÁ   rÃ   rÅ   rÇ   rÉ   rÊ   r8   r=   rÌ   r   r   r   r   r>   h   s’   

	


	  þ


ÿr>   c                   @   s*   e Zd Zd
dd„Zddd„Zddd	„ZdS )r3   Nc                 C   s"   |d krt j ¡ }t | |¡ d S r2   )r   r'   ÚLLVMPY_CreatePassManagerr>   Ú__init__)r   Úptrr   r   r   rÎ   •  s    
zModulePassManager.__init__ÚyamlÚ c                 C   sR   |dkrt j | |¡S t j | |t|ƒt|ƒt|ƒ¡}|dkrFtdƒ‚|dkS dS )aö  
        Run optimization passes on the given module.

        Parameters
        ----------
        module : llvmlite.binding.ModuleRef
            The module to be optimized inplace
        remarks_file : str; optional
            If not `None`, it is the file to store the optimization remarks.
        remarks_format : str; optional
            The format to write; YAML is default
        remarks_filter : str; optional
            The filter that should be applied to the remarks output.
        Nr…   ú"Failed to initialize remarks file.r   )r   r'   ÚLLVMPY_RunPassManagerÚ LLVMPY_RunPassManagerWithRemarksr   ÚIOError)r   r6   Úremarks_fileÚremarks_formatÚremarks_filterÚrr   r   r   Úrunš  s      ýzModulePassManager.runc              
   C   sˆ   t ƒ \}}zlt |d¡� W 5 Q R X |  ||||¡}|dkrDtdƒ‚t|ƒ�"}t|ƒ| ¡ fW  5 Q R £ W ¢S Q R X W 5 t |¡ X dS )a©  
        Run optimization passes on the given module and returns the result and
        the remarks data.

        Parameters
        ----------
        module : llvmlite.binding.ModuleRef
            The module to be optimized
        remarks_format : str
            The remarks output; YAML is the default
        remarks_filter : str; optional
            The filter that should be applied to the remarks output.
        rÙ   r…   rÒ   N©	r   ÚosÚunlinkÚfdopenrÚ   rÕ   ÚopenÚboolÚread)r   r6   r×   rØ   Ú
remarkdescÚ
remarkfilerÙ   Úfr   r   r   Úrun_with_remarksµ  s    


*z"ModulePassManager.run_with_remarks)N)NrÐ   rÑ   )rÐ   rÑ   )r!   r"   r#   rÎ   rÚ   rå   r   r   r   r   r3   “  s   
  ÿ
  ÿr3   c                   @   s8   e Zd Zdd„ Zdd„ Zdd„ Zdd
d„Zddd„ZdS )r5   c                 C   s(   t j |¡}|| _d|_t | |¡ d S )NT)r   r'   Ú LLVMPY_CreateFunctionPassManagerÚ_moduleÚ_ownedr>   rÎ   )r   r6   rÏ   r   r   r   rÎ   Ó  s    zFunctionPassManager.__init__c                 C   s   t j | ¡S )zk
        Initialize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r'   Ú$LLVMPY_InitializeFunctionPassManagerrA   r   r   r   Ú
initializeÙ  s    zFunctionPassManager.initializec                 C   s   t j | ¡S )zi
        Finalize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r'   Ú"LLVMPY_FinalizeFunctionPassManagerrA   r   r   r   Úfinalizeà  s    zFunctionPassManager.finalizeNrÐ   rÑ   c                 C   sR   |dkrt j | |¡S t j | |t|ƒt|ƒt|ƒ¡}|dkrFtdƒ‚t|ƒS dS )a  
        Run optimization passes on the given function.

        Parameters
        ----------
        function : llvmlite.binding.FunctionRef
            The function to be optimized inplace
        remarks_file : str; optional
            If not `None`, it is the file to store the optimization remarks.
        remarks_format : str; optional
            The format of the remarks file; the default is YAML
        remarks_filter : str; optional
            The filter that should be applied to the remarks output.
        Nr…   rÒ   )r   r'   ÚLLVMPY_RunFunctionPassManagerÚ(LLVMPY_RunFunctionPassManagerWithRemarksr   rÕ   rà   )r   ÚfunctionrÖ   r×   rØ   rÙ   r   r   r   rÚ   ç  s      ýzFunctionPassManager.runc              
   C   sˆ   t ƒ \}}zlt |d¡� W 5 Q R X |  ||||¡}|dkrDtdƒ‚t|ƒ�"}t|ƒ| ¡ fW  5 Q R £ W ¢S Q R X W 5 t |¡ X dS )aÏ  
        Run optimization passes on the given function and returns the result
        and the remarks data.

        Parameters
        ----------
        function : llvmlite.binding.FunctionRef
            The function to be optimized inplace
        remarks_format : str; optional
            The format of the remarks file; the default is YAML
        remarks_filter : str; optional
            The filter that should be applied to the remarks output.
        rÙ   r…   rÒ   NrÛ   )r   rï   r×   rØ   râ   rã   rÙ   rä   r   r   r   rå     s    


*z$FunctionPassManager.run_with_remarks)NrÐ   rÑ   )rÐ   rÑ   )r!   r"   r#   rÎ   rê   rì   rÚ   rå   r   r   r   r   r5   Ñ  s     ÿ
  ÿr5   )F)tÚctypesr   r   r   r   r   r   r   r	   Úcollectionsr
   Úenumr   Úllvmlite.bindingr   rÜ   Útempfiler   Úllvmlite.binding.commonr   Z_prunestatsr   r%   r+   r-   r1   r4   r7   r8   Ú	ObjectRefr>   r3   r5   ÚLLVMPassManagerRefr'   rÍ   ÚrestypeÚLLVMModuleRefræ   Úargtypesr@   rÓ   rÔ   ré   rë   ÚLLVMValueRefrí   rî   rC   rE   rG   rI   rK   rM   rO   rQ   rT   rV   ZLLVMPY_AddInstructionCountPassrX   r\   rZ   r^   r`   rb   rd   rf   ri   rk   rm   ro   r   r�   rˆ   r�   r’   r”   r˜   rš   rœ   rž   r    r¢   r¤   r¦   r¨   rª   r¬   r®   r°   r²   r´   r¸   rº   r¼   r¾   rÀ   rÂ   rÄ   r†   rq   rs   rw   ry   r{   r}   rƒ   rŠ   rŒ   rŽ   r–   r¶   rÆ   rÈ   rË   r(   r   r   r   r   Ú<module>   s  (ÿ
    />Tÿ

ü



ÿ

    ÿ

þ
ÿ
ÿ
ÿ
ý
ÿ
 ÿ
ÿ
