
    dͅ                        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e          Z G d de          ZddZd Zd Zd Zd Z G d de          Z G d dej                  Z G d de          Z G 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                       e Zd ZdZd Zd ZdS )r   z4 Holds statistics from reference count pruning.
    c                    t          |t                    s1d}t          |                    t	          |                              t          | j        |j        z   | j        |j        z   | j        |j        z   | j        |j        z             S )Nz;PruneStats can only be added to another PruneStats, got {}.	
isinstancer   	TypeErrorformattype
basicblockdiamondfanoutfanout_raiseselfothermsgs      =lib/python3.11/site-packages/llvmlite/binding/passmanagers.py__add__zPruneStats.__add__   s    %,, 	5OCCJJtE{{33444$/E,<<,6+4+e.@@B B 	B    c                    t          |t                    s1d}t          |                    t	          |                              t          | j        |j        z
  | j        |j        z
  | j        |j        z
  | j        |j        z
            S )NzBPruneStats can only be subtracted from another PruneStats, got {}.r   r   s      r    __sub__zPruneStats.__sub__   s    %,, 	5CCJJtE{{33444$/E,<<,6+4+e.@@B B 	Br"   N)__name__
__module____qualname____doc__r!   r$    r"   r    r   r      sD         B B BB B B B Br"   c                   *    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+   &   s5        	x 	H	8	"	$HHHr"   r+   Fc                     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statsdo_prints      r    dump_refprune_statsr3   .   sg     !Q1%%EhHG$$U5\\8<<<e&u|(* * *r"   c                 ^    t           j                            t          |                      dS )zEnable 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.   LLVMPY_SetTimePassesr   )enables    r    set_time_passesr7   <   s&     G  00000r"   c                      t          j                    5 } t           j                            |            t	          |           cddd           S # 1 swxY w Y   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.   LLVMPY_ReportAndResetTimingsstr)bufs    r    report_and_reset_timingsr=   H   s     
			 s,,S1113xx                 s   .AAAc                      t                      S N)ModulePassManagerr)   r"   r    create_module_pass_managerrA   X   s    r"   c                      t          |           S r?   )FunctionPassManager)modules    r    create_function_pass_managerrE   \   s    v&&&r"   c                   4    e Zd ZdZdZdZdZeez  ez  ez  ZdS )RefPruneSubpasses            N)r%   r&   r'   PER_BBDIAMONDFANOUTFANOUT_RAISEALLr)   r"   r    rG   rG   `   s6        FGFL
7
V
#l
2CCCr"   rG   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZdLdZdLdZd Zd Zd Zd Zd Zd Zd Zd ZdMdZdNdZd Zd Zd Zd Zd Zd Zd Zd  Zd! Z d" Z!d# Z"d$ Z#dOd&Z$d' Z%d( Z&d) Z'd* Z(d+ Z)d, Z*d- Z+d. Z,d/ Z-d0 Z.d1 Z/d2 Z0	 	 dPd3Z1d4 Z2d5 Z3d6 Z4d7 Z5d8 Z6d9 Z7d: Z8d; Z9d< Z:d= Z;d> Z<d? Z=dLd@Z>dA Z?dB Z@dC ZAdD ZBdE ZCdF ZDdG ZEdH ZFeGjH        dIfdJZIdKS )QPassManagerzPassManager
    c                 :    | j                             |            d S r?   )_capiLLVMPY_DisposePassManagerr   s    r    _disposezPassManager._disposel   s    
,,T22222r"   c                 D    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_AddAAEvalPassrV   s    r    add_aa_eval_passzPassManager.add_aa_eval_passo         	$$T*****r"   c                 D    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_AddBasicAAWrapperPassrV   s    r    add_basic_aa_passzPassManager.add_basic_aa_passw         	,,T22222r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#constmerge-merge-duplicate-global-constants

        LLVM 11+: `LLVMAddConstantMergePass`
        N)r   r.   LLVMPY_AddConstantMergePassrV   s    r    add_constant_merge_passz#PassManager.add_constant_merge_pass         	++D11111r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#deadargelim-dead-argument-elimination

        LLVM 11+: `LLVMAddDeadArgEliminationPass`
        N)r   r.    LLVMPY_AddDeadArgEliminationPassrV   s    r    add_dead_arg_elimination_passz)PassManager.add_dead_arg_elimination_pass         	0066666r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#da-dependence-analysis

        LLVM 11+: `llvm::createDependenceAnalysisWrapperPass`
        N)r   r.    LLVMPY_AddDependenceAnalysisPassrV   s    r    add_dependence_analysis_passz(PassManager.add_dependence_analysis_pass   rg   r"   c                 D    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_AddCallGraphDOTPrinterPassrV   s    r    add_dot_call_graph_passz#PassManager.add_dot_call_graph_pass         	11$77777r"   c                 D    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_AddCFGPrinterPassrV   s    r    add_dot_cfg_printer_passz$PassManager.add_dot_cfg_printer_pass         	((.....r"   Fc                 F    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   	show_bodys     r    add_dot_dom_printer_passz$PassManager.add_dot_dom_printer_pass   "     	++D)<<<<<r"   c                 F    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_AddDotPostDomPrinterPassru   s     r    add_dot_postdom_printer_passz(PassManager.add_dot_postdom_printer_pass   s"     	//i@@@@@r"   c                 D    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_AddGlobalsModRefAAPassrV   s    r    add_globals_mod_ref_aa_passz'PassManager.add_globals_mod_ref_aa_pass         	--d33333r"   c                 D    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_AddIVUsersPassrV   s    r    add_iv_users_passzPassManager.add_iv_users_pass   s      	%%d+++++r"   c                 D    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_AddLintPassrV   s    r    add_lint_passzPassManager.add_lint_pass   s      	""4(((((r"   c                 D    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_AddLazyValueInfoPassrV   s    r    add_lazy_value_info_passz$PassManager.add_lazy_value_info_pass   rc   r"   c                 D    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_AddModuleDebugInfoPrinterPassrV   s    r    add_module_debug_info_passz&PassManager.add_module_debug_info_pass         	44T:::::r"   c                 D    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_AddRegionInfoPassrV   s    r    add_region_info_passz PassManager.add_region_info_pass   rr   r"   c                 D    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_AddScalarEvolutionAAPassrV   s    r    add_scalar_evolution_aa_passz(PassManager.add_scalar_evolution_aa_pass         	//55555r"   c                 D    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_AddAggressiveDCEPassrV   s    r    )add_aggressive_dead_code_elimination_passz5PassManager.add_aggressive_dead_code_elimination_pass   rc   r"   Tc                 F    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   insert_lifetimes     r    add_always_inliner_passz#PassManager.add_always_inliner_pass   s"     	++D/BBBBBr"      c                 F    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   max_elementss     r    add_arg_promotion_passz"PassManager.add_arg_promotion_pass   s"     	**4>>>>>r"   c                 D    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_AddBreakCriticalEdgesPassrV   s    r    add_break_critical_edges_passz)PassManager.add_break_critical_edges_pass  rg   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#dse-dead-store-elimination

        LLVM 11+: `llvm::createDeadStoreEliminationPass`
        N)r   r.   "LLVMPY_AddDeadStoreEliminationPassrV   s    r    add_dead_store_elimination_passz+PassManager.add_dead_store_elimination_pass        	22488888r"   c                 D    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_AddReversePostOrderFunctionAttrsPassrV   s    r    *add_reverse_post_order_function_attrs_passz6PassManager.add_reverse_post_order_function_attrs_pass  s      	;;DAAAAAr"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#functionattrs-deduce-function-attributes

        LLVM 11+: `LLVMAddFunctionAttrsPass`
        N)r   r.   LLVMPY_AddFunctionAttrsPassrV   s    r    add_function_attrs_passz#PassManager.add_function_attrs_pass   rc   r"   c                 F    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   	thresholds     r    add_function_inlining_passz&PassManager.add_function_inlining_pass(  s"     	..tY?????r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#globaldce-dead-global-elimination

        LLVM 11+: `LLVMAddGlobalDCEPass`
        N)r   r.   LLVMPY_AddGlobalDCEPassrV   s    r    add_global_dce_passzPassManager.add_global_dce_pass0  s      	''-----r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#globalopt-global-variable-optimizer

        LLVM 11+: `LLVMAddGlobalOptimizerPass`
        N)r   r.   LLVMPY_AddGlobalOptimizerPassrV   s    r    add_global_optimizer_passz%PassManager.add_global_optimizer_pass8  r   r"   c                 D    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_AddIPSCCPPassrV   s    r    add_ipsccp_passzPassManager.add_ipsccp_pass@  r[   r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#dce-dead-code-elimination
        LLVM 11+: `llvm::createDeadCodeEliminationPass`
        N)r   r.   !LLVMPY_AddDeadCodeEliminationPassrV   s    r    add_dead_code_elimination_passz*PassManager.add_dead_code_elimination_passH  s     
 	11$77777r"   c                 D    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_AddAggressiveInstructionCombiningPassrV   s    r    )add_aggressive_instruction_combining_passz5PassManager.add_aggressive_instruction_combining_passO  s      	<<TBBBBBr"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#internalize-internalize-global-symbols

        LLVM 11+: `llvm::createInternalizePass`
        N)r   r.   LLVMPY_AddInternalizePassrV   s    r    add_internalize_passz PassManager.add_internalize_passW        	))$/////r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg

        LLVM 11+: `LLVMAddCFGSimplificationPass`
        N)r   r.   LLVMPY_AddCFGSimplificationPassrV   s    r    add_cfg_simplification_passz'PassManager.add_cfg_simplification_pass_  r   r"   c                 F    t           j                            | |           dS )z
        See https://llvm.org/docs/Passes.html#jump-threading-jump-threading

        LLVM 11+: `llvm::createJumpThreadingPass`
        N)r   r.   LLVMPY_AddJumpThreadingPassr   s     r    add_jump_threading_passz#PassManager.add_jump_threading_passg  rx   r"   c                 D    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_AddLCSSAPassrV   s    r    add_lcssa_passzPassManager.add_lcssa_passo  s      	##D)))))r"   c                 D    t           j                            |            dS )zu
        See http://llvm.org/docs/Passes.html#gvn-global-value-numbering

        LLVM 11+: `LLVMAddGVNPass`
        N)r   r.   LLVMPY_AddGVNPassrV   s    r    add_gvn_passzPassManager.add_gvn_passw  s      	!!$'''''r"   c                 D    t           j                            |            dS )z~
        See http://llvm.org/docs/Passes.html#passes-instcombine

        LLVM 11+: `LLVMAddInstructionCombiningPass`
        N)r   r.   "LLVMPY_AddInstructionCombiningPassrV   s    r    add_instruction_combining_passz*PassManager.add_instruction_combining_pass  r   r"   c                 D    t           j                            |            dS )z{
        See http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion

        LLVM 11+: `LLVMAddLICMPass`
        N)r   r.   LLVMPY_AddLICMPassrV   s    r    add_licm_passzPassManager.add_licm_pass        	""4(((((r"   c                 D    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_AddLoopDeletionPassrV   s    r    add_loop_deletion_passz"PassManager.add_loop_deletion_pass        	**400000r"   c                 D    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_AddLoopExtractorPassrV   s    r    add_loop_extractor_passz#PassManager.add_loop_extractor_pass  rc   r"   c                 D    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_AddSingleLoopExtractorPassrV   s    r    add_single_loop_extractor_passz*PassManager.add_single_loop_extractor_pass  rn   r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#sccp-sparse-conditional-constant-propagation

        LLVM 11+: `LLVMAddSCCPPass`
        N)r   r.   LLVMPY_AddSCCPPassrV   s    r    add_sccp_passzPassManager.add_sccp_pass  r   r"   c                 D    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_AddLoopStrengthReducePassrV   s    r    add_loop_strength_reduce_passz)PassManager.add_loop_strength_reduce_pass  rg   r"   c                 D    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_AddLoopSimplificationPassrV   s    r    add_loop_simplification_passz(PassManager.add_loop_simplification_pass  rg   r"   c                 D    t           j                            |            dS )z{
        See https://llvm.org/docs/Passes.html#loop-unroll-unroll-loops

        LLVM 11+: `LLVMAddLoopUnrollPass`
        N)r   r.   LLVMPY_AddLoopUnrollPassrV   s    r    add_loop_unroll_passz PassManager.add_loop_unroll_pass  rr   r"   c                 D    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_AddLoopUnrollAndJamPassrV   s    r    add_loop_unroll_and_jam_passz(PassManager.add_loop_unroll_and_jam_pass  s      	..t44444r"   c                 H    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   optimize_for_sizehas_branch_divergences      r    add_loop_unswitch_passz"PassManager.add_loop_unswitch_pass  s5     	**4+<+@	B 	B 	B 	B 	Br"   c                 D    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_AddLowerAtomicPassrV   s    r    add_lower_atomic_passz!PassManager.add_lower_atomic_pass  r   r"   c                 D    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_AddLowerInvokePassrV   s    r    add_lower_invoke_passz!PassManager.add_lower_invoke_pass  r   r"   c                 D    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_AddLowerSwitchPassrV   s    r    add_lower_switch_passz!PassManager.add_lower_switch_pass  r   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#memcpyopt-memcpy-optimization

        LLVM 11+: `llvm::createMemCpyOptPass`
        N)r   r.    LLVMPY_AddMemCpyOptimizationPassrV   s    r    add_memcpy_optimization_passz(PassManager.add_memcpy_optimization_pass  rg   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#mergefunc-merge-functions

        LLVM 11+: `llvm::createMergeFunctionsPass`
        N)r   r.   LLVMPY_AddMergeFunctionsPassrV   s    r    add_merge_functions_passz$PassManager.add_merge_functions_pass  r_   r"   c                 D    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_AddMergeReturnsPassrV   s    r    add_merge_returns_passz"PassManager.add_merge_returns_pass  r   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#partial-inliner-partial-inliner

        LLVM 11+: `llvm::createPartialInliningPass`
        N)r   r.   LLVMPY_AddPartialInliningPassrV   s    r    add_partial_inlining_passz%PassManager.add_partial_inlining_pass  r   r"   c                 D    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_AddPruneExceptionHandlingPassrV   s    r    !add_prune_exception_handling_passz-PassManager.add_prune_exception_handling_pass  r   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions

        LLVM 11+: `llvm::createReassociatePass`
        N)r   r.   LLVMPY_AddReassociatePassrV   s    r     add_reassociate_expressions_passz,PassManager.add_reassociate_expressions_pass  r   r"   c                 D    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_AddDemoteRegisterToMemoryPassrV   s    r    "add_demote_register_to_memory_passz.PassManager.add_demote_register_to_memory_pass#  r   r"   c                 D    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_AddSROAPassrV   s    r    add_sroa_passzPassManager.add_sroa_pass+  s      	""4(((((r"   c                 D    t           j                            |            dS )zv
        See https://llvm.org/docs/Passes.html#sink-code-sinking

        LLVM 11+: `llvm::createSinkingPass`
        N)r   r.   LLVMPY_AddSinkPassrV   s    r    add_sink_passzPassManager.add_sink_pass5  r   r"   c                 F    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   
only_debugs     r    add_strip_symbols_passz"PassManager.add_strip_symbols_pass=  s"     	**4<<<<<r"   c                 D    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_AddStripDeadDebugInfoPassrV   s    r    add_strip_dead_debug_info_passz*PassManager.add_strip_dead_debug_info_passE  rg   r"   c                 D    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_AddStripDeadPrototypesPassrV   s    r    add_strip_dead_prototypes_passz*PassManager.add_strip_dead_prototypes_passM  rn   r"   c                 D    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_AddStripDebugDeclarePrototypesPassrV   s    r    add_strip_debug_declare_passz(PassManager.add_strip_debug_declare_passU  s      	99$?????r"   c                 D    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_AddStripNondebugSymbolsPassrV   s    r    add_strip_nondebug_symbols_passz+PassManager.add_strip_nondebug_symbols_pass]  r   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#tailcallelim-tail-call-elimination

        LLVM 11+: `llvm::createTailCallEliminationPass`
        N)r   r.   !LLVMPY_AddTailCallEliminationPassrV   s    r    add_tail_call_elimination_passz*PassManager.add_tail_call_elimination_passe  rn   r"   c                 D    t           j                            |            dS )z?
        LLVM 11+: `LLVMAddTypeBasedAliasAnalysisPass`
        N)r   r.   $LLVMPY_AddTypeBasedAliasAnalysisPassrV   s    r    "add_type_based_alias_analysis_passz.PassManager.add_type_based_alias_analysis_passm  s      	44T:::::r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/AliasAnalysis.html#the-basicaa-pass

        LLVM 11+: `LLVMAddBasicAliasAnalysisPass`
        N)r   r.    LLVMPY_AddBasicAliasAnalysisPassrV   s    r    add_basic_alias_analysis_passz)PassManager.add_basic_alias_analysis_passs  rg   r"   c                 D    t           j                            |            dS )z:http://llvm.org/docs/Passes.html#loop-rotate-rotate-loops.N)r   r.   LLVMPY_LLVMAddLoopRotatePassrV   s    r    add_loop_rotate_passz PassManager.add_loop_rotate_pass{  s    ,,T22222r"   i  c                 f    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)rG   r   r.   LLVMPY_AddRefPrunePass)r   subpasses_flagssubgraph_limitiflagss       r    add_refprune_passzPassManager.add_refprune_pass  s1     #?33&&tV^DDDDDr"   NF)T)r   )r   )FF)Jr%   r&   r'   r(   rW   rZ   r^   rb   rf   rj   rm   rq   rw   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   r  r  r  r  r  r  r  r  r  r  r!  r$  r'  r*  r-  r0  r3  r6  rG   rP   r<  r)   r"   r    rR   rR   h   st        3 3 3+ + +3 3 32 2 27 7 77 7 78 8 8/ / /= = = =A A A A4 4 4, , ,) ) )2 2 2; ; ;/ / /6 6 62 2 2C C C C? ? ? ?7 7 79 9 9B B B2 2 2@ @ @. . .4 4 4+ + +8 8 8C C C0 0 06 6 6= = = =* * *( ( (9 9 9) ) )1 1 12 2 28 8 8) ) )7 7 77 7 7/ / /5 5 5 275:
B 
B 
B 
B0 0 00 0 00 0 07 7 73 3 31 1 14 4 4; ; ;0 0 0; ; ;) ) )) ) )= = = =7 7 78 8 8@ @ @9 9 98 8 8; ; ;7 7 73 3 3 1B0E)-E E E E E Er"   rR   c                   .    e Zd ZddZ	 	 ddZ	 	 d	dZdS )
r@   Nc                 |    |t           j                                        }t                              | |           d S r?   )r   r.   LLVMPY_CreatePassManagerrR   __init__)r   ptrs     r    rA  zModulePassManager.__init__  s6    ;'2244CT3'''''r"   yaml c           	         | t           j                            | |          S t           j                            | |t	          |          t	          |          t	          |                    }|dk    rt          d          |dk    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   rD   remarks_fileremarks_formatremarks_filterrs         r    runzModulePassManager.run  s      700v>>>88fn^<<~..|,,. .A BwwBCCCq5Lr"   c                    t                      \  }}	 t          j        |d          5  	 ddd           n# 1 swxY w Y   |                     ||||          }|dk    rt	          d          t          |          5 }t          |          |                                fcddd           t          j        |           S # 1 swxY w Y   	 t          j        |           dS # t          j        |           w xY w)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.
        rM  Nr   rF  	r   osfdopenrN  rI  openboolreadunlink)r   rD   rK  rL  
remarkdesc
remarkfilerM  fs           r    run_with_remarksz"ModulePassManager.run_with_remarks  sn    ")
J		":s++                ^^LLABwwBCCCj!! )QAww() ) ) ) ) ) ) Ij!!!!) ) ) ) ) ) ) ) ) Ij!!!!!BIj!!!!J   C# 6C# :C# :?C# =#C C# CC# C	C# #C9r?   NrC  rD  rC  rD  )r%   r&   r'   rA  rN  rZ  r)   r"   r    r@   r@     sa        ( ( ( (
 =C   6 7=(*" " " " " "r"   r@   c                   8    e Zd Zd Zd Zd Z	 	 d	dZ	 	 d
dZdS )rC   c                     t           j                            |          }|| _        d|_        t
                              | |           d S )NT)r   r.    LLVMPY_CreateFunctionPassManager_module_ownedrR   rA  )r   rD   rB  s      r    rA  zFunctionPassManager.__init__  sA    g66v>>T3'''''r"   c                 @    t           j                            |           S )zk
        Initialize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r.   $LLVMPY_InitializeFunctionPassManagerrV   s    r    
initializezFunctionPassManager.initialize  s    
 w;;DAAAr"   c                 @    t           j                            |           S )zi
        Finalize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r.   "LLVMPY_FinalizeFunctionPassManagerrV   s    r    finalizezFunctionPassManager.finalize  s    
 w99$???r"   NrC  rD  c           	      "   | t           j                            | |          S t           j                            | |t	          |          t	          |          t	          |                    }|dk    rt          d          t          |          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   rF  )r   r.   LLVMPY_RunFunctionPassManager(LLVMPY_RunFunctionPassManagerWithRemarksr   rI  rT  )r   functionrJ  rK  rL  rM  s         r    rN  zFunctionPassManager.run  s      788xHHH@@h~ > >~..|,,. .A BwwBCCC77Nr"   c                    t                      \  }}	 t          j        |d          5  	 ddd           n# 1 swxY w Y   |                     ||||          }|dk    rt	          d          t          |          5 }t          |          |                                fcddd           t          j        |           S # 1 swxY w Y   	 t          j        |           dS # t          j        |           w xY w)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.
        rM  Nr   rF  rP  )r   rl  rK  rL  rW  rX  rM  rY  s           r    rZ  z$FunctionPassManager.run_with_remarks  sp   " ")
J	" :s++                :~~NNABwwBCCCj!! )QAww() ) ) ) ) ) ) Ij!!!!) ) ) ) ) ) ) ) ) Ij!!!!!BIj!!!!r[  r\  r]  )r%   r&   r'   rA  re  rh  rN  rZ  r)   r"   r    rC   rC     s        ( ( (B B B@ @ @ ?E   6 9?(*" " " " " "r"   rC   r=  )tctypesr   r   r   r   r   r   r	   r
   collectionsr   enumr   llvmlite.bindingr   rQ  tempfiler   llvmlite.binding.commonr   _prunestatsr   r+   r3   r7   r=   rA   rE   rG   	ObjectRefrR   r@   rC   LLVMPassManagerRefr.   r@  restypeLLVMModuleRefr`  argtypesrU   rG  rH  rd  rg  LLVMValueRefrj  rk  rY   r]   ra   re   ri   rl   rp   rt   rz   r}   LLVMPY_AddInstructionCountPassr   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   r   r   r   r   r   r   r   r   r   r   r   r  r/  r2  r8  r/   r)   r"   r    <module>r|     s                      " " " " " "                   				       2 2 2 2 2 2jBE EB B B B B B B B0$ $ $ $ $I $ $ $* * * *	1 	1 	1     ' ' '3 3 3 3 3 3 3 3hE hE hE hE hE#- hE hE hEV;" ;" ;" ;" ;" ;" ;" ;"|N" N" N" N" N"+ N" N" N"h ,/+A   (585F4G ( 1363I ( 0.1.D-E ! **-*@*-*;*=  &(.  %585K585F5=5=5=	5? ( 1
 49 ( 09<9O8P , 57= , 47:7M6N * 35; * 2252H252B2D % .06 % - C,h(= 0 9 <A 0 8),)?(@  %141G0H $ -030F/G # ,585K4L ( 1585K4L ( 1696L5M ) 2-0-C,D   )030F/O # ,
4 ' 0 362H1I % .363I2J & /*-*@)A  &030F/G # ,'*'=&>  #9<9O8P , 5-0-C,D   )474J3K ' 0030F/G # ,030F/O # ,/2/Ev.N " +585K4L ( 17 * 3 @ 3 < A 4 =.1.D-E ! *(+(>'?  $/2/E.F " +030F/G # ,696L5M ) 2585K4L ( 1585K4L ( 1-0-C,D   )363I2J & /

/ " + /2.D-E ! *.1.D-E ! *.1.D-E ! *585K4L ( 1141G0H $ -/2/E.F " +252H1I % .9<9O8P , 5.1.D-E ! *9<9O8P , 5'*'=&>  #/2/Ev.N " +585K4L ( 1696L5M ) 2> 1 :7:7M6N * 3696L5M ) 2030F/N # ,030F/G # ,E3# & /,/,B+C  (252H1I % .),)?(@  %696L5M ) 2474J3K ' 0&)&<%=  "7:7M6N * 3'*'=&>  #'*'=&>  #'*'=&>  #9<9O8P , 5585K4L ( 1+.+A5+3+5  ' .5W]-C-CV,L   ) ) )r"   