
    sKg                        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mZ d dlZd dlmZ d dlmZ  e
d	d
      Ze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jH                  ejJ                  jL                  _'        ejP                  gejJ                  jR                  _*        ejH                  ejJ                  jR                  _'        ejH                  gejJ                  jV                  _*        ejH                  ejP                  gejJ                  jX                  _*        eejJ                  jX                  _'        ejH                  ejP                  eeegejJ                  jZ                  _*        eejJ                  jZ                  _'        ejH                  gejJ                  j\                  _*        eejJ                  j\                  _'        ejH                  gejJ                  j^                  _*        eejJ                  j^                  _'        ejH                  ej`                  gejJ                  jb                  _*        eejJ                  jb                  _'        ejH                  ej`                  eeegejJ                  jd                  _*        eejJ                  jd                  _'        ejH                  gejJ                  jf                  _*        ejH                  gejJ                  jh                  _*        ejH                  gejJ                  jj                  _*        ejH                  gejJ                  jl                  _*        ejH                  gejJ                  jn                  _*        ejH                  gejJ                  jp                  _*        ejH                  gejJ                  jr                  _*        ejH                  egejJ                  jt                  _*        ejH                  egejJ                  jv                  _*        ejH                  gejJ                  jx                  _*        ejH                  gejJ                  jz                  _*        ejH                  gejJ                  j|                  _*        ejH                  gejJ                  j~                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  egejJ                  j                  _*        edk  r'ejH                  egejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  eegejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  egejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  egejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  egejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  egejJ                  j                  _*        ejH                  gejJ                  j                  _*        ejH                  eegejJ                  j                  _*         ee      egejJ                  j                  _*        y)    )c_boolc_char_pc_intc_size_tc_uint	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y)r   z4 Holds statistics from reference count pruning.
    c                 @   t        |t              s%d}t        |j                  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      a/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/llvmlite/binding/passmanagers.py__add__zPruneStats.__add__   s}    %,OCCJJtE{344$//E,<,<<,,6++4++e.@.@@B 	B    c                 @   t        |t              s%d}t        |j                  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    %,CCJJtE{344$//E,<,<<,,6++4++e.@.@@B 	Br#   N)__name__
__module____qualname____doc__r"   r%    r#   r!   r   r      s    BBr#   c                   (    e Zd ZdefdefdefdefgZy)_c_PruneStatsr   r   r   r   N)r&   r'   r(   r   _fields_r*   r#   r!   r,   r,   )   s)    	x 	H	8	"	$Hr#   r,   c                     t        dddd      }t        |       }t        j                  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_statsr4   1   s`     !Q1%EhHGG$$U5\8<e&&u||((* *r#   c                 T    t         j                  j                  t        |              y)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_passesr8   ?   s     GG  0r#   c                      t        j                         5 } t         j                  j                  |        t	        |       cddd       S # 1 sw Y   yxY w)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   s7     
			s,,S13x 
		s   *A		Ac                      t               S N)ModulePassManagerr*   r#   r!   create_module_pass_managerrB   [   s    r#   c                     t        |       S r@   )FunctionPassManager)modules    r!   create_function_pass_managerrF   _   s    v&&r#   c                   2    e Zd ZdZdZdZdZeez  ez  ez  Zy)RefPruneSubpasses            N)r&   r'   r(   PER_BBDIAMONDFANOUTFANOUT_RAISEALLr*   r#   r!   rH   rH   c   s*    FGFL
7
V
#l
2Cr#   rH   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZdJd
ZdJdZd Zd Zd Zd Zd Zd Zd Zd ZdKdZdLd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#dMd"Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0	 	 dNd/Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=dJd<Z>d= Z?d> Z@d? ZAd@ ZBdA ZCdB ZDdC ZEdD ZFdE ZGdF ZHeIj                  dGfdHZKyI)OPassManagerzPassManager
    c                 :    | j                   j                  |        y r@   )_capiLLVMPY_DisposePassManagerr   s    r!   _disposezPassManager._disposeo   s    

,,T2r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#aa-eval-exhaustive-alias-analysis-precision-evaluator

        LLVM 14: `llvm::createAAEvalPass`
        N)r   r/   LLVMPY_AddAAEvalPassrW   s    r!   add_aa_eval_passzPassManager.add_aa_eval_passr        	$$T*r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#basic-aa-basic-alias-analysis-stateless-aa-impl

        LLVM 14: `llvm::createBasicAAWrapperPass`
        N)r   r/   LLVMPY_AddBasicAAWrapperPassrW   s    r!   add_basic_aa_passzPassManager.add_basic_aa_passz        	,,T2r#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#constmerge-merge-duplicate-global-constants

        LLVM 14: `LLVMAddConstantMergePass`
        N)r   r/   LLVMPY_AddConstantMergePassrW   s    r!   add_constant_merge_passz#PassManager.add_constant_merge_pass        	++D1r#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#deadargelim-dead-argument-elimination

        LLVM 14: `LLVMAddDeadArgEliminationPass`
        N)r   r/    LLVMPY_AddDeadArgEliminationPassrW   s    r!   add_dead_arg_elimination_passz)PassManager.add_dead_arg_elimination_pass        	006r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#da-dependence-analysis

        LLVM 14: `llvm::createDependenceAnalysisWrapperPass`
        N)r   r/    LLVMPY_AddDependenceAnalysisPassrW   s    r!   add_dependence_analysis_passz(PassManager.add_dependence_analysis_pass   rh   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#dot-callgraph-print-call-graph-to-dot-file

        LLVM 14: `llvm::createCallGraphDOTPrinterPass`
        N)r   r/   !LLVMPY_AddCallGraphDOTPrinterPassrW   s    r!   add_dot_call_graph_passz#PassManager.add_dot_call_graph_pass        	11$7r#   c                 B    t         j                  j                  |        y)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_AddCFGPrinterPassrW   s    r!   add_dot_cfg_printer_passz$PassManager.add_dot_cfg_printer_pass        	((.r#   c                 D    t         j                  j                  | |       y)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                 D    t         j                  j                  | |       y)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_AddDotPostDomPrinterPassrv   s     r!   add_dot_postdom_printer_passz(PassManager.add_dot_postdom_printer_pass   s     	//i@r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#globalsmodref-aa-simple-mod-ref-analysis-for-globals

        LLVM 14: `llvm::createGlobalsAAWrapperPass`
        N)r   r/   LLVMPY_AddGlobalsModRefAAPassrW   s    r!   add_globals_mod_ref_aa_passz'PassManager.add_globals_mod_ref_aa_pass        	--d3r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#iv-users-induction-variable-users

        LLVM 14: `llvm::createIVUsersPass`
        N)r   r/   LLVMPY_AddIVUsersPassrW   s    r!   add_iv_users_passzPassManager.add_iv_users_pass   s     	%%d+r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lint-statically-lint-checks-llvm-ir

        LLVM 14: `llvm::createLintLegacyPassPass`
        N)r   r/   LLVMPY_AddLintPassrW   s    r!   add_lint_passzPassManager.add_lint_pass        	""4(r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lazy-value-info-lazy-value-information-analysis

        LLVM 14: `llvm::createLazyValueInfoPass`
        N)r   r/   LLVMPY_AddLazyValueInfoPassrW   s    r!   add_lazy_value_info_passz$PassManager.add_lazy_value_info_pass   rd   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#module-debuginfo-decodes-module-level-debug-info

        LLVM 14: `llvm::createModuleDebugInfoPrinterPass`
        N)r   r/   $LLVMPY_AddModuleDebugInfoPrinterPassrW   s    r!   add_module_debug_info_passz&PassManager.add_module_debug_info_pass        	44T:r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#regions-detect-single-entry-single-exit-regions

        LLVM 14: `llvm::createRegionInfoPass`
        N)r   r/   LLVMPY_AddRegionInfoPassrW   s    r!   add_region_info_passz PassManager.add_region_info_pass   rs   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#scev-aa-scalarevolution-based-alias-analysis

        LLVM 14: `llvm::createSCEVAAWrapperPass`
        N)r   r/   LLVMPY_AddScalarEvolutionAAPassrW   s    r!   add_scalar_evolution_aa_passz(PassManager.add_scalar_evolution_aa_pass        	//5r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#adce-aggressive-dead-code-elimination

        LLVM 14: `llvm::createAggressiveDCEPass`
        N)r   r/   LLVMPY_AddAggressiveDCEPassrW   s    r!   )add_aggressive_dead_code_elimination_passz5PassManager.add_aggressive_dead_code_elimination_pass   rd   r#   c                 D    t         j                  j                  | |       y)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/Br#   c                 l    t         dkD  rt        d      t        j                  j	                  | |       y)z
        See https://llvm.org/docs/Passes.html#argpromotion-promote-by-reference-arguments-to-scalars

        LLVM 14: `llvm::createArgumentPromotionPass`
           z.ArgumentPromotionPass unavailable in LLVM > 14N)llvm_version_majorRuntimeErrorr   r/   LLVMPY_AddArgPromotionPass)r   max_elementss     r!   add_arg_promotion_passz"PassManager.add_arg_promotion_pass  s,     "OPP**4>r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg

        LLVM 14: `llvm::createBreakCriticalEdgesPass`
        N)r   r/    LLVMPY_AddBreakCriticalEdgesPassrW   s    r!   add_break_critical_edges_passz)PassManager.add_break_critical_edges_pass  rh   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#dse-dead-store-elimination

        LLVM 14: `llvm::createDeadStoreEliminationPass`
        N)r   r/   "LLVMPY_AddDeadStoreEliminationPassrW   s    r!   add_dead_store_elimination_passz+PassManager.add_dead_store_elimination_pass       	2248r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#function-attrs-deduce-function-attributes

        LLVM 14: `llvm::createReversePostOrderFunctionAttrsPass`
        N)r   r/   +LLVMPY_AddReversePostOrderFunctionAttrsPassrW   s    r!   *add_reverse_post_order_function_attrs_passz6PassManager.add_reverse_post_order_function_attrs_pass  s     	;;DAr#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#functionattrs-deduce-function-attributes

        LLVM 14: `LLVMAddFunctionAttrsPass`
        N)r   r/   LLVMPY_AddFunctionAttrsPassrW   s    r!   add_function_attrs_passz#PassManager.add_function_attrs_pass$  rd   r#   c                 D    t         j                  j                  | |       y)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                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#globaldce-dead-global-elimination

        LLVM 14: `LLVMAddGlobalDCEPass`
        N)r   r/   LLVMPY_AddGlobalDCEPassrW   s    r!   add_global_dce_passzPassManager.add_global_dce_pass4  s     	''-r#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#globalopt-global-variable-optimizer

        LLVM 14: `LLVMAddGlobalOptimizerPass`
        N)r   r/   LLVMPY_AddGlobalOptimizerPassrW   s    r!   add_global_optimizer_passz%PassManager.add_global_optimizer_pass<  r   r#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#ipsccp-interprocedural-sparse-conditional-constant-propagation

        LLVM 14: `LLVMAddIPSCCPPass`
        N)r   r/   LLVMPY_AddIPSCCPPassrW   s    r!   add_ipsccp_passzPassManager.add_ipsccp_passD  r\   r#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#dce-dead-code-elimination
        LLVM 14: `llvm::createDeadCodeEliminationPass`
        N)r   r/   !LLVMPY_AddDeadCodeEliminationPassrW   s    r!   add_dead_code_elimination_passz*PassManager.add_dead_code_elimination_passL  s    
 	11$7r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#aggressive-instcombine-combine-expression-patterns

        LLVM 14: `llvm::createAggressiveInstCombinerPass`
        N)r   r/   ,LLVMPY_AddAggressiveInstructionCombiningPassrW   s    r!   )add_aggressive_instruction_combining_passz5PassManager.add_aggressive_instruction_combining_passS  s     	<<TBr#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#internalize-internalize-global-symbols

        LLVM 14: `llvm::createInternalizePass`
        N)r   r/   LLVMPY_AddInternalizePassrW   s    r!   add_internalize_passz PassManager.add_internalize_pass[       	))$/r#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg

        LLVM 14: `LLVMAddCFGSimplificationPass`
        N)r   r/   LLVMPY_AddCFGSimplificationPassrW   s    r!   add_cfg_simplification_passz'PassManager.add_cfg_simplification_passc  r   r#   c                 D    t         j                  j                  | |       y)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_passk  ry   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lcssa-loop-closed-ssa-form-pass

        LLVM 14: `llvm::createLCSSAPass`
        N)r   r/   LLVMPY_AddLCSSAPassrW   s    r!   add_lcssa_passzPassManager.add_lcssa_passs  s     	##D)r#   c                 B    t         j                  j                  |        y)zt
        See http://llvm.org/docs/Passes.html#gvn-global-value-numbering

        LLVM 14: `LLVMAddGVNPass`
        N)r   r/   LLVMPY_AddGVNPassrW   s    r!   add_gvn_passzPassManager.add_gvn_pass{  s     	!!$'r#   c                 B    t         j                  j                  |        y)z}
        See http://llvm.org/docs/Passes.html#passes-instcombine

        LLVM 14: `LLVMAddInstructionCombiningPass`
        N)r   r/   "LLVMPY_AddInstructionCombiningPassrW   s    r!   add_instruction_combining_passz*PassManager.add_instruction_combining_pass  r   r#   c                 B    t         j                  j                  |        y)zz
        See http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion

        LLVM 14: `LLVMAddLICMPass`
        N)r   r/   LLVMPY_AddLICMPassrW   s    r!   add_licm_passzPassManager.add_licm_pass  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-deletion-delete-dead-loops

        LLVM 14: `llvm::createLoopDeletionPass`
        N)r   r/   LLVMPY_AddLoopDeletionPassrW   s    r!   add_loop_deletion_passz"PassManager.add_loop_deletion_pass       	**40r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-extract-extract-loops-into-new-functions

        LLVM 14: `llvm::createLoopExtractorPass`
        N)r   r/   LLVMPY_AddLoopExtractorPassrW   s    r!   add_loop_extractor_passz#PassManager.add_loop_extractor_pass  rd   r#   c                 B    t         j                  j                  |        y)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_AddSingleLoopExtractorPassrW   s    r!   add_single_loop_extractor_passz*PassManager.add_single_loop_extractor_pass  ro   r#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#sccp-sparse-conditional-constant-propagation

        LLVM 14: `LLVMAddSCCPPass`
        N)r   r/   LLVMPY_AddSCCPPassrW   s    r!   add_sccp_passzPassManager.add_sccp_pass  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-reduce-loop-strength-reduction

        LLVM 14: `llvm::createLoopStrengthReducePass`
        N)r   r/    LLVMPY_AddLoopStrengthReducePassrW   s    r!   add_loop_strength_reduce_passz)PassManager.add_loop_strength_reduce_pass  rh   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-simplify-canonicalize-natural-loops

        LLVM 14: `llvm::createLoopSimplifyPass`
        N)r   r/    LLVMPY_AddLoopSimplificationPassrW   s    r!   add_loop_simplification_passz(PassManager.add_loop_simplification_pass  rh   r#   c                 B    t         j                  j                  |        y)zz
        See https://llvm.org/docs/Passes.html#loop-unroll-unroll-loops

        LLVM 14: `LLVMAddLoopUnrollPass`
        N)r   r/   LLVMPY_AddLoopUnrollPassrW   s    r!   add_loop_unroll_passz PassManager.add_loop_unroll_pass  rs   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-unroll-and-jam-unroll-and-jam-loops

        LLVM 14: `LLVMAddLoopUnrollAndJamPass`
        N)r   r/   LLVMPY_AddLoopUnrollAndJamPassrW   s    r!   add_loop_unroll_and_jam_passz(PassManager.add_loop_unroll_and_jam_pass       	..t4r#   c                 F    t         j                  j                  | ||       y)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  s     	**41B+@	Br#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loweratomic-lower-atomic-intrinsics-to-non-atomic-form

        LLVM 14: `llvm::createLowerAtomicPass`
        N)r   r/   LLVMPY_AddLowerAtomicPassrW   s    r!   add_lower_atomic_passz!PassManager.add_lower_atomic_pass  r   r#   c                 B    t         j                  j                  |        y)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_AddLowerInvokePassrW   s    r!   add_lower_invoke_passz!PassManager.add_lower_invoke_pass  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lowerswitch-lower-switchinsts-to-branches

        LLVM 14: `llvm::createLowerSwitchPass`
        N)r   r/   LLVMPY_AddLowerSwitchPassrW   s    r!   add_lower_switch_passz!PassManager.add_lower_switch_pass  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#memcpyopt-memcpy-optimization

        LLVM 14: `llvm::createMemCpyOptPass`
        N)r   r/    LLVMPY_AddMemCpyOptimizationPassrW   s    r!   add_memcpy_optimization_passz(PassManager.add_memcpy_optimization_pass  rh   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#mergefunc-merge-functions

        LLVM 14: `llvm::createMergeFunctionsPass`
        N)r   r/   LLVMPY_AddMergeFunctionsPassrW   s    r!   add_merge_functions_passz$PassManager.add_merge_functions_pass  r`   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#mergereturn-unify-function-exit-nodes

        LLVM 14: `llvm::createUnifyFunctionExitNodesPass`
        N)r   r/   LLVMPY_AddMergeReturnsPassrW   s    r!   add_merge_returns_passz"PassManager.add_merge_returns_pass  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#partial-inliner-partial-inliner

        LLVM 14: `llvm::createPartialInliningPass`
        N)r   r/   LLVMPY_AddPartialInliningPassrW   s    r!   add_partial_inlining_passz%PassManager.add_partial_inlining_pass  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#prune-eh-remove-unused-exception-handling-info

        LLVM 14: `llvm::createPruneEHPass`
        N)r   r/   $LLVMPY_AddPruneExceptionHandlingPassrW   s    r!   !add_prune_exception_handling_passz-PassManager.add_prune_exception_handling_pass  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions

        LLVM 14: `llvm::createReassociatePass`
        N)r   r/   LLVMPY_AddReassociatePassrW   s    r!    add_reassociate_expressions_passz,PassManager.add_reassociate_expressions_pass  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#rel-lookup-table-converter-relative-lookup-table-converter

        LLVM 14: `llvm::createDemoteRegisterToMemoryPass`
        N)r   r/   $LLVMPY_AddDemoteRegisterToMemoryPassrW   s    r!   "add_demote_register_to_memory_passz.PassManager.add_demote_register_to_memory_pass'  r   r#   c                 B    t         j                  j                  |        y)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_AddSROAPassrW   s    r!   add_sroa_passzPassManager.add_sroa_pass/  s     	""4(r#   c                 B    t         j                  j                  |        y)zu
        See https://llvm.org/docs/Passes.html#sink-code-sinking

        LLVM 14: `llvm::createSinkingPass`
        N)r   r/   LLVMPY_AddSinkPassrW   s    r!   add_sink_passzPassManager.add_sink_pass9  r   r#   c                 D    t         j                  j                  | |       y)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_passA  s     	**4<r#   c                 B    t         j                  j                  |        y)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_AddStripDeadDebugInfoPassrW   s    r!   add_strip_dead_debug_info_passz*PassManager.add_strip_dead_debug_info_passI  rh   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#strip-dead-prototypes-strip-unused-function-prototypes

        LLVM 14: `llvm::createStripDeadPrototypesPass`
        N)r   r/   !LLVMPY_AddStripDeadPrototypesPassrW   s    r!   add_strip_dead_prototypes_passz*PassManager.add_strip_dead_prototypes_passQ  ro   r#   c                 B    t         j                  j                  |        y)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_AddStripDebugDeclarePrototypesPassrW   s    r!   add_strip_debug_declare_passz(PassManager.add_strip_debug_declare_passY  s     	99$?r#   c                 B    t         j                  j                  |        y)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_AddStripNondebugSymbolsPassrW   s    r!   add_strip_nondebug_symbols_passz+PassManager.add_strip_nondebug_symbols_passa  r   r#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#tailcallelim-tail-call-elimination

        LLVM 14: `llvm::createTailCallEliminationPass`
        N)r   r/   !LLVMPY_AddTailCallEliminationPassrW   s    r!   add_tail_call_elimination_passz*PassManager.add_tail_call_elimination_passi  ro   r#   c                 B    t         j                  j                  |        y)z>
        LLVM 14: `LLVMAddTypeBasedAliasAnalysisPass`
        N)r   r/   $LLVMPY_AddTypeBasedAliasAnalysisPassrW   s    r!   "add_type_based_alias_analysis_passz.PassManager.add_type_based_alias_analysis_passq  s     	44T:r#   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/AliasAnalysis.html#the-basicaa-pass

        LLVM 14: `LLVMAddBasicAliasAnalysisPass`
        N)r   r/    LLVMPY_AddBasicAliasAnalysisPassrW   s    r!   add_basic_alias_analysis_passz)PassManager.add_basic_alias_analysis_passw  rh   r#   c                 B    t         j                  j                  |        y)z:http://llvm.org/docs/Passes.html#loop-rotate-rotate-loops.N)r   r/   LLVMPY_LLVMAddLoopRotatePassrW   s    r!   add_loop_rotate_passz PassManager.add_loop_rotate_pass  s    ,,T2r#   c                 V    t         j                  j                  | t        |             y r@   )r   r/   LLVMPY_AddTargetLibraryInfoPassr   )r   triples     r!   add_target_library_infoz#PassManager.add_target_library_info  s    //nV6LMr#   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#instnamer-assign-names-to-anonymous-instructions.

        LLVM 14: `llvm::createInstructionNamerPass`
        N)r   r/   LLVMPY_AddInstructionNamerPassrW   s    r!   add_instruction_namer_passz&PassManager.add_instruction_namer_pass  r   r#   i  c                 \    t        |      }t        j                  j                  | ||       y)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)rH   r   r/   LLVMPY_AddRefPrunePass)r   subpasses_flagssubgraph_limitiflagss       r!   add_refprune_passzPassManager.add_refprune_pass  s$     #?3&&tV^Dr#   NF)T)   ))FF)Lr&   r'   r(   r)   rX   r[   r_   rc   rg   rk   rn   rr   rx   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@  rH   rQ   rF  r*   r#   r!   rS   rS   k   s   3+32778/=A4,)2;/62C?79B2@.4+8C06=*(9)128)77/5 275:
B0007314;0;))=78@98;73N5 1B0E0E)-Er#   rS   c                   ,    e Zd ZddZ	 	 ddZ	 	 ddZy)rA   Nc                 p    |t         j                  j                         }t        j	                  | |       y r@   )r   r/   LLVMPY_CreatePassManagerrS   __init__)r   ptrs     r!   rM  zModulePassManager.__init__  s)    ;''224CT3'r#   c           	          | t         j                  j                  | |      S t         j                  j                  | |t	        |      t	        |      t	        |            }|dk(  rt        d      |dkD  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.
        rI  "Failed to initialize remarks file.r   )r   r/   LLVMPY_RunPassManager LLVMPY_RunPassManagerWithRemarksr   IOError)r   rE   remarks_fileremarks_formatremarks_filterrs         r!   runzModulePassManager.run  so      7700v>>88fn^<~.|,.A BwBCCq5Lr#   c                    t               \  }}	 t        j                  |d      5  	 ddd       | j                  ||||      }|dk(  rt	        d      t        |      5 }t        |      |j                         fcddd       t        j                  |       S # 1 sw Y   rxY w# 1 sw Y   nxY w	 t        j                  |       y# 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  NrI  rP  	r   osfdopenrX  rS  openboolreadunlink)r   rE   rU  rV  
remarkdesc
remarkfilerW  fs           r!   run_with_remarksz"ModulePassManager.run_with_remarks  s     ")
J		":s+ ,^^LABwBCCj!QAw( "! IIj! ,+
 "!! IIj!BIIj!9   C B7C B$9	C B!C $B-)C Cr@   Nyaml rg  rh  )r&   r'   r(   rM  rX  rd  r*   r#   r!   rA   rA     s"    (
 =C6 7=(*"r#   rA   c                   6    e Zd Zd Zd Zd Z	 	 ddZ	 	 ddZy)	rD   c                     t         j                  j                  |      }|| _        d|_        t
        j                  | |       y )NT)r   r/    LLVMPY_CreateFunctionPassManager_module_ownedrS   rM  )r   rE   rN  s      r!   rM  zFunctionPassManager.__init__  s4    gg66v>T3'r#   c                 @    t         j                  j                  |       S )zk
        Initialize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r/   $LLVMPY_InitializeFunctionPassManagerrW   s    r!   
initializezFunctionPassManager.initialize  s    
 ww;;DAAr#   c                 @    t         j                  j                  |       S )zi
        Finalize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r/   "LLVMPY_FinalizeFunctionPassManagerrW   s    r!   finalizezFunctionPassManager.finalize  s    
 ww99$??r#   Nc           	          | t         j                  j                  | |      S t         j                  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.
        rI  rP  )r   r/   LLVMPY_RunFunctionPassManager(LLVMPY_RunFunctionPassManagerWithRemarksr   rS  r^  )r   functionrT  rU  rV  rW  s         r!   rX  zFunctionPassManager.run  so      7788xHH@@h~ >~.|,.A BwBCC7Nr#   c                    t               \  }}	 t        j                  |d      5  	 ddd       | j                  ||||      }|dk(  rt	        d      t        |      5 }t        |      |j                         fcddd       t        j                  |       S # 1 sw Y   rxY w# 1 sw Y   nxY w	 t        j                  |       y# 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  NrI  rP  rZ  )r   rx  rU  rV  ra  rb  rW  rc  s           r!   rd  z$FunctionPassManager.run_with_remarks  s    " ")
J	" :s+ ,:~~NABwBCCj!QAw( "! IIj! ,+
 "!! IIj!BIIj!re  rf  ri  )r&   r'   r(   rM  rq  rt  rX  rd  r*   r#   r!   rD   rD     s.    (B@ ?E6 9?(*"r#   rD      rG  )yctypesr   r   r   r   r   r   r	   r
   collectionsr   enumr   llvmlite.bindingr   llvmlite.binding.initfinir   r[  tempfiler   llvmlite.binding.commonr   _prunestatsr   r   r,   r4   r8   r>   rB   rF   rH   	ObjectRefrS   rA   rD   LLVMPassManagerRefr/   rL  restypeLLVMModuleRefrl  argtypesrV   rQ  rR  rp  rs  LLVMValueRefrv  rw  rZ   r^   rb   rf   rj   rm   rq   ru   r{   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  r2  r5  r;  r?  rB  r0   r*   r#   r!   <module>r     s
     "    7 	  2BE 'q) B B0$I $*	1 '3 3tE#-- tEn;" ;"|N"+ N"h ,/+A+A     (585F5F4G ( ( 1363I3I ( ( 0.1.D.D-E ! ! **-*@*@*-*;*;*=   &(.   %585K5K585F5F5=5=5=	5? ( ( 1
 49 ( ( 09<9O9O8P , , 57= , , 47:7M7M6N * * 35; * * 2252H2H252B2B2D % % .06 % % - C,,h(= 0 0 9 <A 0 0 8),)?)?(@   %141G1G0H $ $ -030F0F/G # # ,585K5K4L ( ( 1585K5K4L ( ( 1696L6L5M ) ) 2-0-C-C,D     )030F0F/O # # ,
4 ' ' 0 362H2H1I % % .363I3I2J & & /*-*@*@)A   &030F0F/G # # ,'*'='=&>   #9<9O9O8P , , 5-0-C-C,D     )474J4J3K ' ' 0030F0F/G # # ,030F0F/O # # ,3(CGG&&/ 695K5K4L ( ( 17 * * 3 @ 3 3 < A 4 4 =.1.D.D-E ! ! *(+(>(>'?   $/2/E/E.F " " +030F0F/G # # ,696L6L5M ) ) 2585K5K4L ( ( 1585K5K4L ( ( 1-0-C-C,D     )363I3I2J & & //2/E/Ev/5/7 " " +.1.D.D-E ! ! *.1.D.D-E ! ! *.1.D.D-E ! ! *585K5K4L ( ( 1141G1G0H $ $ -/2/E/E.F " " +252H2H1I % % .9<9O9O8P , , 5.1.D.D-E ! ! *9<9O9O8P , , 5'*'='=&>   #/2/E/Ev.N " " +585K5K4L ( ( 1696L6L5M ) ) 2> 1 1 :7:7M7M6N * * 3696L6L5M ) ) 2030F0F/N # # ,030F0F/G # # ,E3# & & /,/,B,B+C   (252H2H1I % % .),)?)?(@   %696L6L5M ) ) 2474J4J3K ' ' 0&)&<&<%=   "7:7M7M6N * * 3'*'='=&>   #'*'='=&>   #'*'='=&>   #9<9O9O8P , , 5585K5K4L ( ( 1474J4J4<4> ' ' 0363I3I2J & & /+.+A+A5+3+5   ' .5]-CV,L     )r#   