o
    "ѹgP,                     @   s  d dl mZmZmZ d dlmZ d dlmZ dd Zdd Z	dd	 Z
dddZG dd deZG dd dejZG dd dejZG dd dejZG dd dejZejejj_eje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j_ejgejj _ejgejj!_ejeegejj"_ej#ejj$_ej#e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#egejj,_ej#gejj-_ej#eegejj._ej/ejj0_eejj1_ej/gejj1_ej/egejj2_eejj3_ej/gejj3_ej/egejj4_eejj5_ej/gejj5_ej/egejj6_eejj7_ej/gejj7_ej/egejj8_ej/gejj9_ejejj:_ej;ej/gejj:_ejgejj<_ejejj=_ejeegejj=_ej#ejj>_ejeegejj>_dS )    )c_boolc_intc_size_t)IntFlag)ffic                   C      t  S N)ModulePassManager r
   r
   d/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/llvmlite/binding/newpassmanagers.pycreate_new_module_pass_manager      r   c                   C   r   r   )FunctionPassManagerr
   r
   r
   r    create_new_function_pass_manager
   r   r   c                 C   
   t | |S r   )PassBuilder)tmptor
   r
   r   create_pass_builder      
r      c                 C   r   r   )PipelineTuningOptions)speed_level
size_levelr
   r
   r   create_pipeline_tuning_options   r   r   c                   @   s,   e Zd ZdZdZdZdZeeB eB eB ZdS )RefPruneSubpasses   r         N)__name__
__module____qualname__ZPER_BBZDIAMONDZFANOUTZFANOUT_RAISEALLr
   r
   r
   r   r      s    r   c                       sx   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dddZdd ZejdfddZ  ZS )r	   Nc                    "   |d u r	t j }t | d S r   )r   lib!LLVMPY_CreateNewModulePassManagersuper__init__selfptr	__class__r
   r   r'          
zModulePassManager.__init__c                 C      t j| || d S r   )r   r$   LLVMPY_RunNewModulePassManager)r)   modulepbr
   r
   r   run%      zModulePassManager.runc                 C      t j|  d S r   )r   r$   LLVMPY_AddVerifierPassr)   r
   r
   r   add_verifier(      zModulePassManager.add_verifierc                 C   r4   r   )r   r$   LLVMPY_AddAAEvalPass_moduler6   r
   r
   r   add_aa_eval_pass+   r8   z"ModulePassManager.add_aa_eval_passc                 C   r4   r   )r   r$    LLVMPY_AddSimplifyCFGPass_moduler6   r
   r
   r   add_simplify_cfg_pass.   r8   z'ModulePassManager.add_simplify_cfg_passc                 C   r4   r   )r   r$   LLVMPY_AddLoopUnrollPass_moduler6   r
   r
   r   add_loop_unroll_pass1   r8   z&ModulePassManager.add_loop_unroll_passc                 C   r4   r   )r   r$   LLVMPY_AddLoopRotatePass_moduler6   r
   r
   r   add_loop_rotate_pass4   r8   z&ModulePassManager.add_loop_rotate_passc                 C   r4   r   )r   r$   'LLVMPY_AddInstructionCombinePass_moduler6   r
   r
   r   add_instruction_combine_pass7   r8   z.ModulePassManager.add_instruction_combine_passc                 C      t j| | d S r   )r   r$   "LLVMPY_AddJumpThreadingPass_moduler)   	thresholdr
   r
   r   add_jump_threading_pass:      z)ModulePassManager.add_jump_threading_passc                 C   r4   r   )r   r$   !LLVMPY_DisposeNewModulePassMangerr6   r
   r
   r   _dispose=   r8   zModulePassManager._dispose  c                 C      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)r   r   r$   LLVMPY_AddRefPrunePass_moduler)   Zsubpasses_flagsZsubgraph_limitZiflagsr
   r
   r   add_refprune_passA      z#ModulePassManager.add_refprune_passr   rC   )r   r    r!   r'   r2   r7   r:   r<   r>   r@   rB   rH   rK   r   r"   rQ   __classcell__r
   r
   r+   r   r	      s    
r	   c                       sp   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Zdd Zdd Z	dddZ
dd ZejdfddZ  ZS )r   Nc                    r#   r   )r   r$   #LLVMPY_CreateNewFunctionPassManagerr&   r'   r(   r+   r
   r   r'   U   r-   zFunctionPassManager.__init__c                 C   r.   r   )r   r$    LLVMPY_RunNewFunctionPassManager)r)   Zfunr1   r
   r
   r   r2   Z   r3   zFunctionPassManager.runc                 C   r4   r   )r   r$   LLVMPY_AddAAEvalPass_functionr6   r
   r
   r   r:   ]   r8   z$FunctionPassManager.add_aa_eval_passc                 C   r4   r   )r   r$   "LLVMPY_AddSimplifyCFGPass_functionr6   r
   r
   r   r<   `   r8   z)FunctionPassManager.add_simplify_cfg_passc                 C   r4   r   )r   r$   !LLVMPY_AddLoopUnrollPass_functionr6   r
   r
   r   r>   c   r8   z(FunctionPassManager.add_loop_unroll_passc                 C   r4   r   )r   r$   !LLVMPY_AddLoopRotatePass_functionr6   r
   r
   r   r@   f   r8   z(FunctionPassManager.add_loop_rotate_passc                 C   r4   r   )r   r$   )LLVMPY_AddInstructionCombinePass_functionr6   r
   r
   r   rB   i   r8   z0FunctionPassManager.add_instruction_combine_passrC   c                 C   rD   r   )r   r$   $LLVMPY_AddJumpThreadingPass_functionrF   r
   r
   r   rH   l   rI   z+FunctionPassManager.add_jump_threading_passc                 C   r4   r   )r   r$   #LLVMPY_DisposeNewFunctionPassMangerr6   r
   r
   r   rK   o   r8   zFunctionPassManager._disposerL   c                 C   rM   rN   )r   r   r$   LLVMPY_AddRefPrunePass_functionrP   r
   r
   r   rQ   s   rR   z%FunctionPassManager.add_refprune_passr   rS   )r   r    r!   r'   r2   r:   r<   r>   r@   rB   rH   rK   r   r"   rQ   rT   r
   r
   r+   r   r   S   s    
r   c                       s   e Zd Zd fdd	Zedd Zejdd Zedd	 Zejd
d	 Zedd Zejdd Zedd Z	e	jdd Z	edd Z
e
jdd Z
edd Zejdd Zdd Z  ZS )r   r   r   c                    s.   d | _ d | _|| _|| _t tj  d S r   )	_speed_level_size_levelr   r   r&   r'   r   r$   "LLVMPY_CreatePipelineTuningOptions)r)   r   r   r+   r
   r   r'      s
   zPipelineTuningOptions.__init__c                 C      | j S r   )r_   r6   r
   r
   r   r         z!PipelineTuningOptions.speed_levelc                 C   s.   d|  krdkst d t d|| _d S )Nr      z4Optimization level for speed should be 0, 1, 2, or 3)
ValueErrorr_   r)   valuer
   r
   r   r      s   
c                 C   rb   r   )r`   r6   r
   r
   r   r      rc   z PipelineTuningOptions.size_levelc                 C   sH   d|  krdkst d t d|dkr| jdkrt d|| _d S )Nr   r   z0Optimization level for size should be 0, 1, or 2z=Optimization for size should be encoded with speed level == 2)re   r   r`   rf   r
   r
   r   r      s   
c                 C      t j| S r   )r   r$   LLVMPY_PTOGetLoopInterleavingr6   r
   r
   r   loop_interleaving      z'PipelineTuningOptions.loop_interleavingc                 C   rD   r   )r   r$   LLVMPY_PTOSetLoopInterleavingrf   r
   r
   r   rj         c                 C   rh   r   )r   r$   LLVMPY_PTOGetLoopVectorizationr6   r
   r
   r   loop_vectorization   rk   z(PipelineTuningOptions.loop_vectorizationc                 C   rD   r   )r   r$   LLVMPY_PTOSetLoopVectorizationrf   r
   r
   r   ro      rm   c                 C   rh   r   )r   r$   LLVMPY_PTOGetSLPVectorizationr6   r
   r
   r   slp_vectorization   rk   z'PipelineTuningOptions.slp_vectorizationc                 C   rD   r   )r   r$   LLVMPY_PTOSetSLPVectorizationrf   r
   r
   r   rr      rm   c                 C   rh   r   )r   r$   LLVMPY_PTOGetLoopUnrollingr6   r
   r
   r   loop_unrolling   rk   z$PipelineTuningOptions.loop_unrollingc                 C   rD   r   )r   r$   LLVMPY_PTOSetLoopUnrollingrf   r
   r
   r   ru      rm   c                 C   r4   r   )r   r$   #LLVMPY_DisposePipelineTuningOptionsr6   r
   r
   r   rK      r8   zPipelineTuningOptions._disposer   r   )r   r    r!   r'   propertyr   setterr   rj   ro   rr   ru   rK   rT   r
   r
   r+   r   r      s6    











r   c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	r   c                    s&   t  tj|| || _|| _d S r   )r&   r'   r   r$   LLVMPY_CreatePassBuilder_ptoZ_tm)r)   r   r   r+   r
   r   r'      s   
zPassBuilder.__init__c                 C      t tj| | jj| jjS r   )r	   r   r$   $LLVMPY_buildPerModuleDefaultPipeliner|   r   r   r6   r
   r
   r   getModulePassManager   
   z PassBuilder.getModulePassManagerc                 C   r}   r   )r   r   r$   *LLVMPY_buildFunctionSimplificationPipeliner|   r   r   r6   r
   r
   r   getFunctionPassManager   r   z"PassBuilder.getFunctionPassManagerc                 C   r4   r   )r   r$   LLVMPY_DisposePassBuilderr6   r
   r
   r   rK      r8   zPassBuilder._dispose)r   r    r!   r'   r   r   rK   rT   r
   r
   r+   r   r      s
    r   Nrx   )?ctypesr   r   r   enumr   Zllvmlite.bindingr   r   r   r   r   r   Z	ObjectRefr	   r   r   r   ZLLVMModulePassManagerRefr$   r%   restypeZLLVMModuleRefZLLVMPassBuilderRefr/   argtypesr5   r9   r;   r=   r?   rA   rE   rJ   rO   ZLLVMFunctionPassManagerRefrU   ZLLVMValueRefrV   rW   rX   rY   rZ   r[   r\   r]   r^   ZLLVMPipelineTuningOptionsRefra   ri   rl   rn   rp   rq   rs   rt   rv   rw   r{   ZLLVMTargetMachineRefr   r~   r   r
   r
   r
   r   <module>   s    
52N






























