
    pi                         d Z ddlZddlmZmZ ddlmZ ddlm	Z	  ej                  d      Z ej                  d      Z ej                  dj                  g d	            Zd
 Zd Zy)z
NRT specific optimizations
    N)defaultdictdeque)binding)cgutilsz,\s*(?:tail)?\s*call void @NRT_incref\((.*)\)z,\s*(?:tail)?\s*call void @NRT_decref\((.*)\)|)z[0-9]+:z,[\'"]?[-a-zA-Z$._0-9][-a-zA-Z$._0-9]*[\'"]?:z^definez^;\s*<label>c                    	
 d }	fd}d 
fd	d fd
d g } ||       D ]  \  }}|r ||      }||z  } dj                  |      S )	Nc              3   .  K   g }t        |       j                         D ]s  }|j                  d      r|rJ |j                  |       *|j                  d      r|sJ |j                  |       d|f g }Y|r|j                  |       md|gf u y w)Ndefine}TF)str
splitlines
startswithappend)modulecurlines      [/opt/services/ai/voice_agent/venv/lib/python3.12/site-packages/numba/core/runtime/nrtopt.py_extract_functionsz7_remove_redundant_nrt_refct.<locals>._extract_functions   s     K**, 	$Dx(w

4 %
s

4 Ci

4 dVm#	$s   BBc                 N    g } |       D ]  \  }}|r
|r |      }||z  } |S N )
func_linesoutis_bbbb_lines_extract_basic_blocks_process_basic_blocks       r   _process_functionz6_remove_redundant_nrt_refct.<locals>._process_function/   s?    4Z@ 	OE8/98OC	 
    c              3   &  K   | d   j                  d      sJ | d   j                  d      sJ d| d   gf g }| dd D ]=  }t        j                  |      }|d|f g }d|gf *|s-|j                  |       ? d|f d| d   gf y w)Nr   r
   r   F   T)r   	_regex_bbmatchr   )r   r   lnms       r   r   z:_remove_redundant_nrt_refct.<locals>._extract_basic_blocks7   s     !}''111"~((---jm_$$Qr" 	B#A}CibTk!

2	 Cijn%%%s   A*B-$Bc                 (     |       }  |       } | S r   r   )r   (_move_and_group_decref_after_all_increfs_prune_redundant_refct_opss    r   r   z9_remove_redundant_nrt_refct.<locals>._process_basic_blockJ   s    ;HE-h7r   c              3      K   t        |       D ]h  \  }}t        j                  |      }|||j                  d      d f 4t        j                  |      }||d |j                  d      f b|d d f j y w)Nr"   )	enumerate_regex_increfr$   group_regex_decref)r   numr%   r&   s       r   _examine_refct_opz6_remove_redundant_nrt_refct.<locals>._examine_refct_opO   s      * 	!GC##B'A}1771:t++##B'A}4++dD. 	!s   A8A:c                    t        t              }t        t              }t               } |       D ]h  \  }}}|r|rJ |r,|dk(  r|j                  |       &||   j	                  |       ;|s>|dk(  r|j                  |       U||   j	                  |       j |j                         D ]v  \  }}||   }	t        t        |	      t        |            }
t        |
      D ]@  }|j                  |	j                                |j                  |j                                B x t        |       D cg c]  \  }}||vr| c}}S c c}}w )Nzi8* null)r   r   setaddr   itemsminlenrangepoppopleftr+   )r   
incref_map
decref_map	to_remover/   
incref_var
decref_varvardecopsincopsct_r%   r0   s                r   r)   z?_remove_redundant_nrt_refct.<locals>._prune_redundant_refct_ops]   s=    '
 '
E	+<X+F 	7'CZ"z22+MM#&z*11#6+MM#&z*11#6	7 &++- 	0KC_FS[#f+.B2Y 0fjjl+fnn./0	0 #,H"5 )wsBi'  ) 	) )s   4Ec                 |   d}t        |       D ]   \  }}t        j                  |      |dz   }" d}t        |       D ]   \  }}t        j                  |      |dz   }" t	        ||      }g }g }| d | D ]:  }t        j                  |      |j                  |       *|j                  |       < ||z   | |d  z   S )Nr   r"   )r+   r,   r$   r.   maxr   )r   last_incref_posposr%   last_decref_poslast_posdecrefsheads           r   r(   zM_remove_redundant_nrt_refct.<locals>._move_and_group_decref_after_all_increfsx   s     * 	*GC""2&2"%'	*
  * 	*GC""2&2"%'	* 8 9H% 	 B""2&2r"B		  g~ 333r   
)join)llvmirr   r   	processedis_funclinesr0   r   r(   r   r)   s         @@@@@r   _remove_redundant_nrt_refctrR      sm    $$&&
!)648 I,V4 %e,EU		 99Yr   c                     	 | j                  d       | j                  }t        t	        |             }t        j                  |      }t        j                  |      |_        |S # t        $ r | cY S w xY w)a  
    Remove redundant reference count operations from the
    `llvmlite.binding.ModuleRef`. This parses the ll_module as a string and
    line by line to remove the unnecessary nrt refct pairs within each block.
    Decref calls are moved after the last incref call in the block to avoid
    temporarily decref'ing to zero (which can happen due to hidden decref from
    alias).

    Note: non-threadsafe due to usage of global LLVMcontext
    
NRT_incref)	get_function	NameErrornamerR   r   llparse_assemblyr   normalize_ir_text)	ll_modulerW   newllnew_mods       r   remove_redundant_nrt_refctr^      sl    |, >>D'I7E&G,,T2GLN  s   A$ $A21A2)__doc__recollectionsr   r   llvmliter   rX   
numba.corer   compiler,   r.   rM   r#   rR   r^   r   r   r   <module>re      sg    
 * " 

JK

JKBJJII 	 		C Lr   