
    J/Ph                        d dl 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mZ d dlZd dlmZ d dlmZ ed          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$        j0        _)        eej$        j0        _&        ej#        ej/        eeegej$        j1        _)        e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#        gej$        j7        _)        ej#        gej$        j8        _)        ej#        egej$        j9        _)        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$        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#        gej$        jC        _)        ej#        egej$        jD        _)        ej#        gej$        jE        _)        ej#        gej$        jF        _)        ej#        gej$        jG        _)        edk     r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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dk     rej#        gej$        jZ        _)        ej#        gej$        j[        _)        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$        ja        _)        ej#        gej$        jb        _)        ej#        gej$        jc        _)        ej#        egej$        jd        _)        ej#        gej$        je        _)        ej#        e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#        gej$        jr        _)        ej#        egej$        js        _)        ej#        gej$        jt        _)        ej#        eegej$        ju        _)         ee          egej$        jv        _)        dS )    )c_boolc_char_pc_intc_size_t	StructurebyrefPOINTER)
namedtuple)IntFlag)ffi)llvm_version_infoN)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      ]/var/www/html/test/jupyter/venv/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   1   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=   K   s     
			 s,,S1113xx                 s   .AAAc                      t                      S N)ModulePassManagerr)   r"   r    create_module_pass_managerrA   [   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   c   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dNdZdNdZd Zd Zd Zd Zd Zd Zd Zd ZdOdZdPd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#dQd&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	 	 dRd3Z1d4 Z2d5 Z3d6 Z4d7 Z5d8 Z6d9 Z7d: Z8d; Z9d< Z:d= Z;d> Z<d? Z=dNd@Z>dA Z?dB Z@dC ZAdD ZBdE ZCdF ZDdG ZEdH ZFdI ZGdJ ZHeIjJ        dKfdLZKdMS )SPassManagerzPassManager
    c                 :    | j                             |            d S r?   )_capiLLVMPY_DisposePassManagerr   s    r    _disposezPassManager._disposeo   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 14: `llvm::createAAEvalPass`
        N)r   r.   LLVMPY_AddAAEvalPassrV   s    r    add_aa_eval_passzPassManager.add_aa_eval_passr         	$$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 14: `llvm::createBasicAAWrapperPass`
        N)r   r.   LLVMPY_AddBasicAAWrapperPassrV   s    r    add_basic_aa_passzPassManager.add_basic_aa_passz         	,,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 14: `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 14: `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 14: `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 14: `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 14: `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 14: `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 14: `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 14: `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 14: `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 14: `llvm::createLintLegacyPassPass`
        N)r   r.   LLVMPY_AddLintPassrV   s    r    add_lint_passzPassManager.add_lint_pass         	""4(((((r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#lazy-value-info-lazy-value-information-analysis

        LLVM 14: `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 14: `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 14: `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 14: `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 14: `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 14: `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                      t          d          )z
        See https://llvm.org/docs/Passes.html#argpromotion-promote-by-reference-arguments-to-scalars

        LLVM 14: `llvm::createArgumentPromotionPass`
        z.ArgumentPromotionPass unavailable in LLVM > 14)RuntimeError)r   max_elementss     r    add_arg_promotion_passz"PassManager.add_arg_promotion_pass  s     KLLLr"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg

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

        LLVM 14: `LLVMAddGlobalOptimizerPass`
        N)r   r.   LLVMPY_AddGlobalOptimizerPassrV   s    r    add_global_optimizer_passz%PassManager.add_global_optimizer_pass:  r   r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#ipsccp-interprocedural-sparse-conditional-constant-propagation

        LLVM 14: `LLVMAddIPSCCPPass`
        N)r   r.   LLVMPY_AddIPSCCPPassrV   s    r    add_ipsccp_passzPassManager.add_ipsccp_passB  r[   r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#dce-dead-code-elimination
        LLVM 14: `llvm::createDeadCodeEliminationPass`
        N)r   r.   !LLVMPY_AddDeadCodeEliminationPassrV   s    r    add_dead_code_elimination_passz*PassManager.add_dead_code_elimination_passJ  s     
 	11$77777r"   c                 |    t           dk    rd}t          |          t          j                            |            dS )z
        See https://llvm.org/docs/Passes.html#aggressive-instcombine-combine-expression-patterns

        LLVM 14: `llvm::createAggressiveInstCombinerPass`
           z4AggressiveInstrCombinerPass unavailable in LLVM > 15N)llvm_version_majorr   r   r.   ,LLVMPY_AddAggressiveInstructionCombiningPass)r   r   s     r    )add_aggressive_instruction_combining_passz5PassManager.add_aggressive_instruction_combining_passQ  s>     ""HC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 14: `llvm::createInternalizePass`
        N)r   r.   LLVMPY_AddInternalizePassrV   s    r    add_internalize_passz PassManager.add_internalize_pass]        	))$/////r"   c                 D    t           j                            |            dS )z
        See http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg

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

        LLVM 14: `llvm::createJumpThreadingPass`
        N)r   r.   LLVMPY_AddJumpThreadingPassr   s     r    add_jump_threading_passz#PassManager.add_jump_threading_passm  rx   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#lcssa-loop-closed-ssa-form-pass

        LLVM 14: `llvm::createLCSSAPass`
        N)r   r.   LLVMPY_AddLCSSAPassrV   s    r    add_lcssa_passzPassManager.add_lcssa_passu  s      	##D)))))r"   c                 D    t           j                            |            dS )zt
        See http://llvm.org/docs/Passes.html#gvn-global-value-numbering

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

        LLVM 14: `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 )zz
        See http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion

        LLVM 14: `LLVMAddLICMPass`
        N)r   r.   LLVMPY_AddLICMPassrV   s    r    add_licm_passzPassManager.add_licm_pass  r   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#loop-deletion-delete-dead-loops

        LLVM 14: `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 14: `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 14: `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 14: `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 14: `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 14: `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 )zz
        See https://llvm.org/docs/Passes.html#loop-unroll-unroll-loops

        LLVM 14: `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 14: `LLVMAddLoopUnrollAndJamPass`
        N)r   r.   LLVMPY_AddLoopUnrollAndJamPassrV   s    r    add_loop_unroll_and_jam_passz(PassManager.add_loop_unroll_and_jam_pass        	..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 14: `llvm::createLoopUnswitchPass`
        LLVM 15: `llvm::createSimpleLoopUnswitchLegacyPass`
        N)r   r.   LLVMPY_AddLoopUnswitchPass)r   optimize_for_sizehas_branch_divergences      r    add_loop_unswitch_passz"PassManager.add_loop_unswitch_pass  s5     	**41B+@	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 14: `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 14: `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 14: `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 14: `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 14: `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 14: `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 14: `llvm::createPartialInliningPass`
        N)r   r.   LLVMPY_AddPartialInliningPassrV   s    r    add_partial_inlining_passz%PassManager.add_partial_inlining_pass  r   r"   c                 x    t           dk    rt          d          t          j                            |            dS )z
        See https://llvm.org/docs/Passes.html#prune-eh-remove-unused-exception-handling-info

        LLVM 14: `llvm::createPruneEHPass`
        r   z$PruneEHPass unavailable in LLVM > 15N)r   r   r   r.   $LLVMPY_AddPruneExceptionHandlingPassrV   s    r    !add_prune_exception_handling_passz-PassManager.add_prune_exception_handling_pass  s:     ""EFFF44T:::::r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions

        LLVM 14: `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 14: `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 14: `llvm::createSROAPass`
        N)r   r.   LLVMPY_AddSROAPassrV   s    r    add_sroa_passzPassManager.add_sroa_pass3  s      	""4(((((r"   c                 D    t           j                            |            dS )zu
        See https://llvm.org/docs/Passes.html#sink-code-sinking

        LLVM 14: `llvm::createSinkingPass`
        N)r   r.   LLVMPY_AddSinkPassrV   s    r    add_sink_passzPassManager.add_sink_pass=  r   r"   c                 F    t           j                            | |           dS )z
        See https://llvm.org/docs/Passes.html#strip-strip-all-symbols-from-a-module

        LLVM 14: `llvm::createStripSymbolsPass`
        N)r   r.   LLVMPY_AddStripSymbolsPass)r   
only_debugs     r    add_strip_symbols_passz"PassManager.add_strip_symbols_passE  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 14: `llvm::createStripDeadDebugInfoPass`
        N)r   r.    LLVMPY_AddStripDeadDebugInfoPassrV   s    r    add_strip_dead_debug_info_passz*PassManager.add_strip_dead_debug_info_passM  rg   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#strip-dead-prototypes-strip-unused-function-prototypes

        LLVM 14: `llvm::createStripDeadPrototypesPass`
        N)r   r.   !LLVMPY_AddStripDeadPrototypesPassrV   s    r    add_strip_dead_prototypes_passz*PassManager.add_strip_dead_prototypes_passU  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 14: `llvm::createStripDebugDeclarePass`
        N)r   r.   )LLVMPY_AddStripDebugDeclarePrototypesPassrV   s    r    add_strip_debug_declare_passz(PassManager.add_strip_debug_declare_pass]  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 14: `llvm::createStripNonDebugSymbolsPass`
        N)r   r.   "LLVMPY_AddStripNondebugSymbolsPassrV   s    r    add_strip_nondebug_symbols_passz+PassManager.add_strip_nondebug_symbols_passe  r   r"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#tailcallelim-tail-call-elimination

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

        LLVM 14: `LLVMAddBasicAliasAnalysisPass`
        N)r   r.    LLVMPY_AddBasicAliasAnalysisPassrV   s    r    add_basic_alias_analysis_passz)PassManager.add_basic_alias_analysis_pass{  rg   r"   c                 D    t           j                            |            dS )z:http://llvm.org/docs/Passes.html#loop-rotate-rotate-loops.N)r   r.   LLVMPY_AddLoopRotatePassrV   s    r    add_loop_rotate_passz PassManager.add_loop_rotate_pass  s    ((.....r"   c                 `    t           j                            | t          |                     d S r?   )r   r.   LLVMPY_AddTargetLibraryInfoPassr   )r   triples     r    add_target_library_infoz#PassManager.add_target_library_info  s(    //nV6L6LMMMMMr"   c                 D    t           j                            |            dS )z
        See https://llvm.org/docs/Passes.html#instnamer-assign-names-to-anonymous-instructions.

        LLVM 14: `llvm::createInstructionNamerPass`
        N)r   r.   LLVMPY_AddInstructionNamerPassrV   s    r    add_instruction_namer_passz&PassManager.add_instruction_namer_pass  r   r"   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_AddLegacyRefPrunePass)r   subpasses_flagssubgraph_limitiflagss       r    add_refprune_passzPassManager.add_refprune_pass  s1     #?33,,T6>JJJJJr"   NF)T)r   )r   )FF)Lr%   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-  r0  r3  r6  r9  r=  r@  rG   rP   rF  r)   r"   r    rR   rR   k   s        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M M M M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/ / /N N N5 5 5 1B0E)-K K K K K K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    rK  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.
        rW  Nr   rP  	r   osfdopenrX  rS  openboolreadunlink)r   rD   rU  rV  
remarkdesc
remarkfilerW  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?   NrM  rN  rM  rN  )r%   r&   r'   rK  rX  rd  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   rK  )r   rD   rL  s      r    rK  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"   NrM  rN  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   rP  )r   r.   LLVMPY_RunFunctionPassManager(LLVMPY_RunFunctionPassManagerWithRemarksr   rS  r^  )r   functionrT  rU  rV  rW  s         r    rX  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.
        rW  Nr   rP  rZ  )r   rv  rU  rV  ra  rb  rW  rc  s           r    rd  z$FunctionPassManager.run_with_remarks  sp   " ")
J	" :s++                :~~NNABwwBCCCj!! )QAww() ) ) ) ) ) ) Ij!!!!) ) ) ) ) ) ) ) ) Ij!!!!!BIj!!!!re  rf  rg  )r%   r&   r'   rK  ro  rr  rX  rd  r)   r"   r    rC   rC     s        ( ( (B B B@ @ @ ?E   6 9?(*" " " " " "r"   rC      rG  )wctypesr   r   r   r   r   r   r	   collectionsr
   enumr   llvmlite.bindingr   llvmlite.binding.initfinir   r[  tempfiler   llvmlite.binding.commonr   r   _prunestatsr   r+   r3   r7   r=   rA   rE   rG   	ObjectRefrR   r@   rC   LLVMPassManagerRefr.   rJ  restypeLLVMModuleRefrj  argtypesrU   rQ  rR  rn  rq  LLVMValueRefrt  ru  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  r2  r5  r;  r?  rB  r/   r)   r"   r    <module>r     s&	                    " " " " " "                   7 7 7 7 7 7 				       2 2 2 2 2 2&q) 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xK xK xK xK xK#- xK xK xK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 # ,585K4L ( 17 * 3 @ 3 < E CG8A /2.D-E ! *(+(>'?  $/2/E.F " +030F/G # ,696L5M ) 2585K4L ( 1585K4L ( 1-0-C,D   )363I2J & //2/Ev/5/7 " +.1.D-E ! *.1.D-E ! *.1.D-E ! *585K4L ( 1141G0H $ -/2/E.F " +252H1I % .=CG09 /2.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 ( 1474J4<4> ' 0363I2J & /141G191; $ - .5W]-C-CV,L   ) ) )r"   